vxworks任务如何让CPU在最短的时间内降低优先级任务?
是否有一种方法可以让任务放弃CPU不到1毫秒?
我知道让其他低优先级任务运行的唯一方法是taskDelay(n),其中n> = 1。
我一直认为taskDelay(0)允许所有其他具有相同或更高优先级的任务运行。
taskDelay(1)允许所有优先级较低的待处理任务运行长达1毫秒。
答案 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中的时间安排有很多,我希望这有助于解释一些细节。