rtthread 的定时器管理源码分析Word格式文档下载.docx

上传人:b****5 文档编号:21179778 上传时间:2023-01-28 格式:DOCX 页数:22 大小:40.02KB
下载 相关 举报
rtthread 的定时器管理源码分析Word格式文档下载.docx_第1页
第1页 / 共22页
rtthread 的定时器管理源码分析Word格式文档下载.docx_第2页
第2页 / 共22页
rtthread 的定时器管理源码分析Word格式文档下载.docx_第3页
第3页 / 共22页
rtthread 的定时器管理源码分析Word格式文档下载.docx_第4页
第4页 / 共22页
rtthread 的定时器管理源码分析Word格式文档下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

rtthread 的定时器管理源码分析Word格式文档下载.docx

《rtthread 的定时器管理源码分析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《rtthread 的定时器管理源码分析Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。

rtthread 的定时器管理源码分析Word格式文档下载.docx

//定时器超时例程 

11. 

*parameter;

//定时器例程的传入参数 

12. 

13. 

rt_tick_t 

init_tick;

//定时器的超时时间,即总共多长时间将产生超时事件 

14. 

timeout_tick;

//定时器超时的时间点,即产生超时事件时那一该的时间点 

15.};

16.typedef 

*rt_timer_t;

3.2rt-thread的软件定时器模式

软件定时器线程初始化及启动:

@ingroup 

SystemInit 

4. 

This 

function 

will 

initialize 

system 

thread 

5. 

6.void 

rt_system_timer_thread_init(void) 

7.{ 

8.#ifdef 

RT_USING_TIMER_SOFT//如果采用软件定时器管理模式,则启动定时器线程 

rt_list_init(&

rt_soft_timer_list);

//初始化软件定时器链表 

/* 

start 

software 

rt_thread_init(&

timer_thread,//初始化软件定时器线程,并启动 

"

timer"

 

rt_thread_timer_entry, 

15. 

RT_NULL, 

16. 

&

timer_thread_stack[0], 

17. 

sizeof(timer_thread_stack), 

18. 

RT_TIMER_THREAD_PRIO, 

19. 

10);

20. 

21. 

startup 

22. 

rt_thread_startup(&

timer_thread);

23.#endif 

24.} 

软件定时器线程如下:

1./* 

entry 

2.static 

rt_thread_timer_entry(void 

*parameter) 

3.{ 

next_timeout;

while 

(1) 

get 

the 

next 

timeout 

tick 

next_timeout 

rt_timer_list_next_timeout(&

//得到软件定时器链表上的下一个定时器的超时时间点 

if 

(next_timeout 

== 

RT_TICK_MAX)//如果超过范围,则挂起当前线程,继续线程调度 

no 

exist, 

suspend 

self. 

rt_thread_suspend(rt_thread_self());

rt_schedule();

else 

current_tick;

current 

current_tick 

rt_tick_get();

//获取当前时间点 

23. 

((next_timeout 

current_tick) 

<

RT_TICK_MAX/2)//离下个中断时间点还差些时候 

24. 

25. 

delta 

26. 

//计算还差多长时间 

27. 

rt_thread_delay(next_timeout);

//休眠一段时间 

28. 

29. 

30. 

31. 

lock 

scheduler 

32. 

rt_enter_critical();

//时间到,进入临界区 

33. 

check 

34. 

rt_soft_timer_check();

//检查是否该产生超时事件 

35. 

unlock 

36. 

rt_exit_critical();

//退出临界区 

37. 

38.} 

检查是否产生中断函数rt_soft_timer_check函数如下定义:

list, 

event 

happens, 

corresponding 

be 

invoked. 

5.void 

rt_soft_timer_check(void) 

6.{ 

*n;

*t;

RT_DEBUG_LOG(RT_DEBUG_TIMER, 

("

enter\n"

));

//得到当前时间点 

for 

(n 

rt_soft_timer_list.next;

!

(rt_soft_timer_list);

)//得到下一定时器节点 

rt_list_entry(n, 

rt_timer, 

list);

//t指向rt_timer定时器 

It 

supposes 

that 

new 

shall 

less 

than 

half 

duration 

of 

max. 

((current_tick 

t->

timeout_tick) 

RT_TICK_MAX 

2)//如果当前的时间点超过定时器的超时时间点 

RT_OBJECT_HOOK_CALL(rt_timer_timeout_hook, 

(t));

//使用钩子函数 

move 

node 

to 

n->

next;

//指向下一定时器 

remove 

from 

list 

firstly 

rt_list_remove(&

(t->

list));

//移除当前定时器 

call 

timeout_func(t->

parameter);

//产生定时器超时事件,调用对应处理函数 

re-get 

//再次获取当前时间点 

38. 

39. 

tick:

%d\n"

current_tick));

40. 

41. 

((t->

parent.flag 

RT_TIMER_FLAG_PERIODIC) 

//如果当前定时器是周期性定时器,则将其再次按序放入软件定时器链表 

42. 

RT_TIMER_FLAG_ACTIVATED)) 

43. 

44. 

it 

45. 

~RT_TIMER_FLAG_ACTIVATED;

//置标志为非激活状态 

46. 

rt_timer_start(t);

//再次将定时器t放入软件定时器链表末尾 

47. 

48. 

49. 

50. 

stop 

51. 

52. 

53. 

54. 

break;

not 

anymore 

55. 

56. 

57. 

leave\n"

58.} 

上面代码中,为什么定时器里判断超时的条件是((current_tick-t→timeout_tick)<

RT_TICK_MAX/2)?

因为系统时钟溢出后会自动回绕。

取定时器比较最大值是定时器最大值的一半,即RT_TICK_MAX/2(在比较两个定时器值时,值是32位无符号数,相减运算将会自动回绕)。

系统支持的定时器最大长度就是RT_TICK_MAX的一半:

即248天(10ms/tick),124天(5ms/tick),24.5天(1ms/tick),以下内容相同道理。

其上rt_timer_start函数如下定义:

@param 

started 

@return 

operation 

status, 

RT_EOK 

on 

OK, 

-RT_ERROR 

error 

8.rt_err_t 

rt_timer_start(rt_timer_t 

timer) 

9.{ 

register 

rt_base_t 

level;

*n, 

*timer_list;

RT_ASSERT(timer 

RT_NULL);

(timer->

RT_TIMER_FLAG_ACTIVATED)//如果传入的定时器已经激活,则直接返回错误 

return 

-RT_ERROR;

RT_OBJECT_HOOK_CALL(rt_object_take_hook, 

(&

parent)));

tick, 

max 

great 

RT_TICK_MAX/2 

RT_ASSERT(timer->

init_tick 

2);

timer->

timeout_tick 

rt_tick_get() 

//得到定时器超时的时间点 

disable 

interrupt 

level 

rt_hw_interrupt_disable();

//关中断 

31.#ifdef 

RT_USING_TIMER_SOFT//如果采用的是软件定时器管理模式,则将定时器加入到rt_soft_timer_list中 

RT_TIMER_FLAG_SOFT_TIMER) 

insert 

soft 

timer_list 

rt_soft_timer_list;

38.#endif 

rt_timer_list;

timer_list->

timer_list;

next)//将定时器按序加入到定时器链表中 

2) 

rt_list_insert_before(n, 

//将定时器timer插入到t之前 

58. 

found 

suitable 

position 

in 

59. 

timer_list)//没有找到合适的位置,则放到链表头 

60. 

61. 

62. 

63. 

64. 

|= 

RT_TIMER_FLAG_ACTIVATED;

//置定时器为激活状态 

65. 

66. 

enable 

67. 

rt_hw_interrupt_enable(level);

68. 

69.#ifdef 

RT_USING_TIMER_SOFT 

70. 

RT_TIMER_FLAG_SOFT_TIMER)//如果系统采用的是软件定时器管理模式,且软件定时器线程处理ready状态,则恢复此线程 

71. 

72. 

whether 

is 

ready 

73. 

(timer_thread.stat 

RT_THREAD_READY) 

74. 

75. 

resume 

76. 

rt_thread_resume(&

//恢复定时器线程 

77. 

//开始线程调度 

78. 

79. 

80.#endif 

81. 

82. 

-RT_EOK;

83.} 

软件定时器管理模式的源码分析完了,接下来介绍RTT的硬件定时器管理模式。

3.3RTT的硬件定时器管理模式

硬件定时器管理模式顾名思义,就是说与硬件相关,因此,不用的MCU,其部分源码是不一样的,因为其要采用MCU的系统时钟中断例程来实现。

以STM32F2XX为例,先找到其启动汇编,位置在:

RTT/bsp/stm32f2xx/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F2xx/startup/arm/startup_stm32f2xx.s

找到中断向量:

[plain]viewplaincopyprint?

1.DCD 

SysTick_Handler 

;

SysTick 

Handler 

这是系统时钟中断向量,再找到其中断例程实现:

在bsp/stm32f2xx/drivers/board.c文件中:

service 

routine. 

SysTick_Handler(void)//系统时钟中断例程 

enter 

rt_interrupt_enter();

rt_tick_increase();

leave 

rt_interrupt_leave();

14.} 

其中rt_tick_i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1