- 实验目的:学会xTaskCreate()和vTaskDelete()的使用
- 实验设计:将设计四个任务:start_task、task1、task2、task3
四个任务功能如下:
start_task 用来创建其他的三个任务
task1 实现LED0每500ms闪烁一次
task2 实现LED1每500ms闪烁一次
task3 判断按键KEY0是否按下,按下则删掉task1
基于移植好的框架
第一步
将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1
第二步
定义函数入口参数
根据官网例程https://freertos.org/
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, const configSTACK_DEPTH_TYPE uxStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask );
Example usage:
/* Task to be created. */ void vTaskCode( void * pvParameters ) { /* The parameter value is expected to be 1 as 1 is passed in the pvParameters value in the call to xTaskCreate() below. */ configASSERT( ( ( uint32_t ) pvParameters ) == 1 ); for( ;; ) { /* Task code goes here. */ } } /* Function that creates a task. */ void vOtherFunction( void ) { BaseType_t xReturned; TaskHandle_t xHandle = NULL; /* Create the task, storing the handle. */ xReturned = xTaskCreate( vTaskCode, /* Function that implements the task. */ "NAME", /* Text name for the task. */ STACK_SIZE, /* Stack size in words, not bytes. */ ( void * ) 1, /* Parameter passed into the task. */ tskIDLE_PRIORITY,/* Priority at which the task is created. */ &xHandle ); /* Used to pass out the created task's handle. */ if( xReturned == pdPASS ) { /* The task was created. Use the task's handle to delete the task. */ vTaskDelete( xHandle ); } }
创建动态任务函数
/** *@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) { taskENTER_CRITICAL();/*进入临界区--关闭中断,任务切换就不会进行*/ /*创建任务1*/ xTaskCreate((TaskFunction_t ) task1, //开始任务函数 (char* ) "task1", //开始任务函数名称 (configSTACK_DEPTH_TYPE ) TASK1_STACK_SIZE, //堆栈大小-字 (void* ) NULL, //传递的任务函数参数 (UBaseType_t ) TASK1_PRIO, //任务优先级 (TaskHandle_t* ) &task1_handler //任务句柄 ); /*创建任务2*/ xTaskCreate((TaskFunction_t ) task2, //开始任务函数 (char* ) "task2", //开始任务函数名称 (configSTACK_DEPTH_TYPE ) TASK2_STACK_SIZE, //堆栈大小-字 (void* ) NULL, //传递的任务函数参数 (UBaseType_t ) TASK2_PRIO, //任务优先级 (TaskHandle_t* ) &task2_handler //任务句柄 ); /*创建任务3*/ 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();/*退出临界区--开始任务切换-开启任务调度-限制性任务优先级最高的任务*/ }
- 每个任务函数的参数宏定义,函数声明
/*START_TASK 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define START_TASK_PRIO 1 #define START_TASK_STACK_SIZE 128 TaskHandle_t start_task_handler; void start_task( void * pvParameters);
/*task1 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define TASK1_PRIO 2 #define TASK1_STACK_SIZE 128 TaskHandle_t task1_handler; void task1( void * pvParameters);
/*task2 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define TASK2_PRIO 3 #define TASK2_STACK_SIZE 128 TaskHandle_t task2_handler; void task2( void * pvParameters);
/*task3 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define TASK3_PRIO 4 #define TASK3_STACK_SIZE 128 TaskHandle_t task3_handler; void task3( void * pvParameters); /********************************************************************/
定义在创建函数的上部
移植成品