zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/darren-pty/p/14159462.html
Copyright © 2011-2022 走看看