μC/OS-II中使用软件定时器

Posted 小唐的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了μC/OS-II中使用软件定时器相关的知识,希望对你有一定的参考价值。

在试着将μC/OS-II移植到ARM7芯片(LPC2138)上的过程中,发现使用OSTmrCreate创建的OSTmr始终都不能执行CallbackFunction,OS版本是v2.85,最后是这么解决的。

在文档《uCOS-II-RefMan.PDF》中找到了关于“OSTmrSignal()”这个函数的一段描述:

OSTmrSignal() is called either by a task or an ISR to indicate that it’s time to update the timers. Typically, OSTmrSignal() would be called by OSTimeTickHook() at a multiple of the tick rate.

它说明需要调用“OSTmrSignal()”以更新定时器。这样大概就知道问题出在哪儿了,文档下面也给出了例子:

 

#if OS_TMR_EN > 0

static INT16U OSTmrTickCtr = 0;

#endif

void OSTimeTickHook (void)

{

#if OS_TMR_EN > 0

  OSTmrTickCtr++;

if (OSTmrTickCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC))

{

  OSTmrTickCtr = 0;

  OSTmrSignal();

}

#endif

}

于是修改了钩子函数,加进上述代码,我不太确定新定义的静态局部变量放在哪里比较合适,所以一并也放在了钩子函数里面,这样子:

 

/*
*********************************************************************************************************
*                                               TICK HOOK
*
* Description: This function is called every tick.
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/
#if (OS_CPU_HOOKS_EN > 0) && (OS_TIME_TICK_HOOK_EN > 0)
void  OSTimeTickHook (void)
{
#if OS_TMR_EN > 0 
    static INT16U OSTmrTickCtr = 0; 
#endif
    
#if OS_TMR_EN > 0
    OSTmrTickCtr++;
    if(OSTmrTickCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC))
    {
        OSTmrTickCtr = 0;
        OSTmrSignal();
    }
#endif
}
#endif

最后在Proteus里面验证通过。

之前有用过μC/OS-III的软件定时器,直接用就可以了,貌似并不需要这样做呀。

感觉移植操作系统对我来说难度还是太大,好吧,算不上移植,仅仅只是改写BSP而已啦~~

 

以上是关于μC/OS-II中使用软件定时器的主要内容,如果未能解决你的问题,请参考以下文章

μC/OS-II 信号量集

μC/OS-II的实验内容简介

μC/OS-II 任务的同步与通信 --- 消息队列

μC/OS-II 创建一个任务的流程

嵌入式实时操作系统μC/OS II

μC/OS-II在Microblaze上的移植与使用专题--“安富利杯”赛灵思FPGA设计技巧与应用创新博文大赛参赛作品