• 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

  • 相关阅读:
    JS学习笔记
    JS学习笔记
    编程菜鸟的日记-初学尝试编程-编写函数实现strlen功能(总结考察点)
    编程菜鸟的日记-初学尝试编程-编写函数实现strcpy功能(总结考察点)
    编程菜鸟的日记-初学尝试编程-正整数表达式的四则运算
    编程菜鸟的日记-初学尝试编程-静态链表的建立和输出
    编程菜鸟的日记-初学尝试编程-单链表
    编程菜鸟的日记-初学尝试编程-链表元素快速排序
    编程菜鸟的日记-初学尝试编程-回文数的判断
    编程菜鸟的日记-初学尝试编程-关于测试程序
  • 原文地址:https://www.cnblogs.com/darren-pty/p/14159462.html
Copyright © 2020-2023  润新知