gpt4 book ai didi

rtos - 当信号量在 RTOS 中被释放或发出信号时会发生什么?

转载 作者:行者123 更新时间:2023-12-05 00:57:26 24 4
gpt4 key购买 nike

假设有 6 个任务,在 6 个中,有 4 个(任务)正在等待一个信号量。当信号量发出信号时, 会做出什么决定?实时操作系统

  1. which tasks to pick from the waiting(for semaphore) list
  2. if one task is picked from the waiting list what will happen to remaining task i.e when will they run.
  3. when already a higher priority task is running.


所有 的解决方案是否相同?实时操作系统

最佳答案

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

当有多个任务等待同一个信号量并且该信号量发出信号时:

  • 等待信号量的任务中优先级最高的任务将准备好运行。
  • 剩下的任务会继续等待信号量。
  • 如果先前运行的任务的优先级高于已准备好运行的任务,则先前运行的任务将继续运行。即使等待任务已准备好运行,它也不会运行,直到它成为准备运行的最高优先级任务。

  • 上述情况适用于所有基于优先级的抢占式多任务 RTOS,不一定是所有 RTOS。如果 RTOS 不支持优先任务,那么它可能会将信号量奖励给等待信号量最长的任务。并且它也可能使用循环调度程序,以便每个任务在预定的时间段内运行,而不是允许任务异步抢占对方。

    跟进:
    如果您将信号量用作事件信号,并且有多个任务消耗该事件,那么您将不得不仔细考虑设计。我不相信这可以用一个二进制信号量来完成。因为如果最高优先级的消费者任务拿到信号量,做它的业务,然后在再次发出信号量之前再次等待信号量,那么最高优先级的消费者每次发出信号量时总会拿到信号量。较低优先级的消费者任务将永远不会运行,因为它们永远不会被授予信号量。

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

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

    关于rtos - 当信号量在 RTOS 中被释放或发出信号时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34557050/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com