动态任务创建实战(点灯)
目的:xTaskCreat()和vTaskDelete()使用
将创建start_task、task1、task2、task3四个任务
start_task:用来创建其他三个任务(只执行一次)
task1:led0每500ms闪烁一次
task2:led1每500ms闪烁一次
task3:判断KEY0是否按下,按下删掉task1
freeRTOS部分代码
#define START_TASK_STACK_SIZE 128
#define START_TASK_PRIO 1
TaskHandle_t start_task_handler;
/******************************************************************************************************/
/*FreeRTOS配置*/
void start_task(void * pvParameters);
void task1(void * pvParameters);
void task2(void * pvParameters);
void task3(void * pvParameters);
/******************************************************************************************************/
#define TASK1_STACK_SIZE 128
#define TASK1_PRIO 2
TaskHandle_t task1_handler;
#define TASK2_STACK_SIZE 128
#define TASK2_PRIO 3
TaskHandle_t task2_handler;
#define TASK3_STACK_SIZE 128
#define TASK3_PRIO 4
TaskHandle_t task3_handler;
/**
* @brief FreeRTOS例程入口函数
* @param 无
* @retval 无
*/
void freertos_demo(void)
{
xTaskCreate( (TaskFunction_t ) start_task,
(char * ) "start_task",
(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t * ) &start_task_handler
);
vTaskStartScheduler();
}
void start_task(void * pvParameters)
{
xTaskCreate( (TaskFunction_t ) task1,
(char * ) "task1",
(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK1_PRIO,
(TaskHandle_t * ) &task1_handler
);
xTaskCreate( (TaskFunction_t ) task2,
(char * ) "task2",
(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK2_PRIO,
(TaskHandle_t * ) &task2_handler
);
xTaskCreate( (TaskFunction_t ) task3,
(char * ) "task3",
(configSTACK_DEPTH_TYPE) TASK3_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK3_PRIO,
(TaskHandle_t * ) &task3_handler
);
vTaskDelete(NULL);
taskEXIT_CRITICAL();
}
/*led0 500ms 闪烁*/
void task1(void * pvParameters)
{
while(1)
{
printf("task1正在运行\r\n");
LED0_TOGGLE();
vTaskDelay(500);
}
}
/*led1 500ms 闪烁*/
void task2(void * pvParameters)
{
while(1)
{
printf("task2正在运行\r\n");
LED1_TOGGLE();
vTaskDelay(500);
}
}
/*key0 按下删除task1*/
void task3(void * pvParameters)
{
uint8_t key=0;
while(1)
{
printf("task3正在运行\r\n");
key = key_scan(0);
if(key == KEY0_PRES)
{
if(task1_handler != NULL)
{
printf("删除task1任务\r\n");
vTaskDelete(task1_handler);
task1_handler = NULL;
}
}
vTaskDelay(20);
}
}
实现效果: