标签:
在试着将μ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而已啦~~
标签:
原文地址:http://www.cnblogs.com/heyxiaotang/p/5358192.html