FreeRTOS学习(三)

任务的挂起与恢复API函数

  • vTaskSuspend():挂起任务
  • vTaskResume():恢复被挂起的任务
  • vTaskResumeFromISR():在中断中恢复被挂起的任务

挂起任务类似暂停,可恢复;删除任务,无法恢复
带有后缀FromISR是中断函数中专用的API函数

任务挂起函数

void vTaskSuspend(TaskHandle_t xTaskToSuspend)
形参:待挂起任务的任务句柄
使用时需将宏INCLUDE_vTaskSuspend置1
无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复。

任务恢复函数(任务中被恢复)

void vTaskResume(TaskHandle_t xTaskToResume).
无论任务被挂起多少次,只需在任务中调用vTaskResume()恢复一次。

任务恢复函数(中断中被恢复)

BaseType_t vTaskResume(TaskHandle_t xTaskToResume).
返回值

  • pdTRUE:任务恢复后需要进行任务切换(恢复任务的优先级大于当前任务的优先级)。
  • pdFALSE:任务恢复后不需要进行任务切换。

需要将宏INCLUDE_vTaskSuspend置1和INCLUDE_xTaskResumeFromISR定义为1。
任务切换函数:portYIELD_FROM_ISR(xYieldRequied)

中断服务程序中要调用FreeRTOS的API函数则中断优先级不能高于FreeRTOS管理的最高优先级。5~15

如果将STM32与STM32驱动程序库一起使用,则在启动RTOS时,通过调用NIVC_PriorityGroupConfig(NVIC_PriorityGroup_4)来确保所有优先级位分配为抢占优先级。

中断优先级和任务优先级不一样,任务优先级数值越大优先级越高,中断优先级数值越小优先级越高。
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //系统可管理的最高中断优先级

任务挂起函数

  1. 根据任务句柄获取任务控制块,如果任务句柄为NULL,表示挂起自身。
  2. 将要挂起的任务从相应的状态列表和事件列表中移除。
  3. 将待挂起任务的任务列表项插入到挂起态任务列表末尾。vListInsertEnd(&xSuspendedTaskList,&(pxTCB->xStateListItem));
  4. 判断任务调度器是否运行,在运行,更新下一次阻塞时间,防止被挂起任务为下一次阻塞超时任务。

你可能感兴趣的:(FreeRTOS,学习,单片机,stm32)