μC/OS-II 是一个源代码揭露、可移植、可裁剪的实时多使命操作体系,具有安稳牢靠、实时性好等长处,是专门针对微处理器和微操控器规划的实时内核,它的内核能够做到很小,很适合在单片机体系上移植。移植了μC/OS-II 的嵌入式体系能够使各个使命独立作业,互不干涉,很简略完成按时并且无误履行,使实时应用程序的规划和扩展变得简略,使应用程序的规划进程大为减化。在这个星期内,我通过对禁用了邮箱、行列、文件体系的最简略的μCOS-ii操作体系进行了学习,现将收成共享如下。
μCOS-ii运转进程
μCOS-ii的主函数不到十行代码,可是由于其高度的结构化以及杰出的函数封装,对其运转进程的了解关于学习μCOS-ii的编程思维以及规划思路具有严重的意义。
我通过将μCOS-ii代码移植到SST89V564RD单片机中,并且使用TI公司的温度传感器TMP124创立了两个使命:读TMP122数据、向串口发送读取的温度值。要求两个使命轮番履行,读TMP122的优先级高于向串口发送数据的优先级。
1 体系初始化
在μCOS-ii中,体系初始化能够分为全局变量初始化、创立闲暇使命使命、仓库初始化、使命操控块初始化等部分内容。
全局变量初始化。由于μCOS-ii操作体系中界说了很多与体系参数有关的全局变量,因而全局变量的初始化包含很多内容。这些体系参数的初始化大都被封装 在OSInit()函数中。特别要留意的是,在OSInit函数中,OSRunning变量必定要被界说成FALSE,否则在OSStart函数中,体系 无法发动创立的使命,体系因而变成了一个有头有尾的函数,创立的使命永久得不到履行。在实践运转进程中体现为主函数运转一次之后,体系不再运转。别的需求 留意的是OSTCBCur、OSTCBList等这几个变量需求界说为(OS_TCB DT_XDATA *)0的类型。由于这些变量是指向结构体TCB(Task Control Block)的指针,并不是数字〇。
创立闲暇使命。创立闲暇使命包含进入临界区、使命仓库初始化、TCB初始化、退出临界区等内容,大部分是一些简略的赋值操作,比较简略,不再赘述。其间OSRdyGrp |= ptcb->OSTCBBitY; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;这两句话要尽量看懂。由于这两句话牵扯到后边OSUnMapTbl这个矩阵的了解。其意义为一旦使命安排妥当行列中有"1"(即对应的使命安排妥当),则相应的使命组OSRdyGrp 相应的位变成1,OSRdyTbl中的相应的位也变成1.
仓库初始化以及使命操控块初始化。比较简略了解,简略的赋值操作。不过在仓库初始化中的ppdata = ppdata;opt = opt; 以及使命操控块初始化中的pext= pext; stk_size= stk_size;pbos=pbos;opt=opt; id= id;这些句子刚开端的时分很令人费解。其实这些是避免编译器不断的报warning,避免影响正常的调试的。
2 使命创立
同上述创立空使命大体相同。需求留意的是此刻操作体系的OSRunning变量仍是处于FALSE状况,因而创立使命的进程中,操作体系并没有开端运转。 这便是为什么操作体系在开端运转的时分不是挑选第一个创立的使命开端运转,而是从一切的使命里边挑选优先级最高的运转的原因。
3 使命调度
使命调度是从OSStart函数开端的。详细包含OSStart、OsStartHighRdy、Task1~n、OSTimeDlyHMSM、OSSched等函数,其间使命交流是在汇编语言文件的OS_TASK_SW函数中运转的。
OsStart在整个体系运转的进程中只会运转一次。在体系创立使命之后运转。首要意图是从使命安排妥当表中挑选出优先级最高的使命,并开端运转优先级最高的使命。
OsStartHighRdy为asm文件中的一部分。首要是仓库的操作。意图是要把高优先级使命的使命仓库仿制到寄存器中,为行将开端的运转最高优先级的使命做好预备。
Task1~n。Task为一个无限循环函数。虽然是无限循环函数,可是与往常前后台体系中的无限循环具有差异。由于μCOS-ii操作体系并不是一个像 Linux那样的时刻片轮番处理的操作体系,它只是是一个处理完一部分内容之后再去处理另一部分内容的实时操作体系。这就要求在每一个使命的每一个无限循 环中都要加一个调用OSSched函数的函数。
OSTimeDlyHMSM首要是为用户供给一个杰出的托言,将用户输入的时、分、秒、毫秒这四个数据转换成体系的滴答数,然后调用OSTimeDly实 现。在OSTimeDly中调用OSSched,保证体系的实时性。OSSched函数结构也类似于OSStart,首要是计算出使命安排妥当表中最高优先级 的使命,通过OS_TASK_SW中的仓库的操作完成使命的交流。
μCOS-ii查找最高优先级算法的完成
指导思维:以空间换时刻。
在检查源代码的进程中,最令人费解的或许便是OSUnMapTbl这个矩阵了。现将此矩阵仿制如下:
INT8U const DT_XDATA OSUnMapTbl[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
在了解这个矩阵的作业原理之前,咱们有必要了解一下几个变量的意义:
OSRdyGrp 是一个8位的unsigned char型数。由于该μCOS-ii体系最多答应prio为63,也便是说最多答应有64个优先级。64个优先级被分成了八组,每组有八个优先级。如果有 任何一组中的使命进入了安排妥当状况,则该组所对应的位变为1。比方优先级为4,23,56的使命一起进入了安排妥当态,则对应第0,2,7组中有使命进入了安排妥当 态,则此刻OSRdyGrp 应为 10000101。
OSRdyTbl为一个有8个元素的8位数的数组,分别为OSRdyTbl[0]…OSRdyTbl[7]。从OSRdyTbl[0]到 OSRdyTbl[7]的每一位数对应相应优先级的使命是不是进入了安排妥当态。仍是上面的比方,假设优先级为4,23,56的使命进入了安排妥当态,则 OSRdyTbl[0]的第4位,OSRdyTbl[2]的第7位,OSRdyTbl[7]的第0位变成1,其他的位依然坚持零。
介绍完两个变量之后,就能够很简略了解这个矩阵的作用了。矩阵的第i个数字表明用二进制表明的i中1所呈现的最小位数。比方关于矩阵的第48个数字,48用二进制表明为00110000,在第4位以及第5位中呈现了1,故去最小值,则OSUnMapTbl[48]=4 。也便是说,通过查这个矩阵得到的是最小的呈现1的位数。假设关于OSRdyGrp 来说,在OSRdyGrp 等于48的情况下,意味着第四组与第五组中有使命处于安排妥当状况,则通过此表能够得出最高优先级的使命在第四组中。假设关于OSRdyTbl来 说,OSRdyTbl[4]表明第四组中每一个元素是不是处于安排妥当态。仍是拿48来打比方,假设OSRdyTbl[4]等于48,有48用二进制表明为 00110000可得第四位与第五位中有两个使命处于安排妥当态,此刻查询OSUnMapTbl[48]=4可得优先级最高的使命处于第四位上。由此很简略理 解这两行代码:
y= OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
因而得到的y为最高优先级地点的组号。X为最高优先级地点的组中最高优先级地点的组的组号。由于每组有8个成员,关于y组第x个来说,优先级自然是 8*y+x 。由此得到了最高优先级。下面的代码不难了解。
OSPrioHighRdy = (INT8U)((y << 3) + x);
此外,由于这个矩阵不管在何种情况下,都是不变的,因而个人认为原μCOS-ii体系中界说为DT_XDATA彻底没有必要,只是增加了体系的开支。因而我测验将此变量类型改成DT_CODE ,通过运转TMP124的测验,体系运转几十分钟后依然正常。因而得出了此处能够改善的主张。并且改善之后体系的占用xdata从600多字节削减到400多字节,体系资源占用削减很明显。
或许编写μCOS-ii的工程师为了进步可移植性,将OSUnMapTbl界说为DT_XDATA吧。只是猜想罢了。