一.框架笔记
1.xTaskCreate()
(1)申请任务堆栈的空间
(2)申请任务控制块的内存
(3)调用prvInitialiseNewTask()初始化任务
(4)调用prvAddNewTaskReadyList()添加新创建任务到就绪列表中
2.prvInitialseNewTask()
(1) 初始化堆栈为0xa5,可选功能
(2) 获取栈顶,保存到pxTopofStack.
(3) 保存任务名字,到pxNewTCB->pcTaskName.
(4) 保存任务优先级到任务控制块
(5) 初始化两个列表项 xStateListItem和xEventListItem
(6) 初始化各种任务控制块成员变量,初始化堆栈,初始化句柄(任务控制块)
3. prvAddNewTaskToReadyList
(1) uxCurrrentNemberOfTasks加一,记录系统中有多少个任务
(2) 如果当前的任务只有一个,则初始化相关列表
(3) 调用prvAddTaskToReadyList,将任务添加到就绪列表中
(4) 如果新创建的任务优先级比当前的任务优先级高,则用taskYIEKD_IFUSING_PREEMPTION()进行任务的调度
4.TaskToreadyList()
(1)将uxTopReadyPriority相应的bit置1,表示相应的优先级有就绪的任务。
(2)将新创建的任务添加到对应的就绪列表中去,末尾插入,比如优先级5,插入到pxReadyList()
5.任务删除 vTaskDelete()
(1) 根据任务句柄获取任务控制块,如果任务句柄为NULL,表示删除任务自身
(2) 将要删除的任务从就绪列表中移除,并购且如果相应的优先级只有这一个那么复位相应的优先级位
(3)如果任务等待某些事件的话,那将此任务从相应的事件列表中移除
(4) uxCurrentNumberOfTask减一,表示当前任务减1
(5) 释放任务堆栈和任务控制块
(6) 如果删除的是自身,最后需要主动发起任务切换
6.任务挂起
xTaskSuspend(TaskHandle_t x TaskToSuspend)
(1) 根据任务句柄获取任务块,如果任务句柄位NULL,表示删除任务自身
(2) 将要挂起的任务从相应的状态列表和事件中移除。
(3) 将要挂起的任务添加到挂起任务列表xSuspendTaskList里面去
(4) 如果挂起的是自身,而且正在运行,则需要进行任务切换
7.任务恢复
void vTaskResume(TaskHandle_t xTaskToResume)
(1) 判断要恢复的任务是否为挂起任务
(2) 将要恢复的任务从挂起任务列表xSuspendTaskList 中移除
(3) 调用函数prvAddTaskToReadyList() 将任务添加到就绪列表中
(4) 如果刚刚恢复的任务优先级比当前运行的任务优先级高,则进行一次任务切换