首页 文章

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

提问于
浏览
1

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

有没有一种方法可以让任务放弃CPU不到1ms?

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

我总是假设taskDelay(0)让所有其他优先级相同或更高的任务运行 .

taskDelay(1)允许所有优先级较低的待处理任务运行最多1ms .

2 回答

  • 2

    如果准备就绪,则优先级较高的任务将始终运行,如果尚未调用 taskLock()intLock() 等,则不需要 taskDelay() 来执行 higher 优先级任务 .

    taskDelay(0) 将当前任务放在该优先级的就绪队列的后面 . 如果它是该优先级的唯一任务,则无论是否存在优先级较低的任务,都将重新计划 immediately

    taskDelay(n>0) 将当前任务放在就绪队列的后面,用于该优先级,并且不会为 n ticks重新安排它 . 这将允许任何较低优先级的就绪任务运行 .

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

    NOTE: 该系统时钟与CPU频率不同 .

  • 1

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

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

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

相关问题