FreeRTOS—动态创建与删除任务实战;静态创建与删除任务实战
文章目录
- 一、动态创建任务
- 1.1.实验设计
- 1.2.软件设计
一、动态创建任务
1.1.实验设计
创建四个任务,任务名字分别是 start_task、task1、task2、task3:
- start_task:用来创建其他三个任务
- task1:实现 LED0 每500ms闪烁一次
- task2:实现 LED1 每500ms闪烁一次
- task3:判断按键 KEY0 是否按下,按下则删除 task1
1.2.软件设计
以下代码设计在 freertos_demo.c 文件里实现:
- 首先在 FreeRTOSConfig.h 文件,将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1,支持动态申请内存
- 定义入口函数参数,并在上面声明该函数、进行堆栈大小和任务优先级的宏定义,记得在主函数里面调用
freertos_demo( );
,以下代码实现:
//start_task的任务配置
#define START_TASK_PRIO 1
#define START_TASK_STACK_SIZE 128
TaskHandle_t start_task_handler;
void start_task(void *pvParameters);void freertos_demo(void)
{xTaskCreate((TaskFunction_t) start_task,(char*) "start_task",(uint16_t) START_TASK_STACK_SIZE,(void*) NULL,(UBaseType_t) START_TASK_PRIO,(TaskHandle_t*) &start_task_handler);vTaskStartScheduler(); //开启任务调度器
}
- 声明每个任务的配置包括:任务句柄、任务优先级、堆栈大小、创建任务
//task1的任务配置
#define TASK1_PRIO 1
#define TASK1_STACK_SIZE 128
TaskHandle_t task1_handler;
void task1(void *pvParameters);//task2的任务配置
#define TASK2_PRIO 1
#define TASK2_STACK_SIZE 128
TaskHandle_t task2_handler;
void task2(void *pvParameters);//task3的任务配置
#define TASK3_PRIO 1
#define TASK3_STACK_SIZE 128
TaskHandle_t task3_handler;
void task3(void *pvParameters);
- 编写任务函数
//编写start_task的任务函数,它的里面又定义task1、task2、task3
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); //进入临界区,为什么要进入临界区//因为在定义入口函数参数的时候开启了任务调度器,当任务调度器开启的时候,任务立刻创建,立刻与第一个任务进行优先级比较,优先级的作用在开始的时候就发挥不出来,所以需要进去临界区,等待全部任务创建完成,就进行调度,优先级高的先进性xTaskCreate((TaskFunction_t) task1,(char*) "task1",(uint16_t) TASK1_STACK_SIZE,(void*) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t*) &task1_handler);xTaskCreate((TaskFunction_t) task2,(char*) "task2",(uint16_t) TASK2_STACK_SIZE,(void*) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t*) &task2_handler);xTaskCreate((TaskFunction_t) task3,(char*) "task3",(uint16_t) TASK3_STACK_SIZE,(void*) NULL,(UBaseType_t) TASK3_PRIO,(TaskHandle_t*) &task3_handler);vTaskDelete(start_task_handler);//删除start_task任务,释放空间 taskEXIT_CRITICAL(); //退出临界区
}