ucosIII自学笔记-时间片_5

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

时间片相关成员介绍

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,。如此循环。

执行效果




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值