红叶何时落水
就绪列表 static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];
延时列表1 static List_t xDelayedTaskList1;
延时列表2 static List_t xDelayedTaskList2;
PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList;
PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList;
挂起列表 static List_t xPendingReadyList;
添加到就绪列表 prvAddNewTaskToReadyList
1. 任务数++;
2-true. 如果没有任务在运行, pxCurrentTCB指向新添加的这个任务, (这里会造成刚开始的时候,最先运行的是最后一个创建的任务)
有一个疑问,当节拍间隔比较小时,第一个执行的任务并不是预期的任务,节拍大一点时,才符合逻辑???
就是说,列表中的第一个任务不是最先执行的,也许是刚一执行就立马遇到了新的切换吗 应该是,经过仿真器逐步调试,发现
单步运行正常,全速运行不正常
2.1 prvInitialiseTaskLists 初始化各种列表
2-false. 否则 判断当前运行任务的优先级是否大于要添加的任务优先级
新添加的任务优先级大,pxCurrentTCB = pxNewTCB;
3. 将任务添加到就绪列表中 prvAddTaskToReadyList()
3.1 taskRECORD_READY_PRIORITY(uxPriority); == portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority )
3.1.1 ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
3.2 vListInsertEnd(xStateListItem) xStateListItem项插入列表尾部,就是pxIndex的前面;
4. 如果系统已经开始运行taskYIELD_IF_USING_PREEMPTION();切换任务
等效于portYIELD(),切换上下文
4.1 portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;挂起PendSV中断
会调用中断xPortPendSVHandler();
4.1.1 读取当前任务的psp=>r0;
4.1.2 获取当前任务结构体
4.1.3 当前任务入栈
sp!, {r3, r14} msp入栈,因为要执行vTaskSwitchContext
4.1.4 关中断
4.1.5 vTaskSwitchContext()
4.1.5.1 更新标志位 xYieldPending
4.1.5.2 taskSELECT_HIGHEST_PRIORITY_TASK()获取就绪列表最高优先级的任务
4.1.5.2.1 portGET_HIGHEST_PRIORITY() 获取最高优先级的就绪列表
4.1.5.2.2 listGET_OWNER_OF_NEXT_ENTRY(pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ])
pxCurrentTCB == 当前最高优先级列表中pxIndex指向的下一个任务,
4.1.6 开中断
sp!, {r3, r14} msp出栈
4.1.7 获取最新任务的结构体
4.1.8 新任务出栈,切换PSP, 中断结束
5.结束