AB型血型有什么优势| 蠓虫叮咬后涂什么药膏| 怀孕养猫对胎儿有什么影响| 1971年是什么命| 副部级是什么级别| 军长什么级别| 牙疼吃什么水果| 作茧自缚是什么意思| 山竹和什么不能一起吃| 姓袁女孩叫什么名字好听| ace什么意思| 三点水是什么字| 按摩脸部有什么好处| 淋巴细胞百分比偏高是什么意思| 母猫怀孕有什么症状| 茴香是什么| 为什么心里总想一个人| 耳朵痒是什么预兆| 橘白猫是什么品种| 骨髓水肿吃什么消炎药| 月经刚完同房为什么痛| 有两把刷子是什么意思| 一岁宝宝能吃什么水果| 巴旦木是什么树的果实| 结核t细胞阳性说明什么| 嘈杂的意思是什么| 521是什么星座| 发泡实验阳性说明什么| onlycook是什么牌子| 六亲缘浅是什么意思| qa是什么| 疯狂动物城闪电是什么动物| 肚脐眼上面痛是什么原因引起的| 世界上笔画最多的字是什么| 知了吃什么东西| 十二月四号是什么星座| 什么叫同人文| 鳗鱼是什么鱼| 肝病吃什么好得快| 肾痛是什么原因| 皮肤黑穿什么颜色显白| 草字头一个见念什么| 1985年属什么| 怀孕第一天有什么症状| 处事不惊是什么意思| 技压群雄的意思是什么| ct和磁共振有什么区别| 结甲是什么病| 多动症是什么引起的| bpo是什么意思啊| 什么叫批次线| 尿频尿急小腹胀痛吃什么药| 指压板有什么功效| 柠檬酸是什么| 淋巴结肿大吃什么食物好| 汗液里面有什么成分| 大便绿色的是什么原因| 京兆尹是什么官| 小娘皮什么意思| 修缮是什么意思| 脸皮最厚是什么生肖| 癌症晚期吃什么食物好| 阑尾炎吃什么药| 上位者是什么意思| 吃什么能排出胆结石| 头顶痛吃什么药效果好| 厅局级是什么级别| 月球是地球的什么星| cd代表什么意思| 91是什么意思| 经期喝咖啡有什么影响| la什么牌子| 氯化钠是什么盐| 玻璃水是干什么用的| 理想主义是什么意思| 儿童热感冒吃什么药| 虚荣心是什么意思| 高血糖吃什么药| 饕餮长什么样子| 出是什么意思| 手抖挂什么科| 扁桃体溃疡吃什么药| 甲减喝什么药| 羊肉不能和什么食物一起吃| diff是什么意思| prf是什么意思| 脂肪肝中医叫什么名字| 尿酸高适合吃什么食物| 2月出生的是什么星座| 养病是什么意思| 重阳节的习俗是什么| 鎏是什么意思| 直率是什么意思| 泰迪哼哼唧唧表示什么| 飞机用什么燃油| 打卤面都有什么卤| 人参适合什么人吃| 不速之客是什么意思| 为什么做梦会说梦话| 晚上睡觉咬牙齿是什么原因| 鸡蛋属于什么类食品| 手心发黄是什么原因| 推背有什么好处和坏处| 寂静的意思是什么| 四平八稳是什么意思| 女的右眼跳代表什么| ddp是什么化疗药| 滨海新区有什么好玩的地方| 7月8日是什么星座| 夏天适合穿什么衣服| 无利起早是什么生肖| 扮猪吃老虎什么意思| 松鼠吃什么| 番茄是什么时候传入中国的| 不以为然的意思是什么| 奶酪是什么| 海灵菇是什么东西| 折耳根是什么| 老公工作劳累炖什么汤| 深海鱼油有什么功效| 双肾结晶什么意思| 嘴巴长疱疹用什么药| 井里面一个点念什么| 脾胃气虚吃什么中成药| 宫颈涂片检查是查什么| 腱鞘囊肿看什么科| 胃痞病是什么病| 背部长痘痘是什么原因造成| 入伏吃羊肉有什么好处| 子宫形态失常是什么意思| 急性咽炎吃什么药| 溢脂性皮炎用什么药| 头发热是什么原因| 腐女什么意思| 痛经挂什么科| 米氮平是什么药| 破卵针是什么| gc是什么意思| 鳜鱼是什么鱼| 五谷指的是什么| 血型o型rh阳性是什么意思| 亲子鉴定需要什么材料| 左顾右盼的顾是什么意思| 春茶是什么茶| 子宫形态失常是什么意思| 手不释卷的释是什么意思| b12是什么| 25周岁属什么生肖| 吃什么可以化痰| 什么毛什么血| 红薯开花预示着什么| 莴笋炒什么好吃| ds是什么意思| 黄忠字什么| 拉肚子低烧是什么原因| 跖疣长什么样| 颈部淋巴结肿大挂什么科| 乳房里面有硬块是什么原因| 手串18颗代表什么意思| 手上十个簸箕代表什么| 神经外科和神经内科有什么区别| 当我们谈论爱情时我们在谈论什么| 狄仁杰为什么才三品| 褶是什么意思| 女人右眼跳预示着什么| 大便带油花是什么原因| 工作是什么意思| 三个贝念什么| 歆是什么意思| 月与什么有关| 撒是什么意思| 北极熊的毛是什么颜色的| 挂彩是什么意思| 诺五行属什么| 大运什么意思| 苏打水有什么作用和功效| 心跳加速心慌吃什么药| 什么是动脉硬化| 便秘吃什么食物| 1952年属什么生肖| 一个西一个米念什么| 肚胀是什么原因| 为什么有的| 打喷嚏鼻塞吃什么药| 隐翅虫咬到擦什么药膏| 一什么帽子| 下面有炎症用什么药| 好高什么远| 盆腔炎吃什么药最有效| 吃无花果有什么好处和坏处| 何必是什么意思| 戊肝抗体igg阳性是什么意思| 可望不可求是什么意思| 乳腺增生吃什么药效果好| 男性硬下疳是什么样子| 灭活是什么意思| 女生额头长痘痘是什么原因| 白羊男和什么星座最配| 运动后体重增加是什么原因| 喝酒拉肚子吃什么药| 微量蛋白尿高说明什么| 降血脂喝什么茶最好| 血糖高做什么运动好| 稀料是什么| 鱼肝油又叫什么名字| 女人为什么要穿高跟鞋| 什么是包皮过长图片| 女大七岁有什么说法| 农历十月份是什么星座| 蓝色预警是什么级别| 四肢百骸是什么意思| 空心人是什么意思| 过期的酸奶有什么用| 霉菌阴道炎用什么药| 腐竹炒什么好吃| 孕妇梦见大蟒蛇是什么意思| 霉菌是什么东西| 喉咙痛吃什么| 大姨妈黑色是什么原因| 为什么会梦遗| 间接胆红素偏高是什么原因| 放行是什么意思| 今年流行什么发型女| 什么字最难写| 劳热是什么意思| 一龙一什么填十二生肖| 蝴蝶吃什么食物| 足癣用什么药膏| 晚上七八点是什么时辰| 手心朝上是什么意思| kawasaki是什么牌子| 山什么水什么| 早上七八点是什么时辰| 心门是什么意思| baby是什么意思| 正师级相当于地方什么级别| 钾高是什么原因造成的| 头晕有点恶心是什么原因| 墨龟为什么只能养一只| paw是什么意思| 诺如病毒吃什么药好得快一点| ch是什么牌子| 名人轶事是什么意思| 语无伦次是什么意思| 猫摇尾巴是什么意思| gcp是什么| 外公的妈妈叫什么| 耳鸣吃什么药效果最好| 待见是什么意思| arf是什么意思| 层出不穷是什么意思| 梦见儿子拉屎是什么意思| 解脲支原体阳性是什么病| 妈妈吃什么帮宝宝排气| 晚上梦到蛇是什么意思| 菜板买什么材质的好| tt什么意思| 勇气是什么| 梦见打碎碗是什么预兆| 柠檬配什么泡水喝最好| 胱抑素是什么| 紫水晶五行属什么| 为什么会得带状疱疹| 丢包率是什么意思| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于μC/OS-II的时间片调度法的设计与应用

精神障碍是什么病

作者: 时间:2025-08-04 来源:网络 收藏
百度 偌大的展馆竟然找不到能够给人以补充能量的地方?在之前的DesignShanghai设计上海,不少人都会发出类似的抱怨,而有幸找到那些食物补给站的人则会发出另一种抱怨,价格有点太贵了。

 引言

  μC/OS-II嵌入式实时操作系统采用的是基于优先级的可剥夺调度法[1]。基于优先级的可剥夺调度法是指,CPU总是让处于就绪态的、优先级最高的任务运行;最高优先级的任务一旦就绪,总能得到CPU的使用权,当一个运行着的任务使一个比它优先级高的任务进入了就绪态时,当前任务的CPU使用权就被剥夺了,更高优先级的任务立刻得到了CPU的使用权。除非最高优先级的任务主动放弃CPU的使用权(通过调用OSTimeDly()、OSSemPend()等函数),否则低优先级的任务是没机会获得CPU使用权的。对于一个实际应用系统中耗时比较长的任务,为了让其他任务能够得到实时调度,可以用两种方法来处理。第一种方法是把该任务的优先级设为最低(当然还是比空闲任务要高);第二种方法就是让该耗时任务运行一段时间后延时一下再继续运行,即把整个任务划分为若干步骤来执行,如以下的示例代码:

程序

  很多情况下,耗时长的任务并不能设置为最低优先级任务,而划分步骤来执行的方法不但繁琐而且每一步执行的时间也是不确定的(其他低优先级任务获得CPU使用权的时间也会是不确定的)。笔者在用μC/OSII开发一款车载信息娱乐系统的时候就碰到了这样的问题,因此设计了一种优先级和时间片相结合的调度法(也就是基于μC/OSII的)。

  1 调度原理

  这种调度法给处于就绪态的每一个任务都分配一个时间片(优先级越高分配的时间片越长,空闲任务得不到时间片的分配),内核按照任务的优先级依次调度处于就绪态的任务,即当就绪态中最高优先级的任务用完自己的时间片后,CPU控制权转让给就绪态中优先级第二高的任务。该任务用完自己的时间片后,CPU控制权又转让给下一优先级的就绪态任务……当就绪态的每一个任务都被调度一次之后将重新为它们分配时间片,然后又开始新一轮的调度……[2]

  其中要注意的是,在调度过程中如果有一个比当前任务优先级更高的任务由其他态变成了就绪态(被创建或获取了一个信号量等),当前任务的CPU控制权将被剥夺;空闲任务仍然是等到其他任务都退出就绪态才获得CPU的使用权。

  图1解释了该调度法的调度过程(其中任务1优先级最高,任务2次之,任务3最低)。

基于

图1 基于μC/OSII时间片调度过程

  ① 任务2和任务3都处于就绪态,任务1在等待一个信号量,优先级中的任务2获得CPU使用权。

  ② 任务2的时间片用完,优先级低的任务3获得CPU使用权。

  ③ 任务3的时间片用完,任务2重新获得CPU的使用权。

  ④ 任务2的时间片还没用完时中断来临,中断服务程序获得CPU使用权。

  ⑤ 中断服务程序发送了一个任务1等待的信号量,中断服务完成后优先级高的任务1获得CPU使用权。

  ⑥ 任务1的时间片用完,任务2继续运行。

  ⑦ 任务2的时间片用完,任务3获得CPU使用权。

  ⑧ 任务3的时间片用完,重新分配时间片,新一轮调度开始。

  2 实现方法

  在调度算法的实现过程中,力求做到3点:

  ① 尽可能少地改动μC/OSII原有的代码;

  ② 增加的代码在风格上保持与原有的相一致;

  ③ 兼容原有的(可以很方便地选择或是)。

  注:对于该小节中出现的代码,如果是笔者增加的部分都用黑体表示。

  2.1 数据结构中增加的变量

  在进程控制块中增加两项:

  Typedef struct os_tcb{

  ……

#if OS_TASK_TIME_SLICE_EN>0

  /*条件编译,OS_TASK_TIME_SLICE_EN在os_cfg.h中定义,凡是涉及与时间片调度相关的代码都用条件编译。这样,可以通过更改配置文件很方便地选择任务调度法

*/INT16UOSTCBTimeSlice;

  /*任务的时间片大小,在任务创建时被初始化,运行过程中保持不变*/

INT16UOSTCBCounter;

  /*任务运行剩余时间计数器,每一轮调度开始时该变量被赋值(等于OSTCBTimeSlice),运行过程中不断递减。当其等于0时任务被剥夺CPU使用权*/

#endif

  }

  由于当前任务的时间片使用完时,该任务将被从就绪表OSRdyGrp以及OSRdyTbl[OS_RDY_TBL_SIZE]中清除;新一轮调度开始时它又必须被恢复,因此笔者在uCOS_II.h文件中增加以下变量(不妨把它们称为“时间片调度表”)分别用于保存OSRdyGrp和OSRdyTbl[OS_RDY_TBL_SIZE]。

  OS_EXT INT8UOSTSSGrp;

  OS_EXT INT8UOSTSSTbl[OS_RDY_TBL_SIZE];

  另外,在uCOS_II.h文件中增加宏定义,用于表示任务时间片被用完这种状态:

  #defineOS_STAT_TS_USEUP0x40

2.2 相关函数的修改

  对OS_TCBInit()、OSTimeTick()、OSTimeDly()、OS_EventTaskWait()、OS_EventTaskRdy()这5个函数的修改,是在μC/OSII基础上实现的关键。下面将一一对这几个函数的修改部分进行说明。

  在初始化任务控制块的函数OS_TCBInit()中,笔者添加以下代码让新创建的任务处于时间片就绪表中,并根据任务优先级对任务的时间片大小进行初始化。

程序

  OSTimeTick()函数在每个时钟滴答被调用,在时间片调度过程中起到了递减时间片计数器的作用。当计数器为0时,进行任务切换或是重新给各个任务分配时间片并开始新一轮调度。

  OSTimeDly()函数的作用是将任务延时一定的时间。这种情况下,应该把该任务从时间片调度表中清除。

  当某个任务须等待一个事件的发生时,信号量、互斥型信号量、邮箱及消息队列会通过相应的PEND函数调用函数OS_EventTaskWait(),使当前任务从就绪任务表中脱离就绪态,此时还需把当前任务从时间片调度表中清除。笔者在OS_EventTaskWait()函数中添加了以下代码:

程序

  相应地,当某个事件发生了,信号量、互斥型信号量、邮箱及消息队列会通过相应的POST函数调用OS_EventTaskRdy(),从等待任务队列中使最高优先级任务脱离等待状态,此时还需要把该任务添加到时间片调度表中。笔者在OS_EventTaskRdy()函数中添加了以下代码:

  OSTSSGrp |= bity;

  OSTSSTbl[y] |= bitx;

  3 应用实例

  笔者首先把μC/OSII移植到开发板上(MCU是意法半导体生产的基于ARM7TDMI核的STR730[3]),然后如2小节所述对相关部分的源代码进行修改,接下来将和基于μC/OSII的时间片调度法进行比较。为此分别建立了2个任务Task_TimeConsuming()、Task_Audio(),任务的优先级分别是5、6。

程序

  由于模拟的耗时任务Task_TimeConsuming()是个死循环且没有调用OSTimeDly()函数,其优先级又比Task_Audio()高,如果完全按照优先级调度,系统不会有声音输出,因为负责声音控制的任务Task_Audio一直得不到运行。而如果按照时间片调度(在os_cfg.h中增加#define OS_TASK_TIME_SLICE_EN 1),则声音输出正常,通过仿真器在Task_Audio()中设置断点,程序会很快停止在断点处。进一步地,依次在Task_TimeConsuming()和Task_Audio()函数体中设置断点,分别记录两次PC指针停止在断点处时看门狗计数器的值WDG_Counter1和WDG_Counter2,可以利用WDG_Counter1和WDG_Counter2的差值估算出任务Task_Audio前后两次被调度的时间间隔(忽略任务在切换过程中的耗时)。经过多次计算,这个时间间隔值的范围在58~59ms,而任务Task_TimeConsuming的时间片理论值=64-Prio=64-5=59 ms,实验值与理论值是非常吻合的。

  当然,这只是简单的验证实验。严格的测试还需要兼顾信号量、互斥型信号量、邮箱及消息队列相应的PEND、POST函数以及OSTimeDly()函数调用。鉴于篇幅关系,这里就不再赘述了。

  结语

  笔者已经成功地把这种基于μC/OSII的时间片调度法运用到车载信息娱乐系统的开发中。实践证明,对于含有耗时任务的系统,尤其是在需要严格控制耗时任务运行时间长度的场合,该调度算法会有一定的便捷性,也能保证系统的实时响应,而且整个算法只改动了μC/OSII中的少量代码;还可以根据实际需要调整各个任务的时间片大小,体现出了算法的实用性与灵活性。



评论


相关推荐

技术专区

关闭
今年26岁属什么生肖 kpa什么意思 毛肚是什么动物身上的 谷丙转氨酶偏高吃什么好 泰五行属什么
头顶冒汗是什么原因 国士无双是什么意思 为什么肝区隐隐作痛 阿司匹林不能和什么药一起吃 调经止带是什么意思
活化部分凝血活酶时间偏高是什么意思 百雀羚适合什么年龄段 踮脚走路有什么好处 吃什么解辣最快方法 升结肠憩室是什么意思
苯氧乙醇是什么 今年贵庚是什么意思 为什么抽烟 海澜之家属于什么档次 大连机场叫什么名字
胃酸反流吃什么药hcv9jop4ns0r.cn ki67是什么意思hcv8jop6ns5r.cn 血脂稠是什么原因造成的hcv8jop8ns4r.cn 76年属什么的生肖hcv8jop9ns4r.cn 宫腔粘连带是什么意思hcv9jop3ns4r.cn
何以笙箫默什么意思adwl56.com 梅毒什么症状hcv9jop2ns0r.cn 冷面是什么做的hcv8jop5ns1r.cn 466是什么意思hcv9jop1ns1r.cn 递增是什么意思hcv7jop5ns3r.cn
硒是什么ff14chat.com 三百多分能上什么大学hcv9jop7ns4r.cn 小浣熊吃什么hcv7jop5ns4r.cn 乌鸡白凤丸有什么功效xjhesheng.com 何首乌长什么样子图片hcv9jop3ns5r.cn
羊下面是什么生肖hcv9jop5ns9r.cn dh什么意思hcv9jop0ns2r.cn 正月初二是什么星座的hcv9jop0ns1r.cn 无水酥油是什么hcv9jop3ns2r.cn 誉之曰的之是什么意思hcv8jop1ns1r.cn
百度