1. 任务创建和删除的API函数
任务的创建和删除本质就是调用FreeRTOS的API函数。
1.1 动态创建任务
xTaskCreate(),任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的堆中分配
1.1.1 动态创建任务其内部实现
- 申请堆栈内存(返回首地址)
- 申请任务控制块内存(返回首地址)
- 把前面申请的堆栈地址,赋值给控制块的堆栈成员
- 调用
prvInitialiseNewTask
初始化任务控制块中的成员 - 调用
prvAddNewTaskToReadyList
添加新创建任务到就绪列表中
1.1.2 实现动态创建任务流程
- 使用动态创建任务,需将宏
configSUPPORT_DYNAMIC_ALLOCATION
配置为1 - 定义函数入口参数
- 编写任务函数
1.2 静态创建任务
xTaskCreateStatic(),任务的任务控制块以及任务的栈空间所需的内存,需用户分配提供
1.2.1 静态创建任务其内部实现
- 获取控制块内存(首地址)
- 获取堆栈内存(首地址)
- 标记使用的静态的方式申请的TCB和堆栈内存
- 调用
prvInitialiseNewTask
初始化任务块,并将控制块信息返回给任务句柄,方便返回句柄信息 - 调用
prvAddNewTaskToReadyList
添加新创建任务到就绪列表中
1.2.2 静态创建任务流程
-
将宏
configSUPPORT_STATIC_ALLOCATION
配置为1 -
定义空闲任务&定时器的任务堆栈及TCB
-
实现两个接口函数
vApplicationGetldleTaskMemory() vApplicationGetTimerTaskMemory()
-
编写任务函数
1.3 删除任务
vTaskDelete()
1.3.1 删除任务的内部实现
-
获取所要删除任务的控制块
通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身
-
将被删除任务,移除所在列表
将该任务在所在列表中移除,包括:就绪、阻塞、挂起、事件等列表
-
判断所需要删除的任务
- 删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务执行
- 删除其他任务,当前任务数量—— 更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务
- 删除的任务为其他任务则直接释放内存prvDeleteTCB()
- 调度器正在运行且删除任务自身,则需要进行一次任务切换
2. 临界区保护
保护那些不想被打断的程序段,关闭freertos所管理的中断,中断无法打断,滴答中断和PendSV中断无法进行任务调度