打印
[应用相关]

uCOS时钟节拍和滴答定时器的关系

[复制链接]
557|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
paotangsan|  楼主 | 2019-7-5 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用uCOS时,有一个非常重要,非常关键的概念就是操作系统的时钟节拍,uCOS的时钟节拍来源于滴答定时器,滴答定时器按照设定的时间不停的计时和产生中断,在uCOS-III中滴答定时器的中断服务函数如下:


void  OS_CPU_SysTickHandler (void)
{
    CPU_SR_ALLOC();

    CPU_CRITICAL_ENTER();
    OSIntNestingCtr++;                           /* Tell uC/OS-III that we are starting an ISR */
    CPU_CRITICAL_EXIT();

    OSTimeTick();                                /* Call uC/OS-III's OSTimeTick() */

    OSIntExit();                                /* Tell uC/OS-III that we are leaving the ISR */
}

其中OSTimeTick();的作用是检查每个任务的任务控制块中OSTCBDly减1后是否为0(翻译过来就是检查任务延时函数OSTimeDly中的节拍数是否减为0了),如果是,则表明这个任务刚才是挂起状态,此时应变为就绪态,接着在任务中OSTimeDly函数进行一次任务调度。
所以可以得出一个重要关系:

滴答定时器的中断时间  =  uCOS的1个节拍时间

这个节拍就是OSTimeDly (OS_TICK dly, OS_OPT opt,OS_ERR *p_err)函数中的dly。


使用特权

评论回复
沙发
paotangsan|  楼主 | 2019-7-5 09:24 | 只看该作者
在uCOS-III中针对节拍的时间有如下定义:


                                                                         /* ------------------------ TICKS ----------------------- */

                                 #define  OS_CFG_TICK_RATE_HZ            1000u        /* Tick rate in Hertz (10 to 1000 Hz)                     */


这个OS_CFG_TICK_RATE_HZ表示节拍的频率,如果设定为1000,则表示频率为1000Hz,则1个节拍为1ms。
那么问题来了,如果想要uCOS-III的节拍时间为1ms,如何设定滴答定时器的reload数值呢?

通过上面的分析可知,我们只需要设定滴答定时器的中断时间为1ms即可,以STM32为例,典型的系统时钟频率为72MHz(外部晶振选择为8MHz),滴答定时器时钟源也选择为HCLK(不是除以8),

则滴答定时器计数1次的时间为:1/72000000 s

要想中断时间为1ms = 1/1000 s,则reload = (1/10000)/(1/72000000) = 72000

而72000 = 72000000(系统时钟)/1000(OS_CFG_TICK_RATE_HZ)

所以在设定滴答定时器初始化函数时,只需设定:

SysTick_Config(SystemCoreClock/OS_CFG_TICK_RATE_HZ);  

就能满足uCOS-III想要的节拍时间了。




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

4119

帖子

0

粉丝