《嵌入式操作系统及应用-chapter4-嵌入式实时内核基础》由会员分享,可在线阅读,更多相关《嵌入式操作系统及应用-chapter4-嵌入式实时内核基础(112页珍藏版)》请在金锄头文库上搜索。
1、第四章 嵌入式实时内核基础,主要内容,嵌入式实时内核的关键设计问题 嵌入式实时内核的主要功能 嵌入式实时内核的重要性能指标,第一节 嵌入式实时内核的关键设计问题,实时性 可移植性 可剪裁、可配置性 可靠性 应用编程接口,嵌入式实时内核,在设计时通常需要考虑以下要求: 实时性 可移植性 可剪裁、可配置性 可靠性 应用编程接口,实时性,实时性是实时内核最重要的特性之一。 实时系统的正确性不仅依赖于系统计算的逻辑结果,还依赖于产生这些结果的时间。 从整体上考虑,一个系统的实时性能与硬件、操作系统及应用程序三方面都有关系,提高硬件能力可以在一定程度上提高实时性,但是当硬件条件确定之后,嵌入式系统的性能
2、主要是由操作系统来决定,其中实时内核起着关键的作用。,实时性,所谓实时性是指: 实时内核应该保证系统尽可能快地对外部事件产生响应 系统对外部事件响应的最坏时间是可以预知的,实时性,关于内核实时性的几个重要原则: 支持多任务:为了降低任务切换延迟,许多实时内核的实现都使用轻量级任务(即线程)。线程是轻量级的,因为它们携带的信息比进程要少。这意味着一个线程的控制块比进程的控制块要小,存储被抢占线程的控制块和恢复下一个执行线程的控制块所带来的开销就被降低了。因此在嵌入式实时系统中,多采用单进程多线程(任务)调度来提高实时性。 支持抢占式多任务,实时性,支持任务的优先级调度 支持可预测的任务同步机制
3、实时内核的运行时间(如中断延迟、任务切换延迟等)可知并可以预测 系统调用的确定性。指系统调用的执行时间即使在最坏的情形下也是可预测的。一个时间确定的系统调用,它的执行时间往往不是唯一的值,而是在一个范围内。系统调用运行时间可以预测还有一层含义,即不论系统负载如何,系统调用的最大执行时间可以确定。,实时性,影响实时性的主要因素 调度算法 内核的可抢占性 内核的关中断时间 存储管理机制 资源等待的处理 优先级反转的处理 中断处理 浮点数的处理,调度算法,在设计一个实时内核的调度器的时候,公平和最小化平均响应时间不是重要的。重要的是所有的硬实时任务要在它们的最后期限之前完成(或开始),以及尽可能多的
4、软实时任务也在它们的最后期限之前完成(或开始)。因此,实时内核被设计为尽可能地响应实时任务,当一个实时任务的最后期限接近时,它能够被迅速地调度。,调度算法,当前任务,实时任务,一个实时任务就绪,该实时任务被调度,当前任务阻塞或完成,调度时间,优先级驱动的非抢占式调度,在一个非抢占式的调度器中,可以使用优先级调度,给予实时任务较高的优先级。 在这种情况下,一旦当前任务阻塞或运行完成,一个已就绪的优先级更高的实时任务将会被调度。如果一个慢速的、低优先级的任务在这个关键的时间执行,就可能延迟优先级更高的实时任务,因而这个方法对实时内核来说是不可接受的。,调度算法,在下一个抢占点处实时任务被调度,一个
5、实时任务就绪,调度时间,当前任务,实时任务,抢占点,基于抢占点的优先级驱动的抢占式调度,在规定的时间间隔处设置抢占点,当一个抢占点发生时,如果有一个更高优先级的任务在等待,当前运行的任务就被抢占。 在这种情况下造成的延迟根据抢占点之间的时间间隔而定,可能在几个毫秒的数量级上。,调度算法,一个实时任务就绪,当前任务,实时任务,实时任务抢占当前任务并立即执行,调度时间,立即抢占调度,可以满足要求更高的实时应用,该方法被称为立即抢占。 在这种情况下,内核几乎立即地响应一个实时任务,除非系统处于一个临界代码锁定段中。一个实时任务的调度延迟可以被降低到更少。,调度算法,在大多数实时内核中,为了能够在突发
6、状态时迅速做出反应,大都采用“抢占式优先级任务调度”的机制,也就是实时内核有权主动终止当前任务的执行,将执行权交给新就绪的高优先级任务,并且是立即抢占的。 目前比较流行的思路是采用基于优先级的可抢占调度作为主要的调度方式,配合同优先级时间片轮转调度作为可选择的调度方式,兼顾同优先级任务,使它们具有平等的运行权利。基于优先级的调度方式是指CPU总是让处于就绪态的、优先级最高的任务先运行。,调度算法,非抢占式调度与抢占式调度 非抢占式调度要求每个任务主动放弃CPU的使用权。 在抢占式调度的情况下,一旦更高优先级的任务就绪,当前任务的CPU使用权就会被尽快剥夺,以使更高优先级的任务能够尽快得到CPU
7、。,非抢占式调度 中断服务以后,CPU使用权归还给原来被中断了的那个任务,直到该任务主动放弃CPU的使用权,新就绪的高优先级的任务才能获得CPU的使用权。,假设在任务运行过程中可以响应中断,并且中断服务使一个高优先级任务由其它状态变为就绪态。,抢占式调度 中断服务程序使一个高优先级任务就绪,中断完成后,高优先级任务开始运行。,内核的可抢占性,可抢占内核(preemptable kernel)与可抢占调度(preemptive scheduling)是不同的概念。内核可抢占与不可抢占,体现在任务在使用内核提供的系统调用的过程中被中断打断的不同处理上。,内核的可抢占性,可抢占内核:即使正在执行的是
8、内核服务函数,也能响应中断,并且中断服务程序退出时能进行任务重新调度:如果有优先级更高的任务就绪,就立即让高优先级任务运行,不要求回到被中断的任务,将未完成的系统调用执行完。,内核的可抢占性,不可抢占内核:不可抢占内核有两种情况,一是内核服务函数不能被中断,二是能被中断但是不能进行任务重新调度。在第一种情况下,系统在执行内核服务函数时处于关中断状态,不能响应外部可屏蔽中断,这样就会在一定程度上延迟中断响应时间。在第二种情况下,系统在执行内核服务函数时可以响应中断,不会延迟中断响应时间,但是在中断退出时不进行任务重新调度,即使在中断服务程序执行过程中有更高优先级的任务就绪,也必须回到被中断的任务
9、将未完成的内核函数执行完后,才能让高优先级任务执行。,内核的可抢占性,低优先级任务,内核服务,ISR,高优先级任务,时间,(1),(2),(3),(4),(5),不可抢占内核,内核的可抢占性,可抢占内核,内核的关中断时间,内核的关中断时间由内核服务函数对临界资源的操作而引入。 为了保护临界资源不被破坏,在临界区中需要暂时屏蔽中断。 内核服务函数对临界区的操作可能不连续,即临界区之间有非临界区的操作。对于内核中的这种服务函数,可以合理地设置一些可抢占区域或可抢占点(开放中断的地方)减少系统的关中断时间。 不同的内核在中断响应时间上的差异主要来自于内核的最大关中断时间,所以,通过这些处理可以让内核
10、具有较好的及时响应中断的能力。,存储管理机制,在嵌入式实时内核的实现中,通常不采用虚拟内存管理机制,以提高系统的实时性。 虚拟内存管理中的缺页调度时间取决于需要调入的页面在外围存储介质中的物理位置(比如某一柱面、磁道、扇区),造成执行时间上的无法预测性。一个严格的实时、嵌入式系统要求实时性、内存锁定和代码紧凑,虚拟内存管理往往不能满足这些要求。尤其对于一个强实时的嵌入式系统,虚拟内存管理机制对时间确定性是不利的,而且还有移植上的困难(在不同的嵌入式目标硬件平台上实现虚存管理需要一定硬件机制的支持,比如微处理器的内存管理单元MMU。不是所有的微处理器都具备MMU功能)。,存储管理机制,从实践上,
11、大多数的嵌入式系统一方面不具备大容量的外部存储器以支持虚拟存储;另一方面,嵌入式系统是确定的,不像通用计算机那样总是希望运行更多的应用程序,对于既定的应用来说,它在运行过程中所需的动态数据空间也是可预测的。因而在嵌入式系统中的内存容量一般都是经过特别计算并适合应用需求的。,资源等待的处理,在多任务实时应用中,任务没能获得需要的资源就会被阻塞。 如果该资源并不是任务继续运行必备的,任务可选择有限等待该资源,在等待一段时间后如果还没获得该资源,内核可以唤醒该任务,确保它余下的工作不被耽误。这就是资源的有限时间等待方式,采用该方式能有效地避免死锁,并提高系统的实时性。,优先级反转的处理,抢占式的内核
12、设计虽然可以降低任务重新调度的延迟时间,但会产生优先级反转失控的问题:低优先级的任务L占用临界资源,高优先级任务H拥有执行权但又必须等待该临界资源,这样就导致低优先级的任务反而优先执行。这时如果系统中不断有中等优先级任务出现,系统的任务调度将变得不稳定并且难以预测。 优先级继承和优先级天花板两种方法可以解决优先级反转问题。,中断处理,在中断处理方面,可通过以下方法提高系统的实时性: 允许中断嵌套 在处理某一级中断的过程中,允许更高优先级的中断打断它。中断嵌套让更紧急的中断优先得到服务。 通过这项功能,系统设计者可以指定外部中断的优先级,从而确保高优先级的中断能及时处理。利用外部中断控制器来设置
13、中断的优先级,在中断处理程序的启动过程中,设置中断控制器(比如8259)的中断屏蔽寄存器的相应位,使得较低优先级的中断不能被响应;在离开中断处理程序时,恢复屏蔽位。,中断处理,简短的中断服务程序 基于几方面的原因,中断服务程序应该尽量简短: 一方面,中断处理过程中屏蔽了同级和较低级别的中断,对这些中断的处理要等当前的中断服务程序执行完后才能开始。如果发生中断嵌套致使当前中断服务程序被打断,则被打断的中断服务程序要等所有高优先级中断的服务程序执行完后才能继续执行。 另一方面,在多任务应用中,对中断的处理并不需要全都由中断服务程序完成,通常采用中断服务程序和任务配合的方式来处理导致中断的外部事件。
14、这时,中断服务程序只需做必要的处理比如接收外部设备产生的数据或信号、清除中断位等,更进一步的操作放到与之相关的任务中完成。,浮点数的处理,在进行浮点数处理的时候,往往要使用到数字协处理器(如果有的话)。 如果系统只有一个浮点任务,数字协处理器的内容就可以不做保存和恢复。这样的优化处理避免了不必要的协处理器上下文切换,有效地提高了效率。,可移植性,随着硬件平台的迅猛发展和嵌入式实时系统应用范围的不断扩大,支持多平台已经是嵌入式实时操作系统发展的必然趋势。 可移植性好的操作系统在支持多平台方面具有开发周期缩短、代码可重用度高、维护工作量小等显著优点,所以追求良好的可移植性是设计实时内核时需要重点考
15、虑的目标之一。,可移植性,嵌入式软件的移植工作分为异种处理器平台之间的移植和同种处理器平台的移植两种。 一方面,硬件平台多样化为嵌入式实时系统提供了多种选择,用户希望选用的操作系统能运行在多种嵌入式微处理器上; 另一方面,多数嵌入式硬件系统是由微处理器及其外围系统电路组成的,具有相同微处理器的硬件系统可能会有多种不同的外围电路(如串行通信控制器、定时器、显示控制器、模拟数字转换等)。,可移植性,对实时内核而言,在不同平台处理器下的移植工作集中在任务切换、中断控制设备和时间设备的驱动上。 对于同类处理器平台、不同型号及不同外围电路间的移植工作则更加方便,主要集中在对芯片级控制寄存器的操作上。,可
16、移植性,影响内核可移植性的主要因素 编程语言 体系结构 代码实现的技巧,编程语言,可移植性与编程语言有很大关系。 高级语言实现的代码比用汇编语言实现相应功能的代码具有更好的移植性。 另一方面,汇编语言实现的代码具有更高的执行效率和更紧凑的代码空间。 设计内核时,要立足系统整体性能和效率的考虑,不片面强调某一方面而对另一方面弃之不顾。,编程语言,在嵌入式软件中汇编语言的使用是必不可少的。 对一些反复运行的代码,使用高效、简捷的汇编能大大减少程序的运行时间。 汇编语言作为一种低级语言可以很方便地完成硬件的控制操作,这是汇编语言在与硬件联系紧密的嵌入式软件中的一个优点。 然而汇编语言是高度不可移植的,尽可能少地使用汇编语言,而改用可移植性好的高级语言(如C语言)进行开发,可以有效地提高软件的可移植性。 目前,编译技术已经得到了很大的发展,高级语言编译后产生的可执行代码与汇编产生的代码在性能和代码量上都相差不大。现在的高级语言编译器都提供灵活、高效的选项,以适应开发人员特