你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】FreeRTOS任务挂起和恢复示例

[复制链接]
STMCU小助手 发布时间:2022-3-26 14:00
01. 概述
任务挂起和恢复,当某个任务要停止运行一段时间就可以将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。

02. 功能描述
设计三个任务:start_task、task1_task和task2_task,这三个任务的功能分别如下:

start_task: 用来创建其它两个任务。

task1_task: 当此任务运行5秒以后就会调用函数vTaskSuspend()挂起任务task2_task,当此任务运行10秒以后就会调用函数vTaskResume()恢复任务task2_task该任务控制LED0的闪烁,并且周期性的输出信息到串口中。

task2_task:普通的应用任务,此任务控制LED1的闪烁,并且周期性的输出信息到串口中。

03. 任务设计
任务优先级,堆栈大小,任务句柄和任务函数

  1. //任务优先级
  2. #define START_TASK_PRIO                1
  3. //任务堆栈大小        
  4. #define START_STK_SIZE                 128  
  5. //任务句柄
  6. TaskHandle_t StartTask_Handler;
  7. //任务函数
  8. void start_task(void *pvParameters);

  9. //任务优先级
  10. #define TASK1_TASK_PRIO                2
  11. //任务堆栈大小        
  12. #define TASK1_STK_SIZE                 50  
  13. //任务句柄
  14. TaskHandle_t Task1Task_Handler;
  15. //任务函数
  16. void task1_task(void *pvParameters);

  17. //任务优先级
  18. #define TASK2_TASK_PRIO                3
  19. //任务堆栈大小        
  20. #define TASK2_STK_SIZE                 50  
  21. //任务句柄
  22. TaskHandle_t Task2Task_Handler;
  23. //任务函数
  24. void task2_task(void *pvParameters);
复制代码

start_task函数

  1. //开始任务任务函数
  2. void start_task(void *pvParameters)
  3. {
  4.     taskENTER_CRITICAL();           //进入临界区
  5.         
  6.     //创建TASK1任务
  7.     xTaskCreate((TaskFunction_t )task1_task,            
  8.                 (const char*    )"task1_task",           
  9.                 (uint16_t       )TASK1_STK_SIZE,
  10.                 (void*          )NULL,                                
  11.                 (UBaseType_t    )TASK1_TASK_PRIO,        
  12.                 (TaskHandle_t*  )&Task1Task_Handler);   
  13.     //创建TASK2任务
  14.     xTaskCreate((TaskFunction_t )task2_task,     
  15.                 (const char*    )"task2_task",   
  16.                 (uint16_t       )TASK2_STK_SIZE,
  17.                 (void*          )NULL,
  18.                 (UBaseType_t    )TASK2_TASK_PRIO,
  19.                 (TaskHandle_t*  )&Task2Task_Handler);        

  20.     vTaskDelete(StartTask_Handler); //删除开始任务
  21.                                 
  22.     taskEXIT_CRITICAL();            //退出临界区
  23. }
复制代码

task1_task函数

  1. //任务1
  2. void task1_task(void *pvParameters)
  3. {
  4.         u8 task1_num = 0;
  5.         
  6.         while(1)
  7.         {
  8.                 task1_num++;
  9.                 LED0 = !LED0;
  10.                 printf("任务1已经运行%d次\r\n", task1_num);
  11.         
  12.                 if (5 == task1_num)
  13.                 {
  14.                         //任务1挂起任务2
  15.                         vTaskSuspend( Task2Task_Handler);
  16.                         printf("任务1挂起了任务2\r\n");
  17.                 }
  18.                
  19.                 if(10 == task1_num)
  20.                 {
  21.                         //任务1恢复任务2
  22.                         vTaskResume(Task2Task_Handler);
  23.                         printf("任务1恢复了任务2\r\n");
  24.                 }
  25.                
  26.                 //延时1秒 1000个时钟节拍
  27.                 vTaskDelay(1000);
  28.         }
  29. }
复制代码

task2_task函数

  1. //任务2
  2. void task2_task(void *pvParameters)
  3. {
  4.         u8 task2_num = 0;
  5.         
  6.         while(1)
  7.         {
  8.                 task2_num++;
  9.                 LED1 = !LED1;
  10.                 printf("任务2已经执行了%d次\r\n", task2_num);
  11.                
  12.                 //延时1秒 1000个时钟节拍
  13.                 vTaskDelay(1000);
  14.         }
  15. }
复制代码

04. 程序设计
main.c文件

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "FreeRTOS.h"
  6. #include "task.h"


  7. //任务优先级
  8. #define START_TASK_PRIO                1
  9. //任务堆栈大小        
  10. #define START_STK_SIZE                 128  
  11. //任务句柄
  12. TaskHandle_t StartTask_Handler;
  13. //任务函数
  14. void start_task(void *pvParameters);

  15. //任务优先级
  16. #define TASK1_TASK_PRIO                2
  17. //任务堆栈大小        
  18. #define TASK1_STK_SIZE                 50  
  19. //任务句柄
  20. TaskHandle_t Task1Task_Handler;
  21. //任务函数
  22. void task1_task(void *pvParameters);

  23. //任务优先级
  24. #define TASK2_TASK_PRIO                3
  25. //任务堆栈大小        
  26. #define TASK2_STK_SIZE                 50  
  27. //任务句柄
  28. TaskHandle_t Task2Task_Handler;
  29. //任务函数
  30. void task2_task(void *pvParameters);


  31. //主函数
  32. int main(void)
  33. {
  34.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
  35.         delay_init(168);                //初始化延时函数
  36.         uart_init(115200);             //初始化串口
  37.         LED_Init();                        //初始化LED端口
  38.         
  39.         //创建开始任务
  40.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
  41.                 (const char*    )"start_task",          //任务名称
  42.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  43.                 (void*          )NULL,                  //传递给任务函数的参数
  44.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  45.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
  46.     vTaskStartScheduler();          //开启任务调度
  47. }

  48. //开始任务任务函数
  49. void start_task(void *pvParameters)
  50. {
  51.     taskENTER_CRITICAL();           //进入临界区
  52.         
  53.     //创建TASK1任务
  54.     xTaskCreate((TaskFunction_t )task1_task,            
  55.                 (const char*    )"task1_task",           
  56.                 (uint16_t       )TASK1_STK_SIZE,
  57.                 (void*          )NULL,                                
  58.                 (UBaseType_t    )TASK1_TASK_PRIO,        
  59.                 (TaskHandle_t*  )&Task1Task_Handler);   
  60.     //创建TASK2任务
  61.     xTaskCreate((TaskFunction_t )task2_task,     
  62.                 (const char*    )"task2_task",   
  63.                 (uint16_t       )TASK2_STK_SIZE,
  64.                 (void*          )NULL,
  65.                 (UBaseType_t    )TASK2_TASK_PRIO,
  66.                 (TaskHandle_t*  )&Task2Task_Handler);        

  67.     vTaskDelete(StartTask_Handler); //删除开始任务
  68.                                 
  69.     taskEXIT_CRITICAL();            //退出临界区
  70. }

  71. //任务1
  72. void task1_task(void *pvParameters)
  73. {
  74.         u8 task1_num = 0;
  75.         
  76.         while(1)
  77.         {
  78.                 task1_num++;
  79.                 LED0 = !LED0;
  80.                 printf("任务1已经运行%d次\r\n", task1_num);
  81.         
  82.                 if (5 == task1_num)
  83.                 {
  84.                         //任务1挂起任务2
  85.                         vTaskSuspend( Task2Task_Handler);
  86.                         printf("任务1挂起了任务2\r\n");
  87.                 }
  88.                
  89.                 if(10 == task1_num)
  90.                 {
  91.                         //任务1恢复任务2
  92.                         vTaskResume(Task2Task_Handler);
  93.                         printf("任务1恢复了任务2\r\n");
  94.                 }
  95.                
  96.                 //延时1秒 1000个时钟节拍
  97.                 vTaskDelay(1000);
  98.         }
  99. }

  100. //任务2
  101. void task2_task(void *pvParameters)
  102. {
  103.         u8 task2_num = 0;
  104.         
  105.         while(1)
  106.         {
  107.                 task2_num++;
  108.                 LED1 = !LED1;
  109.                 printf("任务2已经执行了%d次\r\n", task2_num);
  110.                
  111.                 //延时1秒 1000个时钟节拍
  112.                 vTaskDelay(1000);
  113.         }
  114. }
复制代码

05. 执行结果
  1. 任务2已经执行了1次
  2. 任务1已经运行1次
  3. 任务2已经执行了2次
  4. 任务1已经运行2次
  5. 任务2已经执行了3次
  6. 任务1已经运行3次
  7. 任务2已经执行了4次
  8. 任务1已经运行4次
  9. 任务2已经执行了5次
  10. 任务1已经运行5次
  11. 任务1挂起了任务2
  12. 任务1已经运行6次
  13. 任务1已经运行7次
  14. 任务1已经运行8次
  15. 任务1已经运行9次
  16. 任务1已经运行10次
  17. 任务2已经执行了6次
  18. 任务2已经执行了7次
  19. 任务1已经运行11次
  20. 任务2已经执行了8次

复制代码



收藏 评论0 发布时间:2022-3-26 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版