datasheet
超过460,000+ 应用技术资源下载
pdf

基于ARM的嵌入式强实时内核设计

  • 1星
  • 日期: 2014-03-05
  • 大小: 5.68MB
  • 所需积分:1分
  • 下载次数:0
  • favicon收藏
  • rep举报
  • 分享
  • free评论
标签: 基于ARM的嵌入式强实时内核设计

随着国内工业化、数字化的迅速发展,嵌入式开发在IT行业中的重要性越来越显著。嵌入式开发领域对产品的功能性、稳定性、实时性等方面的要求也越来越高。 采用嵌入式实时操作系统作为开发平台,以高性能的嵌入式处理器为工业控制等领域的主控制器可以有效地提高系统的可靠性、实时性、和软件编程的灵活性。在嵌入式处理器方面,ARM构架已经在高性能、低功耗、低成本的嵌入式领域里占领先地位。而在嵌入式操作系统方面,适合国内发展方向的解决方案以及系统基础结构方面并不理想。首先,国外成熟的嵌入式实时操作系统大都成本高、结构复杂,不适合强实时应用;其次,因大部分实时操作系统不公开源码,使开发的产品存在安全隐患。而类似μC/OS-II的小型强实时嵌入式操作系统内核虽然具有低成本、易控制、小规模、高性能等特性,但这类系统的基础较为薄弱,面临产品化和商业化还有一定的距离。 本文针对这种情况,结合现有的操作系统内核理论及嵌入式强实时系统的特殊需求,特别是对μC/OS-Ⅱ的研究分析基础上,面向强实时应用,设计、构造了一种适合在32位ARM处理器环境下使用的内核。这样做的目的是为了提供一个基础牢固、值得信赖的基本平台。 本文研究工作主要集中在以下几个方面: 针对嵌入式环境中高效、简洁、易扩展、易剪裁的要求,对内核体系结构框架进行了设计。内核整体上采用分层结构,在各层中采用功能相对独立的模块:在最底层借鉴微核的原理,只提供最基本的功能模块。 针对系统快速和稳定的实时响应能力需求,为IRQ中断建立了统一的中断入口,采用合理的半嵌套工作方式;保留FIQ为不可屏蔽中断,在快速反应场合使用;引入中断分段处理机制解决中断和任务的ITC机制共享,需要硬保护机制相互协调所引起的硬保护机制被隐性地泛滥使用问题。 针对应用提出的系统行为的可预测性需求,在调度算法方面采用基于优先级位图的抢占阈值调度算法,提高了处理器的利用率和任务集合的可调度性,减少了内核存储开销;在共享资源访问控制方面,以优先级天花板协议为依据,使用互斥事件解决优先级反转和死锁问题的发生。 为了保障系统的强实时性能,本文还对内核的时钟管理、内存管理等方面进行了设计。最后,通过实时性能测试,结果表明该实时内核有很好的强实时特性。

辽宁师范大学 硕士学位论文 基于ARM的嵌入式强实时内核设计 姓名:谭强 申请学位级别:硕士 专业:计算机应用技术 指导教师:刘晋 20080501 基于ARM的嵌入式强实时内核设计 学位论文独创性声明 本人承诺:所呈交的学位论文是本人在导师指导下所取得的研究成果。论文中除特别加 以标注和致谢的地方外,不包含他人和其他机构已经撰写或发表过的研究成果,其他同志的 研究成果对本人的启示和所提供的帮助,均已在论文中做了明确的声明并表示谢意。 学位论文作者签名: B 凝;妒&.6.}。 学位论文版权的使用授权书 本学位论文作者完全了解辽宁师范大学有关保留、使用学位论文的规定,及学校有权保 留并向国家有关部门或机构送交复印件或磁盘,允许论文被查阅和借阅。本文授权辽宁师范 大学,可以将学位论文的全部或部分内容编入有关数据库并进行检索。可以采用影印、缩印 或扫描等复制手段保存、汇编学位论文。保密的学位论文在解密后使用本授权书。 啤 学位论文作者签名: 指导教师签名: 日 期: 基于ARM的嵌入式强实时内核设计 摘要 随着国内工业化、数字化的迅速发展,嵌入式开发在IT行业中的重要性越 来越显著。嵌入式开发领域对产品的功能性、稳定性、实时性等方面的要求也越 来越高。 采用嵌入式实时操作系统作为开发平台,以高性能的嵌入式处理器为工业控 制等领域的主控制器可以有效地提高系统的可靠性、实时性、和软件编程的灵活 性。在嵌入式处理器方面,ARM构架已经在高性能、低功耗、低成本的嵌入式领 域里占领先地位。而在嵌入式操作系统方面,适合国内发展方向的解决方案以及 系统基础结构方面并不理想。首先,国外成熟的嵌入式实时操作系统大都成本高、 结构复杂,不适合强实时应用;其次,因大部分实时操作系统不公开源码,使开 发的产品存在安全隐患。而类似u C/OS—II的小型强实时嵌入式操作系统内核 虽然具有低成本、易控制、小规模、高性能等特性,但这类系统的基础较为薄弱, 面临产品化和商业化还有一定的距离。 本文针对这种情况,结合现有的操作系统内核理论及嵌入式强实时系统的特 殊需求,特别是对u C/0S—II的研究分析基础上,面向强实时应用,设计、构造 了一种适合在32位ARM处理器环境下使用的内核。这样做的目的是为了提供一个 基础牢固、值得信赖的基本平台。 本文研究工作主要集中在以下几个方面: 针对嵌入式环境中高效、简洁、易扩展、易剪裁的要求,对内核体系结构框 架进行了设计。内核整体上采用分层结构,在各层中采用功能相对独立的模块: 在最底层借鉴微核的原理,只提供最基本的功能模块。 针对系统快速和稳定的实时响应能力需求,为IRQ中断建立了统一的中断入 口,采用合理的半嵌套工作方式;保留FIQ为不可屏蔽中断,在快速反应场合使 用;引入中断分段处理机制解决中断和任务的ITC机制共享,需要硬保护机制相 互协调所引起的硬保护机制被隐性地泛滥使用问题。 针对应用提出的系统行为的可预测性需求,在调度算法方面采用基于优先级 位图的抢占阈值调度算法,提高了处理器的利用率和任务集合的可调度性,减少 了内核存储开销;在共享资源访问控制方面,以优先级天花板协议为依据,使用 互斥事件解决优先级反转和死锁问题的发生。 为了保障系统的强实时性能,本文还对内核的时钟管理、内存管理等方面进 行了设计。最后,通过实时性能测试,结果表明该实时内核有很好的强实时特性。 关键词:嵌入式实时操作系统、微内核、任务调度、抢占阈值调度算法、PIP 协议、POP协议 基于ARM的嵌入式强实时内核设计 Abstract With the rapid development of domestic industrialization and digitization,it is increasingly obvious that embedded development plays an important role in IT industry.Meanwhile,the requirement for product’S functionality,stability,real-time, etc.is becoming higher and higher in the field of embedded development. n地reliability and real.time of the system as well弱the flexibility of the sot栅are programming will be improved effectively by using embedded real-time operating system as developing platform and adopting high performance embedded processor as main controller in the industrial control field.Concerning embedded processor,ARM framework haS already taken the lcad in the embedded field for its higll performance,low power consumption and lOW cost.In terms of embedded operating system,besides system infrastructure.solutions suitable for domestic developing trend are alSO not satisfactory.Firstly,mature embedded real-time operating systems abroad are mostly characteristic of high cost and complex structure, which are not fit for the application of hard real-time.Secondly,the source codes of most real-time operating systems are not accessible,which causes a safety hazard to the development products.Regardless of its characteristics of lOW cost,easy control, small scale and high performance.the weak foundation of small.sized hard real.time kernel in embedded system,similar to弘C/OS--II,leaves a gap in product industrialization and commercialization. According to this caSe in combination with the theories of operating system kemel and special requirements of embedded hard real.time system.especially on the basis of analysis of UC/OS—II,tllis Paper designs and constructs a hard real-time application oriented kernel suitable for 32.bit ARM processor,the aim of which is to provide a reliable baSic platfonn、析th a solid foundation. 11le research work of this Paper focuses on the following aSpects: To meet the demand for hi吐e伍ciency,conciseness,eaSy extension and easy tailoring in the embedded environment,the kernel architecture is designed.Layered structure is chosen for the kernel,and relatively independent modules are used in each layer.Basic function modules ate provided at the bottom layer using micro-kernel theories for reference. To fulfill the requirement for the quick and stable real-time response in the system,a unified interrupt entry is established for IRQ and a reasonable half nesting working mode is adopted.FIQ is ke:pt unmasked and uninterrupted,to bc employed in the rapid response situation.Segment handling interrupt mechanism is introduced to solve ITC and the recessive overuse of hardware protection mechanisms due to their mutual coordination. To satisfy the need for the predictability of the system behavior based on application,preemption threshold scheduling algorithm on the basis of priority bitmap is used.which has improved the utilization of the processor and the schedulability of a task set and reduced the kemel storage cost.In regard to shared resource access control,mutex event is used to solve priority inversion and deadlock in accordance with priority ceiling protoc01. 2 基于ARM的嵌入式强实时内核设计 This paper also presents the design of clock management and memoDr managemem in the kernel to ascertain hard real-time performance of the system.At last,it has been proved by the real·time performance test that this kind of real-time kernel has an excellent hard real—time performance. Key words:embedded real—time operating system,micro-kernel,task schedule, preemption threshold scheduling algorithm,stack resource policy,prionty ceiling protocol 3 基于ARM的嵌入式强实时内核设计 第一章概述 1.1嵌入式实时系统简介 嵌入式实时系统中采用的操作系统称为嵌入式实时操作系统,它既是嵌入式 操作系统,又是实时操作系统。作为一种嵌入式操作系统,它具有嵌入式软件共 有的可裁剪、低资源占用、低功耗等特点:而作为一种实时操作系统(本文对实 时操作系统特性的讨论仅限于强实时操作系统,下面提到的实时操作系统也均指 强实时操作系统),它应该能及时响应外部发生的随机事件,并以足够快的速度 完成对事件处理的计算机应用系统。换句话说,计算机能及时响应外部事件的请 求,在规定的时间内完成对事件的处理,并能控制所有实时设备和实时任务协调 运行。 嵌入式实时系统在许多应用领域正在变得越来越关键,承担着系统中重要的 核心角色。应用范围的不断扩大使得实时系统变得越来越复杂,需要应对各种可 靠性需求,优先约束需求,可调度需求等等。【I】【21 实时系统不但要具有功能上的正确性,还要有时间上的正确性,即,只有限 定的时间内完成的计算(操作)才是正确的。这一限定的时间被称作最终截止期, 即时间死线(deadline)。对于超过最终截止期完成的计算,其结果是无用的, 或者是只能达到部分价值。在实时系统中。实现某个功能的执行体称为任务 (task)。通常对任务和实时系统作如下的划分:①如果一个任务没能在最终截 止期之前完成一次操作,结果是灾难性的,称作硬实时任务(hard real-time task)或者强实时任务;②如果一个任务偶尔在执行中错过其最终截止期,只 造成系统性能的下降,则称作软实时任务(soft real-time task)或者弱实时 任务,例如在互联网上传输语音数据的任务。至少包含一个硬实时任务的系统, 称作硬(强)实时系统,否则称作软(弱)实时系统。 实时系统主要通过以下三个性能指标来评价系统的实时性能:①响应时间 (Response Time),指实时系统从识别出一个外部事件到做出响应的时间;②数 据生存时间(Data Survival Time):是数据的有效等待时间,数据只在这段时 间内有效)③吞吐量(Throughout)是指给定时间内系统能够处理的事件总数, 考虑到额外的影响因素,吞吐量通常比平均响应时间的倒数要小一些H¨H副。其中 响应时间是系统实时性能最直观、最重要的指标,主要表现在中断延迟时间、调 度延迟时间、上下文切换时间三个方面。 对于包含多个任务的实时系统,为使每个任务根据需要在合适的时间做出适 当的反应,必须对任务的执行顺序进行恰当的排列,这就是任务调度 (scheduling)。实时系统利用调度程序(scheduler)搜寻任务集合的可用调度, 这一过程称作可调度性(schedulability)测试。调度程序求解正确的任务调度 的方法称为调度算法(scheduling algorithm)。从硬件平台使用的处理器数目 可以将算法分为单处理器调度算法口3和多处理器调度算法H儿引。 实时系统运行中,可能会有多个任务访问相同的资源(resource),例如: 一个显示设备或是一个通信接口,甚至是一段代码。只有正确协调任务对资源的 访问,才能保证系统运行正常,并能保证任务的实时性。这需要资源访问的同步 控制与调度算法密切配合才能实现。所以,调度程序往往还包含资源访问的同步 控制。 嵌入式环境下的实时系统除了要考虑以上的需求外,还要考虑其它的限制条 基于ARM的嵌入式强实时内核设计 件,例如:内存资源有限,电能消耗受限等。实时调度算法和资源访问同步控制 必须考虑并正确处理这些嵌入式系统的限制条件。 1.2嵌入式实时操作系统主要特性 1、可预测性 所谓可预测性(Predictability)是指系统所执行的操作按预先定义或确定 的方式执行,且其操作执行的时间是可预知的。这一点是实时系统最重要的特征。 可预测性将应用于实时系统环境的每一个组成部分,只有这样,这个环境才能提 供一定程度的可预测性。 2、及时性 实时系统的及时性是非常关键的,主要反映在对用户的响应时间要求上。对 于实时信息系统,其对响应时间的要求类似于分时系统,是由操作者所能接受的 等待时间来确定的,通常为秒级。对于实时控制系统,其对时间的响应要求是以 控制对象所能接受的延迟来确定的,它可以是秒级,也可能短至毫秒(ms)、微秒 级(|I s)。当然,响应时间的确定,既依赖于操作系统本身,也依赖于操作系统 的宿主机的硬件的处理速度。 3、高可靠性 这是实时系统最重要的设计目标之一。对实时控制系统,尤其是重大控制项 目,如航天航空、核反应、药品与化学反应、武器控制等,任何疏忽都可能导致 灾难性后果,必须考虑系统的容错机制。对实时信息系统,则要求数据与信息的 完整性,要求经过计算机处理、查询并提供给用户的信息是及时的、有效的、完 整的和可用的。 4、紧凑性 应用设计约束和成本约束限制了硬件资源。在这种情况下所选用处理器主 频一般都比较低,内存容量比较小。这要求应用软件必须尽可能少的使用RAM, 同时也要求底层嵌入式操作系统内核使用的调度算法和资源访问控制协议尽量 减少对内存资源的消耗并且能充分利用处理器的处理能力。 5、可剪裁性 由于嵌入式实时操作系统在不同项目上的广泛应用,使得它必须能够完成上 下剪裁以满足应用特定的需求,依据所要求的功能,嵌入式实时操作系统应当具 有增加和减少模块化部件的能力,包括文件系统和协议栈等。这样将节约相当的 开发时间和经费。 1.3实时操作系统研究现状和发展趋势 实时操作系统研究的方向主要集中在标准化研究、可靠性和容错能力的研 究、实时系统的调度技术的研究、集成的开放式实时系统开发环境的研究、实时 系统基于构件的开发方法的研究等方面,这些技术将对嵌入式实时系统的应用和 发展提供良好的技术支持。 1、标准化研究 嵌入式实时操作系统种类繁多、各具特色,在带来便利的同时也给应用开发 者带来难题。在不同系统上开发的应用软件是否可以相互移植、移植的工作量有 多大是用户最为关注的问题之一。为了达到方便移植,软件重用的目的,实时操作 系统必须具有大致相同的系统服务,以及兼容的应用编程接口。因此,嵌入式实 时操作系统的标准化研究越来越被重视。针对操作系统的标准化工作在几十年前 7 基于ARM的嵌入式强实时内核设计 就已经开始。在这些标准中,目前有一部分已经得到广泛应用和支持,比如POSIX 标准、ulTRON标准和OSEK/VDX标准等。OSEK/VDX标准是从欧洲发展而来的针 对汽车工业的嵌入式实时操作系统标准;ulTRON标准主要由日本几家公司提出 来:POSIX标准是美国IEEE协会在传统UNIX的基础上发展而来的一种开放系统 标准。相比而言,POSIX标准应用范围更广,目前支持POSIX标准的嵌入式操作 系统也比较多,但仍有许多工作还待完成。 2、实时系统可靠性和容错能力 在大多数安全关键的实时系统中,可靠性是衡量和选择实时操作系统的另一 个重要因素。可靠性包含两个方面:①系统平均无故障时间大,也就是系统基本 上不出现故障;②在系统一旦出现故障的情况下,操作系统提供对故障快速并智 能恢复的机制,从而避免灾难性后果的发生。这就要求实时操作系统应用各种必 要的技术措施来保证系统可以长时间无故障运行,同还必须提供一些故障容错方 法,以使得系统即使在出现故障的情况也能快速地恢复。目前提高实时系统可靠 性的主要技术包括:内核体系结构、内存空间保护、看门狗定时器、分布式冗余 配置等。 3、 多处理器结构实时操作系统、分布式实时操作系统和实时网络的研究 随着应用的飞速发展,对嵌入式系统的性能提出了更高的要求。单处理器的 计算机系统已不能很好地满足某些复杂实时应用系统的需要,开发支持多处理器 结构的嵌入式实时操作系统己成为发展方向,这方而比较成功的系统有Psos+m 等。至于分布式嵌入式实时操作系统,国外一些嵌入式实时操作系统厂家虽己推 出部分产品,如QNX,Chorus,Plan 9等,但分布式实时操作系统的研究还未完 全成熟,特别是在网络实时性和多处理器间任务调度算法上还需进一步研究。 4、集成的开放式实时系统开发环境的研究 嵌入式实时操作系统研究的另一个重要方向是集成开发环境的研究。开发实 时应用系统,只有嵌入式实时操作系统是不够的,还需要集编辑、编译、调试、 模拟仿真等功能为一体的集成开发环境的支持。开发环境的研究还包括网络上多 主机间协作开发与调试应用技术的研究、嵌入式实时操作系统与环境的无缝连接 技术等。 5、 嵌入式实时系统基于构件的开发方法的研究 从市场应用的角度讲,成功开发出可用的嵌入式实时系统软件还要依赖于低 的开发代价、系统的高度可裁减性(tailorability)和快速推向市场嘞。基于构 件的软件开发(ComponentBased Software Development,简称CBSD)能提高软 件开发效率,使软件架构定义清晰,便于重用,能加速产品上市时间,降低软件 开发成本,从而受到越来越多的重视,并被广泛应用到不同领域,例如适用于桌 面和企业级应用的EJB川,DCOM哺。和CCM旧1等。 6、实时系统任务调度技术的研究 随着实时系统在各领域的广泛应用,任务调度技术在实时系统中扮演的角色 越来越关键。因为实时系统自身的这些特点,使其快速发展成为一门系统科学。 然而,目前实时系统研究领域,特别是系统任务调度方向上,还有很多已知和未 知的尚未解决的学术问题,例如解决系统优先级反转问题新方法、多处理器单调 速率相关算法的可调度性判定问题、具有优先约束的任务调度问题等等,都是当 前学术界研究的热点问题。 1.4研究的背景和意义 8 基于ARM的嵌入式强实时内核设计 嵌入式开发领域对产品的要求不仅仅体现在功能要求越来越多,而且其他各 个方面的要求也越来越高。随着微处理器性能的不断提高,系统结构的不断优化, 功耗的降低,对实时任务的支持能力和较短的中断响应时间,为嵌入式时时系统 的设计和应用提供了可靠稳定的硬件结构。尤其是ARM构架的RISC处理器逐渐 占据大量市场份额。 作为嵌入式系统核心的嵌入式处理器,主要有以下几类: ●嵌入式微处理器(Embedded Microprocessor Unit, EMU)嵌入式处理器 目前主要有Atme 186/88,386EX,SC-400,Power PC,ARM系列等。由于RISC (Reduced Instruction Set Computer)处理器具有结构简单,处理速度快和功 能强等优点。目前的嵌入式系统大都采用RISC型处理器作为核心控制器。其中, ARM构架的RISC处理器数量最大。 ●嵌入式微控制器(Microcontroller Unit。MCU)和嵌入式微处理器相比, 微控制器的单片化使应用系统的体积大大减小,从而使功耗和成本大幅度下降、 可靠性提高。但功能、处理速度和内存资源等都与32位的ARM系列微处理器存 在差距。 ●嵌入式DSP处理器(Embedded Digital signal processor, EDSP)在数 字信号处理应用中,各种数字信号处理算法相当复杂,特别是向量运算、指针线 性寻址等较多,一般结构的处理器无法实时的完成这些运算。由于DSP处理器对 系统结构和指令进行了特殊设计,使其适合于实时地进行数字信号处理。但是, 由于其常规处理能力弱,寻址范围有限,I/O功能弱及开发平台差等不足,很少 单独作为嵌入式系统的核心控制器,而仅作为一扩展部分。 ●嵌入式片上系统(System On Chip,SOC)由于嵌入式系统应用领域的广 泛性,、不断增加的复杂性、联网的需要以及半导体技术的发展,IC厂家可根据 应用的需要,开发出面相应用领域的、高度集成的、以32位嵌入式微处理器为 核心的SOC,以便嵌入式系统的开发。一般来说,SOC称为系统级芯片,也有称 片上系统,意指它是一个产品,是一个有专用目标的集成电路,其中包含完整系 统并有嵌入软件的全部内容。同时它又是一种技术,用以实现从确定系统功能开 始,到软/硬件划分,并完成设计的整个过程。许多嵌入式应用运行于SoC架构 之上,目的是降低功耗和成本,提高可靠性。在这些系统中,RAM是稀缺资源, 对产品的最终价格影响很大。有时为了节省几十甚至十几个字节,不得不重新设 计应用。同时这些嵌入式芯片的处理器主频一般都比较低,这样做也是为了降低 成本和功耗,不浪费处理资源。这要求应用软件必须尽可能少使用RAM,同时也 要求底层嵌入式操作系统内核使用的调度算法和资源访问控制协议尽量减少对 内存资源的消耗并且能充分利用处理器的处理能力。 面对更复杂的应用和更严格的实时性需求,嵌入式操作系统已经成为嵌入式 系统开发中的重要要素比别^驯。 嵌入式实时操作系统作为大多数实时系统的软件平台,它管理系统的硬件资 源,为应用软件提供各种必要的服务H町’C11]。实时操作系统的采用,使得实时应 用程序的设计和扩展变得容易,可以使应用软件开发人员避开繁琐的硬件管理与 操作编程,而把主要精力放在目标应用的算法研究以及应用程序自身的构架上; 同时应用实时操作系统提供的各种服务,使得资源得到更好的利用,可以更容易 地构建出复杂的嵌入式实时应用系统;并且在软件重用性和开放性方面实时操作 系统也起到了非常重要的作用。 由于嵌入式应用的需要和硬件条件的限制,嵌入式操作系统一般都要满足实 9 基于ARM的嵌入式强实时内核设计 时性、占用空间小和效率高等特点。为了满足这样的要求,高效的中断处理能力 与高速的输入/输出能力是实时系统所必备的基本功能。而实时性是嵌入式实时 系统开发尤为关心的问题之一。 目前比较成熟的商业嵌入式实时操作系统主要有: oVxWorks、PSOS是目前最成熟的嵌入式实时操作系统,但因为其成本高、 结构复杂、实时性较强、网络组件较多,比较适合开发实时性稳定性要求 高的通信产品,如路由器、交换机、大型电讯设备、卫星通讯设备等,不 适合小型应用。 oWinCE操作系统由于其提供的功能比较多,更适合民用、便携式设备等。 ·开源的Linux操作系统体系结构同样复杂,产品化和商业化程度不够,即 使在Linux本来的PC目标环境下,也难寻理想的技术支持,更不用说嵌入 式环境下的Linux。这方面的弱势对批量生产、大规模、长时间运行使用 的工业化产品来说是致命的。 另外,在以上讨论的这几种系统中,只有VxWorks是强实时操作系统,而 WinCE和Linux都是弱实时操作系统,并不适合强实时应用。 在这种情况下,类似u C/OS—II的小型强实时嵌入式操作系统内核具有低 成本、易控制、小规模、高性能等特性,因而有很好的发展前景。但这类系统的 基础较为薄弱,面临产品化和商业化程度不够的局面。 由于嵌入式系统应用的坏境不同,内核所采取的设计方案也不同,对于有大 量第三方程序存在的高端应用环境,必然要采取内存空间的保护措施。这样做的 目的是为了提供一个基础牢固,值得信赖的基本平台。这样的一个内核体系结构, 应该具有高效、简洁、易扩展、易剪裁的特点。 本文针对这种情况,尝试从几个简单、基本、关键的实时内核设计概念出发, 充分考虑嵌入式系统的稳定性、可靠性、实时性等特性,面向强实时应用,设计、 构造了一种适合在32位ARM处理器环境下使用的内核。 通过对嵌入式实时操作系统的设计与实现,可更加深入的理解实时调度理论 与实时系统的设计模式,为进一步从事嵌入式系统的开发奠定了基础。 1.5研究内容 1、操作系统的体系结构是确保系统的实时性、可靠性、灵活性、可移植性 和可扩展性的关键。本文通过对几种嵌入式操作系统的内核结构的分析比较,考 虑强实时应用的需求,利用分层结构和模块化结构的特点,在单一内存空间借鉴 微内核的结构特点;在各层中采用功能相对独立的模块,在最底层采用微核的原 理只提供一些最基本的功能模块,如任务管理、中断管理、内存管理、时钟管理、 任务间通信等。由于充分利用了分层结构和模块化结构的特点,这样的特征非常 适合嵌入式环境中高效、紧凑、简洁、易扩展、易剪裁等要求。 2、嵌入式实时系统是一个能够在指定或者确定的时间内对外部事件出响应 的系统,其重要的特性是实时响应性。嵌入式实时系统对外部事件的响应一般都 是通过中断来处理的,采用何种中断处理方式将直接影响到系统的实时性能。在 中断的处理方面:为IRQ中断建立了统一的中断入口,采用合理的半嵌套工作方 式;保留FIQ为不可屏蔽中断,在快速反应场合使用;同时引入中断分段处理机 制将中断处理程序分为ISR、DISR两部分,在DISR部分可以调用内核ITC机制 和进行更费时的处理,而内核ITC机制里需要硬保护的位置也可以用软保护替 代,这样设计解决了中断和任务的ITC机制共享,需要硬保护机制相互协调所引 10 基于ARM的嵌入式强实时内核设计 起的硬保护机制被隐性地泛滥使用问题,保证了系统快速和稳定的实时响应能 力。 3、对于嵌入式实时系统,除了要满足应用的功能需求以外,更重要的是满 足应用提出的实时性要求。因此,选择合适的调度算法和资源访问控制协议,才 能保证系统行为的可预测性。在调度策略方面,由于调度本身需要一定的系统开 销,为了提高了处理器的利用率,也能提高整个任务集合的可调度性本文在优先 级位图的调度算法的基础上引入了抢占阈值调度算法,同时在增加支持优先级数 量、减少优先级判定表占用存储空间两个方面进行讨论,提高了处理器的利用率 和任务集合的可调度性,减少了内核存储开销。在共享资源访问控制方面,采用 互斥信号量,以优先级天花板协议为依据,降解了优先级反转问题,避免了死锁 的发生。 4、操作系统内核所应提供的其他管理模块设计,如:内存管理、时钟节拍 服务、时钟粒度,任务间通信(ITC)等。在时钟管理方面,由于中断分段处理 机制的引入,时钟节拍服务对中断响应能力没有影响;同时,在时钟节拍服务中 采用差分时间链管理需要延迟处理的任务,有效降低时间等待对象的管理开销。 由于时钟粒度的大小,直接决定操作系统时间的精度以及影响到任务能否被及时 响应和调度,为了在不同的实时应用中既满足实时需求,又减少不必要的系统开 销,本文采用了多时钟粒度配置方式。在内存管理方面,由于实时性的考虑,本 文采用的是单一内核空间,没有使能MMU。通过对内存管理特性和内存分配方案 的分析,在对静态内存分配完善的基础上给出了动态内存分配方案,以适合更广 泛的应用。 5、结合实际开发中常遇到的问题进行了一些内核的辅助设计。如:结合ARM 处理器的特性和异常中断的处理方式,利用FIFO的自保护特性,使ISR中可以 直接与应用交流数据,而不必通过OTC,这样能够最大化地优化系统性能,改善 单个设备的中断响应能力。另外,对系统临界区进行规范和分类的基础上给出了 反映内核实时性能的两项重要的评价指标中断响应时间和任务切换时间,并且与 II C/os—II进行比较,说明本文所设计的内核具有更好的强实时性能。 基于ARM的嵌入式强实时内核设计 第二章嵌入式实时操作系统内核结构设计 2.1 ARM处理器主要特性 ARM微处理器具有RISC体系结构的一般特点嘲外,ARM体系结构采用了一’ 些特别的技术,在保证高性能的同时尽量减小芯片体积,降低芯片的功耗。 任何操作系统的移植都有相当一部分工作和所用处理器的体系结构密切相 关,因此在做具体的移植和中断处理编程工作之前,需要了解该处理器的体系结 构和相应的汇编语言。下面简要介绍ARM的体系结构,主要侧重于与中断和移植 相关的一些概念。 2.1.1程序状态寄存器与处理器模式 ARM处理器屏蔽irq/fiq中断需要向程序状态寄存器的I/F位写1,解除屏 蔽只需要向I/F位写0。 ARM处理器共有7种运行模式。程序状态寄存器CPSR标记处理器的当前状 态和模式值。状态寄存器的MO一--M4位表示处理器模式,包括SVC、user、abt、 und、irq、fiq、sys等模式,cpsr的模式、状态等位会根据ARM处理器自身运 行状态改变,也可以通过代码进行设置。 除user模式以外的其他模式都称为特权模式,除user和sys外的其他5 种模式称为异常模式。特权模式与非特权模式的区别是:特权模式允许对cpsr 进行完全的读/写访问;而非特权模式(用户模式)只允许读CPSR的控制域和读/ 写cpsr的条件标志。异常模式通常都和硬件相关。在user模式下,对系统资源 的访问是受限制的,也无法主动地改变处理器模式,必须通过swi异常中断才能 进入SVC模式。但在没有MMU进行内存保护的情况下,user模式也能访问到SVC 模式的内存空间,因此用user隔离用户级代码没有意义。 SVC模式通常是操作系统内核代码运行模式。irq/fiq模式是在微处理器收 到中断信号后强制处理器进入的模式,ARM在被irq/fiq中断信号中断时自动改 写irq/fiq模式中的LR,LR记录的是被中断模式中运行的代码位置计数器,以便 退出中断时能回到原来模式中运行代码的位置。同时LR也是每个模式下函数调 用的返回代码位置计数器。也就是说,LR寄存器具有保存函数和中断返回位置 两种功能。如果用irq/fiq模式嵌套中断自身,则本模式的LR被改写后,本模 式下原有的函数返回代码位置计数器数据就无法还原。因此应该在关闭中断的条 件下,在irq/fiq模式中进行基本环境准备后让ISR切换到其它模式(und或sys) 下运行。这种处理方法保证产生嵌套中断时被中断的模式不是irq/fiq模式自 身,irq/fiq模式中的LR保存着回到IRQ运行模式(und或sys)的代码位置, IRQ运行模式下LR未被破坏,保存着函数返回用的代码。同时,由于中断处理 程序所使用的堆栈与任务堆栈分离,容易估算任务堆栈大小,避免内存资源浪费 和堆栈的溢出。 每一种处理器异常模式都有各自对应的寄存器LR(R14)、SP(R13)、SPSR (Saved Program Status Register)。LR有两个作用:一是保存函数返回地址; 二是在代码执行遇到设备中断或其它异常中断时保存被中断模式的当前PC(R15) 值。SP是堆栈指针。SPSR用来保存进入异常模式前的CPSR。SPSR的作用就是当 CPU从异常模式退出时,通过一条简单的汇编指令就能够恢复进入异常模式前的 CPSR,该值保存在当前异常模式的SPSR中。 2.1.2中断的优先级资源 12 基于ARM的嵌入式强实时内核设计 中断的优先级资源就是CPU的中断系统,以ARM920T体系的CPU为例,最多 可以有56个中断资源。FIQ中断和IRQ中断都属于可屏蔽中断,他们分别受CPSR 的F和I位的控制。FIQ异常中断为快速异常中断,它比IRQ异常中断优先级高, 这主要表现在下面几个方面: ①当FIQ和IRQ异常中断产生时,CPU先处理FIQ异常中断。 ②在FIQ异常中断处理程序中IRQ异常中断被禁止。 ⑨FIQ异常中断向量为Oxlc,位于中断向量表最后。这样FIQ异常中断处理程 序可直接放在地址Oxlc开始的存储单元,因此可紧接异常向量表书写快中断处理 程序,而不必进行程序跳转操作,避免了刷新指令流水线和高速缓存。 ④与其他异常模式相比,FIQ异常模式还有额外的5个物理寄存器,这样在进 入FIQ处理程序时可以不用保存这5个寄存器,从而避免了由于主工作寄存器数据 的保存和恢复而带来额外开销。 每个具体的中断源都可以设定为FIQ,使其具有最高优先级,但FIQ最好分 配给唯一的中断源,否则就失去意义。为不同的中断服务程序安排不同的优先级, 在允许中断嵌套的情况下,最高优先级的中断总是能够得到及时响应。 中断源是系统及时获得异步事件的主要手段,其优先级安排应该根据中断的 紧迫性、关键性、频繁性、快捷性来设定优先级。 2.1.3 ARM处理器异常中断处理 ARM类微处理器通常安排内存最低端的几个地址为各种异常的入口。异常入 口处的代码通常就是一个跳转指令,即跳转到特定的异常处理例程。 ARM微处理器在异常入口后可以再定义其它设备中断的异常入口,称为矢量 化中断跳转。矢量化跳转是为了方便中断产生后直接跳转,以得到更快的反应速 度。但是在有操作系统的环境下进入ISR入口之前总是统一的被中断环境保护等 工作,然后才能进行中断分发,执行相应的中断处理程序。矢量化方法实际上都 是保留给不带操作系统或者不进入操作系统内核只进行简单处理得情况适用的。 因此,可以不使用矢量跳转,直接在异常入口设置统一的中断入口处理程序。 A跚处理器对异常中断响应过程 ·把中断时的Pc的地址值拷贝给LR; ·把程序状态寄存器CPSR拷贝给SPSR_irq; ·强制进入IRQ异常模式: ·强制进入到ARM状态: ·跳转到绝对地址PC=Ox00000018处执行; ·禁止IRQ中断。 完成中断处理后,程序执行下列返回原中断处:SUBS Pc.R14,#4. 2.1.4 ARM微处理器硬保护算法逻辑 由于中断处理程序和被中断程序的“并发"执行,会引起重入、同步、临界 资源保护等诸多问题。因此在内核体系结构中必然要涉及到硬保护算法。在硬保 护实现方法中,当出现嵌套调用时,只是单纯地开/关中断,就会出现内层的开 中断(退出保护)代码干扰T 层保护的逻辑。因此在ARM环境中,需要在每个 调用到硬保护代码的函数中定义一个局部状态变量(如cpu_sr)进入保护前保 存状态,退出保护时恢复状态。根据ATPCS协议,程序中使用到RO为工作寄存 器用于参数传递。 硬保护算法(C语言和ARM汇编语言描述) #defineOS j 基于ARM的嵌入式强实时内核设计 粕lefme OS ExitHProtect0(OSCPURestoreCPSR(cpu_sr)) EXPORl OSCPUSaveCPSR oscPUSaveCPSR mrs rO,CPSR orr rO,rO,#Ox80 msr CPSR_c,rO IllOV pc,lr EXPORT osCPURestoreCPSR OSCPURestoreCPSR msr CPSR_c,r0 niov pc,lr 。 2.2内核结构 操作系统的体系结构是确保系统的实时性、可靠性、灵活性、可移植性和可 扩展性的关键。目前嵌入式操作系统的体系结构一般为:单一内核结构、层次结 构、微内核结构。 2.2.1单一内核结构 图2.2.1单一结构的操作系统 单一结构的操作系统由许多模块组成,这些模块按照一定的结构方式组合起 来,协同完成整个系统的功能。模块之间通过对外提供的接口之间传递信息进行 通信,模块内部的实现对其他模块是透明的。通过接口,模块间可以不加控制地 互相调用和转移,信息的传递方式也可以根据需要任意约定。它的结构模式如图 2.2.1所示。此结构的操作系统通常有两种工作模式:系统模式和用户模式。这 两种模式有不同的执行权限和不同的执行空间。在用户模式下,系统空间受到保 护,并且有些操作是受限的,如I/0操作和一些特殊指令。而在系统模式下可以 访问任何空间,执行任何操作。运行在用户模式下的应用程序可以通过系统调用 进入系统模式。这种结构的操作系统的优点为结构紧密、接口简单直接、系统的 效率相对较高。缺点是模块之间可以任意转接,各模块互相牵连,不容易把握好 模块的独立性。在添加或修改一个模块时,对其他模块的影响可能会很大。而且 随模块数量的增加和模块之间连接的增多,系统会因多重连接变得更加混乱,这 样系统中任何组件的一个错误都可能带来灾难性的内核故障,并且这种故障是系 14 基于ARM的嵌入式强实时内核设计 统级的,很难恢复。Linux就是单一结构的内核汹1。 2.2.2层次内核结构 图2.2.2分层结构结构的操作系统 要弥补单一结构中模块间调用存在的固有不足,就必须减少模块间毫无规则 的互相调用及互相依赖的关系,尤其要清除模块间的循环调用。层次结构的设计 就是从这一点出发,力求使模块之间的调用由无序变为有序,减少了模块调用的 无规则性。按层次结构来设计操作系统,就是将操作系统的所有模块按功能的调 用次序排列成若干层,使得功能模块之间只存在单向调用和单向依赖关系。整个 结构采用层次化的组织方式,每一层只和它相邻的两层之间有消息通信,层之间 是单向调用,同层模块之间不存在互相调用的关系。在实际的操作系统设计中, 有时也存在同层之间的模块相互调用的情况。它的结构模式如图2.2.2所示。层 次结构的优点是模块间的组织和依赖关系比较明晰,上层功能都建立在下层功能 的基础之上,系统的可读性、可适应性以及可靠性都得到了增强。此外,对某一 ||嚣掣L....=!:囊?:::[j::!j卫::ij罢i:i::::】:::j:◆:一....j | 层的修改或替换时,最多只影响到邻近的两层,便于修改和扩充。为了增强结构 的适应性,通常把与机器特点紧密相关的软件(如中断处理、i/o管理等)放在 最底层;将最常用的操作方式放在最内层,而把随着这些操作方式而改变的部分 放在外层m1。MS—DOS就是这种组织的结构。 2.2.3微内核结构 i核心态 ; ;应答…...◆【..........!!!..!!..一 i{ 微内核技术的核心思想是将传统操作系统内核中的一些组成部分放到内核 之外,作为服务进程在用户空间运行,在微内核中只保留了任务管理、任务调度 和通信等少数几个组成部分。基于这种结构的操作系统,分为两大部分:核心态 的微内核和用户态的客户/服务器。它的结构模型如图2.2.3所示。微内核在系 统中的主要工作是处理客户进程与服务器进程之间的通信,检查消息的合法性并 在客户进程与服务器进程之间传递;把实现访问硬件和内核数据结构功能的机制 放在内核中,而实现该功能的算法和策略放在用户态和服务器进程中。这就是操 作系统中的机制与策略的分离。 采用这种结构的操作系统的优点是: ●内核非常小,一般只有几十到几百KB; 基于ARM的嵌入式强实时内核设计 ●能进一步提高操作系统的模块化程度,使其结构更清晰; ●由于与目标硬件相关部分被放到微内核的底层部分和驱动程序中,当要移 植到新的硬件环境时,只需对与硬件相关的部分稍加修改即可,容易实现 不同平台间的移植; ●每个服务进程运行在独立的用户进程中,即使某个服务器失败或产生问 题,不会引起系统其他服务器和其他组成部分的崩溃,可靠性好: ●系统具有很好的灵活性和扩展性,只要接口规范,操作系统可以方便地增 删服务功能,修改服务器的代码小会影响系统其他部分,维护起来相当方 便; 但是,它的缺点也是很明显的,因为是采用客户用/服务器的结构,在通信 和上下文切换的开销上将大大增加,使得系统的效率不高。微内核方案特别适合 于比较复杂的系统同时在不同微处理器间移植要求比较突出的情况。采用微内核 结构的操作系统的典型代表就是QNX乜7】t㈨。 2.2.4内核结构设计 为了实现对内核和应用之间的保护,一般操作系统内核运行在系统态而应用 程序运行在用户态。因此,用户态的应用是不能够直接调用系统内核提供的功能 接口的,必须通过系统调用方式来进行。此种方式下,当用户态的应用需要调用 内核提供的系统调用时,首先要执行一组特殊的指令使系统进入系统态以便执行 需要的系统调用;当调用完成后,内核将执行另一组特征指令将系统返回到用户 态。每种支持保护模式的系统都提供了专门的软中断命令来完成从用户态进入系 统态的功能。系统挂接一个软中断处理函数,所有的系统调用都通过这个软中断 进入并以不同的参数值(即系统调用号)来加以区分。这种内核和应用之间的保 护是建立在内存管理单元(删U)实现逻辑地址到物理地址的转化,并且对不同 的地址空间的访问权限进行控制的前提之上的。而在没有MMU进行内存保护的情 况下,用户模式也能访问到核心模式的地址空间,所以用user隔离用户代码没 有意义。 从实践上,大多数嵌入式系统一方面不具备大容量的外部存储器以支持虚拟 存储:另一方面,嵌入式系统是确定的,不像通用计算机那样总是希望运行更多 的应用程序,对于既定的应用来说,它在运行过程中所需的动态数据空间也是可 以预测的。对于嵌入式实时应用来说,采用标准的虚存技术,则一个实时任务执 行的最坏情况是每次访问都需要调页,如此累计起来的该任务在最坏情况下的运 行时间是不可预测的,该任务的实时性无法得到保证。从而可以看出在通用操作 系统中广泛采用的虚存技术在实时操作系统中不宜直接采用。因此,在本文所面 向强实时应用的前提下,以单一内存空间对强实时性的保障是必要的。当然,对 于有第三方程序存在的环境,可以使系统在一定程度扩充内存空间保护,通过移 植POSIX接口或TA0,让第三方程序的移植和开发更简便,这将是下一步的工作。 通过对以上几种内核结构的分析比较,以及嵌入式实时应用的需求,图 2.2.4所示的单内存空间、分层结构为本文所采用的内核结构设计。内核整体上 采用分层结构,在各层中采用功能相对独立的模块。在最底层借鉴微核的原理, 通过底层微内核封装硬件接口,让上层内核通过统一的虚拟接口接收设备数据, 底层内核只提供一些最基本的功能模块,如任务管理、中断管理、内存管理、时 钟管理、任务间通信等。由于充分利用了分层结构和模块化结构的特点,这样的 特征非常适合嵌入式环境中高效、紧凑、简洁、易扩展、易剪裁等要求。 16 基于APJVl的嵌入式强实时内核设计 笪∑掣L旦掣f系统层服务 L驯 !堡堡堡竺!l l兰竺堕竺!I 土 ± 土 .. . 。 。 圆圈圆圆匡圃 存储设备 I I网络设备 I 匣示设备l 硬件 图2.2.4内核结构设计 2.3中断与设备 设计开发嵌入式操作系统通常建立在硬件的基础上。也就是在开发过程中需 要编写控制设备内部寄存器的代码,在这种环境中和软件发生关系的最原始、最 本质的来源就是中断。中断是由外部事件引起的异步事件。它可能随时发生,可 能与当前正在运行的任务没有任何关联关系,在实时操作系统设计中,对中断的 处理相当复杂。中断向量的定义、中断如何交付软件处理、中断的屏蔽方法等等 都与具体的硬件结构有着密切的关系。 在嵌入式领域,即使采用VxWorks等著名的嵌入式系统进行嵌入式系统设 计,也要编写BSP板级支持包等。一个嵌入式产品可以没有操作系统内核,但是 没有中断及中断服务是不行的。虽然可以用“轮询”构造系统,但这种设想没有 太大的使用价值,使用的范围极受限制,因此这种方式构造的系统不在讨论之列。 系统的最简化的结构是直接在中断服务中完成全部功能,但这种模式结构扩 充发展的能力较差。为增强这种结构的适应能力,通常会把中断服务和软件应用 功能分割开,彼此通过一些中间模块来交流信息。这种结构虽然相当简单,但可 作为讨论后续问题的基础。 这里先按照这个简单的结构简要描述这种基本的嵌入式系统的结构,如图 2.3所示。这种简单的嵌入式系统可以划分为设备驱动(DRV)和嵌入式应用功 能软件系统(APP)两个功能模块,以及一个中介的消息传递模块(MSG)。设备 驱动模块中包括中断服务(ISR)和设备输出/控制服务(DSR)两个子模块。图 中带箭头的实线表示依赖关系。从结构分析角度考虑,MSG更突出的一个作用应 该是改善了依赖关系,使系统具有更好的层次结构:否则就会出现ISR中直接调 用应用逻辑的情况,这种不适当的依赖关系非常不利于系统的修订和维护,同时 也不利于保持系统强实时特性。 嵌入式应用功能软件系统APP :一广————jL———_1设备驱动: L—!:::王一- -一一-一一一-一一一- _一- - ·- -。: 一I中断服务ISRl I设备输出/控制服务DSR卜……十·峨?件…设…备,; 息传递模块MSG l 图2.3嵌入式系统基本结构 17 基于ARM的嵌入式强实时内核设计 设备管理的主要任务是控制设备和CPU之间进行I/O操作。在嵌入式环境 中,把设备定义为可以通过中断与微处理器进行交流的逻辑单元更符合一般讨论 的习惯∞刳。设备和微处理器的信息交流借助软件中的设备驱动服务来完成。但是 在Pc环境中设备和驱动这两个概念并不一定和中断直接相关。例如,网络文件 系统中真正和中断相关的设备是网口,而磁盘设备及其驱动都是“虚构"出来的。 这种在内核之上建立起来的“虚拟设备环境"在嵌入式系统中也是可能存在的, 本文集中讨论和中断相关的具体设备。 在典型的设备驱动中,例如串口和网络口设备驱动(包括中断服务ISR、设 备服务DSR),通常会涉及到设备相关的寄存器。从设备输入、向设备输出、对 设备进行控制等操作就是对这些寄存器的操作。在嵌入式环境中,这里提到的所 谓设备可能是微处理器自带的设备,也可能是外围芯片构成的设备,还有可能使 通过接口外挂的逻辑设备等。 无论是微处理器自带的设备还是由其他芯片构成的设备,设备中的寄存器通 常都是映射到一段内存地址,对这段内存地址的访问就是对设备的访问。正确操 作这些设备(或称芯片、IC),要仔细阅读相关IC厂商提供的数据手册。 设备驱动中的中断服务可以有很多种编写方式,可以把设备中的信息读出后 立刻传递给其他模块处理,也可以在中断中直接处理。这要根据具体设备的不同、 整个系统结构的不同和产品功能需求的不同来做出判断。 2.4中断管理 中断管理是嵌入式实时内核的重要部分,中断响应能力快慢是问题的一个方 面,中断响应能力是否稳定则是问题的另外一个方面。通常讨论强实时嵌入式操 作系统,正确的概念是具有固定上限的中断响应能力。如果系统中关闭中断的代 码在不确定的位置出现,特别是和上层应用逻辑发生密切关系,则系统就丧失了 稳定的强实时中断响应能力的基础。因此,内核采用的中断处理机制以及体系结 构提供稳定的中断响应能力,是中断管理所应考虑的问题。 2.4.1嵌套中断机制 如果不考虑嵌套中断,单层中断过程很简单。VxWorks的ARM版本就是采用 这种方式。这种方式的中断响应能力并不好,但是系统运行逻辑简单,易于调试, 对于小型且不重要的应用来说,也有相当的价值,只要在整个中断处理过程中不 打开中断屏蔽即可。 标准的ARM指令编译器提供了一个用来声明中断处理函数的关键字一irq,使 用此关键字声明的函数可以被编译器识别为中断处理函数,并且生成必要的接口 代码,这些都由编译器自动完成。编译后的代码在处理异常事件前保存现场信息, 处理异常事件后对现场信息进行恢复。但是,一irq声明的异常处理函数在响应 中断时,并没有保存spsr寄存器,而且一直处于关中断的IRQ模式,这导致了 系统在退出整个中断处理程序之前不能响应其他中断。所以,当ISR纳入操作系 统管理以后不能使用一irq声明异常处理函数,需要编写统一的中断入口程序。 嵌入式实时操作系统要求系统及时响应外界请求,而且中断处理函数应该是 可中断的。因此,应该使用嵌套式中断来设计系统底层代码,而做到兼容非嵌套 式中断只需在整个中断过程中保持中断屏蔽状态即可。嵌套中断机制比单层中断 机制要复杂一些,特别是ARM这类微处理器要做到嵌套中断需要注意多方面的问 题。首先是退出硬保护的时机问题,如果在中断处理过程中一直不退出硬保护, 也就不存在中断嵌套。退出硬保护的最佳时机是图2.4.1中进入设备驱动并且进 18 基于ARM的嵌入式强实时内核设计 入设备保护之后。标准的方式应该是:在进入设备保护后还没有读出设备数据时, 退出硬保护。在退出硬保护之前,应该通过设备保护机制单独屏蔽设备的中断使 能位。 采用嵌套中断机制,并不需要开放完全嵌套。半嵌套是指不同设备中断之间 可以嵌套,但同一设备不能嵌套中断。这样设计既照顾了实时性的要求,又能让 系统具有更明确的稳定性,否则如果开发完全嵌套,中断服务的堆栈空间就存在 不确定性,中断响应时间上限也存在不确定性。同时完全嵌套也没有必要,如果 同设备在中断服务过程中被同一个设备再次中断,要么是软件处理算法问题,要 么是平台处理能力不够,需要从其他方面解决。 中断进入 隘缓i_ (硬保护) ISR(完令嵌套方式) ———__一 设备保护 中断退… .Ⅻn 耀“ (硬保护) 图2.4.1半嵌套与完全嵌套的区别 2.4.2不可屏蔽中断机制 在单一地址空间的实时操作系统的内核和驱动中不可避免的要采用硬保护 (屏蔽设备中断)来保护与中断相关的全局变量,这必然会对某些应用产生影响, 如:采样间隔点的时间不确定。而不可屏蔽中断机制就是一种解决方式。 不可屏蔽中断不能算是一种机制,应该是一种设计安排。这种安排可以在中 断屏蔽的时候只屏蔽IRO中断而FIQ中断保持原来状,这种安排就是把FIQ保留 为不可屏蔽中断来使用,方便进行快速场合使用,如精确定时。 系统保持不可屏蔽中断,可以满足系统某种设备需要特别高速的反应能力的 需要。所以在设计系统进入硬保护临界区函数时,只屏蔽IRQ中断,FIQ中断保 持原状。这样就可以把FIQ保留为不可屏蔽中断来使用。ARM中设计这种FIQ方 式就是为了进行快速反应场合使用。 由于操作系统管理的任何中断都必须处理一些同样的工作,如t被中断环境 的保护,与任务之间的通信等。因此,如果把FIQ纳入系统内核进行处理,FIQ 相对于IRQ的反应优势仅仅剩下一个优先级更高的特点。而在绝大多数ARM微处 理器中,无论是IRQ还是FIQ的中断优先级本来就是可以进行设置的,所以这个 优先级较高的特性也可以通过其他途径解决。 2.4.3中断分段处理机制 中断处理程序和被中断程序的“并发"执行,会引起重入、同步、临界资源 保护等诸多问题。 中断处理程序和任务必须能够交互。如果一个任务正在等待一个I/O操作完 成,相应的中断处理程序必须具有通知该任务此次i/o操作已经完成的能力。有 许多种方法可以实现这种需求。一种简单的实现方法是使用全局变量,中断处理 程序对该变量进行设置,而任务则对该变量进行连续或定时查询。连续查询会大 量占用CPU时间,而定时查询会造成一定延时。另外一种更好的方法是使用任务 间通信机制(ITC),如信号量、条件变量来通知正在等待中断操作完成的任务。 19 基于ARM的嵌入式强实时内核设计 这种方式在I/O事件发生之前不会占用CPU时间,在I/O事件发生的时中断处理 程序调用内核ITC通知等待的任务并使该任务就绪。 在ISR中使用ITC机制,意味着中断和任务的ITC部分是共享的,因此需要 在处于临界区的内核函数中禁止中断。而ITC机制作为应用开发的接口,用户应 用开发方式可以自行按照ITC机制进行调用。也就是说,这种方式导致使用硬保 护的场合与应用层逻辑发生密切关系,这可能导致系统的硬保护机制被隐性地泛 滥使用,并破坏系统中断响应能力的稳定性,丧失强实时系统的基础。1.t C/OS-II 正是采用这种方式,因此有重新设计的必要。 图2.4.3-1是基于以上分析所构建的一个带内核的嵌入式操作系统的基本结 构。这个结构也基本上比较接近1.t c/os-n内核的结构。 嵌入式多任务应用功能软件系统APP 中断服务ISR||设备输出,控制服务DSR 设备内部保护 设备驱动 DRV 务问通信ITC l l调度器Scheduler I 关中断(硬保护HP) 嘲度锁(软保护sP 内核 Kernel 图2.4.3.1带内核的嵌入式系统的基本结构 为了最大限度地减少中断屏蔽的动作,确保最可能少的中断延迟,可以使用 一种分割式中断处理机制。在这种机制中,中断处理被分为两部分。第一部分是 中断服务程序(ISR),ISR进行一些必要的处理(读取设备端口数据)并且决定 是否要执行DISR,这样可以减少ISR的中断服务时间,为其它外部事件的中断 响应提供了更多的时机:第二部分是中断滞后服务程序(DISR)主要进行一些比 较耗时的操作或内核函数(如ITC)的调用,DISR在退出ISR以后的一个安全的 时刻执行,当然如果被中断的环境不在内核临界区DISR会很快被处理。为了实 现这种机制,还需要增加一个设备/任务问通信(DTC)模块和环境调度模块 EV_shced。 通过这种机制,设备驱动一旦被中断引发,读完设备中的数据后,立即通过 DTC机制发出,之后即可立即恢复到为其它设备中断服务的状态中。这样中断处 理不会受到应用方代码逻辑的影响,而应用层不再和中断环境中的设备驱动ISR 共享变量,应用中也就不需要不必要的硬保护逻辑。 DTC模块主要数据结构与接口函数(C语言描述) typedefvoid(*DSRHandlerXint Vec.void幸data); typedefvoid(*lSRHandlerXvoid); typedefstruct_INTERRUPT{ DSRHandler dsr_handler; ISRHandler ira"yamdler, }INTERRUPT; t-ype,defstruct_DTC{ 基于ARM的嵌入式强实时内核设计 UINT32 vector; void data; }DTC; DTC dtc_table[DTC_TABLE_SIZE]; INTERRUPT·intr_table[INTR_TABLE_SIZE]; void DTC Jnit(void);/*DTC初始化·/ void Post DTC(DTC dtc)/*dtc数据发送·, void Call—DTC(void·pdatay·d£c服务函数·, void Rcg_intermpt(int vector,DSRHandler dsr,lSRHandler isr);/·设备中断注册吖 ● ● : 应用 ● ● 件操作APl I l SocketAPI l l GUI 系统层服务 ● ● 注册 示设备 DRV 断服务ISRl l设备输jlj/控制服务DSR l中断滞后服务DIS 设备内部保护 中断退出l 环境调度器EV_shceA I IDISR I I任务间通信ITC 圃 设备任务间通信DTC l l 软保护(SP) |任务调度器Task—sched ‘。。。‘。。。。。。。’’’。。。。。。’I ●__-●_______________一 ’ 硬保护(HP) 图2.4.3-2分层调度内核体系结构 图2.4.3-2为本文所采用的分层调度内核体系结构。下面简单描述一下中断 发生到应用收到消息和数据的过程:中断一旦产生,中断环境通过必要的入口准 备后,进入特定设备的ISR,ISR进行一些必要的处理(如读取设备端口数据) 决定是否要进一步处理,如果需要则向DTC发送消息。当所有的ISR处理结束后 进入环境调度模块(EV_shccd)。当被中断的任务环境正在调用内核模块处于内核 临界区时,EVS直接调度返回被中断的任务,DISR将在临界区退出时执行;当被 中断的任务环境不在内核临界区时,EVS根据DTC内是否有消息决定是否运行相 应的DISR还是返回被中断的任务环境。DISR通过ITC发送消息、数据到应用, 应用在下次被调度器调度运行时收到该消息和数据。 2.4.4lRQ中断入口逻辑与出口处理 2l 基于ARM的嵌入式强实时内核设计 中断产生 前模式为中断模式:①压栈LR-4(断点PC)、SPSR(断点CPSR) (因为要使用Ro作为IRQ模式堆栈指针);②保存IRQ模j 栈指针到ROt③恢复IRQ模式堆栈指针。被中断模式的LR{ 到被中断模式获取,R12-R1可在被中断模式获取。 换到被中断模式(可能足SVC模式或undef模式) R存被中断模式上下文到被中断模式堆栈;通过R0可以获取宅 RQ堆栈压栈的Pc,cPSR,ROt LR,R12一R1直接在本模式获取 Y 高地址[= 獯长l Ii 方I l坠 向I b 低地址一 存堆栈指针到当前任务控制块,切换到undcf模式 N 1 Irq_di spatch中断分发 Irq finish中断结束处理 Irq._dispatch ntNesting‘-·。 rq_return()返回上层中断ISR ntNest ing-- ask_return(),返回被中断任务 l恢复undef模式堆栈指针 , 蛔换到任务运行环境(svc模式) ’ 陆取当前任务堆栈指针 l 恢复任务运行环境,任务运行 EV shcM Irq_finish N— IntNesting=l? Y Y KerneICritical=l? N Y K 图2.4.4 IRO中断入口逻辑与出口处理 基丁二ARM的嵌入式强实时内核设计 2.5设备驱动模型 设备驱动程序的建立,就是编写每个设备相关的ISR、DSR和DISR,而设备 驱动模型的选择依赖于设备的性质和期望的行为。 此处DRV的概念实际上是比较底层的内核驱动模块概念,这个概念与通常所 接触到的多种驱动是有区别的。需要注意的是DISR的设计的目的是:为了使设 备驱动环境中向任务发送消息、数据时调用内核模块任务间通信(ITC)时,避 免在处于临界区的内核函数中禁止中断造成系统中断响应能力不稳定而采用的 机制。DISR还是应该尽量保持简洁、高效,不应该进行不必要的功能扩充。应 该在保持完成必要的设备处理后尽量将后续处理转交真正的应用任务进行进一 步处理的方式。如果系统设计要求更高效,也可以在ISR中直接应答,不必通过 DTC机制进行转达(不和应用发生关系的前提下)。用户完全可以根据自身产品 要求选择具体在ISR、DISR或应用等环节中的任意一个环节输出应答,也可以是 这些方案中的多种组合。 基于ARM的嵌入式强实时内核设计 第三章任务调度策略与资源访问控制协议 对于实时系统,除了要满足应用的功能需求以外,更重要的是满足应用提出 的实时性要求,而组成一个应用的众多实时任务对于实时性的要求是各不相同 的。此外,实时任务之间可能还会有一些复杂的关联、约束和同步关系,如执行 顺序限制、共享资源的互斥访问等,这就为系统实时性的保证带来了很大的困难。 因此,实时系统应遵循的设计原则是:采用合适的调度算法和资源访问控制协议, 始终保证系统行为的可预测性。可预测性是指在系统运行的任何时刻、任何情况 下,实时系统的任务调度算法和资源访问控制协议都能为竞争处理器时间和其它 共享资源的多个实时任务合理地分配资源,使每个实时任务的实时性要求得到满 足。实时系统注重的不是调度算法和资源访问控制协议平均表现,而是要求每个 实时任务在最坏情况下能满足实时性要求,即,实时系统注重的是个体表现,更 准确地讲是个体最坏情况表现。 当实时系统包含的任务集合在某种调度算法和资源访问控制协议下不可调 度时,通过选择另外一种处理速度更快的处理器,提高系统的运行速度来解决这 一问题并不是最佳的方案。因为运行速度的提高必然带来一些负面效应,例如导 致系统功耗加大和电磁兼容性下降等。比较合理的方法是选择实现简单、系统开 销小、对处理器的处理能力利用率高的调度算法以及资源访问同步控制方法。因 此,在设计一个具体的嵌入式实时系统时,选择正确的算法和协议能在保证系统 实时性的前提下,使系统在功耗、可靠性、电磁兼容性等方面获得最佳的品质。 3.1任务调度策略 在实时操作系统中,任务调度用来确定多任务环境下任务的执行顺序和在获 得CPU资源后任务执行时间的长短,以确保各个任务都能够按时完成。调度算法 是任务调度的核心内容,采用何种调度算法,直接影响到系统的实时性能。 由于面向小型嵌入式强实时应用,所以只讨论单处理器任务调度策略。当前 有许多种可用的调度算法n2Ln3kn钉J蚓』埔Ln"。通常情况下,每种算法都试图充分 利用给定任务集合的某一些特性。因此,没有一种算法能适合所有类型的任务集 合。在嵌入式实时应用中任务的调度策略主要有静态优先级调度算法和时间片轮 转调度算法。动态调度算法是为了确保低优先级任务也能被执行。这些系统中, 在出现临时过载的情况下,要求调度算法能够选择最紧急的任务执行,而放弃那 些不太紧急的任务。而动态调度的优先级只反映了任务的时间特性,没有把任务 的紧急程度体现到优先级中去。另外,动态调度的调度代价通常都比静态调度高, 这主要是由于在每一个调度点都要对任务的优先级进行重新计算,而静态调度中 任务的优先级则始终保持不变。这种公平性对于所有任务都同等重要的系统比较 合适,对于需要绝对可预测的性的系统一般不采用动态调度。 静态优先级调度算法包括RM(Rate Monotonic)和DM(Deadl ine Monotonic) 调度算法。前者根据任务周期确定任务优先级,后者根据任务的最终截止期确定 任务优先级。 3.1.1静态优先级调度 允许任务执行中被其它任务抢占的调度程序,称作抢占式(preemptive)调度 程序,包含的调度算法称作抢占式调度算法,RM和DM都是抢占式调度算法。抢 占式调度程序允许任务在任意执行时刻被中断,然后进行现场切换,使新任务或 者仍然是原来的任务继续执行。抢占式调度提供了很大的灵活性,因为任务执行 24 基于ARM的嵌入式强实时内核设计 能被分割成任意的时间间隔来适应不同的执行方式,从而获得更高的处理器利用 率。但进行可调度性分析时必须考虑现场切换的时间,而且这一时间必须显著的 小于任务的执行时间,否则会浪费大量的处理器时间用于抢占造成的现场切换。 使用抢占式调度算法时,每个任务使用一个栈空间,所以还会消耗较多的内存资 源;而且应用程序不应该直接使用不可重入型函数,调用不可重入型函数时,要 满足互斥条件,这一点可用互斥型信号量来实现。这种调度方式主要应用于一些 较简单、较独立的嵌入式系统,但随着调度理论的不断成熟和完善,这种方式也 会逐渐在一些对实时性要求十分严格的领域中得到应用。 不允许任务执行中被其它任务抢占的调度程序称作非抢占式 (non—preemptive)调度程序,使用的算法称作非抢占式调度算法。在非抢占式调 度中,任务一旦执行就不会被其它任务抢占,因此使用了比抢占式调度要少的现 场切换,节省了处理器时间。但由于不允许抢占,有时会降低任务集合的可调度 性。非抢占式调度的一种极端形式是按照先到先服务(First—In—First—Out,简 称FIFO)的方式执行任务。后到的高优先级任务会被排在前面的低优先级任务阻 塞,而且阻塞时间是不确定的,会显著降低高优先级任务的可调度性。使用非抢 占式调度算法时,因为任务之间共享一个栈空间,所以能减少内存消耗。 抢占阈值(Preemption Threshold,简称PT)调度首先被Express Logic公司 的w.Lamie在1997年左右提出,并应用到商业实时操作系统ThreadX中n引。在 1999年,加拿大肯考迪娅大学(Concordia University)的Y.Wang和M.Saksena 等人形式化的论述了抢占阈值调度算法n钔,并证明其特性,通过实例说明了有些 在抢占式和非抢占式调度算法下均不可调度的任务集合在抢占阈值调度算法下 可调度。通过仿真实验证明:与抢占式和非抢占式调度算法相比,抢占阈值调度 算法能提高任务集合的可调度性。 抢占阈值调度属于静态优先级调度算法,实现了双优先级系统,每个任务具 有两个优先级:任务优先级和抢占阈值,后者大于或者等于前者。任务优先级被 用于任务间竞争处理器,抢占阈值则作为任务开始运行后实际使用的优先级。这 样减少了低优先级任务被高优先级任务抢占的次数,从而减少了现场切换次数, 提高了处理器的利用率,也能提高整个任务集合的可调度性。抢占阈值调度还将 整个任务集合分割成较少的非抢占组(Non—Preemptive Group,简称NPG),组 内任务之间是非抢占的,能共享一个栈空间,减少了任务集合对内存资源的消耗。 当集合中所有任务的抢占阈值等于集合的最高优先级时,抢占阈值调度变为非抢 占式调度;当每个任务的抢占阈值等于其优先级时,抢占阈值调度又变成抢占式 调度。所以抢占式和非抢占式调度均为抢占阈值调度的特例,所以后者能充分利 用前两者的优点。在文献n刚描述的仿真环境下,利用抢占阈值的调度与抢占式调 度相比,处理器利用率提高15%-20%。在文献啪1的仿真环境下,当任务最大周期 为100时,平均100个任务被分割成14.3个NPG。 因为抢占阈值调度算法具有上述优点,从而引起了广泛地关注。除了上述商 业实时操作系统外,一些学术界开放源码的实时操作系统也采用了这种技术晗¨。 另外,汽车电子行业的实时操作系统标准OSEK/VDX船羽定义了实现抢占阈值调度 的内核设计标准。 3.1.2时间片轮转调度 时间片轮转调度(round—robin scheduling)算法是指当有两个或多个就绪 任务具有相同的优先级,且它们是就绪任务中优先级最高的任务时,任务调度程 序按照这组任务就绪的先后次序允许一根任务运行事先确定的一段时间,叫做时 基于ARM的嵌入式强实时内核设计 间额度(quantum),然后切换给另一个任务,也叫做时间片调度(time slicing)。 内核在满足以下条件时,把CPU控制权交给下一个处于就绪态的任务:当前任务 已无事可做;当前任务在时间片还没结束时已经完成了。 时间片轮转算法并没有把任务的紧急程度体现在调度算法里,增加了任务切 换的不确定性,同时任务切换的频繁性也降低了系统的利用率。但是,可以把时 间片轮转算法作为一种非时间关键场合、不定期有突发事件的系统的调度选择提 供给用户。 3.1.3静态调度的任务优先级分配 静态优先级可抢占式调度适合于不定期有突发事件产生的系统,而且突发事 件不及时处理就可能造成数据的溢出或其他危害;另外就是时间关键系统。目前 市场上大部分的实时操作系统采用的都是采用抢占式优先级调度方式。 在静态调度算法中,任务的优先级需要在系统运行前进行确定。通常静态调 度中确定任务优先级的主要依据有以下几点: ①执行时间。以执行时间为依据的调度算法为: ●最短执行时间优先(smallest execution time first); ●最长执行时间优先(1argest execution time first); ②周期。以周期为依据的调度算法为: ●短周期任务优先(smal lest period first); ●长周期任务优先(1argest period first); ③任务的CPU使用率。任务的CPU使用率为任务执行时间与任务周期的比值。 以任务的 CPU使用率为依据的调度算法为: ●最小CPU使用率优先(smallest task utilization fist); ●最大CPU使用率优先(1argest task utilization first); ④紧急程度。根据任务的紧急程度,以人为的方式进行优先级的静态安排。 人为安排优先级是嵌入式实时软件开发中使用的非常多的一种方法。该方法 以系统分析、设计人员对系统需求的理解为基础,确定出系统中各个任务之间的 相对优先情况,并据此确定出各任务的优先级。 3.2基于优先级位图的抢占阈值调度 调度本身需要一定的系统开销(overhead),需要花费时间来计算下一个可 被执行的任务。因此,竭力使用最优调度方案往往并不是一个明智的办法。高级 的调度程序通常具有不可预见性,需要花费更多的时间和资源;并且,其复杂性 也增加了应用编程人员的难度。简单是实时内核所强调的主要特点,适用的实时 内核在实现时大都采用了简单的调度算法,以确保任务的实时约束特性和可预见 性是可以管理的。复杂、高级的调度算法则通常用于研究领域。目前商业的实时 操作系统一般采用基于静态优先级抢占调度,以不大的代价保证了任务调度的实 时性和可预见性。 嵌入式实时系统的进程调度与通用计算机操作系统进程调度有很大的不同, 实时操作系统要求任务的执行的确定性和可预测性。实时系统的任务调度通常采 用任务队列的方式进行管理,在基于优先级的调度处理中,需要获得当前具有 最高优先级的就绪任务。采用直接将就绪任务的任务控制块放在就绪队列的末尾 或则将就绪队列中的任务控制块按优先级的顺序排序的调度方法都会使调度程 序所花的时间与任务数量相关,具有不确定性,为提高实时内核的确定性,实时 基丁ARM的嵌入式强实时内核设计 系统通常采用优先级位图的就绪任务处理算法。 3.2.1优先级位图算法实现原理 优先级位图算法采用含有8个char型的数组的每个二进制位对应的一个优 先级的数据结构,二进制位的值为l,表示对应数组元素中对应的优先级有就绪 任务;二进制位为O, 表示对应数组元素中对应的优先级没有就绪任务。在任 务进入和退出就绪态时,根据任务的优先级改写数组的对应优先级的二进制位, 改写方式采用对优先级数进行变换获得数组中对应优先级二进制位位置的方式。 这样对于任何优先级的任务改写位图数据结构的时间都是相同的。在获取进入就 绪态的最高优先级时,是通过优先级判定表即查表的方法来实现的,这样就保证 了获取进入就绪态任务最高优先级的执行时间是确定的。Il C/os—II就是采用 这种算法,内核最多可以管理64个任务,其中系统保留8个任务,用户最多可 以有56个应用任务。 优先级位图算法采用含有8个char型的一维数组的每个二进制位对应一 个优先级的数据结构,使得其只支持64个优先级,而且每个优先级只能对应一 个任务,不能出现多个相同优先级的任务;在获取进入就绪态的最高优先级时, 采用优先级判定表的方法,解决了执行速度的确定的问题,但是这样必须事先填 写好一个含有255个char型的数据表,占用了比较大的数据空间。 3.2.2优先级位图算法增加支持优先级数量 在实际应用中,系统所支持的任务数量限制了系统的复杂程度,而任务数量 的增加同时也给整个系统的实时性和存储空间带来影响。因此,系统应该根据不 同的工程需求提供不同的任务数量支持。在Il C/OS—II中,原有的基于64个任 务调度的优先级调度算法分别用3个比特位来定位任务优先级在就绪表(ready 1ist)中的行和列,即O~2位标识该任务在总就绪表中的列信息,3"-5位标识 该任务在就绪表中的行信息。因为存放任务优先级的字节中8个比特位只会用到 6位,而有两个比特位空闲,可以直接扩展定位就绪任务优先级在就绪表中位置 的行和列信息的比特位,使其能够区分256个不同的任务优先级,扩展后的算法 任务优先级与任务就绪表和任务就绪组之间的关系如图3.2.2一l和3.2.2—2所 示。 OSRdyG巾 OSRdyTbllOS LOWEST-PRIO/16+11 15 14 13 12 3l 30 29 28 47 46 45 44 63 62 61 60 3 2 l O 19 18 17 16 35 34 33 32 5l 50 49 48 207 206 205 204 223 22l 22l 220 239 238 237 236 255 254 253 252 图3.2.2-2 RdyTbl与RdyGtp的关系 27 195 194 193 192 2ll 2lO 209 208 227 226 225 224 243 242 241 240 基于ARM的嵌入式强实时内核设计 臣L[—[互—工三一]!L]臣—[[—[工一三盈.一任务优先级 I k先级在RdyTbl中二进制位序 优先级在RdyGrp中二进制位序 图3.2.2.i任务优先级与RdyTbl和RdyC卸的关系 1、任务进入就绪态 任务进入就绪态算法(C语言描述) UINTl6 OSMapTbl[】={oxol,0X02,0X04,0X08,0X10,03[20,0X40,OX80,0X0100,0X0200, 0X0400,0X0800,0X1000,0X2000,OX4000,ox8000}严优先级映射表定义./ OSRdyGrp l=OSMapTbl[prio>>4】; OSRdyTbl[prio>>4】I=OSMapTbl[prio&OXOF]; 2、任务退出就绪态 当优先级为prio任务脱离就绪状态时,可清除OSRdyGrp和OSRdyTbl[]qb的对应该任务 的位:将就绪任务表数组OSRdyTbl【】中相应元素的相应位清零,而对于OSRdyGrp,只有当 被删除任务所在的任务组中,全组任务一个都没有进入就绪态时,才将相应位清零。也就 是说,OSRdyTbl【prio>>4】所有的位都是0时,OSRdyGrp的相应位才清0。 任务进入就绪态算法(C语言描述) if((OSRdyTbl[prio>>4】&="--OSMapTbl[prio&0XOF])==o) .OSRdyGrp&="-,OSMapTbl[prb>>4】; 3、获取进入就绪态的最高优先级 获取进入就绪态的最高优先级是通过优先级判定表OSUnMapTbl[]实现的,具体内容见 参考文献[32】 获取进入就绪态的最高优先级算法(C语言描述) Thigh4bi伊OSRdyGrp&0X00FF; if(Thigh4bit。=O) high4bit=OSUnMapTbl[OSRdyGrp>>8】+8; else high4bit=OSUnMapTbl[Thigh4bit>>0]+0; Tlow4bit=OSRdyTbl[high4bit]&0X00FF; if(Tlow4bit==o) low4bit=OSUnMapTbl[OSRdyTbl[high4bit]>>8】+8; else low4bit=OSUnMapTbl【Tlow4bit>>O】+o; 蛳o=(high4bit<<4)+low4bit; 3.2.3优先级位图算法减少优先级判定表所需存储空间 优先级位图算法在获取进入就绪态任务的最高优先级时,采用的是查找优先 级判定表的查询方式, 这样需要一个含有256个char型数据的数组。由于嵌 入式系统中对存储空间要求往往较为苛刻,应该尽量减少空间的占用。而优先级 判定表相当规整,除第--歹mJ数据外, 其他列数据均相同,这样便可以改用两个 含有16个char型数据的数组表示原包含256个char型数据的数组的所有信 息,同样可以保持常数运算时间,只不过运算步骤略微多了几步,但是空间占用 基-j=ARM的嵌入式强实时内核设计 可以减少很多。具体算法实现,C语言描述如下: (1)设置优先级判定表 优先级判定表定义(C语言描述) char OSMapTbll={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1辩严原判定表中第一行的值., char OSMapTbl2={0,4,5,4,6,4,5,4,7,4,5,4,6,4,5,4)少原判定表中第--N的值·/ , (2)获取进入就绪态的最高优先级 获取进入就绪态的最高优先级通过查询优先级判定表来实现,如果 OSRdyGrp最低位为1在0SMapTbll[(a&OxOf)]取对应表值;否则在 0SMapTbl2[(a&OxfO)>>4]取对应表值。 获取进入就绪态的最高优先级算法(C语言描述) #define Lookup(a)((a&0X0 1产20 7 OSMapTbl2[(a&OxfO)>>4】:、 OSMapTbl l[(a&OxOt)>>O】) Thigh4bit=OSRdyGrp&OXOOFF; if(Thig,h4bit 2 2o) high4bit=Lookup(OSRdyOrp>>8卜8; else high4bit。Lookup(Thigh4bi伊>0>心; Tlow4bit=OSRdyTbl[high4bit]&OXOOFF: if(Tlow4bit==o) tow4bit=Lookup(OSRdyTbl[high4bit]>>8卜8; else low4bi伊Lookup(Tlow4bit>>0)+0; prio=(high4bit<<4)+low4bit; 在程序中出现“>>O"和“+O’’操作,主要为了满足参数在任何取值下执行 的时间都是相同的,当然编译器可能优化这样的语句,这时需要在编译此语句时 关闭编译优化选项。 3.2.4基于优先级位图的抢占阈值调度算法 抢占式和非抢占式调度均为抢占阈值调度的特例,所以后者能充分利用前两 者的优点。本文所采用的调度算法是在优先级位图调度算法的基础上实现抢占阈 值调度。这种算法实现起来很简单,只要在任务控制块(TCB)的结构中增加一 个抢占阈值成员,调度算法中如果当前就绪表中任务的优先级大于当前运行任务 的抢占阈值则进行任务切换,否则不进行任务切换。 3.3资源访问控制 3.3.1资源访问所引起的设计问题 1、优先级反转 实时系统中,如果采用优先级驱动的调度方式,则传统操作系统使用的资源 共享访问机制在系统运行中会产生“优先级反转"(priority inverse)问题n"。 即,当一个高优先级任务访问共享资源时,该资源己被另一低优先级任务占有, 根据互斥访问共享资源的要求,高优先级任务不能继续执行,将处理器的使用权 转让给低优先级任务,后者继续执行,这称作高优先级任务被低优先级任务阻塞 (blocking)。而这个低优先级任务在访问共享资源过程中可能又被其它一些中 间优先级的不使用该共享资源的任务抢占,从而放弃处理器的使用权给这些中间 优先级的任务。因此造成高优先级任务被许多具有较低优先级的任务阻塞,而且 基于ARM的嵌入式强实时内核设计 阻塞时间是不确定的,使高优先级任务的实时性得不到保证。 如果高优先级任务在访问同一共享资源的低优先级任务运行后才开始执行, 那么这时被后者阻塞是不可避免的。因为共享资源只能被互斥访问,而任务的执 行顺序是根据系统功能需求确定的,不可改变。但是,高优先级任务被中间优先 级任务阻塞是不合理的,因为两者之间没有任何关联。必须利用适当的资源访问 控制协议来避免这种阻塞时间,以保证任务执行的可预测性,并提高处理器的利 用率。 2、死锁 死锁(deadlock)是指两个或两个以上的进程在执行过程中,因争夺资源而 造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系 统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 图3.3.1-1和3.3.1-2描述了任务发生死锁的情况。 图3.3.1.1两个任务的死锁情况 图3.3.1.2三个任务的死锁情况 3.3.2资源访问控制协议 实际的实时系统中,任务很少是独立执行的,经常需要互斥地访问共享资源。 当任务试图访问资源时可能被J下使用该资源的其它任务阻塞,调度分析时要考虑 这一因素。常用的资源访问控制协议包括:L.Sha,R.Rajkumar和J.P.Lehoczky 提出的优先级继承协议(Priority Inheritance Protocol,简称PIP)删,J. B.Goodenough和L.Sha提出的优先级天花板协议)(Priority Ceiling Protocol,简称PCP)[241.[231。 PIP协议能与任何优先级驱动的抢占式调度算法配合使用,而且不需要有关 任务访问资源情况的先验知识。优先级继承协议的执行方式是:当低优先级任务 正在使用资源,而高优先级任务抢占执行后也要访问该资源时,低优先级任务将 提升自身的优先级到高优先级任务的级别。保证低优先级任务继续使用当前资 源,以尽快完成访问,尽快释放占用的资源,使高优先级任务得以执行,从而减 少高优先级任务被多个低优先级任务阻塞的时间。低优先级任务在运行中,继承 了高优先级任务的优先级,所以该协议被称作优先级继承协议。 因为只有高优先级任务访问IF被低优先级任务使用的资源时,优先级继承才 会发生,在此之前,高优先级任务能够抢占低优先级任务并执行,所以优先级继 承协议不能防止死锁(deadlock),而且阻塞是可以传递的,会形成链式阻塞 (chained block)。另外,优先级继承协议不能将任务所经历的阻塞时间减少到 尽可能小的某个范围内,所以,高优先级任务经历的阻塞时间是不确定的。最坏 情况下,一个需要n个资源,并且与v个低优先级任务冲突的任务可能被阻塞 min(n。v)次。 30 基于ARM的嵌入式强实时内核设计 PEP协议扩展了PIP协议,能防止死锁和减少高优先级任务经历的阻塞时间。 该协议假设所有任务分配的优先级都是固定的,每个任务需要的资源在执行前就 已确定。每个资源都具有优先权天花板值,等于所有访问该资源的任务中具有的 最高优先级。任一时刻,当前系统优先权天花板值(current priority ceiling) 等于所有正被使用资源具有的最高值。如果当前没有资源被访问,则当前系统优 先权天花板值等于一个不存在的最小优先级。当任务试图访问一个资源时,只有 其优先级高于当前系统优先级天花板值,或其未释放资源的优先级天花板值等于 当前系统优先权天花板值才能获得资源,否则会被阻塞。而造成阻塞的低优先级 任务将继承该高优先级任务的优先级。 已经证明,PEP协议的执行规则能防止死锁比13,但其代价是高优先级任务可 能会经历优先级天花板阻塞(priority ceiling blocking)。即,高优先级任务 可能被一个正使用某资源的低优先级任务阻塞,而该资源并不是高优先级任务请 求的。这样一来就有可能影响某些中间优先级任务的完成时间,对任务执行流程 的影响相对较大。这种阻塞又被称作回避阻塞(avoidance blocking),意思是因 为回避死锁而引起的阻塞。因此,要求临界区代码尽可能短,才能使低优先权任 务尽快释放共享资源。 在PcP协议下,对占有某临界资源的任务的优先级只需改变一次,而PIP协 议可能改变多次。从这个角度看,优先级天花板协议效率较高,因为若干次改变 基于ARM的嵌入式强实时内核设计 占有资源的任务的优先级会引入更多的额外开销,导致任务执行临界区的时间增 加。使用PCP协议后,我们能静态分析和确定任务之间的资源竞争,计算出任务 可能经历的最大阻塞时间,从而能分析任务集合的可调度性。 3.3.3互斥型事件解决优先级反转 从概念上讲,互斥就是只能取0和1两种值的“信号量(semaphore)”。但 是,在基于优先级抢占的系统中,使用信号量机制处理临界资源互斥访问时,可 能会引发优先级反转问题。 u C/OS--II利用互斥型信号量mutex实现对共享资源的独占式处理,并可 以降解优先级反转问题。其具体实现原理是:①编程设计人员首先确定应用中所 有建立任务的优先级;②确定共享资源互斥信号量的极限优先级PCP,即:在应 用程序中没有被占用的、略高于所有需要该资源的任务中的最高优先级;③应用 OSMutexCreate0函数建立互斥型信号量,此时PCP作为函数的第一个参数,表 示使用该互斥信号量的极限优先级。③当出现比当前占有该资源的任务的优先级 高的任务调用OSMutexPend0函数申请该互斥信号量时,把占有该资源任务的优 先级提升到该互斥信号量的极限优先级PCP,保存原优先级;如果占有该资源的 任务为就绪任务,需要在提升优先级前在就绪表中移除,然后进行任务调度。④ 当占有该资源的任务调用OSMutexPost0函数释放该互斥信号量时需要判断任 务的优先级是否在申请获得互斥信号量的过程中改变,如果改变需要还原该任务 的优先级。 11 c/os—II在解决优先级反转的方法存在的问题:①u c/Os—II采用优先 级位图调度算法,不允许不同任务有相同优先级。因此,编程人员需静态分析系 统和应用代码,然后为每一个临界资源预留一个极限优先级,这就增加了编程的 难度,同时使应用程序复杂,容易出错,导致系统的不稳定;②u C/Os_II解 决优先级反转问题主要依据是优先级天花板协议,任务不会因为请求资源而被阻 塞。因此,互斥信号量的事件控制块不需要像其他事件控制块一样设置任务等待 列表。 针对以上问题本文的解决方案: 1、互斥事件控制块结构在系统启动时初始化成单向线性空闲链表,此链表不需 要设置任务等待链表。另外,在任务控制块中增加一个正在被任务使用的互斥事 件控制块的指针OSMutexEventPtr任务通过这个指针操纵当前的事件控制块。在 多个资源被分配给一个任务后,事件控制块结构中的OSEventPtr指针和TCB中 的OSMutexEventPt指针将形成一条事件控制块链。应用OSMutexCreate()函数 创建互斥事件进行资源管理时,需要从空闲互斥事件链表中摘下一个事件控制块 结构,并将此结构中的OSEventPCP初始化成用户指定的PCP,并返回互斥事件 控制块指针给任务。 互斥事件结构定义 typedefstreet∞_mutexevent{ char OSEventl℃P;,·资源的PCP*I ehar OSEvent Pri:,·拥有该资源任务的优先级., os:mrrEX ltru_ct EVENT OSEvent Ptr;,+空闲时,指向链衰中下一个事件控制块的指针,工作时用予 保存任务先前韵事件控制块叫 霎OS_MUTEX EVENT;’ 2、由于采用优先级天花板协议解决优先级反转问题,任务不会因为请求资源而 被阻塞。所以,在任务申请临界资源时将该任务的优先级与该资源的天花板优先 基于ARM的嵌入式强实时内核设计 级所对应的任务进行互换,从而不需要在优先级分配时为每一个临界资源预留一 个天花板优先级。 任务通过OSMutexPend()函数(图3.3.3)申请临界资源;通过OSMutexPost ()函数释放临界资源,此函数基本执行和OSMutexPend相反操作,但需要在最 后执行一次调度。 开始 OSMutexDel()函数负责删除一 前任务控制块OSMutexEventPtr指向事件控制 弋攀罗夕/ 一一——7’{巯任务优先级<申请磊、\. ! 个互斥事件,并回收事件控制块 到空闲链表。这个功能为任务提 供一定方便的同时也带来了一定 的危险性,因为多任务可能试图 使用一个已经删除了的互斥事 任务当前的优先级!下』从L就—绪—表—中删—除—该—任—务—,并一l 新的优先级下将该任务插入到就绪表中 I 换OSTCBPdoTbI[IdP指向当前任务控制块和 PCP任务控制块的指针 件,因此在使用时应该格外小心。 优先级天花板的本质是让占 有资源的任务尽快执行完,并释 放资源,从而使与其竞争资源的 高优先级任务尽快地得到执行, 并通过良好定义的调度规则使任 改任务控制块的相应位域 I堕塞 J 务不会交错占有资源而形成环路 等待,从而保证死锁不会发生。 因此,优先级天花板协议不仅比 优先级继承协议具有更小、更确 图3.3.30SMutexPend 定的高优先级任务阻塞时间,而 且能够防止死锁的发生。而这种 更快、更确定的时间性能是实时系统所必要的。由于此协议是以高优先级任务可 能会经历优先级天花板阻塞为代价的,所以要求临界代码尽可能短,使低优先权 任务尽快释放资源。 基于ARM的嵌入式强实时内核设计 第四章内核对象 4.1任务管理 在每个操作系统中,都有一个最小的运行单位,系统为它分配资源、进行调 度。有些系统的这个最小运行单位为进程,有些系统的这个最小运行单位为线程。 一个程序要运行,必须先创建一个任务。如果它的优先级高于正在运行的任务或 者当前没有任务在运行,还将为它分配处理器,使其投入运行。创建任务的过程 即为分配任务控制块的过程,在创建任务时,通常要确定任务的名字和任务的优 先级等内容,并为任务确立所能使用的堆栈区域。在任务执行过程中可能需要暂 时释放CPU资源,因此还要提供任务的睡眠与唤醒操作;任务执行完毕,要对任 务执行删除操作,以释放该任务在执行过程中所申请的全部资源。任务在操作系 统中是通过任务控制块(TCB)来描述的。每个任务都有唯一的任务控制块,内 核根据TCB对任务进行控制和管理,而任务的各种动态特征也是通过TCB表现 出来的。TCB是任务在系统中存在的唯一标志。 任务可以简单理解为由任务调度器管理的数据结构和逻辑代码实体,因为任 务的描述结构和调度器的算法一定是同时设计不可分割的,所以调度器和任务这 两个概念的定义是相互引用的。具备任务管理内核的系统的关键就是调度器,触 发或者说调用调度器的方式是系统运行的基础,通常有两种途径: 1、来源于中断,在中断中通过将内核中的消息传递到模块,通知某个任务、某 个条件已经具备,并触发调度。 2、在任务中等待或释放某个资源,并触发调度。 4.1.1任务的状态与变迁 在多任务系统中,任务要参与资源竞争,只有在所需资源都得到满足的情况 下才能得到执行。因此,任务拥有的资源情况是不断变化的,导致任务状态也表 现出不断变化的特性。任务状态的定义及其转换是多任务调度的基础。在多任务 的操作系统中,任务必须以一种具体的状态存在于系统中。对不同的系统,任务 状态的定义也不尽相同。图4.1.1为本文所采用的内核体系结构的任务状态图。 图4.1.1分层调度体系结构任务状态图 基于ARM的嵌入式强实时内核设计 4.1.2任务控制块及任务控制块链表 内核用来记录任务的堆栈指针、任务当前状态、任务优先级等一些与任务管 理有关的属性表叫做任务控制块(TCB)。 任务控制块部分结构定义(C语言描述) typedef struct os._tcb{ oSjTK*OSTCBStkPtr; slruct os_tcb*OSTCBNext; struct os._tcb·OSl℃BPrev:t UINTl6 OSTCBDly; UINT8 OSTCBState; 一 ,脂向任务堆栈栈顶的指针 ,,指向后一个任务控制块的指针 //指向前一个任务控制块的指针 //任务的等待时限 //任务的当前状态标志 UINT8 UINT8 OSTCBPrio; OSTCBThreshold; /,任务的优先级 ./厢E务的抢占阈值 ·一·}OS_TCB 任务的控制块用两条链表来管理,一条是空闲任务块链表(其中所有任务控 制块还没有分配给任务),另一条是任务块链表(其中所有任务控制块已经分配 给任务)。为了加快对任务控制块的访问速度,任务控制块链表被创建为双向链 表,同时还定义了一个数据类型为OSjCB的数组OSTCBTrioTbl口,专门用来以 任务的优先级别为顺序在各个数组元素里存放指向各个任务控制块的指针,这样 系统在访问一个任务的任务控制块时就可以不必遍历任务控制块链表了。任务控 制块链表和OSTCBPrioTbl[]数组之间的关系如图4.1.2。 图4.1.2任务控制块链表和OSTCBPfioTbI[]数组以及变量OSTCBCur 4.2任务间的同步、互斥与通信(ITC) 嵌入式实时多任务应用是由多个任务、多个中断处理过程以及嵌入式实时操 作系统组成的有机整体。嵌入式实时操作系统为应用提供系统管理、底层支持、 协调任务和中断处理程序等功能。 以下是任务之间的关系: 基于ARM的嵌入式强实时内核设计 ①相互独立仅仅是竞争CPU资源。 这里的“相互独立"是指任务间除了竞争CPU资源,再无其他关联。随后谈 到的几种任务间关系并不影响任务本身的独立性,即它们都是独立运行的单元, 是资源竞争和系统调度的实体。 ②竞争除CPU外的其他资源(互斥)任务必须能对共享资源进行互斥访问。 共享资源是多任务系统中主要关心的问题。在大多数情况下,由些资源在某 一时刻仅能被某一任务使用,并且在使用过程中不能被其他任务中断。这些资源 主要包括特定的外设、共享内存以及CPU。当CPU禁止并发操作时,那些包含 了使用CPU之外的共享资源的代码就不能同时被多个任务调度执行。这样的代码 就称为“临界区"。如果两个任务同时进入同一临界区,将会导致意想不到的错 误。 ③同步协调彼此运行的步调 ④通信彼此间传递数据或信息,以协同完成某项工作。 通信可以是任务与任务之间,也可以是在中断服务程序(ISR)与任务之间。 在嵌入式多任务应用程序中,一项工作的完成往往要通过多个任务或多个任 务与多个中断处理程序(ISR)共同完成。它们之间必须协调动作,互相配合, 甚至需要交换信息,即进行通信。因此,在一个多任务实时操作系统中,可靠、 高效的同步与通信机制是必不可少的。下面对内核提供的各种同步、互斥与通信 机制的功能作简单描述,具体实现见相关参考资料。 1、信号量。信号量用于实现任务与任务之间、任务与中断处理程序之间的同步 与互斥。根据用途,信号量一般分为三种:用于解决互斥问题的互斥信号量、 用于解决同步问题的二值信号量和用于解决资源技术问题的计数信号量。其 中互斥信号量比较特殊,可能会引起优先级反转问题,具体内容见第三章。 2、邮箱。邮箱是用于通过发送或接收放在系统内存中的消息来同步和通信的一 种对象。每个邮箱通过唯一的ID进行标识。邮箱都有一个与之相关的消息队 列用来存储待发送的消息,还有一个等待队列用来接收消息。任务发送消息 (通知某个事件的发生)就是把消息挂载到发送队列。任务接收消息(等待 某个事件的发生)就是将消息队列的第一个消息移走。如果没有消息,任务 将被放入邮箱的等待队列中,进入等待态直到有新的消息被送入邮箱。在通 过邮箱传递消息时,传递的只是消息的指针,消息本身并不进行内容的拷贝。 3、队列。消息队列是通过发送和接收变长消息来进行同步和通信的对象。一个 消息队列有一个与之相联的发送等待队列和一个接收等待队列,同时还设置 了一个消息存储区用来存储待发送的消息。当任务发送消息时,先要将消息 拷贝到消息存储区,如果消息存储区已没有空间,任务将会进入发送等待状 态,直到有足够的空间。在实现时,为了提高任务通信的效率,如果发送消 息时在接收等待队列中有任务,则直接将消息内容拷贝给等待任务,而不再 经过消息队列缓冲区。任务取消息就是将消息从消息存储区拷走,如果没有 消息可取,则进入等待态。消息队列也可用于同步,只需将消息队列缓冲区 的长度置为零。这样,单独发送消息的任务将因为没有缓冲区而进入等待状 态,而单独接收消息的任务也将因为没有消息可取而进入等待状态。只有当 消息的发送和接收都发生了,这两个任务才能得以继续运行,从而达到同步 效果。 中断处理程序和任务必须能够交互。也就是说,这种方式导致使用硬保护的 场合与应用层逻辑发生密切关系,这可能导致系统的硬保护机制被隐性地泛滥使 基于ARM的嵌入式强实时内核设计 用,并破坏系统中断响应能力的稳定性,丧失强实时系统的基础。本文在体系结 构设计时引入了中断分割机制。在这种机制中,中断处理被分为两部分。第一部 分是中断服务程序(ISR),ISR进行一些必要的处理(读取设备端口数据)并且 决定是否需要进一步处理,如果需要则向DTC发送消息。这样可以减少ISR的中 断服务时间,为其它外部事件的中断响应提供了更多的时机;第二部分是中断滞 后服务程序(DISR)主要进行一些比较耗时的操作或内核函数(ITC)的调用, DISR在退出ISR以后的一个安全的时刻执行,当然如果被中断的环境不在内核 临界区DISR会很快被处理。由于,采用了这种体系结构的设计,内核的ITC的 临界区只需要进行软保护。下面给出内核临界区软保护算法: 内核临界区软保护代码(C语言描述) OS_EnterSProtectO. ∥进入软保护吖7 OS_CPU_SR epu..sr, if(DISRRunning!=1){ OS_EnterHProteet0; KernelCritical++: OS ExitHProteet0;} OS_ExitSProteet0 f /擎退出软保护书, OS_CPU_SR cpu_sr;。 if(KernelCritical!=0){ while(dtc—table_start!=dte_table_end){ ! INTEI讯UPT*intr; 眦die; 一 ,dte=dtc_table[dtc_.table_start++]: if(dte—.table..start>=IYrC_TABLE_SIZE)dtc..table_start=O; intr=intr_table Fdtc.vector]: intr->dsr_handler(dte.vector,dtc,data):} } OS_EnterHProteet0; gernelCritieal:o: OS_ExitHProtectO; TASO; ,.任务调度·/ } } 4.3时钟管理 实时内核的时间管理以系统时钟为基础,系统时钟一般定义为整数,提供给 应用程序所有与时间有关的服务。系统时钟是由定时器/计数器产生的输出脉冲 触发中断而产生的。输出脉冲的周期叫做一个tick。实时内核的时钟节拍主要 完成维护系统/日历时间、时间等待处理、软件定时器管理以及任务时间片处理 a噍【蠲】 :苛 o 4.3.1时钟粒度 在每个操作系统内部都有一个计数器,用来作为系统的时钟。每当有时钟中 断的到来,该计数器的值就加一。时钟中断到来的频率,即每个时钟中断的时间 37 基于ARM的嵌入式强实时内核设计 间隔,就是操作系统时钟的最小计时单位,称它为时钟粒度。 时钟粒度的大小,直接决定操作系统时间的精度以及影响到任务能否被及时 响应和调度。因为每个时钟中断可以看作是一个抢占剥夺点。当有时钟中断到来 时,如果有高优先级的任务在等待运行,则当前运行任务被抢占。但在实时系统 中,大粒度的时钟根本不能满足实时应用的需要,而简单地提高时钟频率,从而 占用更多的处理器时间,使得整个系统的有效利用率下降。因此,准确而又具有 足够精度的时钟对于实时系统是必不可少的。 在内核中可以通过采用可配置的多粒度时钟,很好地解决这个矛盾。在系统 中,设置一个定义时钟周期的无符号整型变量,在系统时钟初始化阶段,根据配 置文件中用户设定的时钟周期来设置此变量,从而决定系统时钟中断的频率。这 样,用户可以根据实际应用的需要自行配置系统的时钟粒度,在需要高精度时可 以将中断频率设高点,在追求更高的系统效率时可以将中断频率设低点,既满足 实时需求,又减少不必要的系统开销。 但是,仅仅依靠可配置的时钟粒度是不够的。因为某些实时应用对时钟精度 要求非常高,常常是微秒级、甚至是纳秒级。而如果系统的时钟粒度根据需要也 配置到如此高精度的话,CPU的绝大部分时间都可能在处理时钟中断,从而严重 影响系统正常工作。当然,如果需要更为精确的时钟粒度可以单独编写定时器中 断处理程序,必要时可以将时钟中断提升至FIQ处理,不过这时候代码应该非常 精简,以免给系统的实时性造成影响。 4.3.2软件定时器 嵌入式系统常常需要为外设提供定时控制信号或对外部事件进行计数。因 此,需要多种不同的定时系统来完成某段定时操作功能。为获得所需要的定时, 产生准确而稳定的时间基准通常有两种方法:硬件定时器和软件定时器。前者采 用可编程的定时/计数器或单稳延时电路产生定时或延时,不占用CPU时间,但是 嵌入式处理器内部硬件定时器资源是有限的。后者以硬件定时器为基础,利用硬 件定时器的定时中断来实现,占用CPU时间,但是它的资源多、定时时间更长, 且方便灵活、实现简单、功能强大、应用极为广泛。在实际开发中有效应用软件 定时器,可以大大简化软件复杂性,加快设计进程。为了实现定时功能,内核需 要提供软件定时器管理功能,应用程序可根据需要创建、使用软件定时器。软件 定时器在创建时,由用户提供定时值:当软件定时器的定时值减去计数为0时, 触发定时器服务例程。用户可在此例程中完成自己需要的操作。本文所用的通用 定时器模块就是一种软件定时器。 定时器模块的数据结构定义(C语言描述) typedef strJCt..tar f BOOLEAN TmrEn;序启动或禁止倒计数标志衫 INTI璜J RemainTime;序定时器当前计数值影 I孵l铡瓯artTi孵:序定时器初始值形 INTl6U RepeatCotmt;/*定时器多次触发时重复的次数形 l料16tl Re舰inco嘶t:胁定时器多次触发时剩余的次数衫 void(*handler)(void毒):厣定时器触发的服务例程形 void*UserData;A作为一个指针变量传给被调用的函数衫 struct*Tl掘ptr;/串软件定时器链表指针衫 l删R: 基于ARM的嵌入式强实时内核设计 定时器模块的主要接口函数: 主要接口函数 实现功能 TMRInit0软件定时器初始化函数。 初始化软件定时器控制块的空闲列表。 CreatTMR0till建软件定时器函数。 从软件定时器控制块空闲链表摘取一个控制块, 并按用户提供的参数设置此定时器控制块的数据 结构。 TMRStan()启动软件定时器。 将用户创建的定时器链接到差分时间链,定时器 的倒计数开始。 TMRStop0停止软件定时器 停止用户创建的定时器的倒计时行为但不改变定 时器中变量值 DeJTMR0删除软件定时器。 将分配给用户的软件定时器控制块重新放入空闲 链表。 ResTMR0复位软件定时器。 把定时器的定时值恢复到原来的设定值。 4.3.3时钟中断服务程序 通常来说,实时内核提供以下主要与时间相关的管理:维持相对时间(时间 单位为tick)和日历时间;任务有限等待的计时;定时管理等。这些管理功能 是通过tick处理程序来实现的。定时器发生中断后,执行系统时钟中断服务程 序,中断处理程序中调用tick处理程序,实现系统中和定时相关的操作。tick 处理程序作为实时内核的一部分,与具体的定时器/计数器硬件无关,由系统时 钟中断处理程序调用,使内核具有对不同定时器/计数器硬件的适应性。 由于本文所采用的内核支持中断分割,所以可以在中断滞后程序(DISR)执 行tick处理程序,这样tick处理程对系统的中断响应能力不会产生影响。 为了有效降低时间等待对象的管理开销,本文采用差分时间链的方式管理时 间等待对象。时间等待链用来存放需要延迟处理的对象,产生tick后,需要对 时间等待链中的对象的剩余等待时间值进行处理。在差分时间链中,每个表项所 包含的计时值并非当前时刻到表项激活时刻的绝对计数,而是该表项和先于它的 所有表项的计数值之和。图4.3.3—1所示的差分时间链,在当前时刻A对象需要 等待3个时间单位就应被激活;B对象需要等待5(3+2)个时间单位就应该被激 活;C对象需要等待10(3+2+5)个时间单位就应被激活;D对象需要等待14 (3+2+5+4)个时间单位就应该被激活。在当前时刻如果有一个等待7个时间单 位的对象E需要插入队列中,E对象需要插入到差分链中介与对象B和对象C之 间的位置,如图4.3.3-2所示。 对于差分时间链,系统每接收到一个tick,就修订首对象的时间值。如果链 表对象的时间单位为tick,则每发生一个tick,链首对象的时间就减l;当减 到0时,对链首对象进行处理,并从差分时间链中取下来,下一个对象又成为链 首对象。 图4.3.3-l差分时间链l 4.4内存管理 图4.3.3.2差分时间链2 39 基于ARM的嵌入式强实时内核设计 嵌入式实时系统中内存管理不仅仅是上层应用的基础,同样也是内核模块编 写的基础。不同实时内核所采用的内存管理方式不同,有的简单,有的复杂。实 时内核所采用的内存管理方式与应用领域及硬件环境相关。在强实时应用领域, 内存管理方法就比较简单,甚至不提供内存管理功能。一些实时性要求不高,可 靠性要求比较高,且系统比较复杂的应用在内存管理上就相对复杂些,可能需要 实现对操作系统或是任务的保护。 4.4.1内存管理特性 大多数嵌入式系统的处理器没有MMU,即使系统中含有这些硬件也因为实时 性等原因没采用,因此,内核系统和用户空间之间没有任何保护。系统中只有两 个段,代码段和数据段,这两段数据共享整个物理内存。此时,操作系统不需要 对地址空间和保护模式进行管理。每个任务运行前,必须为它分配足够的连续地 址空间,运行时全部载入。所有任务共享一个内存地址空间,也就是所有的任务 包括内核都在一个单一的地址空间中执行。当程序执行时,不需要进行虚拟地址 到物理地址的转换,每个任务可以存取任何物理地址的内存单元。由于所有任务 和操作系统同处于一个地址空间中,彼此之间没有任何保护,任务的正确执行完 全依赖于程序员编写正确无误的程序。一个任务的错误可能会导致其他任务无法 执行,甚至使整个系统瘫痪。 在嵌入式实时系统中,内存管理机制必须满足以下几个特性啼刀 ●实时性。从实时性的角度出发,要求内存分配过程要尽可能地快。因此,在嵌 入式系统中,不可能采用通用操作系统的一些复杂而完善的内存分配策略,一般 没有段页式的虚存管理机制,而是采用简单、快速的内存分配方案,其分配方案 也因程序对实时性的要求而异。例如,VxWorks系统采用简单的“首次适应,立 即聚合"方法;VRTX中采用多个固定尺寸存储块的binning方案。 ●可靠性。嵌入式系统应用的环境千变万化,在有些特定情况下,对系统的可靠 性要求极高,内存分配的请求必须得到满足,如果分配失败则可能会带来灾难性 的后果。 ●高效性。内存分配要尽可能地减少浪费。不可能为了保证满足所有的内存分配 请求而将内存配置得很大。一方面,嵌入式系统对成本的要求使得内存在其中只 是一种很有限的资源;另一方面,即使不考虑成本的因素,系统硬件环境有限的 空间和有限的板面积决定了可配置的内存容量是很有限的。 4.4.2内存分配方案 ‘ 在一般的嵌入式系统的内存管理中,最基本的内存分配方案有两种——静态 分配和动态分配∞3。一般而言,强实时系统对实时性和可靠性要求极高,不能容 忍一点延时或一次分配失败,就采用静态分配方案,在编译或链接时将程序所需 的内存空间分配好,这种方式的优点是速度快。缺点是: ●不灵活,必须在设计阶段明确所需的内存并做出分配; ●必须预先考虑到所有可能的情况,一旦出现没有考虑到的情况,系统就无法 处理: ●浪费资源,因为内存分配必须按照最坏情况进行最大配置,而实际运行时可 能只使用其中的一小部分; ●在硬件平台不变的情况下,要想增加任务,添加功能不太可能,升级困难。 动态分配是指系统运行时根据需要动态地分配内存。而是否支持动态分配主 要基于两个方面的考虑:首先是实时性和可靠性的要求,其次是成本的要求。对 于实时性和可靠性要求极高的强实时系统,不允许延时或者分配失败,必须采用 基于ARM的嵌入式强实时内核设计 静态内存分配。虽然动态内存分配会导致响应和执行时间不确定、内存碎片等问 题,但是它的实现机制灵活,给程序实现带来极大的方便,有的应用环境中动态 内存分配甚至是必不可少的。比如,嵌入式系统中使用的网络协议栈,在特定的 平台下,为了比较灵活地调整系统的功能,在系统中各个功能之间作出权衡,必 须支持动态内存分配。因此,如何在这种无保护、支持动态内存的模式下,提高 系统的可靠性和安全性,己经成为需要迫切解决的问题。 4.4.3内存管理方案设计 通常操作系统中的内存管理方式算法相当复杂,经常涉及到内存碎片、内存 丢失、执行时间不固定等问题,并不适合在嵌入式系统中使用。 Il C/OS—II的内存管理管理模块将同样大小的内存块组织成内存分区,整 个内存堆由这些分区组成,分区的最大数量事先规定好,并事先准备好足够的内 存区控制块。不同的内存区之间管理的内存块大小没有限制,可以相同也可以不 同。这种方式之所以特别适合嵌入式系统的使用,是因为一个模块使用的内存块 尺寸只有有限的几种。利用这种机制,可以分配和释放固定大小的内存块。这样 一来,分配和释放函数的执行时间也是固定的了。在一个系统中可以有多个内存 分区。这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。 而特定的内存块在释放时必须重新放回它以前所属于的内存分区不会产生内存 碎片。当然,如果删除整个内存区之后再生成新的内存区,则会在内存堆中产生 碎片。其示意图如图4.4.3—1所示。 图4.4.3.1内存管理示意图 II C/oS—II内存管理采用静态方法,而实际应用要考虑到实时性、可靠性、 灵活性、成本等的要求,内存管理方案还需要进一步完善。 1、ll C/oS—II管理的内存区由用户通过全局数组定义,严格来说属于静态内存 分配,要求用户程序实现确定好内存区的使用计划,在内存区创建时同时给出数 组的地址以及两个下标的最大值,这三个值必须与内存区的定义严格相符,否则 就会发生问题。而用户只能在指定的内存区中进行内存块的获取和释放管理。内 存区一旦创建就不能释放,内存区管理的内存块也不能少于两个。虽然嵌入式环 境中内存区生成后需要释放的可能性较小,但是完全不支持在某种程度上限制了 这种内存管理模式的使用。考虑到一些复杂的应用为内存区增加释放和重新分配 功能是必要的。内存区的分配和释放功能主要用于任务可以删除、重新生成的环 境:当然,在简单嵌入式开发环境还不支持模块的动态加载、卸载的情况下,删 除的任务至少还占据着代码空间的资源。为内存区增加释放功能,并且在两个已 经释放的内存区管理的内存是连续的情况下,还应该合并内存区。要合并内存区 就要合并内存区管理头,同时能够合并内存区就应该能够在生成内存分区时分割 4l 基于ARM的嵌入式强实时内核设计 出新的内存区。合并内存区没有限制,但是分割(也就是分配)内存分区应该有 限制,否则容易出现内存分区数量过多而无法管理的问题。因此应该设定一个最 小的内存分区值。图4.4.3-2和4.4.3-3显示了这种内存区管理的初始化和分 配后的布局。 图4.4.3-2初始化后的状态 图4.4.3.3从自由内存区分配内存后的布局 2、Il C/Os-II对内存块进行管理时,当用户程序不再使用一个内存块时,必须 及时地把它释放并放回到相应的内存分区中。这个操作必须由用户给出要释放的 内存块,同时必须给出此内存块属于哪个内存分区,而一旦出现指定错误所引发 的系统错误不可预料。这是因为:内存块被分配使用后不包含任何内存区控制块 的相关信息。因此,可以将内存控制块分为两个部分,第一部分包含所属内存分 区相关地址指针信息,第二部分为分配给用户的内存块。当内存块未被分配时, 第一部分存放下一内存块地址指针:当内存被分配后第一部分存放此内存区控制 块地址指针,这样当此内存块被释放时就无需给出此内存块属于哪一内存区,只 需给出要释放的内存块地址就知道此内存块所属内存分区。 3、u C/0S—II内存控制块结构、内存控制块链表以及自由内存控制块链表指针 都在其接口文件中定义。用户必须间接包含该接口文件才能引用内存区控制块的 数据类型,而以上各项对用户的公开,为系统运行带来潜在威胁。因此,需要进 行数据封装,定义ADT,在接口头文件中仅给出内存区控制块的ADT数据类型的 声明,以及提供给用户户程序的函数声明,而将内存区控制块的结构(EMCB)等 全局变量再具体接口实现文件中定义,并以static限定,使这些全局变量为用 户程序不可见。避免用户程序直接访问这些变量的可能。 接口数据封装(C语言描述) typedcfstruet EMCB EMCB;//ADT数据类型声明 INT32U MemCreate(INT32U nbil‘s。INT32U blksize,PMCB¨ppMem); INT32U MemRemove(PMCB事pMem); INTB2U MemGet(PMCB*proem,void¨pbl鼢 42 基于ARM的嵌入式强实时内核设计 INT32U MemPut(void*pblk); void Mem Init_List(void); INT32U MemQuery(PMCB·pmem,OS—MEM—DATA幸卑pdata); 具体接口实现(C语言描述) finclude“mem.h’’ klefine MinParSize 256 //最小内存分区值 ¥define HEAPEND 0x33fr0000//壹篷结尾,取决于硬件 §xtem char lmage¥¥RW¥¥Limit[]; y内存区控制块结构定义 ;臼僦EMCB{ //堆开始,由链接器提供 void *pHead; void *pEnd; , EMCB奉pNext; EMCB奉pPrev; 烈T32U nBlkSize; Dn32U nBlks: INT32U nFree; INT32U,r口arSize; void *pFreeList; y内存控制块第一部分的数据类型 :ypedef union MemBlock{ 。 , PMCB簟pmcb; void幸pNextBlock; , }MemBloek; y全局变量定义用static前缀使客户程序不可见 aatic PMCB g_.pMemTbi[NMemPars]; aatic PMCB壤g pldleParList; ,;tatic PMCB*g_pFreeParList; //用于内存分区管理器的存储 ,/空闲内存控制块链表头 /f西-1分配内存控制块链表头 y用户接口函数实现。。。 4、对各种内存指针参数的合法性判断,除了检查指针是否为空外,还应该根据 具体嵌入式环境中产品配置的RAM内存堆区的起始和结束位置判断指针的合法 性。 5、如果对于某些内存的占用在代码运行期间的大部分时间里是需要占用的,则 用全局变量的方式表达这种内存占用关系,而将系统运行时变化较大的部分留给 动态分配部分。 43 基于ARM的嵌入式强实时内核设计 第五章内核其它设计与性能分析 5.1自保护软件F I FO FIFO是一种异步通信的机制,适合用来传递异步信息和数据。如果是同步 控制类信息,则不适合使用FIFO方式进行通信。FIFO缓冲区不仅具有缓冲系统 突发数据、改善系统算法设计的功能,还有一个显著的优点,即在精心编写的 FIFO实现中,如果只有一个任务或ISR写入,另外只有一个任务或ISR读出的 情况下,可以无需任何保护。达成该特性的原理来源于单指令执行的不可中断特 征,也就是说,可通过充分发挥单指令执行自身具备的保护能力达到软件FIFO 的自我保护能力。 空间 r l。h A ● FIF0 。 间尾 ’ 口1*●—————————▲ 图5.1 FIFO原理 如图5.1所示,FIFO的工作原理就是数据写入方在“写入位置指针’’处写入数 据,之后修改“写入位置指针",不必触动“读出位置指针"。同时数据读出方在 “读出位置指针”处读出数据,之后修改“读出位置指针",不必触动“写入位 置指针"。 在编写代码时只要保证读“读出位置指针”操作只进行一次,并且是在一个 指令中完成,就不用担心读到的“读出位置指针"过时,即便是过时的“读出位 置指针’’,并不影响在“写入位置指针”写入数据的算法。写入方读“读出位置 指针"是为了用来和“写入位置指针"比较,以便判断当前缓冲区是否已满。如 果读到“读出位置指针"判断缓冲区已满,则写入方返回缓冲区已满错误。即便 写入方读取“读出位置指针”后,“读出位置指针”因为读出方的操作立即发生 变化,消耗掉一个缓冲区数据进而腾出一个缓冲区空间,也不影响该FIFO缓冲 区的逻辑正确性。 正是因为上述讨论中提到的这些条件,对于ARM这个条件很容易保证。因为 指针的长度与处理器的字长相同,且ARM处理器内存访问时要求数据指针字对 齐,不对齐的指针是非法的。正确的FIFO功能模块应该用汇编代码来编写以保 证其正确性。或者至少用C代码编写完成后,要检查编译出的汇编代码是否满足 这些条件。 FIFO这一特性有很多好的应用,特别是改善系统性能方面。通过使用FIFO, 在ISR中可以直接与应用交流数据。通常的做法是在ISR中进入设备保护段后用 FIFO传递数据,而不通过DTC通知DISR或应用,然后在缓冲区达到一定程度之 后,才通过DTC通知DISR或应用。这样能够最大化地优化系统性能。虽然这种 方式对系统整体的中断响应能力没有改善(也没有损害),但是对单个设备的中 断响应能力有较大改善。 5.2流控 嵌入式设备中经常和通信协议打交道,处理流控经常是必不可少的,即使是 基于ARM的嵌入式强实时内核设计 系统平台计算能力很高,不进行流控处理也是非常危险的。为了节约成本,对于 产品设计方案的主芯片,通常选择处理能力富裕量并不算很大的芯片。流控的时 机是一个重要因素。如果设备芯片有FIFO,则通常也会有流控处理辅助功能, 以便在FIFO半满或其他情况下控制对方发送数据,并通知主芯片。此处讨论的 是没有设备帮助由主芯片自行处理流控的问题。 这里借助图5.2来讨论流控时机,此时,采用的是合理的半嵌套方案。可以 看出在进入设备保护之后和设备保护退出前做设备的阻塞/开放是不正确的,特 别是对于嵌套式的工作方式,这样很可能存在被其他设备的中断延迟导致阻塞的 时机过晚的问题。通常的阻塞、开放动作都很简单,经常是一条指令完成,因此 应该尽早阻塞,延后开放。这对响应能力影响的代价很低。当然也不必在每个 ISR进入时控制流控,而应该在FIFO缓冲区满到一定程度之后才打开流控,并 且在缓冲区低到一定程度之后取消流控。 l中断进入 ISR f半拂查肯肯、 中断退出 毽醚懑潮豳翻圈E目强目舞强朦豳酸疆£墓|一—o ’ _ ’ Ii j≯_i11;|::冀 i 设备像护j鬈一!一誊…0, 一 一 阻塞的正确时机 阻塞/开放的错误时机 开放的正确时机 图5.2流控处理时机选择 5.3临界区与保护 一旦系统中有了独立的多任务逻辑实体之后,相互间公共部分的保护就成为 关键部分,即便是没有任务环境,ISR和应用也是两个不同的逻辑实体,他们对 公共部分的访问同样需要保护的,不仅公共部分需要保护,各逻辑实体中访问公 共部分的代码段也需要保护。这种代码段就称为“临界区”。 在代码中识别临界区的最直接办法就是察看代码中是否访问了可写的全局 变量。大部分访问可写全局变量的代码段时需要保护的临界区。在嵌入式内核中, 常见的全局变量包括描述任务的数据结构、描述ITC的数据结构、内存堆数据结 构和其他可写全局变量。此外还包括设备资源,因为设备也是映射到内存空间的, 从软件角度观察,同样是全局变量。 从保护的角度考虑,系统所需要提供的保护有3种: 1、内核ITC机制的临界区保护称为软保护。由于中断必须能和任务交互,这就 使中断和任务的ITC部分是共享的,因此需要对内核ITC的临界区进行保护。 u C/0S—II对这部分的保护直接采用硬保护,这会导致硬保护的泛滥使用,本 文在引入中断分割机制后,对这部分保护使用软保护替代。这也是系统的强实时 性能保障的基础。 2、和中断相关的系统保护称为硬保护。主要保护和中断相关的全局变量,采用 关闭中断的方法实现。关闭中断对系统的中断响应速度是有损害的,应该尽量避 免使用。正确的嵌入式实时系统设计应该把使用硬保护的代码尽量封装在内核和 设备驱动中,上层应用程序的编写不应该出现调用硬保护的函数代码。 3、和设备环境相关的系统保护称为设备保护。由于采用关闭单个设备中断的方 法实现,所以不会干扰其他设备,适合设备驱动内部ISR与DSR之间的临界区保 护。当然有些设备因为涉及到时序问题,必要时要采用硬保护。 另外,当没有中断产生时,任务环境中的代码按照调度规则交替运行,只要 45 基于ARM的嵌入式强实时内核设计 保护任务之间的全局变量。由于在多任务并发执行的过程中要涉及到任务之间的 同步和通信,因为不涉及到设备,所以完全可以通过内核ITC(如信号量)完成。 按照这样的处理方式,本文所设计的体系结构中保留下的需要关闭中断位置 仅存极少几个,并且这些位置是非连续的,因此,只需要考虑最大影响位置对系 统的影响。 表5.3-1和5.3-2给出了本文所设计的体系结构和u C/0S—II内核关中断 的位置,以及对系统所带来的影响。 关闭中断位置 系统影响 中断入口处理 中断退出处理 需要保护约40行汇编代码,10行C代码 需要保护约20行汇编代码,5行C代码 内核临界区(软保护)进入 内核临界区(软保护)退出 需要保护2行C代码 需要保护10行汇编代码,2行C代码 EVS环境切换 DTC信息发送 任务切换 需要保护约30行汇编代码,最坏的情况是每个中断触发一次,如 果中断中ISR不向DTC发送消息,则无影响。 需要保护约4行C代码,约0.04u S最坏的情况是:每个中断触发 一次,如果中断中ISR不发送DTC消息,则无影响 需要保护约20行汇编代码 表5.3.1本文内核关中断位置描述表 关闭中断位置 系统影响 内核函数(部分内核函数) 中断入口处理 OSSched0;OSSchextLock();OSSchcdUnlock();OSQCmud); OSTaskDelReq();OSTicldSRO:O¥SemAccept();0SSe=Create(): OSSemDelO; OSSe=Ouery()OSSamPend(); OSScmPost0; 00sS帅MbooxxPAocscteopptt0O; ;0OSSgMbbooxxCPcrneda0t;e OS0QPcl ndOO=S龇gbocxeDpetlO; 0: OSQcreate();OSQDel(),OSQFlushO;OSQPostO:OSQQucryO; OSOPostFront 0·; OSMemQueryO; OSMemGet(); 0SgutexAccept():0Si4utexCreate(); .OS]4utexDelO; OSMutexPend();0SgutexPost0=0SMutexQuerY0t 这里需要最长的硬保护时间是OSQQuery0 需要保护约30行汇编代码,lO行C代码 中断退出处理 任务切换 如果需要中断级任务切换需要保护约lO行汇编代码,8行C代码 需要保护约20行汇编代码 用户调用 不确定。硬保护机制开放给用户和用户开发自行调用内核ITC导 致硬保护机制隐性泛滥使用,无法估算。 表5.3-2 p C/0S—II关中断位置描述表 以上统计的时间的方法是通过将C语言程序编译为汇编代码,然后根据 ARM920T每条指令的执行周期和处理器的时钟频率最后计算出的运行时间。通过 关中断位置描述表5.2.2-1和5.2.2—2可以看出,本文内核最长关中断时间是确 定的,而u C/OS—II的内核最长关中断时间实际上是不确定的。 5.4实时性能测试 5.4.1测试指标 实时内核在实时系统中起着重要作用,其性能的好坏将直接影响到整个系统 基于ARM的嵌入式强实时内核设计 的性能。嵌入式实时内核的时间性能指标主要包括:中断延迟时间、中断响应时 间、中断恢复时间、内核最大关中断时间、任务上下文切换时间、任务响应时间、 系统调用和执行时间。在上述几项中,中断响应时间和任务上下文切换时间是评 价内核实时性能最重要的两个技术指标。 ①中断响应时间 中断响应时间是指从中断发生到系统获知中断,并且开始执行中断服务程序 所需要的最大滞后时间。 在Il C/0S—II原书中,中断响应的估算公式放在和中断相关的概念中,回 避了临界区保护机制对中断的干扰,这是不严格的。并且在Il C/os—II中大量 存在开/关中断的代码,不对临界区保护进行考虑是不妥当的。应该把硬保护机 制限制在最小的范围内,避免系统其他地方使用硬保护,这样的估算才有意义。 u C/os—II原书中的公式如下: { 中断响应时间=硬件中断延迟+保存CPU内部寄存器延迟+内核进入中断服务函数的执行时间 } 在ISR中,仅保存CPU寄存器其实是不够的,还涉及到保存任务、准备中断 嵌套环境等。准确地描述应该称为“准备ISR运行环境时间"而第三个时间是最 模糊的。由于在u C/0S—II中对硬保护的使用不是很有规则,导致这个时间很 难估算,硬保护导致中断响应延时是必须考虑的。因此,这个时间值只有在严格 规范化对硬保护设计后才可以得到真正的值。更清晰的系统在最差情况下中断响 应时间的计算公式如下: { 中断响应时间=硬件中断延迟+准备ISR环境时间+内核中最长硬保护时间 } 以上公式中,由于本文的体系结构设计使硬保护相关代码都已在内核中固定下 来,应用层的逻辑不再需要借助硬保护来完成,所以内核中最长硬保护时间的值 可根据产品代码实际情况进行估算、测试。 ②任务上下文切换时间 在多任务系统中,任务上下文切换是指CPU的控制权由运行任务转移到另外 一个就绪任务时所使用的时间,当前运行的任务转为就绪(或者等待、删除)的 状态,另一个被选定的就绪任务成为当前运行的任务。任务上下文切换时间包括 保存当前运行任务上下文的时间、选择下一个任务的调度时间以及将要运行任务 的上下文恢复时间,其中保存和恢复上下文的时间主要取决于任务上下文的定义 和处理器的速度。不同种类的处理器,任务上下文的定义不同。 任务切换是在实时系统频繁发生的动作,其时间的快慢和可预测性直接影响 到整个实时系统的性能。除开硬件的因素,任务上下文切换的时间与调度的过程 有关。强实时内核要求调度过程所花费的时间是确定的,即不能随系统中就绪任 务的数目而变化。这与具体实现调度算法所采用的数据结构有关。如果采用任务 队列的方式进行管理,调度程序所花的时间与任务数量相关,具有不确定性,为 提高实时内核的确定性,本文采用优先级位图的就绪任务处理算法。在调度算法 方面仅花费了很小的代价实现了64个任务扩展到256个任务,同时保证了算法 的常数时间切换任务。在访问控制协议方面,以优先级天花板协议为依据利用互 斥信号量避免了优先级反转和死锁现象的发生。 5.4.2测试平台 47 基于ARM的嵌入式强实时内核设计 本文测试使用的硬件平台为2410开发板,其中处理器采用Samsung公司的 S3C2410A。¥3C2410A是一款基于ARM920T内核的16/32位RISC嵌入式处理器, 系统主频是202.8 MHz。 这里只用到定时器0。PCLK=FCLK/4=202.8 MHz/4=50.7 MHz,预分频 值设置为0,除法器设为1/4,所以最小分频为f=12.5 MHz。定时器0初始值 TCNTB0设为60000。 另外在测试的时侯需要注意:因为定时器是循环计数的,即从初始值自减到 O,然后恢复初始值,继续自减。所以停止计时时,定时器可能经过了两次或多次 循环。设计程序时要注意这一点。在本次实验中,循环最大间隔为60000/12.5 =4800Il s,远大于一次任务切换时间或中断响应时间,所以定时器不会经过多次 循环。 5.4.3测试原理 。 ①对于中断响应时间可以分为两部分测试 测试中断延迟时间。给定时器一个初始值,建立一个任务和定时器中断服务 函数,在任务中开启定时器;当定时器自减0时,进入中断服务程序,在该中断服 务程序中停止计时,获取定时器的当前计数值,计算定时器初始值与当前计数值 得差值al,则中断延迟时间=al/f。 测试内核最大关中断时间。在系统调用关中断函数时开启定时器,退出关中断 函数后停止计时,获取当前定时器计数值,计算定时器初始值与当前计数值得差 值a2则内核最大关中断时间=a2/f。 ②对于任务之间的切换时间,可以通过两次测试间接得出。 第一次测试称为“交替悬挂/恢复任务",如图5.4.3—1所示。设计为用一个 低优先级的任务来恢复一个被悬挂的高优先级任务,然后这个高优先级的任务又 立即使自己悬挂。用一个程序周期中获得的当前定时器计数值,计算定时器初始 值与当前计数值得差值b1就可以得到交替悬挂/恢复任务的时间。包括两次任务 切换时间,以及任务悬挂恢复各一次的时间。 TaskA(10wer pri嘶忉 while(1) { 定时器计时开始 resume m强kB 定时器停止 ’ 图5.4.3.I交替悬挂/恢复任务时间测试 第二次测试称为“悬挂/恢复任务时间测试”如图,5.4.3—2所示。设计为用 一个高优先级的任务悬挂和恢复一个低优先级的任务。用一个程序周期中获得的 定时器当前计数值,计算定时器初始值与当前计数值得差值b2就可以得到一次 任务悬挂和一次任务恢复的时间,不包括任务切换的时间。 基于ARM的嵌入式强实时内核设计 图5.4.3-2悬挂/恢复任务时间测试 ③计算任务上下文切换时间:任务上下文切换时间=(bl—b2)/f/2 5.4.4测试结果 通过测试内核最大关中断时间就是中断延时时间0.43 u S。 中断响应时间=2半0.43=0.86 p S 任务上下文切换时间=(46—19)/12.5/2=1.1 u S 通过测试结果,本文所设计的内核结构与u C/0S—II相比有更好的实时性能。 更小的内核存储开销。 49 基于ARM的嵌入式强实时内核设计 总结 ,l梦 ;日 随着国内工业化、数字化的步伐加快,嵌入式开发在IT行业中的重要性越 来越显著。嵌入式开发领域对产品的功能性、稳定性、实时性等方面的要求也越 来越高。采用以嵌入式实时操作系统作为开发平台,以高性能的嵌入式处理器为 工业控制等领域的主控制器可以有效地提高系统的可靠性、实时性、和软件编程 的灵活性。在嵌入式处理器方面:ARM构架的处理器具有处理速度快、低功耗、 低成本,为嵌入式实时系统的设计和应用提供了可靠稳定的硬件结构。而在嵌入 式操作系统方面:适合国内发展方向的解决方案以及系统基础结构方面并不理 想。首先,国外成熟的嵌入式实时操作系统大都成本高、结构复杂,不适合小型 应用;其次,因大部分实时操作系统不公开源码,使开发的产品存在安全隐患。 而类似u C/OS—II的小型强实时嵌入式操作系统内核具虽然有低成本、易控制、 小规模、高性能等特性,但这类系统的基础较为薄弱,面临产品化和商业化还有 一定的距离。 由于嵌入式系统应用的环境不同,内核所采取的设计方案也不同,这样做的 目的是为了提供一个基础牢固,值得信赖的基本平台。这样的一个内核体系结构, 应该具有高效、简洁、易扩展、易剪裁的特点。 本文针对这种情况,结合现有的操作系统内核理论及嵌入式强实时系统的特 殊需求,特别是对u C/OS—II的研究分析基础上,面向强实时应用,设计、构 造了一种适合在32位ARM处理器环境下使用的内核。本文工作总结如下: l、操作系统的体系结构是确保系统的实时性、可靠性、灵活性、可移植性 和可扩展性的关键。本文通过对几种嵌入式操作系统的内核结构的分析比较,考 虑强实时应用的需求,利用分层结构和模块化结构的特点,在单内存空间借鉴微 内核的结构特点;各层中采用功能相对独立的模块,在最底层采用微核的原理只 提供一些最基本的功能模块,如任务管理、中断管理、内存管理、时钟管理、任 务间通信等。由于充分利用了分层结构和模块化结构的特点,这样的特征非常适 合嵌入式环境中高效、紧凑、简洁、易扩展、易剪裁等要求。 2、嵌入式实时系统是一个能够在指定或者确定的时间内对外部事件出响应 的系统,其重要的特性是实时响应性。嵌入式实时系统对外部事件的响应一般都 是通过中断来处理的,采用何种中断处理方式将直接影响到系统的实时性能。本 文结合ARM处理器异常中断的处理方式,利用FIFO的自保护特性,对单个设备 的中断响应能力有较大改善;同时通过中断嵌套机制、不可屏蔽中断机制、中断 分段处理机制的引入,建立统~的中断入口,保证了系统实时响应能力的快速和 稳定。 3、对于嵌入式实时系统,除了要满足应用的功能需求以外,更重要的是满 足应用提出的实时性要求。因此,选择合适的调度算法和资源访问控制协议,才 能保证系统行为的可预测性。通过比较、分析几种嵌入式操作系统常用的调度算 法对系统实时性的影响,以及优先级驱动的调度方式在处理共享资源访问时所带 来的问题(如死锁、优先级反转)的解决办法。在调度策略方面,由于调度本身 需要一定的系统开销,为提高实时内核的确定性,本文在增加支持优先级数量、 减少优先级判定表占用存储空间两个方面讨论了基于优先级位图的调度算法。在 共享资源访问控制方面,以优先级天花板协议为依据,采用互斥信号量,降解了 优先级反转问题,避免了死锁的发生。 4、为了保障系统的强实时性能,本文还对内核的时钟管理、内存管理等方面 基于ARM的嵌入式强实时内核设计 进行了设计。在时钟管理方面,由于中断分割机制的引入,时钟节拍服务对中断 响应能力没有影响;同时,在时钟节拍服务中采用差分时间链管理需要延迟处理 的任务,有效降低时间等待对象的管理开销。由于时钟粒度的大小,直接决定操 作系统时间的精度以及影响到任务能否被及时响应和调度,为了在不同的实时应 用中既满足实时需求,又减少必要的系统开销,本文采用了多时钟粒度配置方式。 在内存管理方面,由于实时性的考虑,本文采用的是单一内核空间,没有使能 MMU。通过对内存管理特性和内存分配方案的分析,在对静态内存分配完善的基 础上给出了动态内存分配方案,以适合更广泛的应用。 在研究中,虽然本人抱着求知、务实、创新的态度,但是碍于本人的能力、 知识、工具等各方面的局限,不可避免的存在一些研究上的不足和问题。因此, 在下一步的工作中,还可以在以下方面继续深入研究: l、通过硬件提供的MMU提高系统的安全、可靠性,同时为第三方软件的移植提 供方便。 目前,大多数处理器都集成了MMU。这种在处理器内部实现MMU的方式,能 够大幅度降低那些通过在处理器外部添加ⅢU模块的处理方式所存在的内存访 问延迟。MMU现在大都设计作为处理器内部指令执行流水线的一部分,使得使用 MMU不会降低系统性能;相反,如果系统软件不使用MMU,还会导致处理器的性 能下降。在某些情况下,不使能MMU,跳过处理器的相应流水线,可能导致处理 器的性能降低。 早期的嵌入式操作系统大都没有采用MMU,一方面是出于对硬件成本的考 虑,令一方面是出于实时性的考虑。嵌入式系统发展到现在,硬件成本越来越低, 姗U所带来的成本因素基本上可以不用考虑。另外原来嵌入式处理器的速度较 慢,采用MMU通常会造成对时间性能的不满足,而现在处理器的速度也越来越快, 并且采用新技术后,已经将MMU所带来的时间代价降到比较低的程度。因此,嵌 入式处理器具有MMU的功能已经是一种必然趋势。 由于采用MMU后对应用的运行模式甚至开发模式都会有一些影响,所以大量 嵌入式操作系统都没有使用MMU。但是,对于安全性、可靠性要求高的应用来讲, 如果不采用MMU,则几乎不可能达到要求。如果没有MMU的功能,将无法防止程 序的无意破坏,无法截获各种非法访问异常,当然更不可能防止应用程序的蓄意 破坏了。采用MMU后,能够在应用开发阶段便于发现更多的潜在问题,并且也便 于问题的定位。因为不采用MMU时,内存模式一般都是平面模式,也就是应用可 以任意访问任何内存区域、任何硬件设备,这样当程序中出现非法访问时,开发 人员是无法知晓的,即使发现了问题,也非常难以定位。 2、随着实时系统在各领域的广泛应用,任务调度技术与资源访问控制协议在实 时系统中扮演的角色越来越关键。 与抢占式和非抢占式调度算法相比,抢占阈值调度算法能提高任务集合的可 调度性。与优先级调度方法相比,采用运行前调度方法具有容易满足实现约束、 可以采用优化算法的优点,而优先级调度算法不能有效处理复杂约束、系统开销 大、处理器资源利用率低、系统运行特性难以分析和预测等,但是运行前调度方 法处理异步进程的能力不如优先级调度方法。当然,在异步进程满足某些条件的 时候,可以综合两种调度方法并采用较小的运行时间调度器进行调度。同时也可 以尝试各种度算法与资源访问控制协议在本系统的应用,以提供更好的性能和更 广泛的应用。 基于ARM的嵌入式强实时内核设计 参考文献 【l】C.L.Liu,J.W.Layland.Scheduling Algorithms for Multiprogramming in a Hard Real-Time Environment.JACM.1 973.20(1)46—6 1 P [2】Peter Press.2003 C.Dibble.Real-time Java Platform Programming.Beijing:China Machine 【3】L.George,N.Rivierre,and M.Spuri.Preemptive and non-preemptive real-time uni—processorscheduling.Technical Report No 2966,INRIA,France,sep 1 996 【4】 B.Andersson,S.Baruah,and J.Jonsson.Static-pdofity scheduling on multi processors.1nProceedings of the IEEE Real-Time Systems Symposium,pages 1 93—202,Dec 2001 【5】B.Andersson and J.Jonsson.Some insights on fixed-pdority preemptive non-partitioned multiprocessor scheduling. In Proceedings of the IEEE Real-Time Systems Symposium,Work-in-Progress Session,pages 53-56,Nov 2000 【6】J.Stankovic.VEST:a toolset for constructing and analyzing component based operating systems for embedded and real-time systems.In Proceedings of the Embedded Software,First Intemational Workshop(EMSOFT 200 1),Computer Science,pages 390-402,Tahoe City, CA,volume 22 1 1 of Lecture Notes in USA,October 200 1.Springer-Verlag 【7】Sun Microsystems, Inc.Enterprise JavaBeans Technology. http://java.stm.com/products/ejb/ 【8】 Microsoft Corporation.The Distributed Component Object Model(DOOM). http://www.microsoit.com/com/techlDCOM.asp 【9】Object Management Group.CORBA Component Model Version 3.0.June 2002 【10】TOMIYAMA H,CH IKADA S,HONDA S.An RTOS based Approach to Design and Validation of Embedded System[A】.IEEE International Symposium on VLSI Design, Automation and Test【C】.2005.1 85-1 87. 【ll】HAOBOY,GERSTLAUER A,GAJSKID.RTOS Scheduling inTransaction Level ModeIs 【A】.IEEE International Conference onHareware/Software Codesign and System Synthesis【C】. 2003.31.36. 【12】L.George,N.Rivierre,and M.Spuri.Preemptive and non·preemptive real—time uni-processor scheduling.Technical Report No 2966,INRIA,France,sep 1 996 【l 3】C.L.Liu and J.w.real-time environment.Layland.Scheduling algorithms for multiprogramming in a hard Journal ofthe ACM,20(1):46-61,Jan 1973 【14】J.Lehoczky,L.Sha,and Y.Ding.The rate monotonic scheduling characterization and average Systems Symposium,1 989 Ca,Se behavior.In Proceedings of the algorithm:exact IEEE Real Tune 【15】J.Y-T Leung and J.Whitehead.On the complexity of fixed·priority scheduling of periodic, real—time tasks.Performance Evaluation,2:237—250,1982 【16】M.Joseph and P Pandya.Finding response times in a real-time system.The Computer Journal,29(5):390-395,1 986. [1 7】N.C.Audsley.Deadline monotonic scheduling.Technical Report YCS 146,Department of Computer Science,University ofYork,Oct 1 990 [1 8】W Lamie.Preemption-threshold.Express Logic,lnc.White Paper.Available at http://www.expresslogic.com/wppreemption.html,1 997 【19】Y.Wang,M.Saksena.Scheduling fixed·priority tasks with preemption threshold.In:Gakkai 基于ARM的嵌入式强实时内核设计 JS,ed.Proc.of the 6th Int’l Con#on Real—Time Compming Systems and Application.Los Alamitos:IEEE Computer Society,1 999.328一,335 【20】Manas Saksena and Yun Wang.Scalable real-time system design using preemption threshold. In Proceedings of the Real Time Systems Symposium,December 2000 【2 1】OSEK Group.OSEKIVDX Operating System Specification 2.2 available at http://www.osek-vdx.org,200 1 【22】EKIKA:Embedded Real time Kemel Architecture.http://erika.sssup.it/ [23]L.Sha,R.Rajkumar,and J.P Lehoczky.Priority inhedtance protocols:an approach to mal-time synchronization.IEEE Transactions on Computers,39(9):1175一1185,Sep 1990 【24】J.B.Goodenough and L.Sha.The priority ceiling protocol:A method for minimizing the blocking of hiigh priority ada tasks. ACM SlGAda Ada Letters(Special edition:International Workshop on Real-Time Ada Issues),VIII(7):20—3 1,Jun 1 988 [25】¥3C2410A一200MHz and 266MHz 32一bit RISC microprocessoruser's manual[M].Samsung, 2004. 【26】SD-memory card specifications/partl physical layer specificationversion 1.01[M].SD Group, 2001. 【27】【美]Qing Li(著)Caroline Yao(助编)王安生(译).嵌入式系统的实时概念Real-Time Concepts for EMbedded Systems北京航空航天大学出版社2004.ISBN%81077.380.7 【28】【美]Mim Sarnek Ph.D.(著)敬万钧陈丽蓉(译)嵌入式系统的微模块化程序设计—实 时状态图C,c++实现Partical Statecharts in C/C++Quantum Programming for Embedded Systems.北京航空航天大学出版社2004.ISBN 7-81077-415-8 [29】胡泽明,岳春生.嵌入式系统开发要素的选择分析.单片机与嵌入式系统应用,2003, (32):5-8. 【30】夏玮玮,沈连丰.嵌入式系统关键技术分析与开发应用.单片机与嵌入式系统应用,2003, (26):5-9. 【27]赵良,叶俊民,罗景,陈利.操作系统体系结构风格的比较研究【J】.计算机应用研究, 2005,第5期:50.52. 【28]罗蕾.嵌入式实时操作系统及应用【M】.北京:北京航空航天大学出版社,2005. [29】王春铭,刘振华,郭去飞.实时操作系统中应用软件设计的任务划分.计算机工 程.2000.26(7):1 9-93 【30]何小庆.嵌入式实时操作系统的现状和未来.单片机与嵌入式系统应用,2001,(3):5--9 【31】季筱隆.基于Linux硬实时化的嵌入式系统研究:【武汉大学硕士论文】.武汉:武汉大学, 2003. 【32]黄燕平.1a COS.II ARM移植要点详解.北京航空航天大学出版社.2005 【33]杜春雷.ARM体系结构与编程.北京:清华大学出版社,2003 ISBN7.302.06244-2 [34】Jeanj.Labrosse(著)邵贝贝(译).嵌入式实时操作系统11 COS—II(第二版)【M】.北京: 北京航空航天大学出版社,2003 【35】雷红卫,桑楠,熊光泽.嵌入式实时系统中断管理技术研究【J】.单片机与嵌入式系统应 用,2004,5:16-19 【36】赵良,叶俊民,罗景,陈利.操作系统体系结构风格的比较研究【J】.计算机应用研究, 2005,第5期:50.52 【37】卢春鹏一种嵌入式系统的内存分配方案【【J】.单片机及嵌入式系统应用,2002, 3(12):12—16. 【38)曾非一,桑楠,熊光泽,嵌入式系统内存管理方案研究,单片机与嵌入式系统应用, 53 基于ARM的嵌入式强实时内核设计 2005No.1 [39】叶庆云,刘奇.基于ARM的操作系统中断堆栈分析及实现【J】.武汉:武汉理工大学学报, 2004,260). 【40]邓剑,杨晓非,廖俊卿.FAT文件系统原理与实现【J】.计算机与数字工程,2005,9: 105—108. [4 l】Bo Zhou,Weidong Qiu,Chenlian Peng.An operating system framework for reconfigurable systems.Computer and Information.Technology,2005.CIT 2005.The Fifth International Confefence on 2 1·23 Sept.2005 Page(s):78 1——787 【42】Bo Zhou,Weidong QiuYan Chen,Chenglian Peng.SHUM—uCOS:A RTOS using multi-task model to reduce migration cost between SW/HW tasks.Computer Supported Cooperative Work in Design,2005.Proceedings of the Ninth International Conference on Volume 2,24-26 May 2005 Page(s):984‘__‘989 【43】T.E Baker.Stack-based scheduling of real-time processes.Journal of Real-TimeSystems,3, 1991 基于ARM的嵌入式强实时内核设计 致谢 至此论文完成之际,我要向我的导师刘晋教授致以最衷心的感谢。他严谨的 治学态度和渊博的学识给我留下了深刻的印象。是他不断的鼓励与亲切的指导给 了我信心,我才能去全身心地投入并顺利完成了论文的写作,并在此过程中受益 非浅。 我也十分感谢李惠明、刘卓同学,他们在我的学习期间热情地提供了许多有 益的帮助,同时也感谢给予我很多培养与帮助的计算机学院的各位老师。 当然,我也感谢我的家人、朋友以及我工作单位的领导、同事对我的支持。 作者:谭强 2008年4月1日 基于ARM的嵌入式强实时内核设计 研究生在读期间发表论文 Il C/0S—II ARM移植中断处理研究辽宁行政学院学报2007.8 57 基于ARM的嵌入式强实时内核设计 作者: 学位授予单位: 谭强 辽宁师范大学 相似文献(10条) 1.学位论文 彭哲 基于ARM-Linux的嵌入式Scilab-EMB计算平台设计研究与实现 2008 嵌入式系统在众多工业领域扮演着越来越重要的角色,但是因嵌入式系统的资源受限缘故,导致在嵌入式系统上很难实现复杂计算算法。此外,当 前嵌入式系统设计阶段和实现阶段的分离现状,致使嵌入式系统开发耗时且昂贵。为解决这些问题,本书提出了一种低成本、可重复使用且可重构的嵌 入式系统设计与实现集成开发环境。为了减少成本,该集成环境全部是采用自由和开放源代码软件,如Linux操作系统和Scilab计算平台等。 本文主要包括以下内容: 1、构建嵌入式Linux开发环境及移植相关软件包到嵌入式ARM平台,首先详细的描述了如何使用Buildroot工具包制作交叉编译器,并描述Minicom、 TFTP和NFS等嵌入式开发相关工具,最后详细的描述了如何移植嵌入式图形用户界面TinyX和嵌入式窗口管理器JWM。 2、构建Scilab-EMB嵌入式计算平台,首先介绍了数值计算软件Scilab,然后详细的描述了如何在ARM系统上实现Scilab-EMB嵌入式计算平台。 3、开发Scilab数据采集工具包,实现Scilab与底层设备通讯,该工具包PC版和ARM版均支持串口和以太网接口,且均支持Modbus现场总线。PC版额 外支持OPC协议。 4、基于Scilab构建虚拟控制实验室,验证该平台的可行性及性能。 本文创新点: 1、国内外率先提出了一种新的以Scilab为核心的嵌入式计算平台方案,并在国内外首次实现了Scilab到ARM平台的移植; 2、开发了Scilab-DAQ数据采集工具包,有效的实现了Scilab与底层设备的通讯。 通过虚拟实验室的建立,验证了该嵌入式控制平台能够胜任多种复杂算法。 该嵌入式计算平台解决方案和Scilab-DAQ数据采集工具包已经受到国内外同行的关注,并被多家科研机构、学校和公司所采纳和使用。 2.期刊论文 刘银水.肖正宇.孙伟.Liu Yinshui.Xiao Zhengyu.Sun Wei 基于ARM-Linux的嵌入式WEB服务器 -单片 机与嵌入式系统应用2007,""(6) 针对目前现场设备远程监控的需要,在分析嵌入式WEB服务器原理的基础上,讨论并提出一种实现远程设备监控的方法,设计出一种基于"ARM+ARMLinux"操作系统的嵌入式WEB服务器系统,给出其软硬件设计和一些关键的实现细节.同时,针对嵌入式设备的特点对TCP/IP协议族进行了裁剪,并依照裁剪 后的协议,利用Socket编程和编写CGI程序最终完成了B/S模式下嵌入式WEB服务器的设计.最后将所设计的嵌入式WEB服务器应用到现场交流伺服远程监控 系统中,实现了其远程监控与故障诊断. 3.学位论文 李外云 基于ARM架构的嵌入式人脸识别技术研究 2008 嵌入式人脸识别系统建立在嵌入式操作系统和嵌入式硬件系统平台之上,具有起点高、概念新、实用性强等特点。它涉及嵌入式硬件设计、嵌入式操 作系统应用开发、人脸识别算法等领域的研究;嵌入式人脸识别系统携带方便、安装快捷、机动性强,可广泛应用于各类门禁系统、户外机动布控的实时 监测等特殊场合,因此对嵌入式人脸识别的研究工作具有突出的理论意义和广泛的应用前景。 本文是上海市经委创新研究项目《射频识别RFID系统-自动识别和记录人群的身份》(编号:04-11-2)与上海市科委AM基金项目《基于ARM和RFID芯片 的自组织安全监控系统的研制》(编号:0512)的主要研究内容之一。论文从构建自动人脸识别系统所需解决的若干关键问题入手,重点探讨了基于嵌入式 ARM微处理器的实时人脸检测、关键特征定位、高效的人脸特征描述、鲁棒的人脸识别分类器及自动人脸识别系统设计等问题的研究。论文的主要工作和 创新点表现在以下方面: 1实现了结合肤色校验的Haar特征级联分类器嵌入式实时人脸检测,提出了基于人脸约束的人眼Haar特征RSVM级联分类器人眼检测算法和基于遮罩掩 磨与椭圆拟合的瞳孔定位算法。 复杂背景中的人脸检测是自动人脸识别系统首先要解决的关键问题,通过对基于肤色模型和基于Haar特征级联强分类器的人脸检测算法的分析研究 ,综合两个算法的优点,提出了基于肤色模型校验和Haar特征级联强分类器的嵌入式实时人脸检测算法。实验结果表明,该算法不仅解决了复杂背景中的类 肤色和类人脸结构问题,而且具有较高的检测率和较快的检测速度,同时对光照、尺度等变化条件下的人脸检测也具有较强的鲁棒性。 人眼检测与瞳孔定位在人脸归一化和有效人脸特征抽取等方面起着非常重要的作用,为了快速检测人眼并精确定位人眼瞳孔中心,论文提出了基于人 脸约束的人眼Haar特征RSVM级联分类器人眼检测算法和基于遮罩掩磨与椭圆拟合的瞳孔定位算法,首先利用人眼检测分类器在人脸区域内完成对人眼位置 的检测,然后通过对检测到的人眼进行遮罩掩磨、简单图像形态学变换及椭圆拟合实现瞳孔中心的精确定位。测试结果表明该算法只需几百毫秒便能完成 人眼检测与瞳孔中心定位整个过程,在保证检测速度较快的同时,还能确保较高的定位精度。 2 针对传统线性判别分析法存在的小样本问题(sss),通过调 整Fisher判别准则,实现了自适应线性判别分析算法及相应的人脸识别方法人脸识别中的小样本问题使线性判别分析算法的类内散布矩阵发生严重退化 ,导致问题无法求解。本文在人脸识别小样本问题的基础上,通过调整Fisher判别准则,利用类间散布矩阵的补空间巧妙地避开类内散布矩阵的求逆运算 ,通过训练集每类样本的样本数信息自适应改变调整参数,实现了自适应线性判别分析算法,实验结果表明,该算法能有效解决人脸识别中的小样本问题。 3 提出了基于有效人脸区域的Gabor特征抽取算法,有效地解决了Gabor特征抽取维数过高的问题。 Gabor小波对图像的光照、尺度变化具有较强鲁棒性,是一种良好的人脸特征表征方法。但维数过高的Gabor特征造成应用系统的维数灾难,为解决 Gabor特征的维数灾难问题,论文第四章提出了基于有效人脸区域的Gabor特征抽取算法,该算法不仅有效地降低了人脸特征向量维数,缩小了人脸特征库的 规模,同时降低了核心算法的时间和空间复杂度,而且具有与传统Gabor特征抽取算法同样的鲁棒性。 4 结合有效人脸区域的Gabor特征抽取、自适应线性判别分析算法和基于支持向量机分类策略,提出并实现了基于支持向量机的嵌入式人脸识别和嵌 入式人像比对系统支持向量机通过引入核技巧对训练样本进行学习构造最小化错分风险的最优分类超平面,不仅具有强大的非线性和高维处理能力,而且 具有更强的泛化能力。本文研究了支持向量机的多类分类策略和训练方法,并结合论文中提出的基于有效人脸区域的Gabor特征提取算法、自适应线性判 别分析算法,首次在基于Windows CE操作系统的嵌入式ARM平台中实现了具有较强鲁棒性的嵌入式自动人脸识别系统和嵌入式人像比对系统。 5 提出并初 步实现了基于客户机/服务器结构无线网络模型的远距离人脸识别方案为解决嵌入式人脸识别系统在海量人脸库中进行识别的难题,论文提出并初步实现 了基于客户机/服务器结构无线网络模型的嵌入式远距离人脸识别方案。 客户机(嵌入式平台)完成对人脸图像的检测、归一化处理和人脸特征提取,然后通过无线网络将提取后的人脸特征数据传输到服务器端,由服务器在 海量人脸库中完成人脸识别,并将识别后的结果通过无线网络传输到客户机显示输出,从而实现基于客户机/服务器无线网络模型的嵌入式远距离人脸识别 方案。 6 结合我们开发的基于ARM的嵌入式自动人脸识别系统和嵌入式人像比对系统,从系统设计的角度探讨了在嵌入式系统中进行人脸识别应用设计的思 路及应该注意的问题虽然嵌入式人脸识别系统的性能很大程度上取决于高效的人脸特征描述和鲁棒的人脸识别核心算法。但是,嵌入式系统的设计思想对 嵌入式人脸识别系统的性能影响同样值得重视。本文第六章重点阐述了嵌入式自动人脸识别应用系统的设计思路,并结合我们自主开发的嵌入式自动人脸 识别系统和嵌入式人像比对系统从系统设计的角度探讨了嵌入式人脸识别应用系统设计中应该注意的关键技术问题。 结合本文提出的算法我们在PC上完成对人脸识别分类器的训练,然后在嵌入式ARM开发平台上实现了嵌入式自动人脸识别、嵌入式人像比对两个便携 式人员身份认证系统,经测试运行效果良好。所提出的人脸识别算法不仅具有一定的理论参考价值,而且对于嵌入式系统应用开发、AFR应用系统开发也具 有一定的借鉴意义。 4.期刊论文 车飞锋.孟开元.曹庆年.CHE Fei-feng.MENG Kai-yuan.CAO Qing-nian 基于ARM的嵌入式Web服务器的 研究与实现 -微计算机信息2008,24(26) 本文给出了一种嵌入式Web Server的设计方案.该方案对基于ARM和Linux的嵌入式Web Server系统的软硬件体系结构及构建Boa服务器的具体方法进 行了详细的阐述,实现了浏览器与嵌入式系统之间的动态交互.这种嵌入式Web Server方案可以广泛地应用在远程监控、智能家电等领域,具有广泛的应用 前景. 5.学位论文 顾品标 基于ARM的DRM广播系统研究 2009 随着嵌入式应用的发展,ARM因其高性能、低功耗、低成本而成为移动通信、便携设备、消费与图像应用等嵌入式产品的首选。Linux是使用最广泛 的操作系统,能运行在包括ARM在内的所有主要处理器架构上。近年来对嵌入式Linux的研究正进行得如火如荼,并获得了长足的进步。基于ARM与 Linux的嵌入式技术已经成为当前嵌入式领域研究的一个重要方向。与此同时,世界上调幅(AM)广播正在从模拟信号向数字信号过渡,数字化是技术发展 的必由之路。在此背景下,本文利用ARM-Linux硬件开发平台对AM频段数字声音广播中DRM标准系统的移植进行研究,具体工作内容如下: 1、简要介绍了AM广播的数字化及嵌入式系统,通过对AM广播信道物理特征的分析选取适合的信道模型,给出了采用COFDM的DRM系统传输模式、帧结 构及导频结构,对DRM系统的关键技术如信源编码、同步、信道估计等进行了详细阐述。 2、针对嵌入式Linux系统,讲述其发展历史、特点分析及应用前景,给出了系统的开发流程和开发模式;对Linux系统内核进行了分析,给出了嵌入 式Linux系统的组成。 3、讲述了嵌入式开发平台的选择准则,ARM处理器的体系结构和应用特点,以及交叉编译环境的搭建和Bootloader。 4、介绍了软件开发工具的选择及嵌入式Linux系统的GUI;在探讨DRM发射机和接收机系统体系结构的基础上,对其进行了软件设计和计算机实现。 5、针对所选开发平台,搭建了Qt/Embedded的开发环境,将DRM软件系统进行了移植设计。 本文提出的基于嵌入式Linux平台的数字调幅广播系统潜力巨大,有待进一步研究和探索。 6.期刊论文 刘军.林安 由ARM与μClinux构建的嵌入式Web Server -单片机与嵌入式系统应用2003,""(11) 利用3 2位ARM嵌入式CPU,构建基于μClinux操作系统的嵌入式Web Server,讨论其具体技术及相关实现方案;将高性能、低功耗32位RISC结构的ARM内 核处理器与开放源码的嵌入式多任务操作系统μClinux相结合,构建一个适用于智能家居系统的嵌入式Web Serve的系统硬件平台,给出相关原理框图和实 现嵌入式Web Server的代码框架结构. 7.学位论文 刘兵 基于ARM的嵌入式数控系统软件设计与实现 2008 基于ARM技术和Windows CE操作系统的嵌入式数控系统,是新兴的ARM微处理器技术、嵌入式实时多任务操作系统与数控加工技术的综合应用。嵌入 式数控系统也是嵌入式计算机技术在机床运动控制中的新探索。 由于ARM微处理器具有比单片机更强大的运算处理能力,更快的运算速度,利用ARM微处理器作为数控系统的主要控制芯片,可以显著提高数控加工 的精度和加工的智能化。同时利用嵌入式系统的低功耗,低成本,高可靠性,可以在提高数控系统性能的同时尽量降低加工成本。另外,在具有嵌入式 操作系统的平台上实现的数控系统,具备良好的开放性和扩展性,为系统的更新升级提供便利。 本论文重点研究嵌入式数控系统软件平台的建立和相应的数控加工应用软件的开发。主要内容包括嵌入式数控系统软硬件组成结构与实现方案的选 择;嵌入式数控系统软件平台Windows CE的裁剪定制以及向ARM处理器的移植;嵌入式数控系统上具体应用软件的设计。 文章首先介绍了嵌入式技术应用现状,在此基础上提出了本文的研究意义。接着介绍了构成数控装置的硬件结构以及裁剪定制Windows CE系统的开 发工具Plantform Biulder和开发Windows CE上嵌入式应用软件的开发环境Embedded Visual C++。然后重点介绍了裁剪定制和移植Windows CE的几部分 主要工作--Bootloader、OEM适配层和硬件驱动程序的开发。 本文的另一个重点部分就是根据具体数控编码规则的特点,研究能够编译数控加工代码的数控应用软件。在这部分,首先对该数控应用软件进行了 功能分析和结构分解,确定了三个功能模块的内涵和外延。这三个部分是图形用户界面模块、通用数控代码编译模块、刀具半径补偿模块。在确定功能 模块后,结合数控加工特点,利用开发工具,初步实现了数控代码的编辑,编译,保存、打开以及修改功能,并实现了刀具选择控制和半径补偿设置与 自动半径补偿计算。 在论文的最后,对本课题的工作进行了总结,并对嵌入式数控系统的发展做出了展望。 8.期刊论文 杨磊.方康玲.YANG Lei.FANG Kang-ling 基于ARM的嵌入式文件系统YAFFS的移植 -微计算机信息 2008,24(17) 本文分析了罪常用的两种嵌入式文件系统JAFFS和YAFFS文件系统的优缺点,通过修改Linux-2.6.14内核源码,重新配置内核,提出一种了如何在嵌入式 系统上移植YAFFS文件系统的方法,并在ARM-S3C2410开发平台的NAND FLASH测试并挂栽了移植后的YAFFS文件系统,为嵌入式开发人员提供了一种参考方案 . 9.期刊论文 郁晓飞.舒旋.陈晓光 MiniGUI在ARM嵌入式广告系统上的使用和改进 -计算机应用与软件2010,27(2) 提出一种在嵌入式广告系统上建立图形界面的方式.该嵌入式系统采用ARM芯片和μCLinux操作系统,并采用基于MiniGUI的图形界面.详细描述该图形 界面应用体系的建立流程和要点.对于嵌入式广告系统的特殊需求,提出并实现了对MiniGUI系统的两大改进,一是对于高分辨率图像显示的双缓冲技术,二 是对于高级文字特效的支持. 10.期刊论文 白静.谢憬.毛志刚.BAI Jing.XIE Jing.MAO Zhigang 基于ARM嵌入式平台的X86译码SoC架构设计 -现 代电子技术2009,32(8) 二进制翻译技术是代码移植技术中的一种重要技术.针对二进制翻译的应用,提出在ARM嵌入式平台下实现X86 to ARM二进制翻译系统.通过对ARM嵌入 式平台的研究,介绍二进制翻译模块的功能,着重论述SoC架构的设计,并分析Multi-layer总线结构的特点及优化.该SoC系统实现了将部分X86指令翻译为 ARM指令并由ARM处理器执行目标代码的功能.该设计为在硬件上实现二进制翻译提供了参考. 本文链接:http://d.g.wanfangdata.com.cn/Thesis_Y1341464.aspx 下载时间:2010年5月25日
更多简介内容

评论

下载专区


TI最新应用解决方案

工业电子 汽车电子 个人电子
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })