vxworks任务如何让所有其他优先级较低的任务在单个多任务循环中运行?

时间:2012-06-12 13:22:10

标签: multithreading vxworks

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

是否有一种方法可以让任务放弃CPU不到1毫秒?

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

我一直认为taskDelay(0)允许所有其他具有相同或更高优先级的任务运行。

taskDelay(1)允许所有优先级较低的待处理任务运行长达1毫秒。

2 个答案:

答案 0 :(得分:2)

优先级较高的任务始终运行,如果已准备好,如果您尚未调用taskLock()intLock()等,则不需要{{ 1}}让更高优先级任务运行。

taskDelay()会将当前任务放在就绪队列的后面,以获得该优先级。如果它是该优先级的唯一任务,则无论是否存在优先级较低的任务,它都将立即重新安排

taskDelay(0)会将当前任务放在就绪队列的后面,以获得该优先级,并且不会重新安排taskDelay(n>0)个刻度。这将允许任何较低优先级的就绪任务运行。

n的参数是刻度,而不是ms。此长度可以根据系统clk率(由taskDelay()设置,并由sysClkRateSet()读取)确定。 1个刻度可能等于1毫秒,但如果系统clk率为1000.它可能不会是。

注意:此系统时钟与CPU频率不同。

答案 1 :(得分:1)

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

例如,如果sysClkRateGet()返回10,则每个时钟周期为100 ms。 因此,如果你调用taskDelay(1),那么这将告诉你的任务睡眠,直到下一个系统滴答。然而,这并不保证100毫秒的睡眠,而是如果下一个时钟滴答即将到来,则睡眠时间最长为100毫秒或短至0毫秒。如果你调用taskDelay(2),那么你的任务将一直睡到下一个时钟周期(0到100毫秒之间的某个时间)加上下面的时钟周期(保证为100毫秒) - 导致总延迟在100毫秒之间200毫秒。

VxWorks中的时间安排有很多,我希望这有助于解释一些细节。