ucosiii定时器任务与定时器的剖析

ucosiii中每个任务是由一个任务控制块TCB确定的。同理,每个定时器是由一个定时器结构体变量唯一确定和存在的,可以说这个结构体变量就是一个定时器。

ucosiii定时器任务与定时器的剖析

系统时钟节拍中断函数OSTmrUpdateCnt次节拍(系统节拍每次都是设为1ms)到来其中OSTmrUpdateCnt = OSCfg_TickRate_Hz / OSCfg_TmrTaskRate_Hz;

都会给系统定时器任务void  OS_TmrTask (void  *p_arg)(也是一个系统任务(优先级为2(官方源码默认不是2,我们得改成这个,这样系统定时任务才能准确定时)) 发送一个消息给OS_TmrTask任务,OS_TmrTask就可pend到了,就可以运行了,正是通过消息机制,从而实现任务间同步(即确保任务间严格的先后运行关系)。如下图所示。

ucosiii定时器任务与定时器的剖析

我们来看看OS_TmrTask任务里面做了什么

ucosiii定时器任务与定时器的剖析

根据定时器到来记录次数的全局变量OSTmrTickCtr用取模得到哪个表项有定时器到达,然后进行链表的第一个定时器的到达时间进行比较,相等的话就获取它的回调函数,然后执行即可,如果还有定时器定时值匹配的话,就依次执行完它们的回调函数。而且在这期间,调度器是上锁的,即调度器是不工作的,所以这些回调函数得尽快执行完,才不影响其他任务的实时性。至于定时器的开始,删除等等,都是在操作定时器那个列表罢了,间后面的补充知识。

补充个知识点,C语言函数指针的定义与使用方式如下图。

ucosiii定时器任务与定时器的剖析

补充知识:这里定时器的机制跟前面的时钟节拍列表实现机制是一样的,都是*辐条方式(了解时钟节拍列表,可以看我这篇文章,ucosiii实时嵌入式操作系统时间片实现原理深入解析),如下图。

ucosiii定时器任务与定时器的剖析