实际上,taskDelay(0) 不会让较低优先级的任务运行,原因如下:
- 高优先级任务正在执行
- 高优先级任务问题 taskDelay(0)
- 调度程序被调用并扫描下一个要运行的任务,它将选择“就绪”的最高优先级任务
- 发出 taskDelay(0) 的任务已就绪,因为延迟已过期(即 0 个滴答已过)
- 因此,高优先级任务会立即重新调度,在这种情况下 taskDelay(0) 实际上是在浪费 CPU 周期。
现在,在您发出 taskDelay(1) 的情况下,将遵循相同的步骤,但不同之处在于,高优先级任务未处于就绪状态,因为未经过一个滴答,因此就绪的较低优先级任务可以CPU时间1滴,然后它将被高优先级任务抢占。
现在有一些设计不佳的系统可以执行以下操作:
taskLock();
...
taskDelay(0);
...
taskUnlock();
目的是让低优先级任务占用 CPU 直到某个点,然后通过发出 taskDelay(0) 允许高优先级任务接管。但是,如果您玩这样的游戏,那么您应该重新考虑您的设计。
同样在您的情况下,我会考虑一个更强大的系统,而不是执行 taskDelay() 来允许低优先级任务处理事件,您应该将消息发送到低优先级任务并让该低优先级任务来处理消息队列。当您的高优先级任务阻塞由事件处理程序或类似事物提供的信号量时。在这种情况下,您希望在两个不同的任务之间强制进行乒乓操作以完成工作,但是如果您添加一个充当缓冲区的队列,那么只要您的系统是可调度的(即有足够的时间来响应对于所有事件,将它们排队并完全处理它们)然后它将起作用。
更新
我假设您的系统应该是这样的:
- 事件发生(中断驱动?)。
- 高优先级任务运行以收集数据。
- 数据由低优先级任务处理。
如果是这种情况,您要遵循的模式实际上非常简单,实际上只需 1 个任务即可完成:
中断处理程序收集数据,并向任务发送消息 (msgQSend())。带有 msgQReceive 的消息队列中的任务正在挂起。
但是,如果我对您的系统有更多了解(您真正想要做什么)以及为什么您使用 posix 调用而不是本机 vxworks 调用,这可能会有所帮助。
如果您是实时系统的新手,您应该了解速率单调分析,维基百科上有一个非常简短的总结:
http://en.wikipedia.org/wiki/Rate-monotonic_scheduling
另请注意,在 VxWorks 中,“高优先级”是 0,“低优先级”是 255,实际数字与它们的含义成反比:D