原创 实时系统概念『转』

2011-3-22 12:17 1766 8 8 分类: MCU/ 嵌入式


         首先我们的熟悉实时系统的概念,实时系统它分为软实时和硬实时;软 实时系统它是指系统的目的是为了使各个任务尽快的执行,而不要求限定的某一个任务在多长时间内完成,也就是该系统超过规定时间对系统不会产生很大的影响, 系统依然可以运行。而硬实时系统则不仅要求任务执行无误,而且还要做到准时;也就是说在一到达规定的时间,任务必须完成,否则会给系统带来灾难性的后果。

         我以前写的程序很多是没有嵌系统的,所以它们称为前/后台系统或超循环系统。那么什么是前台,什么是后台呢?我们的程序中有个main函数,这个函数肯定是一个无限循环系统,在循环中调用相应的驱动函数完成相应的功能,这部分可以看成是后台行为;一般的系统都是有中断发生的,那么中断服务处理程序可以看成是前台行为;固有这个说法,后台可以成为任务级,前台成为中断级。这种前/后台系统有一个很大的缺点,就是任务级的响应时间不是固定的,因为它是循环中的一部分,所以取决于循环运行的时间,所以前/后台系统很容易跑飞。

         代码的临界段也称临界区,指处理时不可分割的代码;所以进入临界区之前必须关中断,临界区代码执行完后,必须马上开中断。

任务,在UCOS-ii实时系统中,一个任务其实就是一个线程,该任务可以认为CPU完全属于它自己。UCOS-ii中的任务拥有自己的堆栈和CPU寄存器,并且赋予一定的优先级,在UCOS-ii中,它可能处于睡眠、就绪、运行、等待、中断服务状态之一。1)睡眠状态:它是一个什么样的状态呢,它其实是指一个任务在内存中就占用一部分ROM,它没有被操作系统分配任务控制块,它和其他状态下的任务没有任何直接联系,也就是说不能被内核调度,就好比 我们去吃饭,正在路上;2)就绪状态:它是指操作系统给它分配了任务控制块,已经在就绪列表中登记中,它此时不能运行是因为它的优先级不是最高的,就好比我们去吃饭时在那排队一样;3)运行状态:它 是指一个任务正在运行,应该好理解,就好比食堂工作人员在给我们打饭;4)等待状态:就是一个任务由于一个的条件没有满足,比如说在等待一个信号量的到来,而被至于等待状态,就像我们在打饭时,如果工作人员还没有来,那你没办法,你就得等拉;5)中断服务状态:就是在某个时刻突然因为一个中断到来,那么 这个任务就会马上被中断掉,从而处于中断服务状态,比如一个饿得受不了的人,如果抢你前面,本来该你打饭的,可是你看到他这个样子,不忍心,那么你就被中断了一会,中断结束后,中断掉的任务才会被继续运行,同样的你才能够打饭;呵呵,这个比喻好像损了点。

在操作系统中,内核提供的基本服务就是任务切换,它实际上可以说是寄存器内容的切换。自然任务切换是需要时间的,CPU寄存器越多,负荷也就越大。

    基于优先级的内核有两种:不可剥夺型和可剥夺型。不可剥夺型内核它要求每个任务互相合作,也称为合作型内核,每个任务不会被其它任务剥夺去,除非中断的到来,即便如此,当中断结束后,还是会回到原来被中断的程序,而不会切换到具有高优先级的任务中去,这样,高优先级的任务就不能够及时得到执行,所以它的实时性是比较差的。但是它有一个很重要的特点,就是它可以使用不可重入函数,因为每个任务必须执行完,才能释放CPU,这样它对其它任务调用不可重入函数没有影响;同理在大多数情况下它无须使用信号量来保护资源。

    对于可剥夺型内核,只要高优先级任务一就绪,那它就会被执行,而当前正在执行的任务就会被挂起;正因为如此,对于系统的资源就不能像不可剥夺型那样去使用,而是在使用前必须检查是否可以使用,即互斥机制来保护临界资源,如果不用的话,那么如果低优先级在使用临界资源时,突然被高优先级把CPU给抢过去了,那么低优先级的临界资源就可能会被告优先级任务给破坏掉,所以可剥夺型内核是不能调用不可重入函数的,必须对共享资源通过互斥来访问。可剥夺型的优点是是系统的响应时间得到了优化,且是可知的。

实时系统中,中断优先级反转这一问题是出现得最多的,这问题的本质其实也不能理解,就是低优先级的任务占有高优先级的任务所需要的资源,而使高优先级不得不等低优先级把资源释放才能执行,在UCOS中一样也存在这问题。不过我们可以人为解决这问题,因为UCOS中可以动态的修改任务的优先级,那么我们可以通过优先级极限法,实际上就是把低优先级的任务的优先级提高为0级;使该任务不会被其他任务所中断,直到该任务执行完共享资源的代码后再回到原来的优先级。其实还有一种方法叫优先级继承法,它的含义就是把低优先级任务的优先级提高至与要用到该低优先级任务所占用的资源;这要求内核能够允许一个优先级可以对应于多个任务,同时支持时间片段轮度调度;显然UCOS是不支持它的。更多的请见嵌入式实时系统中的优先级反转问题

上面提到了互斥,就简要描述下互斥的条件;互斥我们一般在于共享资源打交道时经常用到,那么我们对这些共享资源要怎么才能做到合理利用而被破坏呢,那就要使当时内核的环境满足互斥条件:关中断、使用测试并置位指令(要求有相应的硬件)、禁止做任务切换、利用信号量。

信号量实际上是一种约束机制,熟悉操作系统应该都懂它,他有以下作用:1>控制共享资源的使用权『满足互斥机制』2>标志某事件的发生3>使2个任务的行为同步。信号量可是0和1的两个值也可以是0~n(n>2)的计数式的信号量;总之内核是时刻跟踪信号量的『这句话可要好好理解』。一般说信号量只能实施3种操作:初始化,也可以称是建立,此时要初始化信号量的初始值,记住是不能小于0的;等待信号量,这时等待信号量的任务一般处于挂起状态,等待的任务如果发现信号量大于0,信号量的值减1,然后继续执行,如果为0,该任务就挂起;然后就是发送信号量,发送时,信号量会增一,同时会进行任务调度。

死锁也称为抱死,指两个任务无限期的等待对方的资源;防止死锁的方法:1>先得到全部资源,再做下一步的工作2>用同样的顺序申请多个资源3>释放资源是,使用相反的顺序。还有就是定义超时来化解死锁。

任务间的信息的传递有两个途径:全程变量和发消息给另一个任务。任务只能通过全程变量和中断服务子程序通信。

PARTNER CONTENT

文章评论0条评论)

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