FreeRTOS 任务挂起和恢复

Myth丶恋晨 2022-06-08 08:37 324阅读 0赞

在使用RTOS的时候一个实时应用可以作为一个独立的任务。每个任务都有自己的运行环境, 不依赖于系统中其他的任务或者RTOS调度器。 任何一个时间点只能有一个任务运行,具体运行哪个任务是由RTOS调度器来决定的, RTOS调度器因此就会重复的开启、关闭每个任务

任务状态
运行态
当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在
使用处理器的任务

就绪态
可以运行的任务。有一个同优先级或者更高优先级的任务正在运行

阻塞态
一个任务当前正在等待某个外部事件

挂起态
进入挂起态以后也不能被调度器调用。任务进入和退出挂起态通过调用函数vTaskSuspend()和xTaskResume()

任务状态转换
1

任务创建

  1. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //函数指针
  2. const char * const pcName,
  3. const uint16_t usStackDepth, //堆栈大小
  4. void * const pvParameters, //给任务传递参数
  5. UBaseType_t uxPriority, //任务的优先级
  6. TaskHandle_t * const pxCreatedTask /*任务句柄*/) PRIVILEGED_FUNCTION;

pxTaskCode:任务函数
pcName:任务名字
usStackDepth:任务堆栈大小
pvParameters:传递给任务函数的参数
uxPriority:任务优先级
pxCreatedTask:任务句柄

  1. TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
  2. const char * const pcName,
  3. const uint32_t ulStackDepth,
  4. void * const pvParameters,
  5. UBaseType_t uxPriority,
  6. StackType_t * const puxStackBuffer,
  7. StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION;

puxStackBuffer:任务堆栈。一般为数组
pxTaskBuffer:任务控制块

任务删除

  1. void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;

xTaskToDelete:任务句柄

挂起任务

  1. void vTaskSuspend( TaskHandle_t xTaskToSuspend )

恢复任务

  1. void vTaskResume( TaskHandle_t xTaskToResume )

中断服务函数中恢复任务运行

  1. BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )

举例

  1. TaskHandle_t pxCreatedTask;
  2. void TIM4_IRQHandler()
  3. {
  4. if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1)
  5. {
  6. xTaskResumeFromISR(pxCreatedTask); //中断服务函数中恢复任务运行
  7. }
  8. TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  9. }
  10. void key()
  11. {
  12. static u8 flag = 1;
  13. if(flag == 1 && key_up == 1)
  14. {
  15. vTaskDelay(10);
  16. if(key_up == 1)
  17. {
  18. flag = 0;
  19. vTaskSuspend(pxCreatedTask); //挂起任务
  20. }
  21. }
  22. else if(key_up == 0)
  23. {
  24. vTaskDelay(10);
  25. if(key_up == 0)
  26. {
  27. flag = 1;
  28. }
  29. }
  30. }
  31. void vTask_key(void *t)
  32. {
  33. while(1)
  34. {
  35. key();
  36. }
  37. }
  38. int main(void)
  39. {
  40. TIM4_init(10000, 36000-1); //初始化定时器(详见定时器章节)
  41. xTaskCreate(vTask, "vTask", 50, NULL, 1, &pxCreatedTask);
  42. xTaskCreate(vTask_key, "vTask_key", 50, NULL, 2, NULL);
  43. vTaskStartScheduler();
  44. }

实验现象:当按键按下,挂起任务。当定时器中断产生,恢复任务运行

发表评论

表情:
评论列表 (有 0 条评论,324人围观)

还没有评论,来说两句吧...

相关阅读