原创 和我一起学uC/OS-II实时操作系统(20080526)

2008-5-26 21:59 2364 4 4 分类: MCU/ 嵌入式

实时系统中需要了解的概念


1.1        代码的临界段


代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。在进入临界段之前须关中断,而临界代码段执行完后,要立即开中断。


1.2        资源


任何为任务所占用的实体都可以称为资源。资源可以是输入输出设备,也可以是一个变量、一个结构或一个数组等。


1.3        共享资源


可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道的时候,必须独占资源。这种现象叫做互斥(mutual exclusion)。


1.4        多任务


多任务的实现时间上是靠CPU在许多任务之间转换和调度。CPU只有一个,轮番服务与一系列任务中的某一个。多任务运行很像前后台系统,只是后台任务有多个。多任务使CPU的利用率达到最高,并使应用程序模块化。在实时应用中,多任务的最大特点是,开发人员可以将很复杂的应用程序层次化。使用多任务,应用程序将更易设计和维护。


1.5        任务


任务,也称为线程,是一个简单的程序,该程序它自己认为CPU只属于它自己。在实时操作系统中很多个任务就构成了整个系统中的应用程序,每个任务都有自己的优先级而且都有自己的一套CPU寄存器和栈空间。与前后台不一样的是,单个任务就是一个无限的循环,可想而知前后台为什么被称为超级循环。在uC/OS-II实时操作系统中,单个任务可能处于的状态有:


休眠态:任务仍然驻留在内存中,但是它不被内核所调度。


就绪态:任务已经准备好了,可以运行了。但是,由于其优先级不够高或者其他因素暂时还得不到CPU的使用权,那么那它就得再等等咯,这个状态就叫就绪态!


运行态:不用解释了这个,算了还是说一说:已经获得CPU的使用权正在运行的状态。


挂起态:一个任务由于没有得到它需要的信号或事件而“不得不”把CPU的使用权交出来且让自己出于等待的状态。


被中断态: 中断当然是老大咯,当任务还在运行而且它又没有关掉中断(注意操作系统中代码临界段的说法),但是遇到中断这个大哥的时候,被逼暂停运行的状态。


1.6        任务切换


如前所说的,在操作系统中的应用程序是由多个任务组成的。那么在这么多个任务之间进行切换是不可避免的。


任务切换(context switch):CPU只有一个,相关CPU的物理寄存器也就一套,那么当进行任务切换时需要做的就是把当前正在运行的任务的CPU寄存器全部保存到它自己的栈区中,然后把下一个要运行的任务的堆栈中、保存其运行状态的内容装入CPU寄存器,最终完成运行任务的切换(我怎么感觉话说得太长了不太容易理解,来个不确切的意会:我把每个任务比作拥有电话卡的学生,把CPU比作公用电话机,任务切换就相当于学生轮流打电话,每个学生都有自己的一张电话卡,那么每次打完电话后都收好各自的电话卡,以便让后面的同学插入自己的电话卡到电话机中打电话。)。


任务切换过程增加了应用程序的额外的负荷,CPU的内部寄存器越多,额外的负荷就越重。任务的切换时间取决于CPU有多少寄存器要入栈。实时内核的性能不能以每秒能做多少个任务来评判。


1.7        内核


头次听说这个词的时候自己感觉很神秘,高深莫测啊!内核在多任务系统中负责管理各个任务,并且负责各个任务之间的通信。内核提供的基本服务是任务切换。


内核本身也增加了应用程序的额外负荷,因为内核提供的服务需要一定的执行时间。额外的负荷量取决于多久调用一次这类服务。在设计较好的应用系统中,内核占用%2~%5CPU负荷。因为内核是加在用户应用程序中的软件,那么它就会增加ROM的用量,内核本身的数据结构也增加了RAM的用量。更主要的是每个任务都有自己的堆栈空间,这部分占用内存相当的多啊。


1.8        调度


调度(schedulers):这是内核的主要职责之一,就是决定轮到哪个任务被运行了。那么内核怎么去决定该哪一个任务该被运行呢?“坦白”的说这种决定任务该被运行的依据(规则)在uC/OS-II中就是任务的优先级。uC/OS-II操作系统中采用了优先级的调度法,CPU总是让处于最高优先级且处于就绪态的任务运行。值得注意的是,合适让高优先级的任务掌控CPU则由使用的内核的类型决定,基于优先级的内核有2种类型:不可剥夺和可剥夺型。


可剥夺:当最高优先级的任务一旦处于就绪态,立即得到内核调度。


uC/OS-II和绝大多数商业的实时内核都是可剥夺型内核。最高优先级的任务一旦就绪立即就可以得到CPU的使用权。在使用不可剥夺内核时,应用程序不应直接使用不可重入函数,如果要调用不可重入函数则要满足互斥条件。


不可剥夺:当最高优先级的任务就绪,但CPU这个时候还在运行其他任务。当这个任务运行完成后(即这个任务自己放弃CPU使用权),最高优先级的任务才能得到调度。


其优点就是响应中断速度快。不可剥夺型内核允许使用不可重入函数。每个任务都可以调用不可重入函数,而不必担心其他任务可能正在使用该函数。因为每个任务都是执行完成后才释放CPU的使用权。被调用的不可重入函数不能主动放弃CPU使用权,不然其他的任务就得到运行有可能破坏数据。


其最大的缺陷在于其响应时间。当一个高优先级的任务已经进入就绪太,要等待当前的任务运行完成释放CPU使用权后才能得到运行。这段时间有可能会很长导致已经就绪的高优先级任务得不到及时的执行。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条