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

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

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

最终还是使用正点原子方法将句柄等于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);
    }
}
 

你可能感兴趣的:(STM32)