任务什么时候可以从阻塞状态切换到挂起状态?

问题描述

我在 [-1-] 的状态转换图中注意到了这一点。存在使用 vTaskSuspend() 从阻塞状态切换到挂起状态的可能性。 我的问题是, 什么时候可能,这在哪些情况下有用?。另外,我想注意到其他作者没有像 [-2,3-] 中的情况那样涵盖这种可能性。但是,在 CMSIS-RTOS2 [-4-] 中,它确实存在从阻塞状态到非活动/终止状态的相同行为。

这里是图表:

[1,p.93]-> FreeRTOS 巴里,理查德。 2016. 掌握 FreeRTOS 实时内核。动手教程指南。 https://freertos.org/Documentation/RTOS_book.html

提供

[2,p.352]-> Xiacong 范夏聪。 2015. 实时嵌入式系统设计原理与工程实践

[3,p.149]-> Qian 钱凯等人。 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 的阻塞状态。对于 4,非活动/终止状态需要重新创建任务。这似乎更类似于 FreeRTOS 的 vTaskDelete()/xTaskCreate()。其他 RTOS 的图表中根本没有显示非活动/终止/删除状态。