FreeRTOS任务创建和删除(静态)
实验目的:学会xTaskCreateStatic()和vTaskDelete()的使用
实验设计:将设计四个任务:start_task、task1、task2、task3
四个任务功能如下:start_task 用来创建其他的三个任务
task1 实现LED0每500ms闪烁一次
task2 实现LED1每500ms闪烁一次
task3 判断按键KEY0是否按下,按下则删掉task1
修改开始任务函数
/* 开始任务函数-用来创建其他的三个任务*/ void start_task( void * pvParameters) { taskENTER_CRITICAL();/*进入临界区--关闭中断,任务切换就不会进行*/ /*创建任务1*/ //vTaskDelete(start_task_handler);//这两句作用一样 vTaskDelete(NULL); taskEXIT_CRITICAL();/*退出临界区--开始任务切换-开启任务调度-限制性任务优先级最高的任务*/ }
修改入口函数
/** *@brief FreeRTOS例程入口函数 *@param 无 *@retval 无 */ void freertos_demo(void) { vTaskStartScheduler();//开启任务调度器 }
- 需将configSUPPORT_STATIC_ALLOCATION配置为1
- 定义空闲任务&定时器任务的任务堆栈及TCB
- 实现两个接口函数
- vApplicationGetldleTaskMemory()--空闲内存分配函数
- vApplicationGetTimerTaskMemory()--软件定时器任务内存分配函数
/*空闲任务配置*/ StaticTask_t idle_task_tcb; StackType_t idle_task_stack[configMINIMAL_STACK_SIZE]; /*软件定时器任务配置*/ StaticTask_t timer_task_tcb; StackType_t timer_task_stack[configTIMER_TASK_STACK_DEPTH]; /*空闲任务内存分配*/ void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,//空闲任务任务控制块,手动分配内存 StackType_t ** ppxIdleTaskStackBuffer,//空闲任务堆栈地址 uint32_t * pulIdleTaskStackSize ) //空闲任务堆栈大小 /*lint !e526 Symbol not defined as it is an application callback. */ { *ppxIdleTaskTCBBuffer = &idle_task_tcb; *ppxIdleTaskStackBuffer = idle_task_stack; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; } /*软件定时器内存分配*/ void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, uint32_t * pulTimerTaskStackSize ) { *ppxTimerTaskTCBBuffer = &timer_task_tcb; *ppxTimerTaskStackBuffer = timer_task_stack; *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; }
- 将内存分配函数放入到demo.c里
- 定义函数入口参数