uCOS2 学习笔记(四)

主题:为uCOS2添加时间片轮转的功能


简介

ucos2最多可以支持64个任务,每个任务的优先级必须不同,而时间片轮转是针对相同的优先级上的任务而言,保证每一个任务都有机会执行,所以,要添加时间片轮转功能,首先要允许多个任务的优先级相同,然后再实现轮转算法。


数据结构

OS_EXT  OS_TCB           *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];//每个优先级任务链表的数组

OS_EXT  OS_TCB            *OSTCBPrioActiveTbl[OS_LOWEST_PRIO+1];//每个优先级链表中的活跃任务

OS_EXT  INT16U             UniqueNum;//产生唯一的任务ID


基本思路

把同一个优先级的任务用双向链表连接在一起,表头放置全局数组中

把每个优先级中的活跃任务的TCB保存在全局数组中

创建任务时,每个任务的ID由操作系统内部分配,而不是用户指定


初始化

在调用OSTaskCreateExt创建任务时,初始化优先级链表

 

然后初始化优先级中的活跃任务表

if(OSTCBPrioActiveTbl[prio]==0)
   OSTCBPrioActiveTbl[prio]=ptcb;

 


调度方式

1.任务级调度

在OS_Sched中,首先调用OS_SchedNew获取就绪表中的最高优先级,然后取得该优先级中的活跃任务,然后调用OSCtxSw

2.时钟中断调度

当时钟中断来时,会将当前活跃任务的ticks递减,如果ticks==0,则表示当前任务的时间片已经用光,当前优先级的活跃任务向后移动,

如果在OSIntExit调用,即时钟中断退出时发现当前任务和最高优先级活跃任务不一致,则调用OSIntCtxSw进行任务切换,实际上,该函数的实现和OSCtxSw几乎一样


OSTimeDly的实现

在该函数中应当注意,只有当属于该优先级的所有任务都没有处于就绪态时,才可以从就绪表中清除该优先级。

 


实现时间片轮转

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值