第四章 嵌入式实时操作系统内核.pdf

上传人:qwe****56 文档编号:74653948 上传时间:2023-02-27 格式:PDF 页数:34 大小:363.10KB
返回 下载 相关 举报
第四章 嵌入式实时操作系统内核.pdf_第1页
第1页 / 共34页
第四章 嵌入式实时操作系统内核.pdf_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《第四章 嵌入式实时操作系统内核.pdf》由会员分享,可在线阅读,更多相关《第四章 嵌入式实时操作系统内核.pdf(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第四章 嵌入式实时操作系统内核 4-1第四章第四章 嵌入式实时操作系统内核嵌入式实时操作系统内核 实时操作系统(RTOS)是嵌入式系统的关键,它为用户提供了建立应用软件的平台。然而,并非所有的嵌入式系统都使用RTOS进行设计。比如,某些掌上设备、智能家电、机顶盒、仪器仪表等,它们本身的功能不需要RTOS支持,甚至不需要操作系统,而仅使用相对简单的硬件和软件应用代码。例如,使用8位的51机时,由于片内资源很少,一般也不使用操作系统,更不需要RTOS。但是,在大多数的复杂工业过程控制、武器系统、机器人等由于任务量大和应用程序复杂,必须使用RTOS来管理其任务。因此,是否使用RTOS不但取决系统的复

2、杂性,也要看应用的系统和环境要求。本章主要为后续各章提供一个基础,介绍RTOS的结构和功能,包括内核、任务、任务的调度等。另外以VxWorks的实时内核Wind和任务编程接口为实例。4.1 嵌入式实时内核的结构和功能 4.1 嵌入式实时内核的结构和功能 本小节介绍RTOS的结构和功能,不涉及具体的系统。4.1.1 嵌入式实时内核的结构 4.1.1 嵌入式实时内核的结构 由第一章我们已经知道实时操作系统实质上是计算机中的软件,它按时序方式调度、执行、管理系统资源,并为上层应用代码提供统一的接口。根据系统的用处不同,在一个RTOS上设计应用代码具有非常大的差别,从数字秒表、飞机导航控制、宇航设备等

3、的应用都有。因此,一个好的RTOS必须是可以根据系统的硬件和系统的软件进行裁减的,以满足不同应用的不同需求。某些操作系统中,如osc/,它只有一个内核,仅仅提供最小逻辑的核心检测、调度和资源管理算法。而有些操作系统,如VxWorks,则非常复杂,给用户提供了丰富的各类软件、算法和丰富的应用程序接口(API)等。无论操作系统的简单或复杂,作为操作系统的内核通常都包括下面的部件:(1)调度器(scheduler)调度器是任何操作系统内核的心脏。尤其是对于多任务实时操作系统,调度器提供决定何时必须执行哪个任务,即在单处理器环境下,准时地完成多个必须同时运行的任务。多任务是操作系统在设定的死线内处理多

4、个活动的能力,即多个执行线程在并发地运行。然而,在单处理器环境下,内核是依据预先设定的调度算法,按照任务的优先级执行的。(2)上下文切换 每个任务具有自己的上下文,而上下文是任务每次被调度运行时所要求的CPU寄存器的状态。每次新任务被创立时。内核也创立和维护一个相关的任务控制块TCB(Task Control Block)。TCB是内核用来维护任务特定信息的系统数据结构。TCB包含内核需要知道的关于特定任务的每个事情。当任务运行时,第四章 嵌入式实时操作系统内核 4-2TCB维护任务的动态上下文,当调度器从一个任务切换到另一个任务时,就会发生上下文切换。被禁止任务的TCB冻结了上下文。以便保存

5、作为该任务解冻时再次使用。调度器从一个任务切换到另一个任务所需要的时间称为上下文切换时间。上下文切换时间对于实时操作系统是一个非常重要的技术指标。如果系统的应用设计包含频繁的上下文切换,则应用将遭受不必要的性能超载,因此在做系统设计时,应该尽可能减少不必要的任务切换。(3)调度算法 系统根据某种调度算法,调度器决定运行哪个任务。目前大多数的系统都支持基于优先级的抢占调度(preeemptive priority-based scheduling),如osc/。有些操作系统,如VxWorks还支持时间轮换调度(round-robin scheduling)。在下一小节,我们将结合VxWorks的

6、调度策略详细讲解这两种调度算法。(4)对象 内核对象是系统的特殊构件,是实时嵌入式系统的应用开发的建造模块。最常建的RTOS内核对象有:?任务(task)是并发和独立执行的线程,可以竞争CPU执行时间。?信号灯(semaphore)像令牌(token)的对象,可以由任务递增和递减,用于信号量的同步和互斥。?消息队列(message queue)像缓冲区的数据结构,通过在任务之间传递消息,可以进行同步、互斥和数据交换。实时系统的开发者可以组合基本的内核对象解决普遍的实时系统设计问题,如并发、活动同步和数据通信等。这些设计问题和用来解决问题的内核对象我们在后续章节将做更详细的讲解。(5)任务之间的

7、通信 任务之间的通信指的是任务间相互传递信息的方法和原理。通信意味着进程间传送数据。嵌入式应用软件系统(包括操作系统)可以被看作是各种任务组成的,如用户任务、计算任务、打印任务等。这些任务都具有各自的独立功能,且大多数因外部需要而启动执行。一般来说,任务间的通信根据通信内容可以划分为两种:控制信息的传送和大批量数据传送。有时,也把任务间控制信息的交换称为低级通信,而把进程间大批量数据的交换称为高级通信。(6)服务 在嵌入式系统应用中,大多数内核为开发者建立了实时系统提供服务(service)。这些服务组成API调用集合,可用来执行内核对象上的操作或用来实现计时器管理、中断处理、设备I/O和内存

8、管理,也可以提供其它服务。(7)存储管理 第四章 嵌入式实时操作系统内核 4-3存储器是计算机系统的重要资源之一。因为程序和数据以及各种控制用的数据结构都必须占用一定的存储空间,再加上嵌入式系统对存储器要求的苛刻性和吝啬性,因此,存储器管理机制直接影响嵌入式系统的性能。嵌入式系统的存储器也是由内存和外存组成。CPU要通过启动相应的I/O设备后才能使外存与内存交换信息。内存管理部分包括内存管理方法、内存的分配和释放算法、虚拟存储器的概念、控制主存和外存之间的数据流动方法、地址变换技术和内存数据保护与共享技术等。(8)文件管理 目前,大多数嵌入式应用都涉及大量的数据管理,以及与外部设备的大批量数据

9、交换,从而,信息的组织、存取、传输和保管就成为嵌入式系统的一个重要内容。文件系统是计算机组织、存取和保存信息的重要手段。文件系统的功能涉及文件系统的逻辑结构和存取方法、文件的物理结构与存储设备、文件存储空间管理、文件目录管理、文件存取控制、文件的使用、文件系统的层次模型等内容。4.1.2 嵌入式实时内核的功能 4.1.2 嵌入式实时内核的功能 前面我们提到,操作系统是计算机硬件的一个扩展,它赋予了计算机更多的功能,也是计算机系统的资源管理器。这一小节我们介绍嵌入式实时操作系统内核的主要功能,以后各个章节还会对某些功能,如任务管理、中断服务、内存管理等,做更详细的讲解。一、任务管理 我们说过任务

10、是被调度执行和竞争资源的基本实体单元,一个最简单的实时内核也必须有任务管理。目前大多数嵌入式系统都是多任务的体系,内核的任务管理就是要有效的对多任务进行管理和协调它们之间的工作。任务管理主要包括创建任务、删除任务、改变任务的目前状态(或改变任务的运行轨迹,如启动与重新启动任务、挂起与恢复任务、改变优先级和使任务睡眠等)和查询任务状态(如优先级、属性)等功能,其核心还是任务的调度管理。任务调度策略是否适合嵌入式应用的特定要求,对于应用的实时性能至关重要。不同的实时内核最多支持的应用任务数目、任务的状态数不一样,最多支持的优先级数也不一样。二、同步和通信管理 内核除了对任务进行调度等管理外,任务之

11、间、中断服务程序与任务之间的同步和任务之间的通信也是内核的主要功能,其管理机制一般有:(1)信号量 在多任务内核中普遍将信号量用于任务之间、中断服务程序与任务之间的同步、互斥。如控制共享资源的使用权、标志某事件的发生、同步任务之间、中断与任务之间的行为。第四章 嵌入式实时操作系统内核 4-4信号量是一把钥匙,与之相关的代码要运行下去,得先拿到这把钥匙。包括前面提到的用于互斥的信号量在内。大部分内核都可以提供3种类型的信号量,以便用户用于解决不同的问题。?用于解决互斥问题的互斥信号量;?用于解决同步问题的二值信号量;?用于解决资源计数问题的计数信号量。在第五章将有信号量的详细介绍。对信号量的基本

12、操作有:?创建与删除信号量;?申请与释放信号量;(2)信息队列 信息队列机制提供任务之间、中断服务程序和任务之间的通信功能,在第五章有消息队列的详细介绍。对消息队列的操作有:?创建与删除消息队列;?发送普通消息;?发送紧急消息;?广播消息;?接收消息;?取得消息队列上的未决消息数目;?清空消息队列;?取得消息队列标识符。按照消息的紧急程度分为普通和紧急消息,紧急消息无论何时发送,都将被优先接收。接收消息时,任务可以选择是否等待。如果等待还可以选择按照先进先出(FIFO)方式等待,还是按照任务优先级高低顺序等待。(3)管道 管道使用操作系统的I/O系统,它是一种由驱动程序管理的虚拟I/O设备,与

13、其底层的消息队列相联系,可提供与消息队列互换的功能。被创建的管道是命名的I/O设备。一旦管道被创建,任务就能够像使用标准I/O设备那样来打开、读/写管道,也可以设置其属性。如果任务试图向一个已满的管道执行写操作,则该任务将等待(被阻塞)。如果任务试图向一个空的管道执行读操作,则该任务也将被阻塞,直到有消息到达。像对消息队列的操作一样,ISR能够向管道写数据,但是不能从管道读数据。管道也能实现任务之间的客户/服务器通信模式。(4)事件 第四章 嵌入式实时操作系统内核 4-5一个事件标志被用来通知其它任务或中断服务程序出现了一个预先定义的事件。事件机制用于任务之间、中断服务程序与任务之间的同步。事

14、件机制可以提供复杂的同步功能。一个任务可以与多个任务或中断服务程序同步。一个或多个事件构成一个事件集合。事件的特点有:?事件之间是相互独立的;?事件不提供数据传输功能;?任务可以同时等待多个任务;?对事件的等待一般有“与”和“或”两种;?事件没有队列,即多次向任务发送同一事件,在事件标志未被接受处理之前,其效果等同于只发送一次。对事件的基本操作可以有:?发送事件;?接收事件。(5)异步信号 异步信号机制用于任务之间、中断服务程序和任务之间的异步操作。异步信号被任务(或中断服务程序)用来通知其它任务某个事件的出现。异步信号机制允许任务定义一个异步信号例程(ASR)。ASR与ISR的主要区别是:一

15、个ASR对应一个任务,而ISR对应于一组任务。当系统运行时,若外部中断出现且被系统屏蔽,则任务的执行将被中断,系统转而执行与该中断相关的服务例程。同样,当一个异步信号被发送给某任务,该任务将中止其自身代码的运行,转而运行与该异步信号相关的例程。因此,异步信号机制也可以称为软中断机制。给任务发送异步信号对接收任务的当前执行状态没有任何影响。一个或多个异步信号标志组成一个异步信号集合。发送信号集是指发往目标任务的一个或多个异步信号的组合。待处理信号集是指发送给具有有效ASR的目标任务并等待处理的异步信号组合。由于异步信号的接收任务在被调度、完成上下文切换后才处理异步信号,执行异步信号例程,所以异步

16、信号提供了任务切换后进行扩展操作的能力。对异步信号的基本操作有:?安装异步信号处理例程;?发送异步信号。三、中断管理 对于嵌入式系统来讲,中断是一种强大、必不可少的功能。中断本身是一种异步机制,中断服务程序不需要内核的调度就可以执行。但是在嵌入式实时应用中,要求ISR和其它应用任务之间协同工作,第四章 嵌入式实时操作系统内核 4-6以快速、合理地响应外部事件,并完成后续地处理过程。内核对中断提供地管理功能使得这种协同机制能够实现。一般来讲,内核的中断管理有如下功能:?安装指定中断的服务程序,使得一个硬件中断和一段例程相关连。当中断发生时,系统作中断现场的保护和恢复,并且转到相应的ISR中执行。

17、ISR负责处理中断,清除中断标记以使得中断能够再次发生,以及进行设备操作。ISR运行时可以使用当前被中断任务的堆栈,也可以使用专门的中断堆栈。实时内核一般提供专门的堆栈来处理中断,防止可能的任务堆栈溢出。?为某些设备提供缺省的中断处理程序。?将内核内部支持的各级中断映射到目标处理器的各级中断上。?在ISR中可以使用内核提供的功能调用,以便完成与任务的通信。在ISR中使用系统调用是有一定条件限制的,内核必须提供某种机制来避免在ISR中由于这些调用可能造成的意想不到的后果。?提供屏蔽与使能中断调用,使应用能够根据需要在运行时关闭和打开中断。对中断的处理包括中断前导、用户中断程序和中断退出三个部分。

18、各部分的功能有:?中断前导:完成现场保护,调用系统的中断处理程序,最后调用用户的中断程序;?用户中断程序:完成用户自己的中断处理;?恢复现场并进行任务调度方面的相关处理。内核根据需要支持中断嵌套。发生嵌套时,任务调度会延迟到最外层中断处理结束后才发生。四、时间管理 内核的时间管理功能为应用系统的实时响应提供支持,保证其实时性、正确性以提高整个嵌入式系统的实时工作能力。与时间相关的管理包括时钟管理和定时器管理。时钟管理的功能包括:?维护系统时基,执行与系统时基相关的处理操作,比如任务延时、资源限时等待等;?设置和取得时间信息,包括以系统时基为单位的时间和日历时间。定时器机制允许任何函数与一个特定

19、的时间延迟相联系。设置并启动定时器后,定时器开始计时,一旦指定的延时结束,该函数立即被调用。具体来讲,定时器管理功能可以包括:?创建、删除定时器;?设置定时器的触发时间;?定时器重新开始计时;?终止定时器计时。利用定时器功能可以为系统提供多个“软定时闹钟”,以满足对多个不同的定时事件进行处理的需求。定时的事件可以是单次触发的,也可以是周期性触发的。五、对共享资源的互斥管理 第四章 嵌入式实时操作系统内核 4-7在嵌入式系统中,与共享资源打交道是非常频繁的,因此,所有的实时内核都有对共享资源的互斥管理功能。实现资源互斥访问的方法很多,不同之处在于互斥的范围和程度。这些方法包括关中断、使用测试并置

20、位指令2、禁止任务切换和使用信号量等。(1)关中断 处理共享数据时保证互斥,最简单的方法是关中断和开中断。内核在处理内部变量和数据结构时就是使用的这种手段。这也是在中断服务子程序中处理共享变量或共享数据结构的唯一方法。内核可以提供两个调用,允许用户在应用程序中关中断和开中断。从互斥的粒度来看,禁止中断是最强有力的互斥机制,这种上锁保证了对CPU的独占访问。这种方法涉及到中断级互斥,也就是说,在互斥期间,即使外部事件引发相应的中断,系统也不会切换到相应的中断服务程序。所以在上锁期间,它可能会造成系统对外部事件反应迟钝。对于多数实时系统而言,这使得系统的实时性得不到保证,影响着系统的中断响应时间,

21、因而不适合作为一种通用的互斥方法。在任何情况下,关中断都要尽量短。如果使用不恰当,将会明显增加中断延迟。一般来说,当改变或复制某几个变量的值时,可以采用这种方法来实现互斥。(2)使用测试并置位指令 如果不使用实时内核提供的机制,当两个任务共享一个资源时,可以采用如下方法:先测试某一全局变量,如果该变量位0,则允许该任务访问共享资源。为防止另一个任务也要使用该资源,只要简单地将全局变量设置为1即可。但这有一个前提:测试和置位是微处理器地一条不会被中断地指令。或者在做该操作时关中断,以后再开中断。有的微处理器有硬件地测试和置位指令。(3)禁止任务切换 另一种比关中断稍弱的互斥机制是任务抢占,即不允

22、许其它任务抢占当前任务的执行。禁止抢占提供了一种较小限制性的互斥,在这种情形下,ISR仍然能够执行。因为此时虽然任务切换被禁止了,但中断还可以是开着的。如果这时中断来了,中断服务程序还是会在这一临界区内执行。中断服务程序结束时,即使有优先级高的任务进入就绪态,内核还是返回到原来被中断了的任务。临界区执行完后开调度时,内核才看是否有优先级更高的任务被中断服务程序激活而进入就绪态,如果有,则作任务切换。虽然禁止任务切换也是一种有效的互斥方法,但也应该尽量避免这一类的操作。因为内核最主要的功能就是作任务的调度与协调。另外,这种方法仍然可能造成系统的实时性得不到保证。这是因为在上锁的任务离开临界区解锁

23、之前,处于就绪态的更高优先级的任务也不能够执行,尽管这个高优先级的任务可能根本没有涉及到临界区操作。当然,这种互斥方法非常简单。使用这种方法时,同样需要控制禁止抢占的时间尽可能短。一种更好的机制是信号量。(4)使用信号量 第四章 嵌入式实时操作系统内核 4-8信号量是提供任务间通信、同步和互斥的最优选择,也是同步和互斥的主要手段。内核可以提供专门优化了的互斥信号量,以解决信号量机制内在的互斥、优先级反转、删除安全和递归等情况 信号量提供比禁止中断和抢占更为精确的互斥粒度,与这两种方法相比,信号量将互斥仅仅限于与之联系的资源访问。通过对共享资源上锁,实现高效的互斥访问。信号量常被用过了头,处理简

24、单的共享变量也使用信号量是多余的。请求和释放信号量的过程是要化一定的时间的,有时这种额外的负荷是不必要的。用户可能需要通过关中断、开中断来处理简单的共享变量,以提高效率。例如两个任务共享一个32位的整数变量,一个任务给这个变量加1,另一个任务给这个变量清0。如果这两种操作对微处理器来说都只花极短的时间,就不用使用信号量来满足互斥条件来。每个任务只需要在这个操作前关中断,之后再开中断就可以了。然而,如果这个变量是浮点数,而相应的微处理器又没有硬件的浮点运算,这时关中断时间长了会影响延迟时间,那么这种情况下就有必要使用信号量了。各种互斥机制比较如表4-1所示。表4-1 各种互斥机制的比较 比较项目

25、 关中断 使用测试并置位指令 禁止任务切换 使用信号量 锁定范围 互斥粒度最强,锁定所有可屏蔽中断,凡是以中断形式到达的外部事件以及与之相关联的任务或处理过程均得不到执行 所有使用该指令访问共享资源的代码 所有任务 只影响竞争共享资源的任务 对 系 统 响 应时间的影响 如果关中断的时间较长,则对系统的响应性能有很大影响 较小 如果禁止切换的时间过长,则影响系统的响应性能 对系统响应性能有一定影响,可能导致优先级反转 实 现 时 系 统开销 小 小 小 较大 注意事项 关中断时间要尽量短 不是所有处理器都具备这种指令,影响可移植性 关调度的时间要尽量短 需采用一定的策略解决优先级反转问题 在上

26、述几种互斥机制中,关中断、禁止任务切换何信号量都是内核可以提供给用户的功能。如何合理地使用这些机制保护临界区,即采用何种手段保护临界区是根据共享资源的访问源决定的。下面给出一些基本原则。(1)访问源都是任务 在这种情况下通常采用信号量保证互斥。创建初值为1的互斥信号量,任务访问共享资源之前都先申请信号量,退出时再释放。最先试图进入临界区的任务会成功获得信号量进入临界区,其它任务在此第四章 嵌入式实时操作系统内核 4-9期间申请信号量都会被阻塞,待访问共享资源的任务完成访问退出临界区时再释放信号量,内核会完成相应的任务调度,选择合适的任务进入临界区继续执行。除了信号量,还可以使用关调度的方法,强

27、行禁止在访问临界区期间发生任务切换。当然要注意关调度可能会影响那些不需要访问共享资源的任务。如果用户对系统有较好的了解何把握,采用变通的方法,使用其它的机制(比如事件或者消息队列)也可以在一定程度上满足需要,当然前提是一定要清楚采用这些方法会怎样影响系统的行为。(2)访问源都是中断服务程序 因为ISR是不同于任务的独立体,不能使用信号量等方法,ISR是不会阻塞在信号量上的,所以如果访问共享资源的都是中断服务程序,则只能使用关中断的方法。(3)访问源可能是任务也可能是ISR 如果无法区分一次具体的访问到底是来自任务还是来自ISR,只能使用关中断的方法。不过可以尝试通过重新规划应用程序来改变这种情

28、况。六、内存管理 嵌入式系统实时内核的内存管理一般都是提供固定大小和可变大小两种动态内存分配机制。固定大小的动态内存块分配是由分区管理功能提供的。一个分区是一个物理地址连续的内存区域,该内存区域可以被划分为多个大小固定的缓冲区,应用申请和释放空间都对缓冲区进行。可变大小的动态内存块分配是由堆管理功能提供的,堆也是一个物理地址连续的内存区域。从堆中申请的内存块大小虽然是可变的,但是应用每次得到的实际内存块大小是最小分配单位的整数倍,最小分配单位可以在创建堆时由应用指定。另外,内核在堆分配的实现算法中应注意有效地避免内存碎片地产生。在应用中可以创建多个分区和堆,以实现对多个内存区域地管理。对分区地

29、操作主要有:?创建分区;?删除分区;?从分区中申请内存块;?将内存块释放回分区中。对堆地操作主要有:?创建堆;?删除堆;?从堆中申请内存块;?将内存块释放回堆中。下面讨论关于内存保护地问题。第四章 嵌入式实时操作系统内核 4-10为提高可靠性,有些实时内核提供了内存保护地机制,其实现需要用到嵌入式处理器的MMU(Memory Management Unit)。MMU提供了一种用于实现程序之间相互隔离、保护的硬件机制。操作系统通常利用MMU来实现一定的内存保护机制,实现操作系统与应用程序的隔离,以及应用程序与应用程序之间的隔离。这样可以防止应用程序破坏操作系统的代码和数据,防止应用程序对硬件的之

30、间访问。对于应用程序来讲,也可以防止别的应用程序对自己的非法入侵,从而破坏自身的运行。这种关系如图4.1.1所示。采用MMU便于在应用开发阶段发现更多的潜在问题,也便于问题的定位。在采用内存保护机制后,应用程序如果要通信就只能通过操作系统提供的通信服务,如信号量、消息队列、事件、异步信号和管道等,而不能直接访问彼此的地址空间。在一些低端的应用中,出于成本的考虑,CPU不具备MMU功能且运算速度较慢,存储空间有限,并且应用也很简单,系统软件的代码量受到严格限制。另外,即使系统崩溃也不致造成重大损失。这样的应用对内存保护方面的要求非常弱,因此不需要内核提供内存保护的机制。图4.1.1 内存保护模式

31、示意图 在一些高端的安全关键的高可靠应用中,允许投入更多的硬件、软件成本,CPU的速度非常快并且具备MMU功能,内存保护功能对时间性能造成的影响可以忽略,因而要求内核提供内存保护的机制。综上所述,并不是所有的嵌入式实时操作系统都提供了内存保护功能,比如IIosc/、Linux等。而像VxWorks、WinCE等则具有内存保护功能。七、I/O管理 很多嵌入式实时内核都提供了或多或少的输入/输出(I/O)管理,提供了结构化访问设备的方式。使用I/O管理的应用可以在系统配置表中定义设备驱动程序表,其中包括了设备驱动程序的入口地址。每一个设备驱动程序包括初始化、打开、关闭、读、写和控制等操作。八、出错

32、处理 嵌入式系统中出现的错误可以分为一般性错误和严重性错误。一般性错误不会对系统直接造成致命的影响,其后果可以在一定范围内得到纠正,对这类错误的处理由内核和应用协作完成。比如,系统调用因为各种原因没能正确返回时,会返回一个表示错误类型的出错代码给调用者,调用者可以根据出错代码作一定的纠正。其实质是内核向应用提出错误,实际的处理由应用完成。严重性错误会对系统造成致命的影响,其后果不可恢复。实时内核一般会提供这类错误的处理程序,使得系统在出现严重性错误后能处于一个确定的状态。在系统开发过程中还可以借助调试器、分析仪之第四章 嵌入式实时操作系统内核 4-11类的软件,在系统出错时将控制权交给它们作进

33、一步的处理,为用户分析出错原因提供一些信息。比如VxWorks系统提供的Tornado就具有这类功能。另外,内核提供的任务重启动。用户扩展管理、任务超时处理,以及其它的异常处理都是出错处理的有效手段。九、用户扩展管理 用户扩展管理向应用程序提供了灵活处理扩展的机制,在无须或者不可能更改内核代码的情况下,用户编写自己的扩展例程,内核调用这些例程。通过用户扩展程序入口和系统配置表可以实现内核在功能何日规模上的可伸缩性。比如,有时应用需要在任务上下文切换时增加相应的处理,又不需要涉及内核的修改。内核可以提供任务切换的钩子函数,允许当任务上下文切换时调用附加的函数。存储任务上下文的函数结构(例如任务控

34、制块TCB)可以扩展,用户安装的钩子函数将在内核上下文中被调用执行。内核可以提供的扩展点(即能够调用用户扩展程序的系统事件)包括以下几点:?任务创建时;?任务启动时;?任务重新启动时;?任务删除时;?任务上下文切换时;?任务第一次投入运行之前;?任务退出时;?系统错误时。内核可以将扩展程序组织成扩展程序集,每个扩展程序集都包括内核提供的所有可扩展事件的入口。扩展程序集也是一种内核对象,拥有自己的标识符,可以被创建和删除。一个应用中可以有多个扩展集。4.2 嵌入式实时内核的任务管理 4.2 嵌入式实时内核的任务管理 一个任务(task)是独力的执行线程,可以与其它的并发任务竞争处理器时间。任务是

35、代码运行的一个映象,从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、I/O设备及内存空间等系统资源,并独立于其它任务,与它们一起并发运行。开发者在软件设计时通常将应用划分成独立的、并发作用的任务集合。现代实时操作系统是在多任务和任务间通信的基础上建立起来的。任务都是可调度的(schedulable)。任务根据预先定义的调度算法能够竞争处理器的执行时间。任务由不同的参数集合和支持的数据结构定义。特别地,在任务创立时,每个任务具有一个相关的名字、一个唯一的ID、一个优先权、一个任务控制控制块(Task Control Block)、一个堆栈(stack)和一个任第四章

36、嵌入式实时操作系统内核 4-12务例程(task routine),如图4.2.1所示。这些部件在一起组成了任务对象(task object)。内核赋予每个任务一个唯一的ID号,并且在内存中为它创立一个相关的TCB和堆栈空间。图4.2.1 任务及其相关参数和支持的数据结构 4.2.1 多任务机制 4.2.1 多任务机制 多任务设计能随时打断正在执行着的任务,对内部和外部发生的事件在确定的时间里作出响应。VxWorks实时内核Wind提供了基本的多任务环境。从表面上来看,多个任务正在同时执行,实际上,系统内核根据某一调度策略让它们交替运行。系统调度器使用任务控制块的数据结构(简记为TCB)来管理

37、任务调度功能。任务控制块用来描述一个任务,每一任务都与一个TCB关联。TCB包括了任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务最初被激活时以及从休眠态重新被激活时,要用到这些信息。此外,TCB还被用来存放任务的上下文(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。在任务被重新执行时,必须要恢复上下文。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。如同在发生中断所要保存的内容一样。当发生任务切换时,当前运行的任务的上下文被存入TCB,将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。于

38、是转而执行这个任务,执行的起点是前次它在运行时被中止的位置。一个任务的上下文包括以下内容:?任务的执行点、也就是任务的程序计算器。?动态变量和函数调用的I/O分配。?标准输入输出和错误的I/O分配。?一个延时定时器。?一个时间片定时器。?内核控制结构。?信号处理器。第四章 嵌入式实时操作系统内核 4-13?调试和性能监视值。与Windows系统不同,VxWorks操作系统的内存是线性的,所有代码执行在单一的公共的地址空间内,因而内存地址空间不属于任务上下文。每个任务各自的地址空间需要虚地址到物理地址的转换映射,这仅对使用可选产品VxVMI有效。4.2.2 任务状态和状态转变 4.2.2 任务状

39、态和状态转变 任务状态反映任务当前在系统所处的情形。内核负责维护系统中所有任务的当前状态。一个任务从一个状态转变为另一个状态是应用调用内核调用的结果。虽然内核可以定义不同的任务状态组,但一般的基于抢占式调度内核主要有三个状态:就绪态、阻塞态和运行态。当创建时,任务处于挂起(suspended)状态,为使创建任务进入就绪(ready)状态,必须要激活该任务。激活任务阶段相当快,因此应用程序先创建任务,并在适当的时候将其激活。另一种方法是使用发起(spawning)原语,它使用一个单一的函数调用,创建并激活一个任务。任务可以在任何状态下被删除。在VxWorks的Wid中,定义了较多的任务状态,其中

40、最基本的状态有四种:就绪态(ready):处于这种状态的任务只等待系统分配CPU资源;挂起态(suspend):这种任务状态不能执行。主要用于测试。不会约束状态转换,仅仅约束任务的执行,因此,pended-suspended任务仍然可以解锁,delayed-suspended任务仍然可以唤醒。阻塞态(pend):由于一些资源不可用而阻塞任务状态。睡眠态(delay):处于睡眠的任务状态。另外还有悬挂(pended)态和延迟(delayed)态。但悬挂和延迟态实际是阻塞状态的子状态。一个悬挂的任务在等待必须被释放的资源,一个延迟的任务在等待时间延迟的结束。当系统函数对某一任务进行操作时,任务从一

41、种状态迁移到另一状态。处于任一状态的任务都可被删除。对应的状态转换如图4.2.2所示,对应的转换函数如表4.2.1所示。图4.2.2 任务状态转换 表4.2.1 任务状态转换 状态迁移 调用 就绪态-阻塞态semTake()/msgQReceive()第四章 嵌入式实时操作系统内核 4-14就绪态-睡眠态taskDelay()就绪态-挂起态taskSuspend()阻塞态-就绪态semGive()/msgQSend()阻塞态-挂起态askSuspend()睡眠态-就绪态expired delay 睡眠态-挂起态taskSuspend()挂起态-就绪态taskResume()/taskActiv

42、ate()挂起态-阻塞态taskResume()挂起态-睡眠态taskResume()4.2.3 任务调度策略 4.2.3 任务调度策略 内核里的多任务调度须采用一种调度算法来分配CPU给就绪态任务。一般的嵌入式系统内核,如OSC/采用的是基于优先级的抢占式调度法,而Wind内核采用基于优先级的抢占式调度法作为它的缺省策略,同时它也提供了轮转调度法。控制任务调度的函数调用见表4.2.2 表4.2.2 控制任务调度的函数调用 调 用 描 述 kernelTimeSlice()控制轮转调度 taskPrioritySet()改变任务的优先级TaskLock()禁止任务调度 taskUnlock()

43、允许任务调度 一、基于优先级的抢占式任务调度 基于优先级的抢占式调度具有很多优点。这种调度方法为每个任务指定不同的优先级,任一时刻,内核将CPU分配给处于就绪态的优先级最高的任务运行。之所以说这种调度算法是抢占的,是因为如果系统内核一旦发现有一个优先级比当前正在运行的任务的优先级高的任务转变为就绪态,内核立即保存当前任务的上下文,当前任务状态变为阻塞,插入到相应队列,并且切换到这个高优先级任务的上下文执行。图4.2.3中,任务Task1被高优先级的任务Task2抢占,Task2又被Task3抢占,当Task3运行结束,Task2继续执行,当Task2运行结束,Task1继续执行。注:高低优先级

44、时 间表示抢占表示任务完成t1t2t3t2t1 图4.2.3 基于优先级的抢占式调度算法示意图 VVxWorks的Wind内核划分优先级为256 级,编号0255,优先级0为最高优先级,优先级255为最低。osc/的优先级为64。当任务被创建时,系统根据给定值分配任务优先级。然而,优先级也可以第四章 嵌入式实时操作系统内核 4-15是动态的,在Wind内核中它们能在系统运行时被用户使用系统调用taskPrioritySet()来加以改变,但不能在运行时被操作系统所改变。二、轮转调度 轮转调度法分配给处于就绪态的每个同优先级的任务一个相同的执行时间片。如果不使用轮转调度,当系统中存在多个相同优先

45、级的任务共享CPU时,第一个获得CPU的任务可以不被阻塞地独占CPU。如果没有阻塞或其它情况出现,他从不会给其它相同优先级的任务运行的机会。轮转调度是使用时间片来实现这种相同优先级任务CPU公平分配的。一组任务中的每个任务执行一个预先确定的时间段,称为时间片;然后另一个任务执行相等的一个时间片,依次进行。这种分配是公正的,它保证一个优先级组中,在所有任务都得到一个时间片之前,不会有任务得到第二个时间片。在Wind内核中,时间片的长度可由系统调用KernelTimeSlice()通过输入参数值来指定。很明显,每个任务都有一运行时间计数器,任务运行时每一时间滴答加1。一个任务用完时间片之后,就进行

46、任务切换,停止执行当前运行的任务,将它放入队列尾部,对运行时间计数器置零,并开始执行就绪队列中的下一个任务。当运行任务在它的时间片中被更高优先级的任务抢占时,调度器保存它的运行时间计数器,直到该任务下次运行时,调度器恢复运行时间计算器。轮转调度不能单独在内核中使用,它一般是基于优先级调度的补充。图4.2.4是采用轮转调度算法的一个例子。图中有三个系统优先级的任务t1、t2和t3的轮转调度。任务t2被一个更高优先级的任务t4抢占,当t4执行结束时,t2将在其中止处继续执行。在osc/中没有设置轮转调度,因此在osc/中的任务数量最多是64个。时间片t4t2t3t2t1t3t2t1高低时 间先优级

47、注:表示抢占,表示任务完成。图4.2.4 基于优先级的抢占式调度与轮转调度算法结合的调度示意图 三、抢占上锁 实际应用中,并不是每次抢占都是合理的,非期望的抢占可能会导致系统出现意想不到的情况。因此操作系统应该提供避免抢占的机制。Wind内核可通过调用taskLock()和taskUnlock()来使调度器起作用和失效。当一个任务调用taskLock(),将禁止调度器抢占调度,那么该任务运行时,将不会发生基于优先级的抢占式调度。第四章 嵌入式实时操作系统内核 4-16然而,如果这个任务在执行中被阻塞或是被挂起时,调度器从就绪队列中取出最高优先级的任务运行。当设置抢占禁止的任务解除阻塞,再次开始

48、运行时,抢占又被禁止。这种抢占禁止防止任务的切换,但对中断处理不起作用。抢占上锁可以用来实现互斥。需要指出的是,尽量使上锁的时间最小。4.2.4 任务异常处理 4.2.4 任务异常处理 程序代码和数据的出错可能引起硬件异常状态,如非法命令、总线或地址错误、被零除等。VxWorks异常处理包处理这些异常。一般是将引起异常的任务挂起,保存任务在异常出错处的状态值,并将关于这个异常的描述送到Tornado开发工具中。用户可根据这些信息,并借助Tornado开发工具,分析产生异常的原因,查看当前任务状态,从而确定被休眠的任务。同时内核和其它任务不会被中断,系统继续执行。VxWorks同时允许任务使用信

49、号功能激活自己的异常处理程序。如果一个任务已经提供了一个异常的信号处理程序,系统提供的上述的默认的异常处理程序不再执行。像发送硬件异常信号那样,信号也可以用来发送软件异常信号。(1)删除保护 互斥引起的一个问题会涉及到任务删除。在由信号量保护的临界区中,需要防止执行任务被意外地删除。删除一个在临界区执行的任务是灾难性的。资源会被破坏,保护资源的信号量会变为不可获得,从而该资源不可被访问。通常删除保护是与互斥操作共同提供的。由于这个原因,互斥信号量通常提供选项来隐含地提供前面提到的任务删除保护的机制。(2)优先级逆转/优先级继承 在实时内核中,优先级反转问题是实时系统中出现的最多的问题。我们将在

50、5.3.1节详细介绍优先级的倒置机理。4.3 嵌入式实时内核的共享代码和重入 4.3 嵌入式实时内核的共享代码和重入 嵌入式系统,包括VxWorks都提倡单个子程序的拷贝或子程序库能够被多个不同的任务调用。例如,许多任务可能要调用printf(),但系统仅有一份拷贝。一个被多个任务调用的拷贝称为共享代码。VxWorks动态链接功能很容易实现代码共享。代码共享页使得系统更为有效更容易维护,如图4.3.1。共享代码必须是可重入的。一个子程序是可重入的,如果该程序的单个拷贝可以被多个任务同时调用而不会发生冲突。这种冲突典型发生在一个子程序修改了全局的或静态的变量,由于系统中仅有一份拷贝,该子程序指向

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁