本节课程主要是进行时基列表练习。当任务阻塞延时时,不是将其对应优先级数组中标志位清零,而是将其从就绪列表中清除,并将其加入到时基列表中。只有当任务延时时间结束才会从时基列表中清除重新加入到就绪列表中。
任务描述:建立三个任务 优先级分别为1 2 3 当阻塞延时时进行时基列表操作,延时结束重新加入到就绪列表。
仿真结果:
main()代码:
1、CPU_Init() 时间戳设置 本节课忽略
2、CPU_IntDis() 关中断
3、OS_CPU_SysTickInit() systick设置
4、OSInit() 系统初始哈
1)进行变量OSTCBCurPtr、OSTCBHighRdyPtr、OSPrioCur、OSPrioHighRdy初始化;2)优先级列表初始化;3)就绪列表初始化;4)时基列表及相关变量初始化;5)闲时任务初始化
4.1 OS_PrioInit()优先级列表初始化
4.2 OS_RdyListInit()就绪列表初始化
4.3 OS_TickListInit()时基列表初始化
注意
5、OSTaskCreate() 任务创建
6、OSStart() 启动任务
OSPrioHighRdy、OSPrioCur、OSTCBHighRdyPtr、OSTCBCurPtr变量及指针赋值 启动任务
6.1 OS_PrioGetHighest()获取高优先级任务
7.任务执行
在OSStart()最后一句OSStartHighRdy()后,就进入到该函数,将高就绪任务指针赋值给当前TCB,执行该TCB
执行到OSTimeDly(),由于阻塞延时,进行相关操作。临界代码内执行,与上一节不同,此处是将任务从就绪列表中删除,并插入到时基列表
7.1OS_TickListInsert() 插入到时基列表
注意:时基列表插入完,更新NbrEntries、NbrEntriesMax。并且将任务指向时基列表根部。
7.2OS_RdyListRemove()从就绪列表中移除
注意:1)如果优先级列表就一个任务,要执行OS_PrioRemove();2)最后要复位TCB->PrevPtr、NextPtr
7.3OSSched()任务调度
临界段内写。获取OSPrioHighRdy、OSTCBHighRdyPtr。判断当前任务指针与高就绪任务指针是否相同。最后触发中断异常
8 systick中断处理
OSTimeTick()执行时基列表更新以及任务调度
8.1 OS_TickListUpdate() 时基列表更新 临界段内写
判断延时是否到期,到期执行任务就绪OS_TaskRdy(),第一个就绪了,继续检查看第二个,直到遍历完;否则退出。
8.1.1 OS_TaskRdy()执行将任务从时基列表中移除,并添加到就绪列表中
8.1.1.1 OS_TickListRemove()
注意:1)移除完任务进行TCB->TickNextPtr、TickPrevPtr、TickCtrMatch、TickSpokePtr变量复位;2)spoke->NbrEntries更新
8.1.1.2 OS_RdyListInsert() 执行1)如果当前优先级与待就绪任务优先级相同,将其插入到就绪列表尾部;2)如果当前任务优先级与待就绪任务优先级不同 将其插入到对应优先级就绪列表头部(为何,理解不了,求解答)