版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。rt_thread 的定时器管理源码分析-1前言rt-thread可以采用软件定时器或硬件定时器来实现定时器管理的,所谓软件定时器是指由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。而硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。软件定时器的精度取决于它使用的硬件定时器精度。
2、而rt-thread操作系统在默认情况下是采用的硬件定时器的方式,用户可以通过修改宏定义#ifdefRT_USING_TIMER_SOFT来修改采用哪种。2rt-thread的定时器的基本工作原理在RT-Thread定时器模块维护两个重要的全局变量,一个是当前系统的时间rt_tick(当硬件定时器中断来临时,它将加1),另一个是定时器链表rt_timer_list,系统中新创建的定时期都会被以排序的方式插入到rt_timer_list(硬件定时器模式下使用)链表中,rt_timer_list的每个节点保留了一个定时器的信息,并且在这个节点加入链表时就计算好了产生时间到达时的时间点,即tick,
3、在rt-thread系统中如果采用软件定时器模式,则存在一定时器线程rt_thread_timer_entry,不断获取当前TICK值并与定时器链表rt_timer_list上的定时器对比判断是否时间已到,一旦发现就调用对应的回调函数,即事件处理函数进行处理,而如果采用硬件定时器管理模式的话,则该检查过程放到系统时钟中断例程中进行处理,此时,是不存在定时器线程的。如下图:注:如果采用软件定时器软件定时器,则该定时器链表为rt_soft_timer_list。3源码分析3.1数据定义cppHYPERLINK/flydream0/article/details/8570841oviewplainv
4、iewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/8570841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*timerstructure*/structrt_timerstructrt_objectparent;/内核对象rt_list_tlist;/链表节点void(*timeout_func)(void*parameter);/定时器超时例程void*parameter;/定时器
5、例程的传入参数rt_tick_tinit_tick;/定时器的超时时间,即总共多长时间将产生超时事件rt_tick_ttimeout_tick;/定时器超时的时间点,即产生超时事件时那一该的时间点;typedefstructrt_timer*rt_timer_t;/*timerstructure*/structrt_timerstructrt_objectparent;/内核对象rt_list_tlist;/链表节点void(*timeout_func)(void*parameter);/定时器超时例程void*parameter;/定时器例程的传入参数rt_tick_tinit_tick;/
6、定时器的超时时间,即总共多长时间将产生超时事件rt_tick_ttimeout_tick;/定时器超时的时间点,即产生超时事件时那一该的时间点;typedefstructrt_timer*rt_timer_t;3.2rt-thread的软件定时器模式软件定时器线程初始化及启动:cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/8570841o
7、printprintHYPERLINK/flydream0/article/details/8570841o?/*ingroupSystemInit*Thisfunctionwillinitializesystemtimerthread*/voidrt_system_timer_thread_init(void)#ifdefRT_USING_TIMER_SOFT/如果采用软件定时器管理模式,则启动定时器线程rt_list_init(&rt_soft_timer_list);/初始化软件定时器链表/*startsoftwaretimerthread*/rt_thread_init(&timer_
8、thread,/初始化软件定时器线程,并启动timer,rt_thread_timer_entry,RT_NULL,&timer_thread_stack0,sizeof(timer_thread_stack),RT_TIMER_THREAD_PRIO,10);/*startup*/rt_thread_startup(&timer_thread);#endif/*ingroupSystemInit*Thisfunctionwillinitializesystemtimerthread*/voidrt_system_timer_thread_init(void)#ifdefRT_USING_TI
9、MER_SOFT/如果采用软件定时器管理模式,则启动定时器线程rt_list_init(&rt_soft_timer_list);/初始化软件定时器链表/*startsoftwaretimerthread*/rt_thread_init(&timer_thread,/初始化软件定时器线程,并启动timer,rt_thread_timer_entry,RT_NULL,&timer_thread_stack0,sizeof(timer_thread_stack),RT_TIMER_THREAD_PRIO,10);/*startup*/rt_thread_startup(&timer_thread)
10、;#endif软件定时器线程如下:cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/8570841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*systemtimerthreadentry*/staticvoidrt_thread_timer_entry(void*para
11、meter)rt_tick_tnext_timeout;while(1)/*getthenexttimeouttick*/next_timeout=rt_timer_list_next_timeout(&rt_soft_timer_list);/得到软件定时器链表上的下一个定时器的超时时间点if(next_timeout=RT_TICK_MAX)/如果超过范围,则挂起当前线程,继续线程调度/*nosoftwaretimerexist,suspendself.*/rt_thread_suspend(rt_thread_self();rt_schedule();elsert_tick_tcurre
12、nt_tick;/*getcurrenttick*/current_tick=rt_tick_get();/获取当前时间点if(next_timeout-current_tick)RT_TICK_MAX/2)/离下个中断时间点还差些时候/*getthedeltatimeouttick*/next_timeout=next_timeout-current_tick;/计算还差多长时间rt_thread_delay(next_timeout);/休眠一段时间/*lockscheduler*/rt_enter_critical();/时间到,进入临界区/*checksoftwaretimer*/rt
13、_soft_timer_check();/检查是否该产生超时事件/*unlockscheduler*/rt_exit_critical();/退出临界区/*systemtimerthreadentry*/staticvoidrt_thread_timer_entry(void*parameter)rt_tick_tnext_timeout;while(1)/*getthenexttimeouttick*/next_timeout=rt_timer_list_next_timeout(&rt_soft_timer_list);/得到软件定时器链表上的下一个定时器的超时时间点if(next_tim
14、eout=RT_TICK_MAX)/如果超过范围,则挂起当前线程,继续线程调度/*nosoftwaretimerexist,suspendself.*/rt_thread_suspend(rt_thread_self();rt_schedule();elsert_tick_tcurrent_tick;/*getcurrenttick*/current_tick=rt_tick_get();/获取当前时间点if(next_timeout-current_tick)timeout_tick)next;/指向下一定时器/*removetimerfromtimerlistfirstly*/rt_lis
15、t_remove(&(t-list);/移除当前定时器/*calltimeoutfunction*/t-timeout_func(t-parameter);/产生定时器超时事件,调用对应处理函数/*re-gettick*/current_tick=rt_tick_get();/再次获取当前时间点RT_DEBUG_LOG(RT_DEBUG_TIMER,(currenttick:%dn,current_tick);if(t-parent.flag&RT_TIMER_FLAG_PERIODIC)&/如果当前定时器是周期性定时器,则将其再次按序放入软件定时器链表(t-parent.flag&RT_TI
16、MER_FLAG_ACTIVATED)/*startit*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;/置标志为非激活状态rt_timer_start(t);/再次将定时器t放入软件定时器链表末尾else/*stoptimer*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;/置标志为非激活状态elsebreak;/*notcheckanymore*/RT_DEBUG_LOG(RT_DEBUG_TIMER,(softwaretimercheckleaven);/*Thisfunctionwillchecktimerlist,i
17、fatimeouteventhappens,the*correspondingtimeoutfunctionwillbeinvoked.*/voidrt_soft_timer_check(void)rt_tick_tcurrent_tick;rt_list_t*n;structrt_timer*t;RT_DEBUG_LOG(RT_DEBUG_TIMER,(softwaretimercheckentern);current_tick=rt_tick_get();/得到当前时间点for(n=rt_soft_timer_list.next;n!=&(rt_soft_timer_list);)/得到下
18、一定时器节点t=rt_list_entry(n,structrt_timer,list);/t指向rt_timer定时器/*Itsupposesthatthenewtickshalllessthanthehalfdurationof*tickmax.*/if(current_tick-t-timeout_tick)next;/指向下一定时器/*removetimerfromtimerlistfirstly*/rt_list_remove(&(t-list);/移除当前定时器/*calltimeoutfunction*/t-timeout_func(t-parameter);/产生定时器超时事件
19、,调用对应处理函数/*re-gettick*/current_tick=rt_tick_get();/再次获取当前时间点RT_DEBUG_LOG(RT_DEBUG_TIMER,(currenttick:%dn,current_tick);if(t-parent.flag&RT_TIMER_FLAG_PERIODIC)&/如果当前定时器是周期性定时器,则将其再次按序放入软件定时器链表(t-parent.flag&RT_TIMER_FLAG_ACTIVATED)/*startit*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;/置标志为非激活状态rt_timer_
20、start(t);/再次将定时器t放入软件定时器链表末尾else/*stoptimer*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;/置标志为非激活状态elsebreak;/*notcheckanymore*/RT_DEBUG_LOG(RT_DEBUG_TIMER,(softwaretimercheckleaven);上面代码中,为什么定时器里判断超时的条件是(current_tick-ttimeout_tick)parent.flag&RT_TIMER_FLAG_ACTIVATED)/如果传入的定时器已经激活,则直接返回错误return-RT_ERROR;
21、RT_OBJECT_HOOK_CALL(rt_object_take_hook,(&(timer-parent);/使用钩子函数/*gettimeouttick,*themaxtimeouttickshallnotgreatthanRT_TICK_MAX/2*/RT_ASSERT(timer-init_ticktimeout_tick=rt_tick_get()+timer-init_tick;/得到定时器超时的时间点/*disableinterrupt*/level=rt_hw_interrupt_disable();/关中断#ifdefRT_USING_TIMER_SOFT/如果采用的是软
22、件定时器管理模式,则将定时器加入到rt_soft_timer_list中if(timer-parent.flag&RT_TIMER_FLAG_SOFT_TIMER)/*inserttimertosofttimerlist*/timer_list=&rt_soft_timer_list;else#endif/*inserttimertosystemtimerlist*/timer_list=&rt_timer_list;for(n=timer_list-next;n!=timer_list;n=n-next)/将定时器按序加入到定时器链表中t=rt_list_entry(n,structrt_t
23、imer,list);/*Itsupposesthatthenewtickshalllessthanthehalfdurationof*tickmax.*/if(t-timeout_tick-timer-timeout_tick)list);/将定时器timer插入到t之前break;/*nofoundsuitablepositionintimerlist*/if(n=timer_list)/没有找到合适的位置,则放到链表头rt_list_insert_before(n,&(timer-list);timer-parent.flag|=RT_TIMER_FLAG_ACTIVATED;/置定时器
24、为激活状态/*enableinterrupt*/rt_hw_interrupt_enable(level);#ifdefRT_USING_TIMER_SOFTif(timer-parent.flag&RT_TIMER_FLAG_SOFT_TIMER)/如果系统采用的是软件定时器管理模式,且软件定时器线程处理ready状态,则恢复此线程/*checkwhethertimerthreadisready*/if(timer_thread.stat!=RT_THREAD_READY)/*resumetimerthreadtochecksofttimer*/rt_thread_resume(&timer
25、_thread);/恢复定时器线程rt_schedule();/开始线程调度#endifreturn-RT_EOK;/*Thisfunctionwillstartthetimer*paramtimerthetimertobestarted*returntheoperationstatus,RT_EOKonOK,-RT_ERRORonerror*/rt_err_trt_timer_start(rt_timer_ttimer)structrt_timer*t;registerrt_base_tlevel;rt_list_t*n,*timer_list;/*timercheck*/RT_ASSERT
26、(timer!=RT_NULL);if(timer-parent.flag&RT_TIMER_FLAG_ACTIVATED)/如果传入的定时器已经激活,则直接返回错误return-RT_ERROR;RT_OBJECT_HOOK_CALL(rt_object_take_hook,(&(timer-parent);/使用钩子函数/*gettimeouttick,*themaxtimeouttickshallnotgreatthanRT_TICK_MAX/2*/RT_ASSERT(timer-init_ticktimeout_tick=rt_tick_get()+timer-init_tick;/得
27、到定时器超时的时间点/*disableinterrupt*/level=rt_hw_interrupt_disable();/关中断#ifdefRT_USING_TIMER_SOFT/如果采用的是软件定时器管理模式,则将定时器加入到rt_soft_timer_list中if(timer-parent.flag&RT_TIMER_FLAG_SOFT_TIMER)/*inserttimertosofttimerlist*/timer_list=&rt_soft_timer_list;else#endif/*inserttimertosystemtimerlist*/timer_list=&rt_t
28、imer_list;for(n=timer_list-next;n!=timer_list;n=n-next)/将定时器按序加入到定时器链表中t=rt_list_entry(n,structrt_timer,list);/*Itsupposesthatthenewtickshalllessthanthehalfdurationof*tickmax.*/if(t-timeout_tick-timer-timeout_tick)list);/将定时器timer插入到t之前break;/*nofoundsuitablepositionintimerlist*/if(n=timer_list)/没有找
29、到合适的位置,则放到链表头rt_list_insert_before(n,&(timer-list);timer-parent.flag|=RT_TIMER_FLAG_ACTIVATED;/置定时器为激活状态/*enableinterrupt*/rt_hw_interrupt_enable(level);#ifdefRT_USING_TIMER_SOFTif(timer-parent.flag&RT_TIMER_FLAG_SOFT_TIMER)/如果系统采用的是软件定时器管理模式,且软件定时器线程处理ready状态,则恢复此线程/*checkwhethertimerthreadisready*
30、/if(timer_thread.stat!=RT_THREAD_READY)/*resumetimerthreadtochecksofttimer*/rt_thread_resume(&timer_thread);/恢复定时器线程rt_schedule();/开始线程调度#endifreturn-RT_EOK;软件定时器管理模式的源码分析完了,接下来介绍RTT的硬件定时器管理模式。3.3RTT的硬件定时器管理模式硬件定时器管理模式顾名思义,就是说与硬件相关,因此,不用的MCU,其部分源码是不一样的,因为其要采用MCU的系统时钟中断例程来实现。以STM32F2XX为例,先找到其启动汇编,位置在
31、:RTT/bsp/stm32f2xx/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F2xx/startup/arm/startup_stm32f2xx.s找到中断向量:plainHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/8570841oprintprintHYPERLINK/flydream0/art
32、icle/details/8570841o?DCDSysTick_Handler;SysTickHandlerDCDSysTick_Handler;SysTickHandler这是系统时钟中断向量,再找到其中断例程实现:在bsp/stm32f2xx/drivers/board.c文件中:cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/857
33、0841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*Thisisthetimerinterruptserviceroutine.*/voidSysTick_Handler(void)/系统时钟中断例程/*enterinterrupt*/rt_interrupt_enter();rt_tick_increase();/*leaveinterrupt*/rt_interrupt_leave();/*Thisisthetimerinterruptserviceroutine.*/voidSysTick_Handler(void)
34、/系统时钟中断例程/*enterinterrupt*/rt_interrupt_enter();rt_tick_increase();/*leaveinterrupt*/rt_interrupt_leave();其中rt_tick_increase函数在RTT/src/clock.c文件中的实现如下:cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/deta
35、ils/8570841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*Thisfunctionwillnotifykernelthereisonetickpassed.Normally,*thisfunctionisinvokedbyclockISR.*/voidrt_tick_increase(void)structrt_thread*thread;/*increasetheglobaltick*/+rt_tick;/全局rt_tick加1/*checktimeslice*/thread=rt_thread_self();/
36、得到当前正在运行的线程-thread-remaining_tick;/纯种剩下时间减1if(thread-remaining_tick=0)/如果线程剩余时间为0,即调度时间已到/*changetoinitializedtick*/thread-remaining_tick=thread-init_tick;/将线程剩余时间重新设置初始化值/*yield*/rt_thread_yield();/调度时间到,切换到其它线程/*checktimer*/rt_timer_check();/检查硬件定时器链表是否有定时器产生超时事件/*Thisfunctionwillnotifykernelthere
37、isonetickpassed.Normally,*thisfunctionisinvokedbyclockISR.*/voidrt_tick_increase(void)structrt_thread*thread;/*increasetheglobaltick*/+rt_tick;/全局rt_tick加1/*checktimeslice*/thread=rt_thread_self();/得到当前正在运行的线程-thread-remaining_tick;/纯种剩下时间减1if(thread-remaining_tick=0)/如果线程剩余时间为0,即调度时间已到/*changetoini
38、tializedtick*/thread-remaining_tick=thread-init_tick;/将线程剩余时间重新设置初始化值/*yield*/rt_thread_yield();/调度时间到,切换到其它线程/*checktimer*/rt_timer_check();/检查硬件定时器链表是否有定时器产生超时事件其中rt_timer_check函数在RTT/src/timer.c文件中如下定义:cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/de
39、tails/8570841ocopycopyHYPERLINK/flydream0/article/details/8570841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*Thisfunctionwillchecktimerlist,ifatimeouteventhappens,the*correspondingtimeoutfunctionwillbeinvoked.*notethisfunctionshallbeinvokedinoperatingsystemtimerinterrupt.*/voidrt_timer
40、_check(void)structrt_timer*t;rt_tick_tcurrent_tick;registerrt_base_tlevel;RT_DEBUG_LOG(RT_DEBUG_TIMER,(timercheckentern);current_tick=rt_tick_get();/*disableinterrupt*/level=rt_hw_interrupt_disable();while(!rt_list_isempty(&rt_timer_list)t=rt_list_entry(rt_timer_list.next,structrt_timer,list);/*Itsu
41、pposesthatthenewtickshalllessthanthehalfdurationof*tickmax.*/if(current_tick-t-timeout_tick)list);/*calltimeoutfunction*/t-timeout_func(t-parameter);/*re-gettick*/current_tick=rt_tick_get();RT_DEBUG_LOG(RT_DEBUG_TIMER,(currenttick:%dn,current_tick);if(t-parent.flag&RT_TIMER_FLAG_PERIODIC)&(t-parent.
42、flag&RT_TIMER_FLAG_ACTIVATED)/*startit*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;rt_timer_start(t);else/*stoptimer*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;elsebreak;/*enableinterrupt*/rt_hw_interrupt_enable(level);RT_DEBUG_LOG(RT_DEBUG_TIMER,(timercheckleaven);/*Thisfunctionwillchecktimerlist,ifatimeo
43、uteventhappens,the*correspondingtimeoutfunctionwillbeinvoked.*notethisfunctionshallbeinvokedinoperatingsystemtimerinterrupt.*/voidrt_timer_check(void)structrt_timer*t;rt_tick_tcurrent_tick;registerrt_base_tlevel;RT_DEBUG_LOG(RT_DEBUG_TIMER,(timercheckentern);current_tick=rt_tick_get();/*disableinter
44、rupt*/level=rt_hw_interrupt_disable();while(!rt_list_isempty(&rt_timer_list)t=rt_list_entry(rt_timer_list.next,structrt_timer,list);/*Itsupposesthatthenewtickshalllessthanthehalfdurationof*tickmax.*/if(current_tick-t-timeout_tick)list);/*calltimeoutfunction*/t-timeout_func(t-parameter);/*re-gettick*
45、/current_tick=rt_tick_get();RT_DEBUG_LOG(RT_DEBUG_TIMER,(currenttick:%dn,current_tick);if(t-parent.flag&RT_TIMER_FLAG_PERIODIC)&(t-parent.flag&RT_TIMER_FLAG_ACTIVATED)/*startit*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;rt_timer_start(t);else/*stoptimer*/t-parent.flag&=RT_TIMER_FLAG_ACTIVATED;elsebreak
46、;/*enableinterrupt*/rt_hw_interrupt_enable(level);RT_DEBUG_LOG(RT_DEBUG_TIMER,(timercheckleaven);此函数与rt_soft_timer_check基本大致相同,只不过一个是查找硬件定时器链表rt_timer_list,一个是查找rt_soft_timer_list.在此,硬件定时器管理模式基本上介绍完毕,接下来介绍一些定时器接口.4定时器接口4.1定时器初始化静态初始化定义器cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplai
47、nHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/8570841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*Thisfunctionwillinitializeatimer,normallythisfunctionisusedto*initializeastatictimerobject.*paramtimerthestatictimerobject*paramnamethenameoftimer
48、*paramtimeoutthetimeoutfunction*paramparametertheparameteroftimeoutfunction*paramtimethetickoftimer*paramflagtheflagoftimer*/voidrt_timer_init(rt_timer_ttimer,constchar*name,void(*timeout)(void*parameter),void*parameter,rt_tick_ttime,rt_uint8_tflag)/*timercheck*/RT_ASSERT(timer!=RT_NULL);/*timerobje
49、ctinitialization*/rt_object_init(rt_object_t)timer,RT_Object_Class_Timer,name);/初始化内核对象_rt_timer_init(timer,timeout,parameter,time,flag);/*Thisfunctionwillinitializeatimer,normallythisfunctionisusedto*initializeastatictimerobject.*paramtimerthestatictimerobject*paramnamethenameoftimer*paramtimeoutth
50、etimeoutfunction*paramparametertheparameteroftimeoutfunction*paramtimethetickoftimer*paramflagtheflagoftimer*/voidrt_timer_init(rt_timer_ttimer,constchar*name,void(*timeout)(void*parameter),void*parameter,rt_tick_ttime,rt_uint8_tflag)/*timercheck*/RT_ASSERT(timer!=RT_NULL);/*timerobjectinitializatio
51、n*/rt_object_init(rt_object_t)timer,RT_Object_Class_Timer,name);/初始化内核对象_rt_timer_init(timer,timeout,parameter,time,flag);_rt_timer_init函数如下定义:cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/8570
52、841oprintprintHYPERLINK/flydream0/article/details/8570841o?staticvoid_rt_timer_init(rt_timer_ttimer,void(*timeout)(void*parameter),void*parameter,rt_tick_ttime,rt_uint8_tflag)/*setflag*/timer-parent.flag=flag;/置flag/*setdeactivated*/timer-parent.flag&=RT_TIMER_FLAG_ACTIVATED;/初始化时,设置为非激活状态timer-time
53、out_func=timeout;/设置超时事件处理函数timer-parameter=parameter;/超时事件处理函数的传入参数timer-timeout_tick=0;/定时器的超时时间点初始化时为0timer-init_tick=time;/置超时时间/*initializetimerlist*/rt_list_init(&(timer-list);/初始化本身节点staticvoid_rt_timer_init(rt_timer_ttimer,void(*timeout)(void*parameter),void*parameter,rt_tick_ttime,rt_uint8_
54、tflag)/*setflag*/timer-parent.flag=flag;/置flag/*setdeactivated*/timer-parent.flag&=RT_TIMER_FLAG_ACTIVATED;/初始化时,设置为非激活状态timer-timeout_func=timeout;/设置超时事件处理函数timer-parameter=parameter;/超时事件处理函数的传入参数timer-timeout_tick=0;/定时器的超时时间点初始化时为0timer-init_tick=time;/置超时时间/*initializetimerlist*/rt_list_init(&
55、(timer-list);/初始化本身节点动态创建定时器cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/details/8570841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*Thisfunctionwillcreateatimer*paramnamethenameoftimer*p
56、aramtimeoutthetimeoutfunction*paramparametertheparameteroftimeoutfunction*paramtimethetickoftimer*paramflagtheflagoftimer*returnthecreatedtimerobject*/rt_timer_trt_timer_create(constchar*name,void(*timeout)(void*parameter),void*parameter,rt_tick_ttime,rt_uint8_tflag)structrt_timer*timer;/*allocateao
57、bject*/timer=(structrt_timer*)rt_object_allocate(RT_Object_Class_Timer,name);/动态分配定时器内核对象if(timer=RT_NULL)returnRT_NULL;_rt_timer_init(timer,timeout,parameter,time,flag);/调用上述的初始化接口returntimer;/*Thisfunctionwillcreateatimer*paramnamethenameoftimer*paramtimeoutthetimeoutfunction*paramparameterthepara
58、meteroftimeoutfunction*paramtimethetickoftimer*paramflagtheflagoftimer*returnthecreatedtimerobject*/rt_timer_trt_timer_create(constchar*name,void(*timeout)(void*parameter),void*parameter,rt_tick_ttime,rt_uint8_tflag)structrt_timer*timer;/*allocateaobject*/timer=(structrt_timer*)rt_object_allocate(RT
59、_Object_Class_Timer,name);/动态分配定时器内核对象if(timer=RT_NULL)returnRT_NULL;_rt_timer_init(timer,timeout,parameter,time,flag);/调用上述的初始化接口returntimer;4.2脱离和删除脱离:cppHYPERLINK/flydream0/article/details/8570841oviewplainviewplainHYPERLINK/flydream0/article/details/8570841ocopycopyHYPERLINK/flydream0/article/de
60、tails/8570841oprintprintHYPERLINK/flydream0/article/details/8570841o?/*Thisfunctionwilldetachatimerfromtimermanagement.*paramtimerthestatictimerobject*returntheoperationstatus,RT_EOKonOK;RT_ERRORonerror*/rt_err_trt_timer_detach(rt_timer_ttimer)registerrt_base_tlevel;/*timercheck*/RT_ASSERT(timer!=RT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026韩山师范学院招聘辅导员20人备考题库及答案详解(夺冠系列)
- 2026重庆财经职业学院考核招聘10人备考题库含答案详解(培优a卷)
- 2026庐山云雾茶产业集团有限公司社会招聘工作人员16人备考题库及答案详解(新)
- 2026年福建省晋江一中教育集团紫帽中学关于教师应聘意向摸底的备考题库完整答案详解
- 2026国家纳米科学中心刘晶课题组招聘1人备考题库及答案详解(新)
- 2026江苏徐州市新盛集团下属润彭企管公司招聘1人备考题库含答案详解(基础题)
- 2026云南空港百事特商务有限公司招聘4人备考题库含答案详解(综合题)
- 2026江苏南京大学物理学院专业、技术人员招聘备考题库(含答案详解)
- 2026四川宜宾高县硕润建设开发有限公司招聘2人备考题库及答案详解(必刷)
- 2026年河南省南阳市事业单位公开联考招聘755名备考题库及参考答案详解一套
- 2025版国际护士节护士压力与情绪管理讲座课件
- 更正登记申请书范本律师
- 黄帝文化精髓与民族精神
- 2026年人教版八年级数学下册 第十九章 二次根式 单元检测基础测试卷(含答案)
- 2025年《地质与矿业工程基础》真题(附答案)
- 2021公路项目安全性评价规程
- 康复护士进修结业汇报
- 2025年11月广东深圳市公办中小学招聘教师454人(编制)(公共基础知识)测试题附答案解析
- 胃食管反流常见症状及护理方法培训
- 消防交通安全培训课件下载
- 采伐安全施工技术交底
评论
0/150
提交评论