3

vxworks 任务如何在最短的时间内将 CPU 让给优先级较低的任务?

有没有一种方法可以让任务在不到 1ms 的时间内放弃 CPU?

我知道让其他低优先级任务运行的唯一方法是 taskDelay(n),其中 n>=1。

我一直假设 taskDelay(0) 让所有其他具有相同或更高优先级的任务运行。

taskDelay(1) 让所有较低优先级的挂起任务最多运行 1 毫秒。

4

2 回答 2

6

更高优先级的任务将始终运行,如果它准备好了,并且如果你没有调用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.

于 2013-10-25T10:05:25.950 回答
2

VxWorks 中有某些事件会强制调度程序运行,例如,每个 semGive()、每个系统时钟滴答和 taskDelay()。taskDelay() 的参数是系统时钟的滴答声。sysClkRateGet() 将返回系统时钟的速率。

例如,如果 sysClkRateGet() 返回 10,则每个时钟节拍为 100 毫秒。因此,如果您调用 taskDelay(1),那么这将告诉您的任务进入睡眠状态,直到下一个系统滴答声。但是,这并不能保证 100 毫秒的睡眠,而是最多 100 毫秒的睡眠,或者如果下一个时钟滴答即将到来,则可以短至 0 毫秒。如果您调用 taskDelay(2),那么您的任务将休眠直到下一个时钟滴答(0 到 100 毫秒之间的某个时间)加上下一个时钟滴答(保证为 100 毫秒) - 导致总延迟介于 100 毫秒和200 毫秒。

VxWorks 中的时序有很多考虑因素,我希望这有助于解释一些细节。

于 2012-06-20T12:20:06.130 回答