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

【经验分享】FreeRTOS创建和删除任务示例(动态方法)

[复制链接]
STMCU小助手 发布时间:2022-3-26 14:00
01. 概述
FreeRTOS中创建和删除任务API函数的应用。

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

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

task1_task: 当此任务运行5秒以后就会调用函数vTaskDelete()删除任务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.                         vTaskDelete(Task2Task_Handler);
  16.                         printf("任务1删除了任务2\r\n");
  17.                 }
  18.                
  19.                 //延时1秒 1000个时钟节拍
  20.                 vTaskDelay(1000);
  21.         }
  22. }
复制代码

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.                         vTaskDelete(Task2Task_Handler);
  86.                         printf("任务1删除了任务2\r\n");
  87.                 }
  88.                
  89.                 //延时1秒 1000个时钟节拍
  90.                 vTaskDelay(1000);
  91.         }
  92. }

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

05. 结果验证
任务1运行5秒中之后删除了任务2,任务2被删除之后就不会被运行。最后只剩下任务1运行了。


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

举报

0个回答

所属标签

相似技术帖

官网相关资源

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