UCOS 的延时函数OSTimeDlyHMSM()实现精确延时
介绍UCOS的资料汗牛,但详细解说OSTimeDlyHMSM()函数的不多,经过本人仔细研究该函数代码并通过调试发现:要想实现精确延时的对代码进行相应的修正。
本人实现的是UCOS在2812上的移植,在其它DSP型号上移植情况是一样的,相差不大。
以下是OSTimeDlyHMSM()函数的代码片段:
ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
+ OS_TICKS_PER_SEC * ((INT32U)milli + 1000L / OS_TICKS_PER_SEC) / 1000L;
loops = ticks / 65536L; /* Compute the integral number of 65536 tick delays */
ticks = ticks % 65536L;
OSTimeDly(ticks);
while (loops > 0) {
OSTimeDly(32768);
OSTimeDly(32768);
loops--;
由ticks表达式看出:ticks的值与OS_TICKS_PER_SEC宏(一般设为100或200)的大小相关,为精确延时,请务必注意两点:
1、OS_TICKS_PER_SEC取100或200时OS_TICKS_PER_SEC * ((aINT32U)milli + 1000L / OS_TICKS_PER_SEC) / 1000L部分中的分子1000L应作相应的调整,比如当OS_TICKS_PER_SEC取100时,分子应为500L,而200时为1000L。
2、以上只是实现精确延时的第一步,我们知道,时钟节拍ticks是通过定时器中断来实现,在配置定时器时,函数
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)中的 float Freq和 float Period俩参数取值有讲究:Freq要求为Mhz,其对应DSP的SysCtrlRegs.HISPCP的工作频率,Period单位为US,一般取为1000000/OS_TICKS_PER_SEC,为什么这样,请大家自己好好琢磨,只有这样才记得深刻,对吧!
完成以上两步,你便可放心大胆的运用该函数了,好好品味那种随心所欲驾驭任何长时间延时的成就感吧!!
http://blog.csdn.net/fengfei2000/article/details/3183090