一、实时系统
软实时系统:软实时系统中系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成
硬实时系统:在硬实时系统中,各任务不仅要执行无误而且要做到准时
二、前后台系统
前后台系统又称循环系统,应用程序为一个无限循环。在循环中完成的工作称为后台行为,由中断触发的中断服务程序完成的工作称为前台行为。所以,后台又称为任务级,前台也称为中断级。时间相关性很强的关键操作一定是靠中断服务来保证的,但是由于中断任务的执行要等到后台执行到这个任务时才可以触发,所以实际花费的时间要比预想的慢一点,这个指标称作任务级响应时间,取决于整个循环执行的时间。
三、代码的临界段
这段代码一旦执行就不允许被打断,所以在执行这段代码前,要将中断关掉。
四、资源
任何为任务所占用的实体都可称为资源。资源可以是输入输出设备,例如打印机、键盘、显示器,资源也可以是一个变量,一个结构或一个数组等
五、共享资源
可以被一个以上的任务使用的资源成为共享资源。
为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源。这叫做互斥
六、多任务
多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度
多任务与后台有些相似,但是后台系统的任务有多个,CPU只有一个
多任务运行使CPU的利用率得到最大的发挥
七、任务
1.一个任务也称作一个线程
2.一个应用程序是多个任务组成的,每个任务有自己的优先级,拥有自己的CPU寄存器和栈空间,每个任务都是一个无限循环
3.每个任务有五种状态:休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态
休眠状态:任务只是以代码的形式驻留在程序空间(ROM或RAM),还没有交给操作系统进行管理
就绪状态:该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行
运行状态:该任务掌握了CPU的控制权,正在运行中
挂起状态:挂起状态也可以叫做等待事件态WAITING,指该任务在等待(已经交出CPU的使用权),等待某一事件的发生,(例如等待某外设的I/O操作,等待某共享资源由暂不能使用变成能使用状态,等待定时脉冲的到来或等待超时信号的到来以结束目前的等待,等等)
中断状态:发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态(中断执行完后会继续返回执行)
-
任务切换
Context switch , 任务切换或者CPU寄存器内容切换,任务切换的步骤:
-
保存当前运行任务的状态,即CPU寄存器中的全部内容,这些任务状态保存在任务自己的栈区中
-
把将要运行的任务的当前状态从栈中重新载入到CPU的寄存器,并且开始运行
任务切换的时间取决于CPU有多少寄存器要入栈
-
内核
1.内核的作用是负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯,提供的基本服务是任务切换
2.实时内核:实时内核允许将应用分成若干个任务,由实时内核来管理它们,所以会大大简化应用系统的设计
3.但是由于内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量,单片机一般不能运行实时内核
-
调度
1.调度是内核的职责之一,就是要决定该轮到哪个任务运行了
2.多数实时内核是基于优先级调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行。但是,究竟何时让高优先级任务掌握CPU的使用权,要看用的是什么类型的内核,是不可剥夺型的还是可剥夺型内核
十一、不可剥夺型内核
1.所谓不可剥夺型内核,就是要求每个任务能够自我放弃CPU的所有权
2.不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态(等待状态)变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。
3.优点:
①响应中断快。不可剥夺型内核允许使用不可重入函数,每个任务都可以调用非可重入性函数,而不必担心其它任务可能正在使用该函数,从而造成数据的破坏,因为每个任务要运行到完成时才释放CPU的控制权
②几乎不需要使用信号量保护共享数据。因为运行着的任务占有CPU,不必担心被别的任务抢占,当然也不是绝对的
-
缺点任务级响应时间不确定,不知道什么时候最高优先级的任务才能拿到CPU的控制权
十二、可剥夺型内核
1.可剥夺型内核的特点是最高优先级的任务一旦就绪,总能得到CPU的控制权。具体表现为:①当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权
②如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行
-
优点:最高优先级的任务什么时候可以执行,可以得到CPU的控制权是可知的。使用可剥夺型内核使得任务级响应时间得以最优化
-
注意点:应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用互斥型信号量来实现。如果直接调用不可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。
-
可重入性
-
概念:可以被一个以上的任务调用,而不必担心数据的破坏
-
特点:任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失
-
注意点:可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以保护。
-
时间片轮番调度法
当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间,叫做时间额度(quantum),然后切换给另一个任务。也叫做时间片调度。
内核在满足以下条件时,把CPU控制权交给下一个任务就绪态的任务:
-
当前任务已无事可做
-
当前任务在时间片还没结束时已经完成了。
目前,μC/OS-Ⅱ不支持时间片轮番调度法。应用程序中各任务的优先级必须互不相同。
-
静态优先级
应用程序执行过程中诸任务优先级不变,则称之为静态优先级。在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。
-
动态优先级
应用程序执行过程中,任务的优先级是可变的,则称之为动态优先级。实时内核应当避免出现优先级反转问题。
-
优先级反转
优先级反转是在使用实时内核是经常出现的问题
如果低优先级的任务占用着高优先级任务需要用到的资源的话,高优先级需要等待低优先级的任务释放该资源才得以运行,此时,次高优先级的任务剥夺了低优先级任务的CPU使用权,使得次高优先级的任务首先完成,此时,最高优先级任务的次高优先级任务的优先级实际上发生了反转。
解决方法:在低优先级任务使用共享资源时,提升低优先级任务的优先级。任务完成时予以恢复。低优先级任务的优先级必须升至最高,高于允许使用该资源的任何任务。
优先级继承:为防止发生优先级反转,内核能自动变换任务的优先级
-
任务优先级分配
-
单调执行率调度法RMS(Rate Monotonic Scheduling)
这种方法基于哪个任务执行的次数最频繁,执行最频繁的任务优先级最高
RMS做了一系列假设:
-
所有任务都是周期性的
-
任务间不需要同步,没有共享资源,没有任务间数据交换等问题
-
CPU必须总是执行那个优先级最高且处于就绪态的任务。换句话说,要使用可剥夺型调度法。
RMS认为最高执行率的任务具有最高的优先级,但最某些情况下,最高执行率的任务并非是最重要的任务
-
互斥条件
虽然共享数据区法简化了任务间的信息交换,但是必须保证每个任务在处理共享数据时的排它性,以避免竞争和数据的破坏。
与共享资源打交道时,使之满足互斥条件最一般的方法有:
-
关中断
-
使用测试并置位指令
-
禁止做任务切换
-
利用信号量