本节课程主要进行时间片内容的学习。在一个同一优先级列表下挂载两个任务,每个任务工作一个时间片,时间片到了,任务从 切就绪列表头部切换到尾部,换到另一个任务。注意:每个任务软件延时的时间一定要小于时间片。
时间片相关成员介绍
TimeQuanta需要多少个时间片
TimeQuantaCtr还剩多少个时间片
时间片的调度函数在systick中断服务程序OSTimeTick()中调用。
代码介绍:
main:
1、CPU_Init()时间戳初始化 配置
2、CPU_IntDis()关中断
3、OS_CPU_SysTickInit () systick配置
4、OSInit(&err) 系统初始化
5、OSTaskCreate() 任务创建 加入时间片大小
6、OSStart() 启动系统
详细介绍:
4.OSInit(&err) 系统初始化 在初始化IdleTask时给IdleTask分配时间片大小为0
其他函数内容同上节
5、OSTaskCreate() 任务创建
5.1、os_tcb结构体加入与时间片相关成员
5.2、OS_TaskInitTCB() 任务初始化函数加入时间片成员初始化
5.3、各成员赋值
5.4临界段内写 OS_PrioInsert()将任务优先级置位 OS_RdyListInsertTail()将任务加入到就绪列表尾部 函数同前一节
6、 OSStart()启动系统 未做修改 经过这里后 将接下来执行任务优先级最高的任务(任务1)
7、任务执行
7.1阻塞延时OSTimeDly() 未修改 临界代码内处理
7.2、任务1加入到时基列表后,继续任务调度,执行任务2
任务2位死循环,且为软件延时,将一直执行任务2。
8、systick中断处理函数 OSTimeTick()
在OSTimeTick()进行1)时基列表更新; 2)时间片任务调度更新; 3)任务调度
8.1 OS_TickListUpdate()时基列表更新 同前一节
8.2、 OS_SchedRoundRobin()时间片调度更新
检查若就绪列表 1)非空节点 2)非闲时任务 3)剩余时间大于0,并进行-- 4)自减后为0 5)不少于两个任务。则执行后续代码
6)OS_RdyListMoveHeadToTail()将任务从就绪列表头部移到尾部 7)重新获取就绪列表头指针以及时间片 上述代码在临界段内执行
8.2.1 OS_RdyListMoveHeadToTail()
执行完上述代码,此时就绪列表中只有任务3可以调度(任务1阻塞延时未结束,任务2在就绪列表尾部,由于任务3位死循环 软件延时,任务2无法执行到 ),之后执行任务3.直到下一个systick中断到来,切换到任务1,在将任务3从就绪列表头部移到尾部,切换到任务2,。如此循环。
执行效果