ucosIII自学笔记-时间片_5

时间:2022-08-10 21:17:11

本节课程主要进行时间片内容的学习。在一个同一优先级列表下挂载两个任务,每个任务工作一个时间片,时间片到了,任务从 切就绪列表头部切换到尾部,换到另一个任务。注意:每个任务软件延时的时间一定要小于时间片。

时间片相关成员介绍

TimeQuanta需要多少个时间片

TimeQuantaCtr还剩多少个时间片

时间片的调度函数在systick中断服务程序OSTimeTick()中调用。

代码介绍:

main:

1、CPU_Init()时间戳初始化 配置

2、CPU_IntDis()关中断

3、OS_CPU_SysTickInit () systick配置

4、OSInit(&err) 系统初始化

5、OSTaskCreate() 任务创建 加入时间片大小

6、OSStart()    启动系统

ucosIII自学笔记-时间片_5ucosIII自学笔记-时间片_5

详细介绍:

4.OSInit(&err) 系统初始化 在初始化IdleTask时给IdleTask分配时间片大小为0

其他函数内容同上节

ucosIII自学笔记-时间片_5

5、OSTaskCreate() 任务创建 

5.1、os_tcb结构体加入与时间片相关成员

ucosIII自学笔记-时间片_5

5.2、OS_TaskInitTCB() 任务初始化函数加入时间片成员初始化

ucosIII自学笔记-时间片_5

5.3、各成员赋值

5.4临界段内写  OS_PrioInsert()将任务优先级置位  OS_RdyListInsertTail()将任务加入到就绪列表尾部 函数同前一节

ucosIII自学笔记-时间片_5

6、 OSStart()启动系统 未做修改 经过这里后 将接下来执行任务优先级最高的任务(任务1)

7、任务执行

7.1阻塞延时OSTimeDly()  未修改 临界代码内处理

ucosIII自学笔记-时间片_5

ucosIII自学笔记-时间片_5

7.2、任务1加入到时基列表后,继续任务调度,执行任务2

任务2位死循环,且为软件延时,将一直执行任务2。

ucosIII自学笔记-时间片_5

8、systick中断处理函数 OSTimeTick()

在OSTimeTick()进行1)时基列表更新; 2)时间片任务调度更新; 3)任务调度

ucosIII自学笔记-时间片_5

ucosIII自学笔记-时间片_5

8.1 OS_TickListUpdate()时基列表更新 同前一节

ucosIII自学笔记-时间片_5

ucosIII自学笔记-时间片_5

8.2、 OS_SchedRoundRobin()时间片调度更新

检查若就绪列表 1)非空节点 2)非闲时任务 3)剩余时间大于0,并进行-- 4)自减后为0 5)不少于两个任务。则执行后续代码

6)OS_RdyListMoveHeadToTail()将任务从就绪列表头部移到尾部 7)重新获取就绪列表头指针以及时间片  上述代码在临界段内执行

ucosIII自学笔记-时间片_5

ucosIII自学笔记-时间片_5

8.2.1 OS_RdyListMoveHeadToTail()

ucosIII自学笔记-时间片_5

ucosIII自学笔记-时间片_5

执行完上述代码,此时就绪列表中只有任务3可以调度(任务1阻塞延时未结束,任务2在就绪列表尾部,由于任务3位死循环 软件延时,任务2无法执行到 ),之后执行任务3.直到下一个systick中断到来,切换到任务1,在将任务3从就绪列表头部移到尾部,切换到任务2,。如此循环。

执行效果

ucosIII自学笔记-时间片_5