主要内容
FreeRTOS任务的创建和删除。
1.任务创建和删除的API函数
(1)动态创建任务:任务相关的任务控制块和任务栈空间所需要的内存,都是有freertos自动在堆中进行分配,不需要人为去分配。
(2)静态创建任务:任务相关的任务控制块和任务栈空间所需要的内存需要用户自己定义分配。
2.动态创建任务函数
动态创建任务函数有返回值:
(1)传递给任务函数的参数一般是NULL;
2.1动态创建任务流程
2.2任务控制块结构体成员
(1)任务控制块说白了就是任务的身份证,保留了任务的特征。
(2)任务栈顶,在任务切换和任务恢复息息相关。
2.3代码程序
(1)定义任务相关的堆栈大小、优先级、任务句柄等,函数声明等放在同一个位置,可以放在一个专门的.h文件中,方便后期进行管理。
#define START_TASK_STACK_SIZE 128
#define START_TASK_STACK_PRIO 1
TaskHandle_t start_task_handler;
void start_task( void * pvParameters );
在main()函数中,首先是初始化各种外设硬件,初始化完成后,调用xTaskCreate()创建任务,创建完任务后,打开调度函数vTaskStartScheduler();从而开始执行任务。
xTaskCreate((TaskFunction_t) start_task,//任务函数
(const char *) start_task,//任务名字
(uint16_t) START_TASK_STACK_SIZE,//任务堆栈大小
(void *) NULL,//传递给任务函数的参数
(UBaseType_t) START_TASK_STACK_PRIO,//任务优先级
(TaskHandle_t *) &start_task_handler);//任务句柄
vTaskStartScheduler();
3.静态创建任务函数
静态任务创建函数的返回值:
3.1静态态创建任务流程
(1)首先需要创建空闲任务,给任务分配堆栈内存和任务控制块。
StaticTask_t idla_task_tcb;//空闲任务的任务块
StackType_t idla_task_stack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize )
{
*ppxIdleTaskTCBBuffer = &idla_task_tcb;
*ppxIdleTaskStackBuffer = idla_task_stack;
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
(2)创建静态任务,需要自己申请堆栈和任务控制块
#define START_TASK_STACK_SIZE 128
#define START_TASK_STACK_PRIO 1
TaskHandle_t start_task_handler;
StackType_t start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_tcb;
void start_task( void * pvParameters );
start_task_handler = xTaskCreateStatic(
(TaskFunction_t) start_task,
(char ) “start_task”,
(uint32_t) START_TASK_STACK_SIZE,
(void ) NULL,
(UBaseType_t) TASK2_STACK_PRIO,
(StackType_t) start_task_stack,
(StaticTask_t) &start_task_tcb );
(3)返回任务句柄,和动态定义稍有不同。
4.任务删除函数
用于删除已被删除的任务,被删除的任务将从四种状态中被删除。
(1)当传入的参数是NULL,则代表删除任务自身(当前执行的任务)。
(2)删除动态任务时,空闲任务会负责删除和释放任务中由系统分配的内存,但是由用户在任务删除前申请的内存,则需要用户在任务被删除前提前释放,否则会导致内存泄漏。
4.1删除任务流程
5.实验代码
实验创建了三个任务,task任务复杂创建task1和task2,1中进行闪灯,2中设置一个延时,等时间到了就删除1.代码附件。