首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VxWorks信号

VxWorks信号
EN

Stack Overflow用户
提问于 2013-01-24 22:31:53
回答 3查看 3.2K关注 0票数 2

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

代码是:

代码语言:javascript
复制
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)一起工作吗

EN

回答 3

Stack Overflow用户

发布于 2013-01-27 01:14:29

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

高优先级任务正在执行高优先级任务问题taskDelay(0)

  • Scheduler被调用并扫描下一个要运行的任务时,它将选择最高优先级的任务“ready”

  • 发出taskDelay(0)的任务已准备就绪,因为延迟已经过期(即已经过了0个刻度)

  • 因此立即重新调度高优先级任务,在这种情况下taskDelay(0)实际上是对CPU周期的浪费。

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

现在有一些设计不佳的系统,它们做的事情如下:

代码语言:javascript
复制
taskLock();
...
taskDelay(0);
...
taskUnlock();

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

同样,在您的情况下,我会考虑一个更健壮的系统,而不是执行taskDelay()来允许低优先级任务处理事件,您应该向低优先级任务发送消息,并让低优先级任务处理消息队列。而你的高优先级任务阻塞在由你的事件处理程序或类似的东西给出的信号量上。在这种情况下,你希望在两个不同的任务之间强制乒乓来完成一个任务,但是如果你添加一个队列作为缓冲,那么只要你的系统是可调度的(即有足够的时间响应所有事件,将它们排队并完全处理它们),那么它就会工作。

更新

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

发生中断优先级事件( driven?).

  1. High
  2. 任务运行以收集数据。低优先级任务处理
  3. 数据。

如果是这种情况,你想要遵循的模式实际上是非常简单的,实际上只需一项任务就可以完成:

中断处理程序收集数据,并向任务发送一条消息(msgQSend())。任务在具有msgQReceive的消息队列中处于挂起状态。

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-11 10:30:21

这正是我不明白当高优先级任务运行时,低优先级任务如何获得一些

时间的原因?

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-23 01:01:45

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

第一部分:

vxWorks中的TaskDelay可能会混淆:

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

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

顺便说一句,它和taskDelay(NO_WAIT)是一样的。

TaskDelay(1) -这将延迟调用任务,延迟时间介于零(!)到1个系统节拍。vxWorks中的延迟以系统节拍结束。

TaskDelay(2) -有时介于1到2个系统节拍之间。

3个……(理解…)

TaksDelay(-1) (A.K.A taskDelay(WAIT_FOREVER)) -将永远延迟任务(不推荐)。

第二部分:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14503720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档