本文主要是介绍STM32H750之FreeRTOS学习--------(三)任务的挂起与恢复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
三、任务的挂起与恢复
任务挂起
void vTaskSuspend(TaskHandle_t xTaskToSuspend) //在任务中挂起
xTaskToSuspend 待挂起任务的任务句柄
使用时需将宏 INCLUDE_vTaskSuspend 配置为 1
挂起后的任务无论优先级多大,都不再执行,直到任务被恢复
传入参数为NULL时,代表挂起当前任务,即当前正在运行的任务
任务挂起内部实现
获取所要挂起任务的控制块
通过传入的任务句柄,判断所需要挂起哪个任务,NULL代表挂起自身移除所在列表
将要挂起的任务从相应的状态列表和事件列表中移除(就绪或阻塞列表)
插入挂起任务列表
将待挂起任务的任务状态列表向插入到挂起态任务列表末尾
判断任务调度器是否运行
在运行,更新下一次阻塞时间,防止被挂起任务为下一次阻塞超时任务
判断待挂起任务是否为当前任务
如果挂起的是任务自身,且调度器正在运行,需要进行一次任务切换
调度器没有运行,判断挂起任务数是否等于任务总数,是:当前控制块赋值为NULL,否:寻找下一个最高优先级任务
任务恢复
void vTaskResume(TaskHandle_t xTaskToResume) //在任务中恢复
- xTaskToResume 待恢复任务的任务句柄
- 使用时需将宏 INCLUDE_vTaskSuspend 配置为 1
- 任务无论被挂起多少次,只需要在任务中恢复一次,就可以继续运行
- 被恢复的任务会处于就绪态
任务恢复内部实现
恢复任务不能是正在运行任务
判断任务是否在挂起列表中
将该任务在挂起列表中移除, 将该任务添加到就绪列表中判断恢复任务优先级
判断恢复的任务优先级是否大于当前正在运行的 是的话执行任务切换
在中断中恢复任务
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)
- xTaskToResume 待恢复任务的任务句柄
- 使用该函数注意宏:INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为 1
- 该函数用于中断服务函数中,用于恢复被挂起的任务
- 中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级
FreeRTOS管理的优先级5-15
返回值
- pdTRUE 任务恢复后需要进行任务切换
e)
``
- xTaskToResume 待恢复任务的任务句柄
- 使用该函数注意宏:INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为 1
- 该函数用于中断服务函数中,用于恢复被挂起的任务
- 中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级
FreeRTOS管理的优先级5-15
返回值
- pdTRUE 任务恢复后需要进行任务切换
- pdFALSE 任务恢复后不需要进行任务切换
这篇关于STM32H750之FreeRTOS学习--------(三)任务的挂起与恢复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!