3-FreeRTOS 动态任务创建/删除

要求:动态任务创建(任务堆栈自动创建)

①用一个任务创建两个任务Task1和Task2后,将自身任务删除

②在Task1执行5次后,用Task1将Task2删除

③Task1执行10次后,将自身删除

代码:

  1 #include "FreeRTOS.h"
  2 #include "task.h"
  3 
  4 
  5 //----------------------------------------任务优先级
  6 #define START_TASK_PRIO 1 
  7 #define TASK1_PRIO 2 
  8 #define TASK2_PRIO 3 //优先级高
  9 
 10 //----------------------------------------任务堆栈大小
 11 #define START_STK_SIZE 256 
 12 #define TASK1_STK_SIZE 256 
 13 #define TASK2_STK_SIZE 256 
 14 
 15 
 16 //----------------------------------------任务句柄
 17 TaskHandle_t Task1_Handler; 
 18 TaskHandle_t Task2_Handler; 
 19 TaskHandle_t StartTask_Handler; 
 20 
 21 
 22 //----------------------------------------任务函数
 23 void start_task(void *pvParameters); 
 24 void task1_task(void *pvParameters); 
 25 void task2_task(void *pvParameters); 
 26 
 27 
 28 
 29 int main(void)
 30 {
 31   BaseType_t OS;
 32     
 33   User_GPIO_Init();
 34     Delay_init();
 35     USART_Config();
 36     
 37 //    TIM6_Time_Init(9999,7199);//定时1s
 38 //  TIM7_Time_Init(9999,7199);//定时1s
 39 
 40     
 41     OS= xTaskCreate(
 42                                  (TaskFunction_t        ) start_task,       //任务函数
 43                                  (const char *          )  "start_task",    //任务名
 44                                  (configSTACK_DEPTH_TYPE) START_STK_SIZE,   //堆栈大小
 45                                  (void *                )NULL,              //传递给任务函数的参数
 46                                  (UBaseType_t           ) START_TASK_PRIO,  //任务优先级
 47                                  (TaskHandle_t *        ) &StartTask_Handler  //任务句柄
 48                              );
 49                                  
 50     if(OS==pdPASS) 
 51         GPIO_SetBits(GPIOA, GPIO_Pin_8);
 52         
 53     vTaskStartScheduler(); //开启任务调度
 54     
 55 }
 56 
 57 
 58 void start_task(void *pvParameters)
 59 {
 60  
 61         taskENTER_CRITICAL(); //进入临界区
 62         
 63       //创建任务Task1
 64         xTaskCreate((TaskFunction_t )task1_task, //任务函数
 65         (const char* )"task1_task", //任务名称
 66         (uint16_t )TASK1_STK_SIZE, //任务堆栈大小
 67         (void* )NULL,
 68         (UBaseType_t )TASK1_PRIO, //任务优先级
 69         (TaskHandle_t* )&Task1_Handler); //任务句柄
 70 
 71         
 72         
 73         //创建任务Task2
 74         xTaskCreate((TaskFunction_t )task2_task, //任务函数
 75         (const char* )"task2_task", //任务名称
 76         (uint16_t )TASK2_STK_SIZE, //任务堆栈大小
 77         (void* )NULL,
 78         (UBaseType_t )TASK2_PRIO, //任务优先级
 79         (TaskHandle_t* )&Task2_Handler); //任务句柄
 80                 
 81         
 82         vTaskDelete(StartTask_Handler); //vTaskDelete(NULL)也可以   删除开始任务
 83         taskEXIT_CRITICAL();            //退出临界区
 84 }
 85 
 86 
 87 
 88 void task1_task(void *pvParameters)
 89 {  
 90     uint8_t count_num=0; 
 91    
 92     while(1)
 93     {
 94       count_num++;
 95         printf("任务1执行:%d次
", count_num);
 96         
 97         if(count_num==5) 
 98         {
 99           vTaskDelete(Task2_Handler);
100             printf("任务2被删除
");
101         }            
102         if(count_num==10)  
103         {
104             printf("任务1被删除
");
105           vTaskDelete(NULL);  //将自身任务删除
106             
107         }
108         vTaskDelay(1000);  //延时1000个时钟节拍,就是1s   configTICK_RATE_HZ
109     }
110         
111 }
112  
113 void task2_task(void *pvParameters)
114 {  
115     uint8_t count_num1=0;
116    while(1)
117    {
118          count_num1++;
119      printf("任务2执行:%d次
", count_num1);
120          vTaskDelay(1000);
121   }
122 }

执行结果:

任务2优先级大于任务1

原文地址:https://www.cnblogs.com/darren-pty/p/14159462.html