VxWorks里常用的定时/延时机制
taskDelay()
详情见《Task之任务的控制》
sleep()/nanosleep()
这俩是POSIX标准的函数,也是延时操作,将当前任务移到延时队列,其底层就是调用的taskDelay(),即其精度也是取决于系统时钟。与taskDelay()的不同是
可以看到,sleep 1秒的话,结果是1秒加1个tick,这样就防止了taskDelay()的那个小于1个tick的误差
nanosleep()也是这样操作的:
当系统时钟每个tick是1毫秒时,nanosleep()1个纳秒的话,其实是:向上取整为1毫秒(基数是tick的1毫秒)再加1个tick(1毫秒),即2毫秒。而nanosleep()略大于1毫秒(例如1000001)时,其实是:向上取整(2毫秒)再加1个tick(1毫秒),即3毫秒
WatchDog
详情见《Component之WatchDog》
其定时精度也是取决于系统时钟,但与taskDelay() / sleep() /nanosleep()的区别是:WatchDog定时后的操作是以中断形式执行的,不会受到其它高优先级任务的干扰
Auxiliary Clock
详情见《Component之辅助时钟》
定时精度可以远高于WatchDog,而且定时是周期性的
Timestamp
详情见《Component之时间戳》
定时精度最高,可以到纳秒,但多数板子里只支持轮询模式
你还知道哪些定时机制?
这正是:
定时机制有多种,越罗蜀锦各不同。
阻塞、轮询易调用,高频中断显奇能。