基于无MMU嵌入式系统实现应用软件硬件无关性

2018-03-29 02:21杨会新
铁路计算机应用 2018年3期
关键词:寄存器调用中断

杨会新

(河南思维轨道交通技术研究院有限公司,郑州 450001)

随着嵌入式系统的广泛应用,其硬件升级提供更好性能的同时,也带来一些嵌入式系统设计、应用的问题。嵌入式系统通常面向专用的功能,面向控制,其软件一般和其运行的硬件平台紧密相关。特别是那些微控制器没有内存管理单元(MMU)的嵌入式硬件平台,管理底层硬件的驱动代码与实现应用功能的代码作为一个软件整体存在于嵌入式系统中。无论应用功能调整还是硬件部件更新均须完整更换其软件。即使是局部变更,表现出来的却是全部变更,使得升级的测试边界被放大,导致增加系统测试、维护的成本。

如果在无MMU嵌入式系统中,能实现完成应用功能的代码(简称:应用软件)与硬件驱动代码(简称:系统软件)分离,以各自独立的形态存在于嵌入式系统中,且应用软件具有与硬件无关性,那么这种系统架构能提供清晰的变更边界,软、硬件变更的相互制约大大降低,同时也降低系统升级、变更的测试、维护成本,甚至有可能实现嵌入式应用软件像通用计算机软件一样,不用重新生成即可运行于不同硬件条件的嵌入式设备上,添加新功能软件,而不中断现有的服务功能。

文献[1]和文献[2]提出软件模拟MMU的方法,从实用角度考虑,无MMU的微处理器相对资源较少,运算能力较弱,增加软件模拟MMU的开销,值得商榷。文献[3]的分析表明,能在无MMU平台上支持应用分离的ucLinux最少内核也在100 KB以上,在无MMU嵌入式系统中运用也有颇多资源限制。文献[4]~文献[7]都涉及到软硬件分离的讨论,但基本都是基于建立一种软件逻辑架构方面的研究,少有提及软件部署方面的软硬件分离。本文探索一种新的方法,在无MMU的嵌入式系统中实现应用软件的硬件无关性,应用软件与系统软件以分离形式部署。

1 应用软件实现硬件无关性原理

应用软件要做到与硬件无关(本文不讨论与硬件指令集的无关性),要实现以下几方面的硬件无关性:(1)指令寻址与硬件无关性,即软件运行不依赖于存储位置或加载位置;(2)不直接操控实现其功能的硬件部件。

1.1 具有MMU的系统实现应用软件硬件无关性的原理

在具有MMU的系统中,系统软件通过使用MMU,建立了虚拟地址空间[8],系统软件加载应用软件运行时,进行重新定位操作,确定应用软件运行的地址,应用软件运行于虚拟地址空间,由MMU完成虚拟地址到物理地址的转换。这样应用软件使用的地址与运行平台的具体硬件无关,不仅实现了指令寻址与硬件无关,还可使用比实际物理地址空间大的多的虚拟地址空间。此技术极大地方便应用软件的设计开发。

对支撑应用软件完成其功能的硬件部件的访问,都被封装于操作系统及硬件驱动软件中,应用软件需要使用硬件部件完成某个功能,通常是通过操作系统提供的系统调用,由操作系统内核代码或传递给硬件驱动软件来完成,通过硬件驱动程序屏蔽具体硬件的差异[9]。系统调用在应用软件代码中,是使用类似软中断的指令码实现控制流由应用软件切换进入操作系统,并不像常规函数调用那样使用的是函数地址,这样就与系统调用代码的位置无关了。这些系统调用接口都是高度抽象的,与实际硬件特性无关,由此实现了应用软件与受控硬件的无关性。应用软件并不用关心硬件部件的寄存器地址、位定义、操作时序等,即使硬件部件更换,也能保证系统调用接口不变,应用软件也就无须做相应的变动。如图1所示。

图1 具有MMU的系统实现应用软件硬件无关性原理示意图

此种系统架构的优势显而易见,引入MMU硬件部件,也提升了系统的成本和复杂性。这类系统一般都需要运行复杂的、大规模的操作系统软件才能发挥其优势。

1.2 具有段寄存器的系统实现应用软件硬件无关性的原理

此类系统使用的是段地址+段内偏移地址的方式寻址,典型的代表是Intel的X86系统。

此类系统的应用软件指令被编译为基于段寄存器的寻址方式,在应用软件加载和运行时,确定其段寄存器的内容,通过段寄存器与指令寻址偏移地址,硬件部件运算得出具体的硬件地址。这样软件代码的寻址是相对于段寄存器,而段寄存器在加载运行时可重定位,实现应用软件寻址与实际物理地址无关。

对于硬件部件访问的硬件无关性,以X86经典的DOS操作系统为例,DOS提供了大量的中断服务程序,完成对硬件部件的访问,应用软件正是通过中断服务程序实现其控制硬件完成的功能。进入中断服务程序的中断指令与地址无关。应用软件设计者一般是使用设计语言提供的系统调用库函数,由库函数使用中断指令调用操作系统提供的中断服务程序。当然DOS允许在应用软件中实现中断服务程序来操控硬件部件以实现特定的功能,这样在提供灵活性的同时,也使得应用软件不能完全做到硬件无关。如图2所示。

此类系统架构有一定局限性,寻址空间有限,对应用软件的设计有相当的限制。

1.3 无MMU嵌入式系统实现应用软件硬件无关性的原理

无MMU嵌入式系统中,无前述两类系统中的特殊硬件部件来支持实现应用软件寻址的硬件无关性。要实现硬件无关性,首先从软件架构设计上入手,对系统整个软件划分逻辑层次,明确应用功能与底层支撑层的界线,确定抽象调用接口。软件逻辑架构方面的论述文献较多,此处不作展开[10]。下文以实现应用软件与系统软件部署分离方面的原理进行阐述。

图2 具有段寄存器的系统实现应用软件硬件无关性原理示意图

(1)应用软件中的寻址可分为两类:代码与只读数据的寻址;可读写数据的寻址。这两类寻址在编译应用软件时,都要选择编译为位置无关目标码。这样应用软件内部的寻址都是位置无关的相对寻址。

(2)系统软件加载应用软件运行时,由于其内部寻址为位置无关的相对寻址,只需转入其加载位置的软件入口地址,无须进行软件重定位。对于可读写数据区,则需要为其分配存储空间位置。应用软件对位置无关的可读写数据区的访问需要通过一个数据基址寄存器进行相对寻址实现。所以,由系统软件切换至应用软件运行时,还需要为其设置数据基址寄存器。至此实现应用软件寻址的硬件无关性。

(3)系统软件要提供系统调用函数,应用软件通过系统调用来操控硬件部件完成其功能。系统调用的接口类似1.1中所述系统,是硬件特性无关的调用接口。这就要求无MMU嵌入式系统要提供软件中断或专用的系统调用机制来实现系统调用。例如ARM的Cortex-M系列处理器就提供了SVC机制用于实现系统调用。

无MMU嵌入式系统应用软件硬件无关性原理如图3所示。

图3 无MMU嵌入式系统实现应用软件硬件无关性原理示意图

2 实现方法

硬件平台为ARM Cortex-M系列处理器,使用Keil uVision5作为开发软件。

2.1 应用软件设计要求

编写应用软件代码,需要使用位置无关的方式。比如不能使用“__attribute__((at(address))) variable attribute”指定变量的位置;不能使用“__attribute__((section("section_name")))”指定其放置位置。

在嵌入汇编代码中不能使用“LDR Rn, = 标号”这样的语句,因为这种语句生成目标代码时,会写入标号的地址值,这破坏了代码运行位置无关性,也就不能实现硬件无关性。

所有对硬件部件的访问都通过系统软件提供的系统调用进行。系统调用的实现可以用Cortex-M处理器提供SVC机制或软中断方式。推荐使用SVC机制来实现。对于应用软件而言,就像使用标准库函数一样。

在 keil软 件“Options of target” 对 话 框 的C/C++、ASM选项卡选择“Read-Only Position Independent”和“Read-Write Position Independent”编译选项,也就是编译命令行参数“/ropi”和“/rwpi”;linker选 项 卡 选 择“Make RW Sections Independent”、“Make RO Sections Position Independent”,也就是链接命令行参数“--rwpi”、“--ropi”。注意使用位置无关编译、链接选项时,不能使用分散加载文件“*.sct”来描述存储空间。如果使用了分散加载文件,编译链接时,会有警告错误,指出忽略位置无关命令行选项开关。

如上所述,就可以生成运行位置无关的应用软件了。

2.2 系统软件设计要求

(1)应用软件加载运行的要求。如前文所述,系统软件要加载应用软件运行,需要做一些特定的工作。对通用的编译器产生的可执行应用软件文件,要通过自制工具软件附加一些信息,生成系统软件使用的文件。附加的信息主要包括应用软件执行入口地址(相对文件头的偏移)、数据区大小、堆栈大小。系统软件启动运行后,根据应用软件描述信息(类似启动脚本),加载应用软件,根据应用软件文件附加的信息,为其分配所需资源,转入应用软件入口执行。

(2)系统调用的要求。使用SVC机制提供满足应用软件访问硬件部件的系统调用,如_svc(svc_no)func_ret func(func_param)。系统调用的接口设计可参考通用操作系统的系统调用接口,便于应用软件的开发、仿真验证、移植等工作。在实际响应系统调用,返回应用软件时,应设置应用软件的数据基址寄存器,保证应用软件能正确访问静态数据区数据。

2.3 实现的局限性

无MMU嵌入式系统微处理器的存储空间通常是不连续的,另外处理器厂商可能为平衡性价比,不同存储区域的性能也有所不同。由于应用软件使用位置无关编译链接选项时,不能使用分散加载文件描述不连续的存储空间,使得应用软件只能使用一块连续代码区和一块连续的静态数据区,这对代码规模大和要求大数据区的应用而言就有很大限制。对于应用软件代码规模大的,只能拆分成多个应用。对于数据区要求大的,只能通过系统软件提供的系统调用动态分配存储空间,在软件设计及数据使用上有所不便。

3 结束语

本文阐述了无MMU嵌入式系统实现应用软件硬件无关性的意义,讨论了在无MMU嵌入式系统中实现应用软件的原理,并结合Cortex-M系列处理器,Keil开发环境,提出了无MMU嵌入式系统下实现应用软件硬件无关的方法,为改变目前大部分此类系统只能建立单一的硬件相关软件的现状进行了有价值的探索,便于建立更加灵活、易于升级、性价比更高的嵌入式系统。进一步发展,有望在无MMU嵌入式系统中实现应用软件一次发布运行于不同硬件条件的嵌入式设备;在运行设备上添加新功能软件,而不中断现有服务功能。

参考文献:

[1]张秀平,杨国武,李晓瑜. MMU协处理器的一种软件模拟模型[J]. 计算机工程与应用,2011,47(3):57-60.

[2]张加林,王海琳. 中低端微处理器平台软件仿真MMU的设计与实现[J]. 计算机光盘软件与应用,2014,17(6):67-70.

[3]孙鲁毅. 四种流行的嵌入式实时操作系统的比较研究—VxWorks,QNX,ucLinux,RTEMS[J]. 计算机应用与软件,2007,24(8):196-197.

[4]王 君,王志杰,乐 浪. 基于SOIS的星载平台软件架构设计探索[J]. 航天器工程,2017,26(3):84-89.

[5]饶天贵,李 凯,李宇锋. 机车显示器应用软件模块化设计[J]. 机车电传动,2016 (1):71-74.

[6]赵 勇,陈香兰. 基于模型驱动的实时嵌入式系统[J]. 计算机系统应用,2017,26(8):83-87.

[7]甄 君,梁 超,夏俊清. 信息对抗侦察系统开放架构计算环境[J]. 太赫兹科学与电子信息学报,2015,13(4):590-595.

[8]闫路平,龚乐中. 基于MILS架构的高可信嵌入式操作系统研究[J]. 通信技术,2017,50(5):1029-1035.

[9]张国强.《操作系统原理》课程教学中的结构思维培养[J].软件导刊,2016,15(2):180-184.

[10]王继刚,方 芳,张华强. 嵌入式操作系统异常处理框架设计与实现[J]. 电子技术应用,2017,43(5):60-63+66.

猜你喜欢
寄存器调用中断
Lite寄存器模型的设计与实现
“单片机中断概述”微课教学设计
核电项目物项调用管理的应用研究
一种考虑GPS信号中断的导航滤波算法
二进制翻译中动静结合的寄存器分配优化方法
系统虚拟化环境下客户机系统调用信息捕获与分析①
Linux中断线程化分析及中断延时测试
移位寄存器及算术运算应用
跟踪导练(二)(5)
利用RFC技术实现SAP系统接口通信