我在刚刚看到这个定时器的时候第一印象是硬件的定时器,相对于硬件的定时器我还是比较熟悉的,因为我使用过好几种芯片,定时器是必调的。阅读了UCOS_III关于定时器的介绍之后我简单的说说我个人的见解(并不一定是对的,只是本人在学习过程中的一些见解而已)。对于这个UCOS_III定时器我的认识理解是和硬件上定时器差不多的,是硬件定时器的一部分(systick定时器),UCOS的时间系统都是由systick提供的,因此定时器的时基也是由systick提供的,有点不同的是UCOS的时间节拍和定时器的时间节拍是不一样的,由两个不同的变量决定,UCOS时钟节拍有OS_CFG_TICK_RATE_HZ决定,而定时器的时钟节拍是由OS_CFG_TMR_TASK_RATE_HZ决定的。
为什么要说这个时钟节拍呢?因为定时器的时间是以时钟节拍来计算的,也就是说当你定时多长时间的时候不是你直接在函数上的参数里面写定时多长的时间,而是在参数那个地方写定时几个时钟节拍,因此你要想定时一定的时间就必须知道一个时钟节拍是多长时间,定时几个时钟节拍就能到达你定时的那个时间。
而定时器的时钟节拍的时间是怎么计算呢?这里我说说我的见解(如果有什么不对的地方请高手指点一二)。要想知道定时器的时钟节拍就要知道UCOS的时钟节拍,假定OS_CFG_TICK_RATE_HZ是1000,也就是systick是1ms中断一次,而OS_CFG_TMR_TASK_RATE_HZ为10,那么定时器的一个时钟节拍就是100ms,也就是说每100次UCOS时钟节拍就发送一次信号给定时器任务。
这两个节拍的定义在(os_cfg_app.h)中
关于定时器时钟节拍就说到这里,接下来说说其他的。我们理解的硬件定时器是,当定时时间到时发生定时中断,其实这里也是差不多的,这里的定时时间到了之后就会调度到回调函数里面,这里的回调函数相当于我们的额定时中断服务函数。但是这里的回调函数要考虑定时器任务的优先级,如果定时器任务的优先级较低的话,就要等待高优先级的任务处于空闲状态,而定时器任务是就绪状态任务中的最高优先级就会轮到它执行,如果你直接就将定时器任务的优先级设置的比较高,那么当定时间到了之后,发生任务调度的时候就会立即执行回调函数(在回调函数内部禁止使用阻塞性函数)。
回调函数执行完毕之后就进入另外的一个问题,定时器是要重复执行函数执行一次之后就停止?这个通过定时器创建函数里面的一个参数来决定(opt)。
说到这个重复周期执行和一次执行,那么我就说说这个延迟时间和重复周期执行之间的关系?当延时时间设置为0的时候,那么不管是一次执行还是重复执行,都是按重复周期的时钟节拍执行的;当延时时间设置的不是0时,如果是一次执行,那么只是执行延迟时间节拍数之后就停止了,如果是重复执行,那么重复执行的第一次执行是以延迟时间节拍来执行的,以后的执行就是按重复周期来执行的。
说到这里关于定时的我个人的理解就差不多了没什么了,其它的感觉就很容易了。在这里贴上定时器的有关函数。
(有一部分还没有详细的理解去看,就是关于定时器管理内部机制------定时器列表,这篇只是定时器的第一步,我会在第二步中继续努力的。)