VXWORKS 任务如何让所有其他优先级较低的任务在单个多任务周期内运行



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

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

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

我一直认为 taskDelay(0) 让我们运行所有其他同等或更高优先级的任务。

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

如果更高

优先级的任务准备就绪,并且您尚未调用taskLock()intLock()等,则优先级较高的任务将始终运行,因此您无需taskDelay()即可让更高优先级的任务运行。

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

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

taskDelay()的参数是即时报价,而不是毫秒。其长度可以根据系统clk速率(由sysClkRateSet()设置,并由sysClkRateGet()读取)确定。1 个时钟周期可能等于 1 毫秒,但前提是系统时钟速率为 1000。它可能不会。默认速率为 60,给出 16ms 的时钟周期,但这通常在内核配置中静态覆盖,或通过调用 sysClkRateSet() 动态

覆盖

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

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

例如,如果 sysClkRateGet() 返回 10,则每个时钟周期为 100 毫秒。所以如果你调用 taskDelay(1),那么这将告诉你的任务休眠,直到下一个系统滴答作响。但是,这并不能保证 100 毫秒的睡眠时间,而是保证睡眠时间长达 100 毫秒,如果下一个时钟滴答即将到来,则睡眠时间仅为 0 毫秒。如果调用 taskDelay(2),则任务将休眠,直到下一个时钟周期(介于 0 和 100 毫秒之间的某个时间)加上下一个时钟周期(保证为 100 毫秒) - 导致总延迟在 100 毫秒到 200 毫秒之间。

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

最新更新