参考文献
第9章 多任务实时系统设计与控制补偿及其应用
9.1 嵌入式实时系统
9.1.1 嵌入式系统
国际电气和电子工程师协会(IEEE)对嵌入式系统的定义是:“用于控制、监视或者辅助操作机器和设备的装置”(原文为:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants)。这主要是从应用对象上加以定义,从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。目前,国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
嵌入式系统的核心是由一个或几个预先编程好以用来执行少数几项任务的微处理器或者微控制器组成。与通用计算机能够运行用户选择的软件不同,嵌入式系统上的软件通常是暂时不变的;所以经常称为“固件”。可从几方面来理解嵌入式系统:
1)嵌入式系统是面向用户、面向产品、面向应用的,它必须与具体应用相结合才会具有生命力、才更具有优势。因此可以这样理解上述含义,即嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。
2)嵌入式系统是将先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散和不断创新的知识集成系统。所以,介入嵌入式系统行业,必须有一个正确的定位。例如Palm软件之所以在PDA领域占有70%以上的市场,就是因为其立足于个人电子消费品,着重发展图形界面和多任务管理。而风河公司的Vxworks软件之所以在火星车上得以应用,则是因为其高实时性和高可靠性。
3)嵌入式系统必须根据应用需求对软硬件进行裁剪,满足应用系统的功能、可靠性、成本和体积等要求。所以,如果能建立相对通用的软硬件基础,然后在其上开发出适应各种需要的系统,是一个比较好的发展模式。目前的嵌入式系统的核心往往是一个只有几K到几十K微内核,需要根据实际的使用进行功能扩展或者裁减,但是由于微内核的存在,使得这种扩展能够非常顺利的进行。
实际上,嵌入式系统本身是一个外延极广的名词,凡是与产品结合在一起的具有嵌入式特点的控制系统都可以叫嵌入式系统,而且有时很难以给它下一个准确的定义。另外,嵌入式系统都带操作系统吗?从嵌入式系统发展的历史过程中可以看出,嵌入式系统可能有也可能没有。一个功能简单的嵌入式系统可能根本不需要操作系统;而对于一个功能复杂的嵌入式系统,则需要操作系统。现在人们讲嵌入式系统时,某种程度上指近些年比较热的具有操作系统的嵌入式系统。
9.1.2 嵌入式实时系统概念
设备中的嵌入式系统常用于实现数据采集、信息处理和实时控制等功能。而采集、处理和控制往往是一个连续过程,必须在一定时间内完成,这就要求具有实时性,所以嵌入式系统普遍具有实时性要求。为完成实时性目的,在嵌入式实时系统中采用的操作系统称为嵌入式实时操作系统,它既是嵌入式操作系统,又是实时操作系统。作为一种嵌入式操作系统,它具有嵌入式软件共有的可裁剪、低资源占用和低功耗等特点。作为一种实时系统,它能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出响应的系统。
嵌入式实时操作系统建立在计算机机硬件系统之上,用户的一切开发工作都在其上进行,因此它可以称作一个平台。采用实时操作系统的用户不必花大量时间学习硬件,和直接开发相比起点更高,所有的硬件设置和资源访问都要通过实时操作系统的核心。硬件这样被屏蔽起来以后,用户不必清楚硬件系统的每一个细节就可以进行开发,这样就减少了开发前的学习量。实时操作系统还是一个标准化的平台,它定义了每个应用任务和内核的接口,它可以统一协调各个任务,优化CPU时间和系统资源的分配,使之不空闲、不拥塞。另外,这种标准化平台也促进了应用程序的标准化。应用程序标准化后便于软件的存档、交流、修改和扩展,为嵌入式软件开发的工程化创造了条件、减少开发管理工作量。
9.1.3 嵌入式实时系统的特点
1.多任务类型
在实时系统中,不但包括周期任务、偶发任务、非周期任务,还包括非实时任务。实时任务要求满足时限,而非实时任务要求要使其响应时间尽可能的短。多种类型任务的混合,使系统的可调度性分析更加困难。
2.多约束性
任务的约束包括时间约束、资源约束、执行顺序约束和性能约束。时间约束是任何实时系统都固有的约束。资源约束是指多个实时任务共享有限的资源时,必须按照一定的资源访问控制协议进行同步,以避免死锁和高优先级任务被低优先级任务堵塞的时间(即优先级倒置时间)不可预测。执行顺序约束是指各任务的启动和执行必须满足一定的时间和顺序约束。例如,在分布式端到端实时系统,同一任务的各子任务之间存在前驱/后驱约束关系,需要执行同步协议来管理子任务的启动和控制子任务的执行,使它们满足时间约束和系统可调度要求。性能约束是指必须满足如可靠性、可用性、可预测性和服务质量等性能指标。
3.可预测性
可预测性是指系统能够对实时任务的执行时间进行判断,确定是否能够满足任务的时限要求。由于实时系统对时间约束要求的严格性,使可预测性成为实时系统的一项重要性能要求。除了要求硬件延迟的可预测性以外,还要求软件系统的可预测性,包括应用程序的响应时间是可预测的,即在有限的时间内完成必需的工作;以及操作系统的可预测性,即实时原语、调度函数等运行开销应是有界的,以保证应用程序执行时间的有界性。
4.可靠性
大多数实时系统要求有较高的可靠性。在一些重要的实时应用中,任何不可靠因素和计算机的一个微小故障,或某些特定强实时任务(又叫关键任务)超过时限,都可能引起难以预测的严重后果。为此,系统需要采用静态分析和保留资源的方法及冗余配置,使系统在最坏情况下都能正常工作或避免损失。可靠性已成为衡量实时系统性能不可缺少的重要指标。
5.与外部环境的交互作用性
实时系统通常运行在一定的环境下,外部环境是实时系统不可缺少的一个组成部分。计算机子系统一般是控制系统,它必须在规定的时间内对外部请求做出反应。外部物理环境往往是被控子系统,两者互相作用构成完整的实时系统。大多数控制子系统必须连续运转以保证子系统的正常工作或准备对任何异常行为采取行动。
9.1.4 嵌入式实时系统的分类与调度
实时系统主要分为以下两类。
(1)强实时系统(Hard Real-Time)在航空航天、军事、核工业等一些关键领域中,应用时间需求应能够得到完全满足,否则就可能造成飞机失事之类的重大安全事故,造成重大生命财产损失和生态破坏。因此,在这类系统的设计和实现过程中,应采用各种分析、模拟及形式化验证方法对系统进行严格的检验,以保证在各种情况下应用的时间需求和功能需求都能够得到满足[1]。
(2)弱实时系统(Soft Real-Time)某些应用虽然提出了时间需求,但实时任务偶尔违反这种需求对系统的运行以及环境不会造成严重影响,如视频点播系统、信息采集与检索系统就是典型的弱实时系统。在视频点播系统中,系统只需保证绝大多数情况下视频数据能够及时传输给用户即可,偶尔的数据传输延迟对用户不会造成很大影响,也不会造成像飞机失事一样严重的后果。
为了精确管理“时间”资源,已达到实时性和预测性要求,并能够满足实时系统的新要求,需用实时调度理论对任务进行调度和可调度性分析。任务调度技术包括调度策略和可调度性分析方法,两者是紧密结合的。任务调度技术研究的范围包括任务使用系统资源(包括处理机、内存、I/O、网络等资源)的策略和机制,以及提供判断系统性能是否可预测的方法和手段。例如,什么时候调度任务运行、在哪运行(当系统为多处理机系统或分布式系统时)、运行多长时间等;以及判断分析用一定参数描述的实时任务能否被系统正确调度。
给定一组实时任务和系统资源,确定每个任务何时何地执行的整个过程就是调度。在非实时系统中,调度的主要目的是缩短系统平均响应时间,提高系统资源利用率,或优化某一项指标;而实时系统中调度的目的则是要尽可能地保证每个任务满足他们的时间约束,及时对外部请求做出响应。抢占式调度通常是优先级驱动的调度,每个任务都有优先级,任何时候具有最高优先级且已启动的任务先执行。一个正在执行的任务放弃处理器的条件为:自愿放弃处理器(等待资源或执行完毕);有高优先级任务启动,该高优先级任务将抢占其执行。除了共享资源的临界段之外,高优先级任务一旦准备就绪,可在任何时候抢占低优先级任务的执行。抢占式调度的优点是实时性好、反应快,调度算法相对简单,可优先保证高优先级任务的时间约束,其缺点是上下文切换多。而非抢占式调度是指不允许任务在执行期间被中断,任务一旦占用处理器就必须执行完毕或自愿放弃。其优点是上、下文切换少;缺点是在一般情况下,处理器有效资源利用率低,可调度性不好。
9.1.5 常见的嵌入式实时操作系统
1.Vxworks实时操作系统
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。Tornado是WindRiver公司推出的一套实时操作系统开发环境,类似Microsoft Visual C,但是提供了更丰富的调试、仿真环境和工具。Vx- Works支持几乎所有现代市场上的嵌入式CPU,包括x86系列、MIPS、PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-4、ARM,StrongARM以及xScaleCPU。VxWorks以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通信、军事演习、弹道制导、飞机导航等。在美国的F-16、F/A-18战斗机、B-2隐形轰炸机和“爱国者”导弹上,甚至连1997年7月在火星表面登陆的火星探测器,2008年5月在火星表面上登陆的“凤凰号”火星探测器,2011年首飞的X-47B无人机,2012年8月在火星表面上登陆的“好奇号”火星探测器上也都使用到了该实时操作系统。Vxworks占据了嵌入式系统的大半江山,特别是在通信设备等实时性要求较高的系统中,几乎非Vxworks莫属。但因Vxworks价格很高,所以一些小公司或小产品中往往用不起,目前很多公司都在转用免费的嵌入式Linux系统。
2.WindowsCE实时操作系统
Windows CE是一个抢先式多任务并具有强大通信能力的Win32嵌入式操作系统,是微软专门为信息设备、移动应用、消费类电子产品、嵌入式应用等非PC领域而从头设计的战略性操作系统产品。Windows CE中的C代表袖珍(Compact)、消费(Consumer)、通信能力(Connectivity)和伴侣(Companion);E代表电子产品(Electronics)。与Windows95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows95/98,但Windows CE是基于WIN32 API重新开发、新型的信息设备的平台。Windows CE具有模块化、结构化和基于Win32应用程序接口和与处理器无关等特点。Windows CE不仅继承了传统的Windows图形界面,并且在WindowsCE平台上可以使用Windows95/98上的编程工具(如Visual Basic、Visual C++等)、使用同样的函数、使用同样的界面风格,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。
基于Windows CE构建的嵌入式系统大致可以分为4个层次,从底层向上依次是:硬件层、OEM层、操作系统层和应用层。不同层次是由不同厂商提供的,一般来说,硬件层和OEM层由硬件OEM厂商提供;操作系统层由微软公司提供;应用层由独立软件开发商提供。每一层分别由不同的模块组成,每个模块又由不同的组件构成。这种层次性的结构试图将硬件和软件、操作系统和应用程序隔开,以便于实现系统的移植,便于进行硬件、软件、操作系统、应用程序等开发的人员分工合作、并行开发。硬件层是指由CPU、存储器、I/O端口、扩展板卡等组成的嵌入式硬件系统,是Windows CE操作系统必不可少的载体。一方面,操作系统为嵌入式应用提供一个运行平台;另一方面,操作系统要运行在硬件之上,直接与硬件打交道并管理硬件。值得注意的是,由于嵌入式系统是以应用为核心的,嵌入式系统中的硬件通常是根据应用需要定制的,因此,各种硬件体系结构之间的差异非常大。“更小、更快、更省钱”几乎是所有嵌入式系统硬件的设计目标。OEM层是逻辑上位于硬件和Windows CE操作系统之间的一层硬件相关代码。它的主要作用是对硬件进行抽象,抽象出统一的接口,然后Windows CE内核就可以用这些接口与硬件进行通信。
3.Linux实时操作系统
嵌入式linux是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。嵌入式Linux的特点是版权费免费,而且性能优异,软件移植容易,代码开放,有许多应用软件支持,应用产品开发周期短,新产品上市迅速,实时性能,稳定性好,安全性好等特点。嵌入式linux主要的应用领域有信息家电、PDA、机顶盒、数字电话、网络设备、远程通信、医疗电子、交通运输、计算机外设、工业控制、航空航天等领域。该部分将在下节进行详细介绍。
9.2 实时多任务Linux操作系统
9.2.1 Linux简介
Linux的诞生可以追溯到1991年,当Linus还是芬兰赫尔辛基大学的一名学生时,他对当时为教学而设计的Minix操作系统提供的功能不满意,于是他决定自己写比Minix更强大的类UNIX操作系统来取代Minix,后来这个类UNIX操作系统就是Linux。Linus从一开始就决定自由扩散Linux,他把源代码发布在Internet上,随即就引起爱好者的注意,他们通过Internet加入了Linux的内核开发工作,一大批高水平程序员的加入,使得Linux得到迅猛发展,他们为Linux修复错误、增加新功能,不断尽其所能地改进它。现在,Linux凭借优秀的设计,不凡的性能,加上IBM、Intel、AMD、DELL、Oracle、Sybase等国际知名企业的大力支持,市场份额逐步扩大,逐渐成为主流操作系统之一。Linux其本质只是操作系统的核心,负责控制硬件、管理文件系统、程序进程等。LinuxKernel(内核)并不负责提供用户强大的应用程序,没有编译器、系统管理工具、网络工具、Office套件、多媒体、绘图软件等,这样的系统也就无法发挥其强大功能,用户也无法利用这个系统工作,因此有人便提出以Linux Kernel为核心再集成搭配各式各样的系统程序或应用工具程序,组成一套完整的操作系统,经过如此组合的Linux套件即称为Linux发行版。
Linux操作系统在短短的几年之内得到了非常迅猛的发展,这与Linux具有下面良好特性是分不开的。
(1)开放性 系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准。凡遵循国际标准所开发的硬件和软件,都能彼此兼容,可方便地实现互连。它是基于GPL(General Public License)的架构之下,任何人都可以免费的使用或者是修改其中的原始码。开放性架构对科学界来说是相当重要的,因为很多工程师由于特殊的需求,常常需要修改系统的原始码,使该系统可以符合自己的需求,而这个开放性的架构将可以满足各不同需求的工程师。
(2)多用户 系统资源可以被不同用户各自拥有使用,即每个用户对自己的资源有特定的权限,互不影响。
(3)多任务 多任务是现代计算机的最主要的一个特点。它是指计算机同时执行多个程序,而且各个程序的运行互相独立。Linux系统调度每一个进程,平等地访问微处理器。
(4)良好的用户界面Linux向用户提供了两种界面,用户界面和系统调用。Linux的传统用户界面是基于文本的shell命令行界面,shell有很强的程序设计能力,用户可方便地用它编制程序,从而为用户扩充系统功能提供了更高级的手段。
(5)设备独立性 设备独立性是指操作系统把所有外部设备统一当成文件来看待,只要安装它们的驱动程序,任何用户都可以像使用文件一样,操纵和使用这些设备,而不必知道它们的具体存在形式。
(6)提供了丰富的网络功能Linux在通信和网络功能方面优于其他操作系统。其他操作系统不包含如此紧密地和内核结合在一起的连接网络的能力,也没有内置这些联网特性的灵活性。而Linux为用户提供了完善的、强大的网络功能。
(7)可靠的系统安全Linux采取了许多安全技术措施,包括对读、写进行权限控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的安全保障。
(8)良好的可移植性 可移植性是指将操作系统从一个平台转移到另一个平台,使它仍然能按其自身的方式运行的能力。Linux是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和平台上运行。
9.2.2 嵌入式Linux简介
嵌入式系统是指嵌入到对象体系中执行独立功能的专用计算机系统。嵌入式系统的三个基本要素是专用性、计算机系统和嵌入性,包括定时器、存储器、传感器、微控制器、微处理器等一系列器件与微电子芯片,以及嵌入在存储器中的控制应用软件、微型操作系统,共同实现诸如数据处理、实时控制、管理、监视、移动计算等各种自动化处理任务。嵌入式Linux是指对Linux小型化裁减后,能够固化在容量有限的存储器芯片中,应用于特定嵌入式场合的Linux操作系统。因为Linux自身的优点使其非常适合作为嵌入式操作系统,其优点表现为以下几个方面:
1)开发成本小,源代码公开。大多数商业操作系统都是价格昂贵的,Linux是一个免费的性能优秀的操作系统且源代码公开,使不同领域和不同层次的用户可以根据自己的应用需要对内核进行裁减。
2)可靠性高,稳定性好,容易移植。同目前流行的操作系统相比,Linux是非常稳定和可靠的,这一点已经得到很多用户的肯定。另外,Linux也是一个多平台的操作系统,可以运行在很多种处理器上,这一点对于嵌入式的应用尤其重要。
3)功能强大的开发工具。Linux提供C、C++、Java等很多开发工具,而且开发者可以免费获得。Linux具备这么多的工具,使得用户可以自行建立嵌入式系统的开发环境和交叉运行环境,而且可以不用专门的仿真工具直接在Linux内核调试即可。
正是由于Linux具有上述的诸多优势,使得它近几年在嵌入式应用领域发展迅速,嵌入式实时Linux的开发和研究成为目前操作领域的一个热点。然而,Linux作为嵌入式实时操作系统,也存在着一些不足,如Linux系统的实时性较差,极大地限制了Linux系统在嵌入式方面的应用,主要表现在以下方面。
1)关中断问题。在系统调用中,为了保护临界区资源,Linux处于内核临界区时,中断会被系统屏蔽,这就意味着假如当前进程正处于临界区,即使他的优先级较低,也会延迟高优先级的中断请求。在实时应用中,这是个十分严重的问题。
2)进程调度问题。Linux采用标准的UNIX技术使得内核是不可抢占的。采用基于固定时间片的可变优先级调度,不论进程的优先级多么低,Linux总会在某个时候分给该进程一个时间片运行,即使同时有能够运行的高优先级进程,它也必须等待低优先级进程的时间片用完,这对一些需要高优先级进程立即抢占CPU的实时应用是不能满足需要的。
3)时钟问题。Linux为了提高系统的平均吞吐率,将时钟中断的最小间隔配置为10ms,这对于一个周期性的实时任务,间隔需要小于10ms时,就不能满足实时任务的需要。假如要把时钟的间隔改小以满足周期性的实时任务的需要,由于Linux的进程转换比较费时,时钟中断越频繁,而花在中断处理上的时间就越多,系统的大部分时间是调用进程调度程式进行进程调度而不能进行正常的处理。
这些问题是Linux用于嵌入式环境时碰到的问题,但是Linux操作系统本身的优势决定了Linux经过改造后仍然适合嵌入式环境,将Linux经过改造,使其成为一个能运行于嵌入式系统的操作系统是现在操作系统领域中研究的一个热点,例如RTLinux和RTAILinux就是Linux实时性改造的成功范例[2-5]。
9.2.3 嵌入式实时系统RTLinux简介
RTLinux是美国新墨西哥州大学计算机科学系Victor Yodaiken和Micae Brannanov开发的。它在Linux内核的下层实现了一个简单的实时内核,而Linux本身作为这个实时内核的优先级最低的任务,所有的实时任务的优先级都高于Linux系统本身的,以及Linux系统下的一般任务。
RTLinux的设计思想是:应用硬件的实时约束将实时程序分割成短小简单的部分,较大部分承担较复杂的任务。根据这一原则,将应用程序分为硬件实时和程序两个部分。硬件实时部分被作为实时任务来执行,并从外部设备拷贝数据到一个叫做实时有名管道(RTFIFO)的特殊I/O端口,程序主要部分作为标准Linux进程来执行。它将从RTFIFO中读取数据,然后显示并存储到文件中,实时部分将被写入内核。设计实时有名管道是为了使实时任务在读和写数据时不被阻塞。
RTLinux通过对标准Linux内核进行改造,将Linux内核工作环境作了一些变化。在Linux进程和硬件中断之间,本来由Linux内核完全控制。现在,在Linux内核和硬件中断的地方加上了一个RTLinux内核的控制。Linux的控制信号都要先交给RTLinux内核进行处理。在RTLinux内核中实现了一个虚拟中断机制,Linux本身永远不能屏蔽中断,它发出的中断屏蔽信号和打开中断信号都修改成向RTLinux发送一个信号。
到目前为止,RTLinux已经成功地应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像处理等广泛领域。RTLinux开发者并没有针对实时操作系统的特性而重写Linux的内核,因为这样做的工作量非常大,而且要保证兼容性也非常困难。为此,RTLinux提出了精巧的内核,并把标准的Linux核心作为实时核心的一个进程,同用户的实时进程一起调度。这样对Linux内核的改动非常小,并且充分利用了Linux下现有的丰富的软件资源。
9.2.4 嵌入式实时系统RTAILinux简介
RTAI(Real-Time Application Interface)是由意大利米兰理工学院航天工程系发起开发的遵循GPL的开源项目。RTAI是对Linux内核的硬实时扩展,它遵循自由软件规范。它可以提供工业级的RTOS功能,而且其所有的功能都可无缝的通过GNU/Linux环境访问。RTAI支持的CPU类型包括I386,PPC和ARM。
1.RTAILinux提供的功能
RTAI为开发硬实时系统提供了丰富的功能。首先、提供多种对实时任务的调度方式,它的调度器分为UP(Uniprocessor),SMP(Symmetric Multiple Processor)和MUP(Multi-Uniprocessor)三类。其中,UP调度器用于单处理器的系统;SMP调度器用于对称的多处理器的系统,所有的CPU使用相同的时钟中断源,也就是说,任务在所有的CPU上都是以相同的模式运行;而MUP调度器也是用于多处理器系统,只不过每个CPU有自己独立的时钟中断源,所以,在不同的CPU上运行的任务可以以不同的时钟模式运行。在这三类调度方式中,时钟运行的模式都有两种,单触发模式(one-shot mode)和周期模式(periodic mode)。另外,它提供了丰富的任务间的通信方法,主要包括邮箱机制(Mailboxe),消息和过程调用机制(Message and RPC),信号量机制(Semaphore),管道机制(FIFO),共享内存机制(Shared memory)。其中的管道机制和共享内存机制可用于RTAI的实时任务和Linux进程之间的通信。此外,RTAI还提供了LXRT机制,使得可以在Linux的用户空间创建软实时进程,满足软实时应用的要求。RTAI还在不断发展之中,而且它在实时环境中的应用也越来越多,它将来的主要发展方向包括实现更多硬件平台上的移植、为RTAI提供C++开发环境、实时文件系统、对基于Flash的文件系统的支持、高级的实时内存管理机制等。
2.RTHAL与RTAILinux
RTAI在Linux上定义了一组实时硬件抽象层RTHAL(Real Time Hardware Abstraction Layer),RTHAL将所有需要的Linux内部数据和函数的指针集合到一个RTHAL的结构中。RTHAL结构用于截取Linux硬件操作,在双内核结构工作时,它们可以被RTAI重定向,以取代Linux中原有的函数;同时RTAI只是用此程序界面与Linux进行沟通。通过这种方法就可以把对Linux内核源码的改动程度降到最低,可以避免RTLinux方案对Linux内核源码改动过大的问题,便于在不同Linux版本之间的移植。在RTHAL架构下,RTAI以独立实时内核的形式运行于硬件和Linux之间,它将Linux视为优先级最低的任务。
基于RTHAL的RTAI实时化方案的技术思想是构造一个简单的硬实时内核,应用的实时部分作为实时进程直接运行在这个硬实时内核之上;原来的Linux内核作为一个优先级最低的任务,也为这个实时内核所调度,应用的非实时部分作为非实时进程运行在Linux内核从而可以获得Linux内核所提供的一切服务。RTAI当初设计的目的是为了解决RTLinux在不同Linux版本之间难于移植的问题,为此,RTAI在Linux内核与硬件之间定义了一个实时硬件抽象层RTHAL,实时任务通过这个抽象层提供的接口和Linux系统进行交互,这样给Linux内核增加实时支持时可以尽可能少地修改Linux内核源代码,同时减少跟踪移植到新版Linux的工作量。
RTAI修改了内核中与体系结构相关的代码而形成了RTHAL层,RTHAL通过接管硬件中断,建立软件模拟中断机制,将Linux内核与中断隔离。RTAI引入一个实时调度器(schedule)来保证其实时性,将Linux内核当成一个任务模块来执行,调度那些与实时应用紧密相关的内核函数指针集中组织到RTHAL结构中,当系统要转入实时处理时,这些指针可以被RTAI动态转换。通常情况下,这些指针变量指向嵌入式Linux中的函数,此时系统相当于工作在嵌入式Linux下,RTHAL不过增加了一个中间环节而已;当有实时要求时,即加载RTAI主模块后,该主模块的初始代码将这些指针变量修改为指向RTAI主模块中同名的函数,此时所有硬件中断都将被实时硬件抽象层接收,由相应函数来处理。当原有Linux试图屏蔽中断时,系统实际上并没有真正屏蔽中断,而只是设置了RTHAL中的某个结构,实时内核仍可处理中断。当发生中断时,RTAI不会马上调用嵌入式Linux的中断处理程序,而是分两步进行处理:首先接受中断请求,判断RTAI中是否存在对应的中断服务程序,若存在则转至该服务程序,否则由实时内核的中断服务程序处理该中断;然后查看RTHAL中的软件模拟中断控制器,如果Linux允许中断,则将中断交给Linux中断服务程序,如果不允许中断则返回。
3.Adeos与RTAILinux
Adeos的全称是Adaptive Domain Environment for Operating System,它的目标是为操作系统提供了一个灵活的、可扩展的自适应环境,在这个环境下,多个相同或不同的操作系统可以共存,共享硬件资源;随着历史的发展,目前已经存在了不少优秀的操作系统,正是因为这些操作系统的共同存在发展,而产生了以下的问题:一方面,对于那些面向相同的用户,具有相似设计理念和功能的操作系统来说,它们之间是不兼容或不完全兼容的,例如,在Windows操作系统上的应用程序是不能直接在Linux上运行的;这就将用户(包括程序设计者和系统管理员)限制在了一个固定的软件环境下,用户在应用的选择上缺少灵活性。另一方面,由于最初的应用环境和面向的用户的不同,有些操作系统在设计理念和功能上完全不同;但是,随着计算机技术的发展,现在的一个计算机系统往往具有以前多个系统的功能,各种计算机系统之间的界限越来越模糊。例如,现在的终端电子设备对实时性的要求越来越高(如智能手机),而某些实时系统也对人机界面的交互有了更高的要求,这就会促使这两种应用环境下的操作系统相互融合。目前,主要存在两类方法使多个操作系统运行在同一个系统上;第一类方法是模拟,例如,VMWare,Plex86和VirtualPC等;它们都是在已有的操作系统上提供一个虚拟的硬件环境,在这个虚拟硬件环境下可以运行另外操作系统。这样,用户就可以充分的利用两个或多个系统所提供的功能和软件;但这种方法最大的缺点就是会极大地降低系统的性能,因为它包含三个软件层次:主机操作系统(Host Operating System)->虚拟硬件环境->客户操作系统(Guest Operating System)。第二类方法,是在硬件上实现一个所谓的超微内核(nano-kernel),通过这个超微内核实现硬件的共享,然后再在这个内核上构建实用的操作系统,例如,SPACE、Cache kernel和Exokernel等,但这些方法都没有考虑当前已经存在的操作系统和用户。
而Adeos是在已有的操作系统下插入一个软件层,通过向上层多个操作系统提供某些原语和机制而实现硬件共享。但是Adeos并不对硬件的使用强加任何的限制,上层的操作系统仍然可以自由的操作硬件,而不会因为Adeos的存在而有任何的约束(实际上,上层的操作系统可以完全不知道有Adeos的存在)。Adeos除了可以实现操作系统对系统资源的共享之外,还可以用于新的操作系统的开发、操作系统内核的调试、跟踪等。目前,Adeos是基于Linux内核实现的,主要的应用是在Linux的实时化方面,使基于Linux的系统能满足硬实时的要求。
9.3 系统的硬件设计
9.3.1 PET/CT简介
PET全称为正电子发射断层显像。该显像技术是将极其微量的正电子核素示踪剂注射到人体内,然后采用特殊的体外测量仪器(PET)探测这些正电子核素在人体全身各脏器的分布情况,通过计算机断层显像的方法显示人体的全身主要器官以及大脑、心脏的生理代谢功能和结构。同时,应用CT技术为这些核素分布情况进行精确定位,主要用于肿瘤、神经系统和心血管疾病的临床诊断。PET/CT作为PET的升级产品,融合了PET和CT的优点,是目前影像诊断技术中最理想的结合,是分子影像学的重要技术代表。
从国内外生产厂家看:由于PET/CT是投资大、开发周期长、技术复杂的项目,该产品几乎被几大国际公司垄断。卫生部卫生经济研究所成本测算中心根据国家卫生部的要求,对我国引进PET/CT设备的医院使用效率、运营成本、收费等运行情况进行调研。得到的结果是:PET/CT这类高端医疗设备市场主要集中在GE、西门子、飞利浦国外供应商。由于国外厂家在该领域内技术的垄断,造成了我国医院购置PET/CT每台设备费用为3000万元左右、每年的维护费用平均约在200万元左右,设备和维护的高成本造成了病人的检查费用为一次7000元左右,即使按目前的收费标准仍不能回收成本[6-8]。同国外相比,国内的PET/CT只是刚刚起步,与国外几家跨国公司差距的确较大。但国内的厂家和研究人员在PET和PET/CT研发上还是做了大量艰苦努力工作,如早年的中科院高能物理研究所,近年的北京亿仁赛博和沈阳东软集团。目前,沈阳东软集团第一代PET机经多年研制获得成功,并取得美国FDA认证,现已投放到国内外市场。
9.3.2 PET机电控制系统
PET的机电控制部分尽管不直接参与投影数据的探测、编码、符合、采集和成像的整个流程,但同样在PET系统中起着举足轻重的作用。作为系统底层硬件与上层服务器之间通信以及底层硬件之间通信的交通枢纽,它负责接收来自上层服务器的命令,传给底层执行部件,命令这些部件做相应的动作,然后再将底层执行部件的完成情况和当前状态实时反馈给服务器作相应处理,同时它为前端数据采集子系统提供增益表和编码表等控制信息。可以说,机电控制部分几乎完成除机械设计和整个成像生成外的所有底层执行部件控制以及状态显示,各种模拟量、数据量的采集与控制工作,为系统成像作好各种准备工作。PET的机电控制部的实际设备和实验设备如图9-1所示。(https://www.daowen.com)

图9-1 实际设备与实验设备
1.PET的机电子系统
PET的机电控制部分主要包括下面几个子系统:
1)扫描床子系统:该子系统主要完成扫描床的水平和升降运动,其中升降运动采用手动方式,而水平运动采用交流伺服电动机驱动形成闭环自动控制。
2)棒源子系统:该子系统主要完成环和多棒源运动。棒源子系统的主要目的是完成衰减扫描,最后和发射扫描融合形成最后的PET图像。该子系统用步进电动机驱动形成开环自动控制。
3)隔板子系统:该子系统主要完成隔板(Septa)从采集孔的移出和移进,如果隔板从采集孔移出,系统将做3D扫描;如果隔板移进采集孔,系统将做2D扫描。该子系统也用步进电动机驱动形成开环自动控制。
4)摆动装置子系统:该子系统主要完成摆动装置(Wobble)的摆动,摆动装置的摆动将增加采集率和投影计数率。该子系统也用步进电动机驱动形成开环自动控制。
2.PC/104与PC/104+
PC/104是一种专门为嵌入式控制而定义的工业控制总线,近年来在国际上广泛流行,被IEEE协会定义为IEEE-P996.1。我们知道,IEEE-P996是PC和PC/AT工业总线规范,而从PC/104被定义为IEEE-P996.1就可以看出,PC/104总线实质上是一种紧凑型,小型化的IEEE-P996,其总线信号定义和PC/AT基本一致,但电气和机械规范却完全不同,是一种优化的、小型化、堆栈式结构的嵌入式控制系统。
PC104有两个版本,8位和16位,分别与PC和PC/AT相对应。在PC104总线的两个版本中,8位PC104共有64个总线管脚,单列双排插针和插孔,P1:64针,P2:40针,合计104个总线信号,PC104因此得名。PC104+是专为PCI总线设计的,可以连接高速外接设备。PC104+在硬件上通过一个3X40即120孔插座,PC104+包括了PCI规范2.1版要求的所有信号。为了向下兼容,PC104+保持了PC104的所有特性。我们选用PC/104+作为PET计算机控制系统。PC104和PC104+如图9-2所示。

图9-2 PC104主板与PC104+主板
3.运动控制卡
在对PET机电子系统进行运动控制时,可以采用商用化的PLC控制器或运动控制卡。由于PLC的控制精度远低于板卡类,我们采用了运动控制卡。运动控制卡通常是采用专业的运动控制芯片或高速DSP来满足一系列运动控制需求的控制单元,其可通过PCI PC104等总线接口安装到PC和工业PC上,可与步进和伺服驱动器连接,驱动步进和伺服电动机完成各种运动(单轴运动、多轴联动、多轴插补等),接收各种输入信号,可输出控制继电器、电磁阀和气缸等元件。用户可使用VC\VB等开发工具,调用运动控制卡函数库,快速开发软件。运动控制卡是PCI、cPCL、PXI等总线形式的板卡,通俗的说我们可以把它看成一个单片机,有自己的算法,可以通过VC、VB、labview、BCB等语言实现其功能。其中比较有名的是美国PMAC运动控制卡,考虑成本因素,最后我们选择了日本的PCL6045B运动控制卡。
4.伺服器与伺服电动机
为了适应数字控制的发展趋势,运动控制系统中大多采用步进电动机或全数字式交流伺服电动机作为执行电动机。虽然两者在控制方式上相似(脉冲串和方向信号),但在使用性能和应用场合上存在着较大的差异。步进电动机是一种离散运动的装置,步进电动机是按照特性命名的,指它的转动是一步一步的。例如一个360分度的步进电动机,转一圈要走360步,每一步转1°,如果你要求它转半度,是不可能实现的。所以步进电动机是把一圈分成若干步,不累积误差,一般用做开环控制。在目前国内的数字控制系统中,步进电动机的应用十分广泛。随着全数字式交流伺服系统的出现,交流伺服电动机也越来越多地应用于数字控制系统中。伺服电动机一般是功率小,运行精确,能高速制动,惯量小,适合闭环控制,也就是能检测到实际位置和理论位置的误差,并消除误差。综上所述,交流伺服系统在许多性能方面都优于步进电动机。但在一些要求不高的场合也经常用步进电动机来做执行电动机。所以,在控制系统的设计过程中要综合考虑控制要求、成本等多方面的因素,选用适当的控制电动机。在PET扫描床子系统选用了交流伺服电动机,而棒源子系统、隔板子系统和摆动装置子系统选用了步进电动机。选用了日本富士的RYC401D3-VVT2伺服器和日本富士伺服电动机。伺服器与伺服电动机如图9-3所示。

图9-3 伺服器与伺服电动机
9.4 系统的软件设计
9.4.1 系统整体结构
如图9-4所示,可以把整个基于RTAI+Linux的PET实时控制系统划分成硬件平台和软件平台两大部分:硬件平台主要由PC104+、PCL6045B运动控制卡、PCMUIO96 I/O卡以及控制扫描床的交流伺服电动机和控制棒源、隔板、摆动装置的步进电动机组成(虚线部分)。软件平台主要由RTAI,Linux kernel和Linux应用程序几部分组成(实线部分),下面把各个部分之间的关系归结如下[9]:
关系1表示实时任务如何与RTAI提供的实时任务接口相互作用。实时任务都是以Linux内核模块方式实现的,要实现一个实时任务,在模块初始化的时候要调用RTAI的任务创建函数初始化实时任务相关的数据和环境,指定定时器的运行模式(单触发模式或周期模式)并初始化定时器,然后开始执行任务;当没有加载任何RTAI的实时任务模块的时候,RTAI的任务调度和时钟中断都没有启动。关系2表示实时任务通过RTAI提供的管道(FIFO)和共享内存与Linux用户空间中的进程进行通信,通过这种方式,实时任务获取的实时数据就可以传递到用户空间让非实时进程对数据进行后续的处理。关系3表示RTAI本身的实现需要用到Linux内核提供的某些功能;例如,RTAI本身(包括各种提供给实时任务的服务模块)是以Linux内核驱动模块的形式存在的,这就需要用到Linux内核的动态内核模块加载功能;另外,RTAI目前的内存管理模块在初始化时是使用Linux的内存分配接口分配足够的内存。关系4表示传统的Linux内核和Linux用户程序的关系。关系5表示RTAI和底层硬件之间的交互,当外部事件触发了实时任务之后,实时任务在处理的过程中一般要对外部设备执行某些操作,例如控制采集卡进行数据采集、控制电动机等。关系6表示Linux和硬件平台之间的关系。PET控制系统执行过程如图9-5所示。

图9-4 系统整体结构
在用户空间:
①接收/反馈进程主要功能是通过远程过程调用的socket接口和主机sun相连接,从sun接命令信息并把命令信息传递到commFIFO,同时发起另一个线程statusTask完成状态和检测信息的反馈。
②显示进程是在用户空间运行的另一个进程,该进程通过串口485把错误信息、床位置等送到显示屏显示。
在内核空间:
①comTask任务主要功能完成各实时任务的初始化工作,从commFIFO接命令信息并按要求发送到其他邮箱。
②bedTask任务主要功能是从bedMBX邮箱接收床控命令并完成床的相应运动。
③rapTask任务主要功能从rapMBX邮箱接棒源、隔板(Septa)以及摆动装置控制命令并完成相应运动。
④errTask任务的主要功能完成从errMBX邮箱接错误命令信息并传给用户空间的显示进程。
⑤monTask任务的主要功能是完成各种状态监控。
⑥dioTask任务的主要功能是完成控制面板和I/O卡信号的监控。
主机系统和用户空间的进程的通信主要是依靠远程过程调用(RPC)完成,主要调用sock接口函数完成。内核空间和用户空间下进程的通信主要是依靠实时扩展部件RTAI提供的实时FIFO和共享内存来完成。内核空间的实时任务之间的通信依靠邮箱完成。

图9-5 系统执行过程
9.4.2 系统软件设计方法
上位机软件主要完成文件管理和控制参数设定等功能。由于下位机软件是本章分析的重点,按照前文的论述将用户空间模块(虚线左)和内核空间模块(虚线右)之间关系汇总如图9-6所示,其中在用户空间运行两个进程,在内核空间完成六个实时任务。多任务调度算法采用了基于优先级的FIFO算法。

图9-6 系统软件任务结构模块
9.5 信息传递过程实例
Linux中的进程运行在用户空间和内核空间两种模式下:一般在Linux用户空间运行的是非实时任务(也就是进程和线程),而在Linux内核空间运行的是RTAI的实时任务。在实时Linux下为了保证PET控制系统的实时任务能够即时响应,所有实时任务都必须放在内核空间运行,这些任务包括:rapTask、bedTask、comTask、errTask、monTask、dioTask。而非实时任务则放在用户空间运行,它们在任何时候都不会打断实时任务的运行,非实时任务包括接收/反馈进程和显示进程。而主机系统包括:文件管理、状态显示,协议运行,参数设置等组成,PET控制系统软件结构如图9-7所示。

图9-7 PET控制系统软件结构
9.5.1 网络传递信息
在主机系统和PC104+的用户空间程序之间通过网络完成信息的传递,下面的表9-1、图9-8和后面的部分程序是完成该部分信息传递的实例。
表9-1 linux下常用的socket处理函数

在网络通信中,首先由服务器端创建一个侦听用套接字(socket),然后与服务器的本地地址绑定,接着进入侦听模式。客户端开始时,同样也需要创建一个套接字,不同的是这个套接字只用于通信,然后连接服务器端。对应到网络通信就是:服务器端用于侦听的套接字接受(accept)这个来自客户端的连接,然后建立新的通信用套接字,并利用新建的通信套接字与客户端进行通信。服务器端和客户端从各自的通信套接字传送和接收数据(send/recv),通信结束后再关闭相关的通信套接字(send/recv)。

图9-8 基于socket的网络信息传递



9.5.2 信号量传递信息
Linux系统有大量的资源,内核在使用这些资源时会发生竞争,在内核开发的时候为避免竞争的发生,通常用信号量来解决。Linux信号量(semaphore)是一种互斥机制。即对某个互斥资源的访问会收到信号量的保护,在访问之前需要获得信号量。在操作完共享资源后,需释放信号量,以便另外的进程来获得资源。获得和释放应该成对出现。PC104+的用户空间和内核空间的程序之间通过信号量完成信息的传递,下面的表9-2、图9-9和后面的部分程序是完成该部分信息传递的实例。
表9-2 RTAI下常用的信号量处理函数



图9-9 基于信号量的信息传递


9.5.3 邮箱传递信息
RTAI的邮箱(Mailbox),也被称作消息交换,是使用指引变量,通过发送或接收放在系统内存中的消息来同步和通信的一种对象。每个邮箱通过唯一的ID进行标识,邮箱都有一个与之相关的消息队列用来存储待发送的消息,还有一个等待队列用来接收消息。任务发送消息就是把消息挂载到消息队列。任务接收消息就是将消息队列的第一个消息移走。如果没有消息,任务将被放入邮箱的等待队列中,进入等待态直到有新的消息被送入邮箱。PC104+的用户空间的各任务之间通过邮箱完成信息的传递,下面的表9-3、图9-10和后面的部分程序是完成该部分信息传递的实例。
表9-3 RTAI下常用的邮箱处理函数


图9-10 基于邮箱的信息传递


9.6 不确定问题的校正与补偿处理
我们知道,非线性不确定摩擦是一种复杂的、非线性的、具有不确定性的自然现象。摩擦使系统响应出现爬行、振荡、打滑或稳态误差,以及其他不可预料现象。在前面章节里从理论上提出了各种补偿方法,以消除摩擦的不利影响。实际产品也考虑了这些不确定现象,并在产品中嵌入了一些补偿措施,如本章节用到的PCL6045B运动控制卡就有此功能[10]。
9.6.1 间隙补偿与打滑校正
PCL6045B运动控制卡具有间隙补偿与打滑校正功能,这些功能输出一定数量的指令脉冲,其速度由校正速度寄存器RFA中的速度设定值决定。间隙补偿功能在每次改变操作方向时执行,而打滑校正功能则在指令操作之前执行,与运动方向无关。校正量和校正在RE-NV6寄存器中指定。根据RENV3寄存器的设置,校正操作中也可以让计数器(C1-C4)进行计数操作。表9-4是间隙补偿与打滑校正的参数设置。需要注意的是:
1)在圆弧插补运动过程中各轴运动方向会发生改变。间隙补偿与打滑校正不能在定时器和圆弧插补中使用,但可以再圆弧插补启动时使用。如果想在圆弧插补中使用间隙补偿需要将圆弧插补分段,在各段开始时使用间隙补偿。
表9-4 间隙补偿与打滑校正的参数设置

2)在直线插补1和圆弧插补中,必须为各轴指定速度数据。然而,在补偿操作中PRMG寄存器的设置被用作速度数据。如果想在插补操作中使用间隙补偿,应设置PRMG寄存器中的值与各轴速度数据相同,也要为各轴设置RFA寄存器。
3)PCL和RFA寄存器中提供一个匀速度间隙补偿。替代状态寄存器检测值SFU(加速阶段)、SFD(减速阶段)和SFC(匀速阶段)将变为0。
间隙补偿软件实现如下的参考代码:

9.6.2 不确定振动的补偿处理
PCL6045B运动控制卡具有减小停止时振动的功能。此功能的实现,是在完成指令脉冲的操作后,立即添加一个反向脉冲和一个正向脉冲。在RENV7寄存器中指定额外脉冲的输出时序。当反向定时(RT)和正向定时(FT)均不为零时,即允许减振功能。设置FT和RT的单位为32倍的参考时钟频率。图9-11中的虚线表示减振功能添加的脉冲,图中为正方向脉冲。表9-5是实现减振功能的参数设置,其中FT和RT的最佳值将随机器和负载的不同而不同,因此最好通过试验来获得这些值。


图9-11 减振功能实现的时序
图9-12是使用减振功能时电动机运动的波形采样,连接一个编码器到一个5相位步进电动机。给上/下计数器提供编码信号,并且通过程序控制以一定的间隔读取计数器的值。然后计算运动量和检测电动机运动状态。通常,在使用S形曲线加减速时停止过程中要比直线加减速时容易减振。
表9-5 振动补偿的参数设置


图9-12 减振功能实现的效果
9.7 本章小结
本章给出了基于RTAILinux为软件平台的PET控制系统的多任务实时系统设计与控制补偿实例。经过反复实验证明,PET的扫描床、棒源、隔板以及摆动装置能够很好地完成既定控制任务,运动控制精度达到了期望的性能指标,并且系统运行稳定,目前该系统已完成产品化目标,在东软PET系统获得运行。
参考文献
[1] Bernet G,Burns A.Weakly Hard Real-Time Systems.IEEE Trans Computers,2001,50(4):308-321.
[2] 邹勇,王青,李明树.Linux内核的实时支持的研究与实现[J].计算机研究与发展,2002,39(4):466-472.
[3] 朱达宇,李彦等.基于RTLinux的全软件数控系统[J].计算机集成制造系统,2004,10(12):1571-1575.
[4] 郭锐,赵万生,李论,李志勇,郑君民.基于Linux的微细电火花加工数控系统的研究[J].计算机集成制造系统,2007,13(2):370-375.
[5] 李志勇,赵万生.基于Linux内核的数控系统关键技术研究[J].计算机集成制造系统,2004,10(5):569-573.
[6] 孙强.PET/CT运行成本及效率研究[J].中国卫生经济,2005,24(1):37-41.
[7] David W T,Jonathan P J.PET/CT today and tomorrow[J].Journal of Nuclear and Medicine,2004,45(1):1-14.
[8] 王永富,赵宏,刘积仁.国产PET实时控制与成像系统的研究[D].沈阳:东北大学,2008.
[9] 王永富,李甲递,赵宏,刘积仁.基于实时Linux的PET控制软件设计与实现[J].东北大学学报,2008,29(4):497-500.
[10] 叶佩青,张辉.PCL6045B运动控制与数控应用[M].北京:清华大学出版社,2007.