人人范文网 范文大全

初学μCOSII心得

发布时间:2020-03-02 02:34:33 来源:范文大全 收藏本文 下载本文 手机版

初学μC/OS-II心得

μC/OS-II 是一个源代码公开、可移植、可裁剪的实时多任务操作系统,具有稳定可靠、实时性好等优点。和学习其他操作系统一样,我习惯从操作系统内核开始学习,然后扩展到其他细节和方面。这次初学μC/OS-II操作系统,我大体了解了构建一个操作系统的思路和运行流程,本文也主要围绕系统运行过程和通信谈谈自己的理解。一个系统的运行过程包括初始化、任务创建以及任务调度这几个主要的方面,而系统内通信则涉及到了信号量管理、消息邮箱以及消息队列等。其中我最感兴趣的是μC/OS-II查找最高优先级算法的实现,这一数据结构以及用空间换时间的基本思想是该操作系统中一个重要的环节;其次,μC/OS-II中的通信媒介也是我比较关注的部分,我将总结一下几种通信方式的特点以及异同。

相比而言,μC/OS-II是一个较为简单的操作系统,远没有Linux复杂,学习起来也比较好掌握,但这些基本思想在很多操作系统中是可以借鉴甚至相通的,可以作为学习其他操作系统的一个基础。书中的介绍方式是把一个实时系统分为很多个模块,然后逐一介绍。我觉得这种方式缺少整体把握,让初学者难以了解一个系统的大概运行情况。所以我先从操作系统运行过程切入,这与程序运行从Main开始有类似之处,比较好理解。

μC/OS-II运行过程

μC/OS-II的运行过程可分为系统初始化、任务创建和任务调度三个方面。其中主函数Main不到十行,由OSInit(),OSTaskCreate(),OSStart()分别完成初始

化,创建任务和调度的工作。其高度的结构化以及良好的函数封装对了解运行过程和学习μC/OS-II的编程思想以及设计思路有重大的意义。

在μC/OS-II中,系统初始化可以分为全局变量初始化、创建空闲任务任务、堆栈初始化、任务控制块初始化等部分内容。由于μC/OS-II操作系统中定义了众多与系统参数有关的全局变量,因此全局变量的初始化包含众多内容。这些系统参数的初始化大都被封装在OSInit函数中。尤其要注意的是,在OSInit函数中,OSRunning变量一定要被定义成FALSE,否则在OSStart函数中,系统无法启动创建的任务,系统因此变成了一个有始有终的函数,创建的任务永远得不到执行。在实际运行过程中表现为主函数运行一次之后,系统不再运行。创建空闲任务包括进入临界区、任务堆栈初始化、TCB初始化、退出临界区等内容,大部分是一些简单的赋值操作,比较简单。一旦任务就绪队列中有\"1\"(即对应的任务就绪),则相应的任务组OSRdyGrp 相应的位变成1,OSRdyTbl中的相应的位也变成1。

任务创建与创建空任务大体雷同。需要注意的是此时操作系统的OSRunning变量还是处于FALSE状态,因此创建任务的过程中,操作系统并没有开始运行。这就是为什么操作系统在开始运行的时候不是选择第一个创建的任务开始运行,而是从所有的任务里面选择优先级最高的运行的原因。

任务调度是从OSStart函数开始的。具体包括OSStart、OsStartHighRdy、OSTimeDlyHMSM、OSSched等函数。OsStart在整个系统运行的过程中只会运行一次。在系统创建任务之后运行。主要目的是从任务就绪表中挑选出优先级最高的任务,并开始运行优先级最高的任务。因为μC/OS-II操作系统并不是一个像Linux那样的时间片轮流处理的操作系统,它仅仅是一个处理完一部分内容之后再

去处理另一部分内容的实时操作系统,这就要求在每一个任务的每一个无限循环中都要加一个调用OSSched函数的函数。

μC/OS-II查找最高优先级

μC/OS-II操作系统查找最高优先级的算法和数据结构是我最感兴趣的部分,其中的主要思想就是以空间换时间。无论是遍历OSRdyGrp还是OSRdyTbl,都是为了找出最低位为1的位置,最直接的办法就是从低位到高位一个个比对,直到找到第一个为1的位置。类似于用for循环加上if语句,时间复杂度为Θ(k),在最差的情况下需要比较16次(8次OSRdyGrp,8次OSRdyTbl)。在μC/OS-II中巧妙地用一个OSUnMapTbl矩阵列举了8位数可能出现的所有情况(0x00~0xFF),查表即可得到某一个数对应的最低位是第几位,时间复杂度为Θ(1)。

OSRdyGrp 是一个8位的unsigned char型数。由于μC/OS-II系统最多允许prio为63,也就是说最多允许有64个优先级。64个优先级被分成了八组,每组也有八个优先级。如果有任何一组中的任务进入了就绪状态,则该组所对应的位变为1。OSRdyTbl为一个有8个元素的8位数的数组,分别为OSRdyTbl[0]到OSRdyTbl[7]。从OSRdyTbl[0]到OSRdyTbl[7]的每一位数对应相应优先级的任务是否进入了就绪态。

了解这两个变量之后,就可以很容易理解这个矩阵的作用了。矩阵的第i个数字表示用二进制表示的i中1所出现的最小位数。也就是说,通过查这个矩阵得到的是最小的出现1的位数。由此很容易理解这两行代码:

y= OSUnMapTbl[OSRdyGrp]

x = OSUnMapTbl[OSRdyTbl[y]]

得到的y为最高优先级所在的组号,x为最高优先级所在的组中最高优先级所在的组的组号。由于每组有8个成员,对于y组第x个任务来说,优先级自然是 8*y+x ,由此得到了最高优先级。下面的代码中左移三位即是乘八:

OSPrioHighRdy = (INT8U)((y

μC/OS-II通信

μC/OS-II操作系统中的通信是我第二感兴趣的内容,之前学操作系统的时候,就了解过读者-作者问题,哲学家进餐问题等,涉及最重要的就是信号量在其中起的作用。μC/OS-II的通信用到了信号量、消息邮箱、消息队列这三种形式,这三种媒介有类似之处,尤其是消息邮箱和消息队列比较难分开。在我总结它们之间的区别之前,首先分别介绍这三种通信媒介。

信号量是进行任务通信的最基本事件。二值信号也叫互斥信号量,可以实现共享资源的独占。高优先级的任务在等待接受信号量的时候,如果低优先级的任务没有释放信号量,那就会一直等待下去,那低优先级的任务就没有机会运行了,系统就出现死机的状况了。 在使用信号量同步时,一个任务能否运行取决于2个条件:一是优先级 ,二是是否获得信号量,相当于串联关系,这也引发了优先级反转的问题。消息邮箱是多任务进行通信的时候传递消息缓冲区指针的数据结构。消息队列是多任务进行通信的时候传递多个消息邮箱的数据结构。为了把事件的数据结构统一起来,制定了事件控制块ECB,专门用来描述消息邮箱、消息队列、信号量这些事件的。

我认为μC/OS-II通信的精华在于理解这三种媒介应用方面的不同,这样才能明白设计者区分为三种情况的原因所在:

用信号量进行行为同步时,只能提供同步的时刻信息,不能提供内容信息。若被控制方要求得到控制方的内容信息时,可以使用消息邮箱或消息队列。但由于消息邮箱里只能存放一条消息,所以使用消息邮箱进行任务的同步时,需要满足一个条件:消息的产生速度总要慢于消息的消费速度,即被控制任务总是在等待消息。若遇到出现消息的产生速度可能快于消息的消费速度的情况时,则可以使用比消息邮箱更为强大的消息队列,由于消息队列可以存放多条消息,所以消息队列能够有效解决消息的临时堆积问题。但消息队列的使用仍然需满足一个条件:消息的平均生产时间比消息的平均消费时间长,否则再长的消息队列也会溢出。综上可知,虽然这三种通信媒介比较类似,但是不能互相替代,他们有各自的适应范围。

由于μC/OS-II是一种抢占式的多任务操作系统,如果最高优先级的任务不主动放弃CPU的使用的话,其他任务是无法运行的,通常情况下,高优先级的任务在使用完CPU或其他资源后都要主动放弃,可以通过延时函数或者时等待一些信号量之类的让自己挂起。但是如果最高优先级任务一直使用CPU,那就跟单任务没有什么区别了。

学习总结

通过学习嵌入式操作系统,我也间接复习了操作系统,觉得之前的学习也是模块化太强,没有能够整体把握,这次通过写论文让自己理清了思路,从操作系统运行的角度更深入的理解了操作系统的整体流程,同时对自己感兴趣的地方进行了比较和总结,很有收获。

初学催眠心得

设计模式初学心得

书法心得(初学)[优秀]

825初学房地产策划心得

初学游泳

初学佛法

初学书法

预算员初学

围棋初学目录

初学灯谜资料

初学μCOSII心得
《初学μCOSII心得.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
相关专题 初学cosii心得 心得
点击下载本文文档