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次\n", count_num); 96 97 if(count_num==5) 98 { 99 vTaskDelete(Task2_Handler); 100 printf("任务2被删除\n"); 101 } 102 if(count_num==10) 103 { 104 printf("任务1被删除\n"); 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次\n", count_num1); 120 vTaskDelay(1000); 121 } 122 }
执行结果:
任务2优先级大于任务1
posted on 2020-12-19 15:58 Darren_pty 阅读(415) 评论(0) 编辑 收藏 举报