2

我对 VxWorks 论坛中提出的先前问题有疑问。我的目标是当高优先级函数产生一个信号时,低优先级函数将立即处理它(高优先级函数必须被抢占)

代码是:

sig_hdr () { ... }
task_low_priority() {
    ...
    // Install signal handler for SIGUSR1
    signal(SIGUSR1, sig_hdr);

    ...
}

task_high_priority() {
    ...
    kill(pid, SIGUSR1); //pid is the ID of task_low_priority
    ...
} 

行后: signal(SIGUSR1, sig_hdr); 我添加了 taskDelay(0). 我想阻止高优先级任务,以便低优先级任务可以获得 CPU 以执行信号处理程序,但除非我这样做,否则它不会发生taskDelay(1)

谁能解释为什么它不起作用taskDelay(0)

4

3 回答 3

1

实际上,taskDelay(0) 不会让较低优先级的任务运行,原因如下:

  1. 高优先级任务正在执行
  2. 高优先级任务问题 taskDelay(0)
  3. 调度程序被调用并扫描下一个要运行的任务,它将选择“就绪”的最高优先级任务
  4. 发出 taskDelay(0) 的任务已就绪,因为延迟已过期(即 0 个滴答已过)
  5. 因此,高优先级任务会立即重新调度,在这种情况下 taskDelay(0) 实际上是在浪费 CPU 周期。

现在,在您发出 taskDelay(1) 的情况下,将遵循相同的步骤,但不同之处在于,高优先级任务未处于就绪状态,因为未经过一个滴答,因此就绪的较低优先级任务可以CPU时间1滴,然后它将被高优先级任务抢占。

现在有一些设计不佳的系统可以执行以下操作:

taskLock();
...
taskDelay(0);
...
taskUnlock();

目的是让低优先级任务占用 CPU 直到某个点,然后通过发出 taskDelay(0) 允许高优先级任务接管。但是,如果您玩这样的游戏,那么您应该重新考虑您的设计。

同样在您的情况下,我会考虑一个更强大的系统,而不是执行 taskDelay() 来允许低优先级任务处理事件,您应该将消息发送到低优先级任务并让该低优先级任务来处理消息队列。当您的高优先级任务阻塞由事件处理程序或类似事物提供的信号量时。在这种情况下,您希望在两个不同的任务之间强制进行乒乓操作以完成工作,但是如果您添加一个充当缓冲区的队列,那么只要您的系统是可调度的(即有足够的时间来响应对于所有事件,将它们排队并完全处理它们)然后它将起作用。


更新

我假设您的系统应该是这样的:

  1. 事件发生(中断驱动?)。
  2. 高优先级任务运行以收集数据。
  3. 数据由低优先级任务处理。

如果是这种情况,您要遵循的模式实际上非常简单,实际上只需 1 个任务即可完成:

中断处理程序收集数据,并向任务发送消息 (msgQSend())。带有 msgQReceive 的消息队列中的任务正在挂起。

但是,如果我对您的系统有更多了解(您真正想要做什么)以及为什么您使用 posix 调用而不是本机 vxworks 调用,这可能会有所帮助。


如果您是实时系统的新手,您应该了解速率单调分析,维基百科上有一个非常简短的总结:

http://en.wikipedia.org/wiki/Rate-monotonic_scheduling

另请注意,在 VxWorks 中,“高优先级”是 0,“低优先级”是 255,实际数字与它们的含义成反比:D

于 2013-01-26T17:14:29.173 回答
0

我的答案有 2 个部分: 1. 如何正确使用 vxWorks 的任务延迟 2. TaskDelay 不是解决您问题的正确方法

第一部分:

vxWorks 中的 TaskDelay 可能会混淆:

taskDelay(0) – 根本不执行延迟!!!

这是调度程序从 CPU 中删除当前任务的命令。如果这仍然是系统中优先级最高的任务,它将毫无延迟地返回队列的头部。如果调度程序配置为 FIFO 以防相同优先级的任务并且您的任务有 CPU 实时消费者功能要运行,您将使用此命令,可以尝试为相同优先级的其他任务释放 CPU(很好)。

顺便说一句,它与 taskDelay(NO_WAIT) 相同。

TaskDelay(1) – 这将在零 (!!!) 到 1 个系统滴答之间的某个时间延迟调用任务。vxWorks 中的延迟在一轮系统滴答声中完成。

TaskDelay(2) – 有时在 1 个系统滴答到 2 个系统滴答之间。

3 ……(明白了……)

TaksDelay(-1) (AKA taskDelay(WAIT_FOREVER)) – 将永远延迟任务(不推荐)。

第二部分:

使用 taskDelay 启用低优先级任务可能是一个错误的想法。您没有提供所有问题信息,但请注意延迟高优先级任务并不能确保您的低优先级任务将运行(无论您将编写的睡眠时间)。高优先级和低优先级任务中的其他最高优先级任务可能会在所有“睡眠时间”中运行。vxWorks 中有几种同步方法,如二进制信号量、更改任务优先级、信号……

于 2013-05-22T17:01:44.603 回答
0

这正是我不明白当高优先级任务运行时低优先级任务将如何获得一些 CPU 时间的一点?

高优先级任务将继续运行,直到它被阻塞。O一旦它被阻塞,准备运行的低优先级任务将运行。

于 2013-03-11T02:30:21.490 回答