STM32 FreeRTOS不断的删除任务创建任务测试

测试出删除后,状态回是删除标志

但是,定义了句柄没有创建任务时,状态是就绪,那就无法判断是不是创建了改任务。

最终还是使用正点原子方法将句柄等于NULL来判断。

#include "my_task.h" #include "FreeRTOS.h" #include "task.h" #include "delay.h" #include "usart.h" #include "stdio.h" #include "string.h" #include "my_lib.h"

void task_start(void *pvParameters); //任务函数声明 TaskHandle_t TaskStart_Handle;

void debug_fun(void *pvParameters); //任务函数声明 TaskHandle_t DebugFun_Handle; //任务句柄

void led1_task(void *pvParameters); TaskHandle_t Led1_Handle;

void led2_task(void *pvParameters); TaskHandle_t Led2_Handle = NULL;

void delay_task(void *pvParameters); TaskHandle_t Delay_Handle;

void my_task_init(void) { xTaskCreate((TaskFunction_t)task_start, //任务函数 (const char *)"task_start", //任务名称 (configSTACK_DEPTH_TYPE)128, //任务大小,字为单位 (void *)NULL, //任务函数传参 (UBaseType_t)0, //优先级,越大优先级越高 (TaskHandle_t *)&TaskStart_Handle //任务句柄 ); }

void task_start(void *pvParameters) { taskENTER_CRITICAL(); //临界区 xTaskCreate((TaskFunction_t)debug_fun, //任务函数 (const char *)"debug_fun", //任务名称 (configSTACK_DEPTH_TYPE)128, //任务大小,字为单位 (void *)NULL, //任务函数传参 (UBaseType_t)5, //优先级,越大优先级越高 (TaskHandle_t *)&DebugFun_Handle //任务句柄 ); xTaskCreate((TaskFunction_t)led1_task, (const char *)"led1_task", (configSTACK_DEPTH_TYPE)128, (void *)NULL, (UBaseType_t)1, (TaskHandle_t *)&Led1_Handle ); // xTaskCreate((TaskFunction_t)led2_task, // (const char *)"led2_task", // (configSTACK_DEPTH_TYPE)128, // (void *)NULL, // (UBaseType_t)1, // (TaskHandle_t *)&Led2_Handle // ); // // xTaskCreate((TaskFunction_t)delay_task, // (const char *)"delay_task", // (configSTACK_DEPTH_TYPE)128, // (void *)NULL, // (UBaseType_t)2, // (TaskHandle_t *)&Delay_Handle // ); delay_ms(10); // vTaskDelete(Led2_Handle); vTaskDelete(NULL); taskEXIT_CRITICAL(); }

void debug_fun(void *pvParameters) { char *pcWriteBuffer = NULL; eTaskState TaskRun; for(;;) { pcWriteBuffer = pvPortMalloc(256); //分配内存 printf("Name State Priority Statck Num "); // HAL_UART_Transmit(&huart1, "hello world", 12, 0xff); memset(pcWriteBuffer, 0, 256); //格式化内存 vTaskList(pcWriteBuffer); //获取任务状态信息 printf("%s ", pcWriteBuffer); //打印到串口1 // vTaskGetInfo((TaskHandle_t)Led2_Handle, // (TaskStatus_t *)&TaskStatus, // (BaseType_t)pdFALSE, // (eTaskState)eInvalid // ); TaskRun = eTaskGetState(Delay_Handle); //获取Led2任务的状态 printf("任务状态:%d ", TaskRun); vPortFree(pcWriteBuffer); //释放内存 delay_ms(500); } }

void led1_task(void *pvParameters) { eTaskState TaskRun; for(;;) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); delay_ms(2000); TaskRun = eTaskGetState(Led2_Handle); printf("ret = %d ", TaskRun); // if(TaskStatus.eCurrentState == eDeleted) // if(TaskRun == eDeleted) //如果任务删除了,则创建任务 if(NULL == Led2_Handle) { xTaskCreate((TaskFunction_t)led2_task, (const char *)"led2_task", (configSTACK_DEPTH_TYPE)128, (void *)NULL, (UBaseType_t)1, (TaskHandle_t *)&Led2_Handle ); } } }

void led2_task(void *pvParameters) { eTaskState TaskRun; for(;;) { TaskRun = eTaskGetState(Led2_Handle); printf("ret2 = %d ", TaskRun); HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); delay_ms(500); // Led2_Handle = NULL; // vTaskDelete(NULL); //删除自身任务 myTaskDelete(&Led2_Handle); } }

void delay_task(void *pvParameters) { TickType_t PreviousWakeTime; const TickType_t TimeIncrement = pdMS_TO_TICKS(50); PreviousWakeTime = xTaskGetTickCount(); for(;;) { delay_ms(1000); printf("vTaskDelayUntil "); vTaskDelayUntil(&PreviousWakeTime, TimeIncrement); } }

经验分享 程序员 微信小程序 职场和发展