Linux等多任务操作系统中使用延时函数要特别注意以下几点:
(1)应用层和内核层的延时函数是不能混用的。因为,内核层的延时函数在调用过程中是不会发生任务切换的延时是精确的,而应用层的延时函数在延时函数调用是会发生任务切换,延时是不精确的。
(2)模拟时序的操作必须要在内核层完成,即函数执行的过程中不能够发生任务切换,因为切换会导致延时不精确。
(3)在应用层的一个任务中多次频繁的调用延时函数会导致延时精度偏差非常的大。
那么,如果我们想在应用层中实现模拟时序和一个任务中多次调用延时函数这类操作应该怎么办?
(1)根据CPU的频率来计算一次加减法运算的时间来替代标准C语言提供的延时函数。
(2)将任务的优先级提高到不能被中断的级别。
下面贴出一段,我们使用PPC405EP在应用层做延时的函数:
/*f=25MHz 1us---n=2*/ /*PPC405EP 1us---n=10*/ void delayus(unsigned char n) { n = n*10; while(--n) ; } /*f=25MHz 1ms---n=1*/ /*PPC405EP 1ms---n=1*/ void delayms(unsigned char n) { unsigned char i=0x64; while(--n) { while(--i) delayus(0x64); } } |