在RTOS中释放或发出信号时会发生什么?

阿尼什库马尔

假设有6个任务,其中6个(任务)中的4个正在等待信号量。发出信号量时,RTOS会做出什么决定

  1. 从等待(信号量)列表中选择哪些任务
  2. 如果从等待列表中选择一项任务,剩下的任务将会发生什么,即它们何时运行。
  3. 当已经有更高优先级的任务正在运行时。

所有RTOS的解决方案都一样吗

克拉博姆

如果这是基于优先级的抢占式多任务处理系统,则RTOS调度程序将运行可运行的最高优先级任务。当信号量发出信号时,RTOS调度程序会重新评估最高优先级的准备运行任务,如果与先前运行的任务不同,它将执行到该任务的上下文切换。

当有多个任务等待相同的信号量并且该信号量被信号通知时,则:

  1. 等待信号量的任务中优先级最高的任务将准备就绪。
  2. 其余任务将继续等待信号量。
  3. 如果先前运行的任务的优先级高于已准备就绪的任务,则先前运行的任务将继续运行。即使已将等待任务准备就绪,它也不会运行,直到它成为可以运行的最高优先级任务。

对于所有基于优先级的抢占式多任务RTOS,以上情况均适用,但不一定是所有RTOS。如果RTOS不支持优先任务,则它可能会将信号授予最长等待信号的任务。而且它也可能使用循环调度程序,以便每个任务都在预定的时隙中运行,而不是允许任务彼此异步抢占。

后续:如果您将信号灯用作事件信号,并且有多个任务使用该事件,那么您将必须仔细考虑设计。我不相信使用单个二进制信号量就可以做到这一点。因为如果最高优先级的使用者任务获得了信号量,然后进行了业务,然后在再次发出信号量之前再次等待该信号量,那么最高优先级的使用者将始终在每次发出信号时都得到该信号量。优先级较低的使用者任务将永远不会运行,因为它们永远不会被授予信号量。

一种可能的解决方案是使用计数信号量。事件发生时,信号量计数应设置为等于消耗任务的数量。然后,每个使用任务都会获得信号量,并将计数减一。消费任务不应再等待信号量,直到信号量计数减少到零为止。这将防止最高优先级的使用者在每个事件中多次获得信号灯,因此,它将允许每个使用者任务在响应事件时仅运行一次。

您可能想探索发布-订阅设计模式,以查看是否有更好的方法来解决您的情况的此要求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

小部件失去焦点时会发出什么信号?

来自分类Dev

当我释放Delphi中可能不存在的内存时会发生什么?

来自分类Dev

暂停时会发生什么?

来自分类Dev

选择/单击 QScrollArea 条目时会发出什么样的信号?

来自分类Dev

当您从《虚无》中抽奖时会发生什么?

来自分类Dev

在lldb中打印Swift对象(po)时会发生什么?

来自分类Dev

VHDL中的整数超出范围时会发生什么?

来自分类Dev

当函数在python中返回自己的名称时会发生什么?

来自分类Dev

当软件包在源中重复时会发生什么?

来自分类Dev

当Final块中的代码引发异常时会发生什么?

来自分类Dev

在C ++标准中,当违反“应”要求时会发生什么?

来自分类Dev

在SVN中删除中继时会发生什么标记

来自分类Dev

在python中的str上使用encoding时会发生什么?

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

当您在python中设置字典时会发生什么?

来自分类Dev

在SwiftUI中,显示操作表时会发生什么?

来自分类Dev

为什么在文件中写入csv时会发生错误?

来自分类Dev

当flet在递归函数中时会发生什么?

来自分类Dev

当声明符(我/州)在for块中时会发生什么?

来自分类Dev

在AngularJS中删除ngRepeat使用的对象时会发生什么?

来自分类Dev

当软件包在源中重复时会发生什么?

来自分类Dev

在浏览器中请求URL时会发生什么?

来自分类Dev

在tar中目录内容更改时会发生什么?

来自分类Dev

在SVN中删除中继时会发生什么标记

来自分类Dev

当“丢弃” APNS中的通知时会发生什么?

来自分类Dev

从字典中删除值(对象)时会发生什么?

来自分类Dev

当电池在 Ubuntu 18.04 中充满电时会发生什么?

来自分类Dev

在 C++ 中为对象赋值时会发生什么

来自分类Dev

当非root用户向root用户的进程发送信号时会发生什么?

Related 相关文章

  1. 1

    小部件失去焦点时会发出什么信号?

  2. 2

    当我释放Delphi中可能不存在的内存时会发生什么?

  3. 3

    暂停时会发生什么?

  4. 4

    选择/单击 QScrollArea 条目时会发出什么样的信号?

  5. 5

    当您从《虚无》中抽奖时会发生什么?

  6. 6

    在lldb中打印Swift对象(po)时会发生什么?

  7. 7

    VHDL中的整数超出范围时会发生什么?

  8. 8

    当函数在python中返回自己的名称时会发生什么?

  9. 9

    当软件包在源中重复时会发生什么?

  10. 10

    当Final块中的代码引发异常时会发生什么?

  11. 11

    在C ++标准中,当违反“应”要求时会发生什么?

  12. 12

    在SVN中删除中继时会发生什么标记

  13. 13

    在python中的str上使用encoding时会发生什么?

  14. 14

    在Git中删除分支时会发生什么情况

  15. 15

    当您在python中设置字典时会发生什么?

  16. 16

    在SwiftUI中,显示操作表时会发生什么?

  17. 17

    为什么在文件中写入csv时会发生错误?

  18. 18

    当flet在递归函数中时会发生什么?

  19. 19

    当声明符(我/州)在for块中时会发生什么?

  20. 20

    在AngularJS中删除ngRepeat使用的对象时会发生什么?

  21. 21

    当软件包在源中重复时会发生什么?

  22. 22

    在浏览器中请求URL时会发生什么?

  23. 23

    在tar中目录内容更改时会发生什么?

  24. 24

    在SVN中删除中继时会发生什么标记

  25. 25

    当“丢弃” APNS中的通知时会发生什么?

  26. 26

    从字典中删除值(对象)时会发生什么?

  27. 27

    当电池在 Ubuntu 18.04 中充满电时会发生什么?

  28. 28

    在 C++ 中为对象赋值时会发生什么

  29. 29

    当非root用户向root用户的进程发送信号时会发生什么?

热门标签

归档