首页 > 解决方案 > 什么时候可以将任务从阻塞状态切换到暂停状态?

问题描述

我注意到在 [-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

标签: taskstateschedulerfreertosrtos

解决方案


在 FreeRTOS 中,暂停的任务在明确恢复之前不会被视为/没有资格运行。挂起的任务无限期地保持挂起,而阻塞的任务保持阻塞,直到事件发生或计时器到期。vTaskSuspend() 将任务句柄作为输入,因此正在运行的任务有可能挂起另一个可能被阻止的任务。(任务必须正在运行才能暂停自身。)

这是使用挂起的一个示例用例(可能还有更多用例)。想象一个用户可以在两种模式(运行或编程)之间切换的设备。在运行模式下,设备具有定期执行测量的任务。当用户切换到程序模式时,周期性测量任务被暂停。当用户切换到运行模式时,周期性测量任务将恢复。设备处于程序模式的时间是不确定的,因为它取决于不可预知的用户。

其他 RTOS 中的 Sleeping 和 Inactive/Terminated 状态与 FreeRTOS 的 Suspended 状态并不直接相似。对于 2 和 3,看起来 Sleeping 意味着任务将在计时器到期时变为 Ready。该行为被合并到 FreeRTOS 的 Blocked 状态中。对于 4,Inactive/Terminated 状态需要重新创建任务。这似乎更类似于 FreeRTOS 的 vTaskDelete()/xTaskCreate()。其他 RTOS 的图表中根本没有显示非活动/终止/删除状态。


推荐阅读