Bootstrap

FreeRTOS(三)FreeRTOS任务挂起和恢复与中断

在 FreeRTOS 中,任务挂起(Suspend)和恢复(Resume)是用于控制任务执行流程的两个重要操作。挂起一个任务会使其暂停执行,而恢复一个任务则使其重新进入调度器的考虑范围,可能在适当的时候被调度执行。

在 FreeRTOS 中,如果需要临时停止某个任务的执行,但又希望保留其状态和变量值,可以使用任务挂起和恢复的功能,而不是删除并重新创建任务。当任务需要暂停一段时间时,可以将其挂起;当准备再次运行该任务时,可以将其恢复。这样,任务的运行状态和变量值都会保持不变,避免了删除和重建任务时可能导致的数据丢失问题。通过这种方式,可以有效地管理任务的执行流程,同时确保任务数据的完整性。

任务挂起

void vTaskSuspend( TaskHandle_t xTaskToSuspend );

 此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。退出挂 起态的唯一方法就是调用任务恢复函数vTaskResume()或xTaskResumeFromISR()。

参数

  • xTaskToSuspend:要挂起的任务的句柄。
  • 注意!如果参数为NULL的话表示挂起任务自己。

       无返回值

功能描述

  • 当调用 vTaskSuspend() 时,指定的任务会被挂起。如果该任务正在执行,它将立即停止,并从就绪任务列表中移除,直到被显式恢复。

补充:

如果使用函数 xTaskCreate()创建任务的话那么函数的参数 pxCreatedTask 就是此任务的任务句柄,如果使用函数xTaskCreateStatic() 创建任务的话那么函数的返回值就是此任务的任务句柄。也可以通过函 数xTaskGetHandle()来根据任务名字来获取某个任务的任务句柄

任务恢复 

void vTaskResume( TaskHandle_t xTaskToResume );

 将一个任务从挂起态恢复到就绪态,只有通过函数 vTaskSuspend()设置为挂起态的任务才 可以使用vTaskRexume()恢复!

参数
  • xTaskToResume:要恢复的任务的句柄。
功能描述
  • vTaskResume() 用于恢复之前被挂起的任务。该任务将重新被放入就绪任务列表,调度器将根据任务优先级决定何时执行它。

中断管理

FreeRTOS使用的是中断优先级分组是:NVIC_PriorityGroup_4

通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置

抢占优先级:0-15级抢占优先级;子优先级:0级子优先级

低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级(5-15)的中断里才允许调用FreeRTOS 的API函数

FreeRTOS 的任务调度器依赖于一个稳定的时钟中断来定期执行任务切换。如果一个高优先级的中断服务例程(ISR)调用了可能会引起任务切换的 FreeRTOS API 函数,那么它可能会破坏调度器的状态,导致不可预测的行为和系统崩溃。

中断优先级数值越小越优先,任务优先级数值越大越优先

;