4-FreeRTOS 静态任务的创建/删除
需求:静态创建任务(任务堆栈、控制块由用户自己指定)
①用一个任务创建两个任务Task1和Task2后,将自身任务删除
②在Task1执行5次后,用Task1将Task2删除
③Task1执行10次后,将自身删除
代码:
①需要将该宏打开:
#define configSUPPORT_STATIC_ALLOCATION 1 //静态内存
如果使用静态方法 的 话 需 要 用 户 实 现 两 个 函 数 vApplicationGetIdleTaskMemory() 和vApplicationGetTimerTaskMemory()。 通过这两个函数来给空闲任务和定时器服务任务的任务堆栈和任务控制块分配内存
1 //空闲任务所需内存 2 void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, 3 StackType_t ** ppxIdleTaskStackBuffer, 4 uint32_t * pulIdleTaskStackSize ) 5 { 6 7 * ppxIdleTaskTCBBuffer = &IdleTaskTCB;//空闲任务控制块 8 * ppxIdleTaskStackBuffer= IdleTaskStack; //空闲任务任务堆栈 9 * pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; //堆栈大小 10 11 } 12 13 14 //定时器任务所需内存 15 void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, 16 StackType_t ** ppxTimerTaskStackBuffer, 17 uint32_t * pulTimerTaskStackSize ) 18 { 19 20 * ppxTimerTaskTCBBuffer = &TimerTaskTCB;//任务控制块 21 * ppxTimerTaskStackBuffer= TimerTaskStack; //任务堆栈 22 * pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; //堆栈大小 23 24 }
②静态创建过程
1 //----------------------------------------任务优先级 2 #define START_TASK_PRIO 1 3 #define TASK1_PRIO 2 4 #define TASK2_PRIO 3 //优先级高 5 6 //----------------------------------------任务堆栈大小 7 #define START_STK_SIZE 128 8 #define TASK1_STK_SIZE 128 9 #define TASK2_STK_SIZE 128 10 11 //----------------------------------------任务堆栈 12 StackType_t StartTaskStack[START_STK_SIZE]; 13 StackType_t Task1TaskStack[TASK1_STK_SIZE]; 14 StackType_t Task2TaskStack[TASK2_STK_SIZE]; 15 16 //----------------------------------------任务控制块 17 StaticTask_t StartTaskTCB; 18 StaticTask_t Task1TaskTCB; 19 StaticTask_t Task2TaskTCB; 20 21 22 //----------------------------------------任务句柄 23 TaskHandle_t Task1_Handler; 24 TaskHandle_t Task2_Handler; 25 TaskHandle_t StartTask_Handler; 26 27 28 //----------------------------------------任务函数 29 void start_task(void *pvParameters); 30 void task1_task(void *pvParameters); 31 void task2_task(void *pvParameters); 32 33 34 35 //定时器任务所需内存 36 void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, 37 StackType_t ** ppxTimerTaskStackBuffer, 38 uint32_t * pulTimerTaskStackSize ) 39 { 40 41 * ppxTimerTaskTCBBuffer = &TimerTaskTCB;//任务控制块 42 * ppxTimerTaskStackBuffer= TimerTaskStack; //任务堆栈 43 * pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; //堆栈大小 44 45 } 46 47 48 49 int main(void) 50 { 51 User_GPIO_Init(); 52 Delay_init(); 53 USART_Config(); 54 55 // TIM6_Time_Init(9999,7199);//定时1s 56 // TIM7_Time_Init(9999,7199);//定时1s 57 58 59 StartTask_Handler= xTaskCreateStatic( (TaskFunction_t) start_task, 60 (const char * ) "start_task", 61 (uint32_t) START_STK_SIZE, //任务堆栈大小 62 (void * ) NULL, 63 (UBaseType_t) START_TASK_PRIO, 64 (StackType_t * ) StartTaskStack, 65 (StaticTask_t *) &StartTaskTCB); 66 67 if(StartTask_Handler==NULL) //创建成功 68 GPIO_SetBits(GPIOA, GPIO_Pin_8); 69 70 vTaskStartScheduler(); //开启任务调度 71 72 } 73 74 void start_task( void * pvParameters ) 75 { 76 taskENTER_CRITICAL(); //进入临界区 77 78 //创建任务Task1 79 Task1_Handler= xTaskCreateStatic( (TaskFunction_t ) task1_task, 80 (const char * ) "task1_task", 81 (uint32_t ) TASK1_STK_SIZE, //任务堆栈大小 82 (void * ) NULL, 83 (UBaseType_t ) TASK1_PRIO, 84 (StackType_t *) Task1TaskStack, 85 (StaticTask_t *) &Task1TaskTCB ); 86 87 88 //创建任务Task2 89 Task2_Handler= xTaskCreateStatic( (TaskFunction_t) task2_task, 90 (const char *) "task2_task", 91 (uint32_t ) TASK2_STK_SIZE, //任务堆栈大小 92 (void * ) NULL, 93 (UBaseType_t ) TASK2_PRIO, 94 (StackType_t *) Task2TaskStack, 95 (StaticTask_t *) &Task2TaskTCB ); 96 97 98 99 vTaskDelete(StartTask_Handler); //vTaskDelete(NULL)也可以 删除开始任务 100 taskEXIT_CRITICAL(); //退出临界区 101 } 102 103 104 105 void task1_task(void *pvParameters) 106 { 107 uint8_t count_num=0; 108 109 while(1) 110 { 111 count_num++; 112 printf("任务1执行:%d次\n", count_num); 113 114 if(count_num==5) 115 { 116 vTaskDelete(Task2_Handler); 117 printf("任务2被任务1删除\n"); 118 } 119 if(count_num==10) 120 { 121 printf("任务1被删除\n"); 122 vTaskDelete(NULL); //将自身任务删除 123 124 } 125 vTaskDelay(1000); //延时1000个时钟节拍,就是1s configTICK_RATE_HZ 126 } 127 128 } 129 130 void task2_task(void *pvParameters) 131 { 132 uint8_t count_num1=0; 133 while(1) 134 { 135 count_num1++; 136 printf("任务2执行:%d次\n", count_num1); 137 vTaskDelay(1000); 138 } 139 }
执行结果:
posted on 2020-12-19 18:03 Darren_pty 阅读(733) 评论(0) 编辑 收藏 举报