vxworks 任务如何在最短的时间内将 CPU 让给优先级较低的任务?
有没有一种方法可以让任务在不到 1ms 的时间内放弃 CPU?
我知道让其他低优先级任务运行的唯一方法是 taskDelay(n),其中 n>=1。
我一直假设 taskDelay(0) 让所有其他具有相同或更高优先级的任务运行。
taskDelay(1) 让所有较低优先级的挂起任务最多运行 1 毫秒。
vxworks 任务如何在最短的时间内将 CPU 让给优先级较低的任务?
有没有一种方法可以让任务在不到 1ms 的时间内放弃 CPU?
我知道让其他低优先级任务运行的唯一方法是 taskDelay(n),其中 n>=1。
我一直假设 taskDelay(0) 让所有其他具有相同或更高优先级的任务运行。
taskDelay(1) 让所有较低优先级的挂起任务最多运行 1 毫秒。
更高优先级的任务将始终运行,如果它准备好了,并且如果你没有调用taskLock()
或intLock()
等等,所以你不需要taskDelay()
让更高优先级的任务运行。
taskDelay(0)
会将当前任务放在该优先级的就绪队列的后面。如果它是该优先级的唯一任务,则无论是否存在较低优先级的任务,都会立即重新安排它
taskDelay(n>0)
将把当前任务放在就绪队列的后面,对于那个优先级,它不会被重新调度n
。这将允许任何较低优先级的就绪任务运行。
The parameter to taskDelay()
is ticks, not ms. The length of this can be determined based on the system clk rate (which you set by sysClkRateSet()
, and read by sysClkRateGet()
). 1 tick might equal 1ms, but only if the system clk rate is 1000. Which it probably wont be. The default rate is 60, which gives a 16ms tick, but this is normally overridden either statically in the kernel config, or dynamically by calling sysClkRateSet()
NOTE: This system clock is not the same as the CPU freq.
VxWorks 中有某些事件会强制调度程序运行,例如,每个 semGive()、每个系统时钟滴答和 taskDelay()。taskDelay() 的参数是系统时钟的滴答声。sysClkRateGet() 将返回系统时钟的速率。
例如,如果 sysClkRateGet() 返回 10,则每个时钟节拍为 100 毫秒。因此,如果您调用 taskDelay(1),那么这将告诉您的任务进入睡眠状态,直到下一个系统滴答声。但是,这并不能保证 100 毫秒的睡眠,而是最多 100 毫秒的睡眠,或者如果下一个时钟滴答即将到来,则可以短至 0 毫秒。如果您调用 taskDelay(2),那么您的任务将休眠直到下一个时钟滴答(0 到 100 毫秒之间的某个时间)加上下一个时钟滴答(保证为 100 毫秒) - 导致总延迟介于 100 毫秒和200 毫秒。
VxWorks 中的时序有很多考虑因素,我希望这有助于解释一些细节。