测试出删除后,状态回是删除标志
但是,定义了句柄没有创建任务时,状态是就绪,那就无法判断是不是创建了改任务。
最终还是使用正点原子方法将句柄等于NULL来判断。
/**********************************************
*函数名:myTaskDelete
*功能:删除一个任务
*参数:xTaskToDelete 要删除任务的句柄,不能填NULL
*返回:无
*作者:悟爱电子
*时间:2019.7.24
*说明:删除任务
***********************************************/
void myTaskDelete(TaskHandle_t *xTaskToDelete)
{
if(*xTaskToDelete != NULL) //判断任务是否存在
{
taskENTER_CRITICAL(); //进入临界区
TaskHandle_t TempHandle = *xTaskToDelete; //将句柄复制到局部变量
(*xTaskToDelete) = NULL; //将句柄设为NULL,即为任务不存在
vTaskDelete(TempHandle); //删除任务
taskEXIT_CRITICAL(); //推出临界区
}
}
#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\tState\tPriority\tStatck\tNum\r\n");
// HAL_UART_Transmit(&huart1, "hello world", 12, 0xff);
memset(pcWriteBuffer, 0, 256); //格式化内存
vTaskList(pcWriteBuffer); //获取任务状态信息
printf("%s\r\n", pcWriteBuffer); //打印到串口1
// vTaskGetInfo((TaskHandle_t)Led2_Handle,
// (TaskStatus_t *)&TaskStatus,
// (BaseType_t)pdFALSE,
// (eTaskState)eInvalid
// );
TaskRun = eTaskGetState(Delay_Handle); //获取Led2任务的状态
printf("任务状态:%d\r\n", 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\r\n", 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\r\n", 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\r\n");
vTaskDelayUntil(&PreviousWakeTime, TimeIncrement);
}
}