task - 什么时候可以将任务从阻塞状态切换到暂停状态?
问题描述
我注意到在 [-1-] 的状态转换图中。存在从阻塞状态切换到暂停状态的可能性vTaskSuspend()
。我的问题是, 什么时候可能,在什么情况下这很有用?. 另外,我想注意到其他作者没有像 [-2,3-] 那样涵盖这种可能性。但是,在 CMSIS-RTOS2 [-4-] 中,它确实存在从阻塞状态到非活动/终止状态的相同行为。
这里的图表:
[1,p.93]-> FreeRTOS Barry, Richard。2016. 掌握 FreeRTOS 实时内核。动手教程指南。可在https://freertos.org/Documentation/RTOS_book.html中找到
[2,p.352]-> 夏聪 范夏聪。2015. 实时嵌入式系统设计原则和工程实践
[3,p.149]-> 钱倩,凯等人。2009 嵌入式软件开发
[4] CMSIS-RTOS2在线可用。https://www.keil.com/pack/doc/CMSIS/RTOS2/html/group__CMSIS__RTOS__ThreadMgmt.html
解决方案
在 FreeRTOS 中,暂停的任务在明确恢复之前不会被视为/没有资格运行。挂起的任务无限期地保持挂起,而阻塞的任务保持阻塞,直到事件发生或计时器到期。vTaskSuspend() 将任务句柄作为输入,因此正在运行的任务有可能挂起另一个可能被阻止的任务。(任务必须正在运行才能暂停自身。)
这是使用挂起的一个示例用例(可能还有更多用例)。想象一个用户可以在两种模式(运行或编程)之间切换的设备。在运行模式下,设备具有定期执行测量的任务。当用户切换到程序模式时,周期性测量任务被暂停。当用户切换到运行模式时,周期性测量任务将恢复。设备处于程序模式的时间是不确定的,因为它取决于不可预知的用户。
其他 RTOS 中的 Sleeping 和 Inactive/Terminated 状态与 FreeRTOS 的 Suspended 状态并不直接相似。对于 2 和 3,看起来 Sleeping 意味着任务将在计时器到期时变为 Ready。该行为被合并到 FreeRTOS 的 Blocked 状态中。对于 4,Inactive/Terminated 状态需要重新创建任务。这似乎更类似于 FreeRTOS 的 vTaskDelete()/xTaskCreate()。其他 RTOS 的图表中根本没有显示非活动/终止/删除状态。
推荐阅读
- notepad++ - 如何在记事本++中删除两个字符串之间的文本
- javascript - 单击处理程序模拟函数不会被调用
- html - 不同块中的标题文本无响应
- ibm-mq - strmqcfg 不启动 ibm mq websphere
- swift4 - 遍历 Mongokitten 中 find 操作的结果
- python - 带有或条件的while循环
- java - @Test(expected = Exception.class) 对我不起作用,我错过了什么?
- angular - 角度错误处理程序
- dependency-injection - 依赖注入上升趋势
- zapier - 在 zapier 中,我使用 RSS 触发。我想在原始数据使用 webhook 操作中添加一个额外的对