μC/OS-II就绪表算法介绍与具体改动方法

μc/os-ⅱ的就绪表设置、清除、查找算法,是高效的、跨平台的程序。它使用了两个查找数组osmaptbl[8]和osunmaptbl[256],以提高查找就绪表的速度,尽快获取就绪任务的最高优先级。
cortex-m3是arm公司较新的一种架构版本,主要应用在单片机领域。基于它生产的32位芯片日益增多;cortex-m3只支持thumb-2指令集,在效能和代码密度间能取得更佳的表现。
1 在arm上改动算法的因由利弊 由于就绪表操作是在关中断状态下运行的,其执行影响到系统的中断响应时间,因此就绪表操作算法的效率是衡量实时操作系统优劣的基准之一。
在cortex-m3所用的指令集中,一些指令功能不可小觑,如前导零计数clz、字内位反转rbit、位清除bic。其中的clz和bic为μc/os就绪表的高优先级获取算法指出了另一条道路。
(1)改动后的优势 ①节省存储空间。不再使用查找数组osmaptbl[8]和osunmaptbl[256]。设立这两个数组的目的,是为了提高查找就绪表的效率。
②提升查找效率。clz是单周期指令,使用带移位的加法指令,大幅缩短运算时间。
③增加了μc/os-ⅱ支持的任务数量,从64提升到了1 024(2.84版支持的任务数量已经到了256,不过效率有所下降)。
(2)存在的不足 ①realview mdk(这里使用的是3.20版及其指令模拟器)尚不支持在c语言程序中使用thumb-2指令内联汇编。使用内嵌汇编函数时,函数的调用(跳转返回)降低了执行效率。
②c语言对clz指令的支持尚有不足,故新算法跨平台性差。但鉴于arm芯片应用广泛,指令又被arm9之后的芯片广泛兼容,所以应用空间还算广阔。
2 μc/os-ⅱ就绪表算法介绍与具体改动 μc/os-ⅱ就绪表是一个数组,数组元素一位的值(1或0)对应了一个任务就绪与否,该位在数组中的位置表示任务的优先级。当需要调度已就绪的最高优先级任务运行时,就在就绪表中查找该任务。
2.1 μc/os-ⅱ就绪表算法简介 一种解决方法是,对数组各项依次判断是否为0:若>o,进入该项查找最小权的置1位位置;若=0,优先级加一个基数,查下一项,直至查到该优先级。
μc/os-ⅱ技高一筹,设置了一个对就绪表各项判断是否为0的变量,称之为就绪表组。就绪表组一位为0或1,对应就绪表一项的值是否为0。通过查找就绪表组最小权位的置1位位置,就确定了对应首个>0的就绪表项的下标,从而避免了循环,大幅度提高了效率。
2.2改动方式与源码 clz算法接受了μc/os-ⅱ的思路,再通过使用clz指令来进行优化。不同的是,clz是从右往左查,二进制的高权位对应高优先级,而μc/os-ⅱ优先级以值小为高。
考虑到有时用不到很多任务,这时用数组作就绪表不免浪费。因此当任务总数小于32时,就用32位无符号整数变量作就绪表。注意,此时就绪表组变量osrdygrp被当作就绪表使用。
常量os_les_tsk表示是否使用较小任务数,0表示使用最多32个任务,1表示使用最多1 024个任务。
常量rdyst是将32位整数的最高权位置1,以便移位使用。
2.3 c语言实现 以下算法利用内嵌clz指令的函数编写,实现了指定优先级任务在就绪表的设置、清除,在就绪表中查找就绪任务的最高优先级。
程序中的bx r14,有些资料上要求必须写,不过查看反汇编代码,编译程序已经给加上了。看来是编译程序已升级,会不会出错要看使用的编译器,建议还是按规范写上。由于内嵌函数调用返回耗时,查找算法未能充分发挥,需改进编译后的汇编代码以实现更高的效率,或使用汇编代码重写这部分程序。
2.4 thumb-2汇编指令实现 用汇编语言写程序时的技巧:在最高优先级任务的设置、清除函数中,c语言运算符“︱=”对等汇编指令“orr”,“&=~”对等汇编指令“bic。这两条指令都可以进行预移位操作,大幅提高执行效率。可以查看反汇编源码,看c编译器是否利用了这一便利。
在查找函数中,可以省去c语言程序中的内嵌汇编调用,减少冗余指令。示意伪代码如下:
ldr ro, =osrdygrp;加载就绪表组变量osrdygrp地址
可以看出,除了数据加载指令外,查找的核心算法仅3条指令(使用255的值;过程中clz算法更多地使用16或32位整数,以充分利用芯片性能。
3 适用范围 等待任务列表使用了与就绪表操作相似的过程,注意要同时更改其数据类型和算法。算法虽然是在cortex—m3上执行的,但适用于arm9及其以后芯片。支持arm指令集的芯片,可以在c语言中使用内嵌汇编,不必再编写汇编查找函数。
本文所叙述的算法适用于下述两种情况。
①使用μc/os-ⅱ系统: ◆要求更多的任务优先级;
◆要求产品性能优越或是时间关键的应用,想进一
步提高效率;
◆学习、研究或希望优化μc/os-ⅱ以扩展其应用范围。
②未使用μc/os-ⅱ系统: ◆移植改造其他操作系统的就绪表算法;
◆编写新操作系统或执行调度程序;
◆编程爱好者借鉴、改进编程方法。
结 语 cortex-m3推出时,笔者就认定它是单片机过渡到arm的有力工具,其小存储量使得它更适合用小型实时系统。在学习μc/os-ⅱ的过程中,发现其就绪表操作算法经过改动或许更好,于是就做了本文所述的试验。

激光切割机常见故障以及解决方案
普渡机器人亮相第二届Foodtech Japan大阪展
工信部将研究制定App个人信息保护暂行规定,持续开展App侵害用户权益专项整治
LG将推出八款8K型号的新款OLED电视
谷歌Clips无线摄像头,它可以被运动触发和记录视频,而无需智能手机
μC/OS-II就绪表算法介绍与具体改动方法
SpaceX星舰SN10稳定落到指定地点,却意外爆炸
家电行业转型升级 智慧显示终端开始抢占智能家居控制入口
PCB打样中表面贴装技术的不同优势
德国行业联盟发布直流供电工厂示范项目规划
四维智联抖8车机最新OTA版本 全时段场景智能消息推送
精确送风奠定机房节能基础讲解
东风日产e-POWER或将在2021年导入国内
千兆网线和百兆网线的传输速率是多少
OPPO Reno5系列外观细节曝光:晶钻更大更闪亮
一座变电站建成的流程是什么
来看一下170A电源模块的MCU主控板
全新第三代荣威RX5开启预售,搭载3颗地平线征程3芯片
S3C44B0的初始化程序的理解
三星Galaxy S20曝光采用了方正的设计在背部加入了一枚ToF镜头