冷 迪,陈 瑞,李 英
(深圳供电局有限公司,广东 深圳 518000)
早期开发任务少,嵌入式系统功能单一,不需要操作系统支持[1]。但随着功能和复杂性的增加,对系统的要求也越来越高。所以,像普通计算机一样在处理器中引入操作系统就成了一个必然的趋势[2]。由于操作系统的引入,能够充分利用处理器有限的资源,实现不同CPU 进程间的最佳切换,因此必然会把嵌入式系统引入到更广阔的领域[3]。目前X86架构虚拟化逐渐完善,但是仍然有些问题需要解决。小型机原CPU 单核数量较少,但单核率较高。但PC 服务器的CPU 内核较多,单一CPU 内核性能较差[4]。一些应用在移植过程中表现出不同的性能,这是小型机过渡到PC 服务器时不可避免的共同问题。
以ARM 为基础的嵌入式操作系统是目前信息市场的主流,也是一个热门话题。由于应用迁移过程平台公开了源代码,使其他人可以在自己喜欢的平台系统中移植代码和使用它,所以嵌入式操作系统受到关注,选择该系统作为应用迁移过程操作平台。为此,提出了由X86 构架到ARM 构架的应用移植流程平台研究。
由X86 构架到ARM 构架的应用移植流程平台结构如图1 所示。
图1 应用移植流程平台结构
图1是把内核分成两层,底层是驱动程序层,上层是虚拟文件系统层。这些层对应于内核的两个主要功能,驱动程序层负责管理底层硬件[5]。虚拟文件系统层为Linux上层应用程序提供对L1的访问。核心代码按照其功能可分为进程管理、内存管理、文件系统、设备控制、网络功能等模块[6]。每一个模块都很大,迁移过程中的主要工作是驱动设备控制。各开发板的硬件结构不同,需要增加或改进硬件驱动程序[7]。
驱动程序通常与应用程序迁移过程平台内核中的一个通用总线连接,例如USB、I2C等驱动程序[8]。但在嵌入式芯片中,很多设备都没有与公共总线连接。
平台设备驱动如图2 所示。
由图2 可知,使用USB 和I2C 总线控制器来控制主板上的设备,并通过一条廉价但功能强大的总线(包括两根导线)收集相关信息;LCD 控制器的作用是接收总线发送的信息,计数器通过计算数字系统中脉冲数来实现测量、计数和控制[9-10]。声道控制器采用联机音乐控制方式,输出DMX512/1990 信号,保证了系统的安全可靠[11]。
图2 平台设备驱动
LCD 控制器结构如图3 所示。
图3 LCD控制器结构
由图3 可知,FCT 接收来自初始化、屏幕间隙和显示器等参数的指令。它根据指令生成一系列控制信号和相应的时序,并通过控制LCD 显示模块来完成相应的操作[12]。在FCT 输入LCD_FCT 为低电平时,对复位电路进行初始化,对复位标志和状态进行复位,并设置相关常数[13]。
LCD 控制器的主要功能是为计时器提供高品质的时间设定,LCD_FCT 中的微秒和毫秒计时器是为了满足不同时间的工作要求而设计的[14-15]。
定时器的时间常数存放在时间常数寄存器中,将MP 中的地址和控制信息发送给解码器。该解码器可根据不同的地址和控制信息产生相应的复位指令标志,将指示符号发送到控制电路[16]。
Apache 服务器是指Apache 服务器端口中的嵌入式系统。在HTTP 端口上,当客户端向服务器发出连接请求时,服务器软件守护程序在客户端和服务器之间建立连接。如果守护程序从客户端收到HTTP 请求消息,那么就对其进行解析,并将解析的请求传递给后台处理程序。这个后端程序是PHP 和CGI。在对后端程序进行处理之后,客户端所需数据就会传送到服务器端,最终呈现在网页中。
R2R 平台中,触摸屏驱动层次结构如图4 所示。
图4 触摸屏驱动层次结构
由图4 可知,如果高层应用程序需要获得触摸屏坐标,需要首先调用I2C 总线驱动程序,这些驱动程序的分层开放式系统调用打开文件界面,然后使用ioctl 或read 系统调用获取所需的坐标值。
由于输入设备具有多个触摸屏,因此鼠标和键盘都是输入设备。其基本工作机制是产生中断,然后内核将数据存储在缓冲区中。硬件方面,设置数据读取、输入事件管理、缓冲区管理共享模块;所有这些常规处理由输入驱动完成,剩下的是中断管理、数据读取和其他硬件驱动。
Android 系统移植分析了UBOOT、Android 内核、用户空间的层次结构;下一步,根据层次结构找到与迁移最相关的代码。修改代码以适应硬件特性,完成代码移植。开始运行系统前,编译修改的UBOOT代码,并使用RENEWS 刻录机将BIN 文件(编译结构)刻录到R2R 平台的引导风扇上。修改后的内核随后被编译,内核镜像被拷贝到端口主机的TFTP 目录中;最后编译成Android 文件系统,拷贝到U 盘。该系统首先启动应用程序,下载内核,然后分析数据,最后内核从U 盘读取初始化文件,开始初始化操作,最后将初始进程加载到Android 用户空间。
启动程序是与架构相关的一部分,是在运行操作系统内核和应用程序之前启动并加载系统的一小部分。一般情况下,不可能在嵌入式系统中建立通用的启动迁移。用户必须编写此小程序,完成硬件设备的初始化,建立存储空间映射,使系统软硬件达到适当的状态,才能使操作系统内核良好运行。
通常引导程序移植分为两步:
步骤一:CPU 依赖代码使用汇编语言实现。其中主要包括对硬件设备进行初始化;准备内存空间将引导程序复制到引导迁移设备上,设置堆栈读取ARM 空间,完成检测系统内存映射;
步骤二:将内核和根文件系统镜像从Flash 读取到ARM 空间;设置内核启动参数,调用内核。引导程序移植的工作流程如图5 所示。
图5 引导程序移植工作流程
内核移植启动操作系统,执行内存管理任务调度,然后执行应用程序,或者等待用户的指令。尽管在功能间存在着复杂的调度关系,但应用迁移平台的层次结构使硬件相关代码具有独立性。在迁移过程中,只需要对进程、内存、设备等进行管理。对内核代码的修改包括以下部分:
1)在内核目录树中修改项目构建工具,设置环境变量,找到交叉编译工具链,重新登录。
2)建立灰色分区区域,修改ARM 表示的分区信息,使用灰色分区表创建文件内容;修改ARM 文件,根据分区设置指定初始化和内核启动程序。
通过执行MakeMenucon 命令,配置内核生成卡,选择SBC2410 位卡的处理器类型,将卡保存在串口中。在进入配置管理界面时,必须先验证用户的身份。验证是访客访问权的标志,不同权限验证对应不同的数据信息。
移植之前,需确保主机上正确安装了操作系统和GCC 跨工具编译器链连接了目标板上的USB、串行和JTAG 接口,并且成功安装了驱动程序。该实验使用安装在主机上的RedHat9 和主机上的Linux 操作系统,以及ARM-Linux-GCC3 交叉编译工具。
单独使用X86架构、ARM架构与移植流程平台对比分析信息存储空间占用情况、重复信息剔除效率。
3.2.1 存储空间
添加Flash 分区信息,在目标板中的存储空间为64 MB,将其划分为4个区域,分别是分区1(占用1 MB空间)、分区2(占用3 MB 空间)、分区3(占用40 MB空间)、分区4(占用20 MB 空间)。
分别使用X86 架构、ARM 架构与移植流程平台对空间占用情况进行对比分析,对比结果如图6所示。
图6 不同架构空间占用情况对比分析
由图6 可知,使用X86 架构,分区1 所占空间为3 MB,分区2 所占空间为6 MB,分区3 所占空间为43 MB,分区4 所占空间为12 MB;使用ARM 架构,分区1 所占空间为2 MB,分区2 所占空间为6 MB,分区3 所占空间为32 MB,分区4 所占空间为24 MB;使用移植流程平台,分区1 所占空间为1 MB,分区2 所占空间为3 MB,分区3 所占空间为40 MB,分区4 所占空间为20 MB。由此可知,使用移植流程平台在目标板中的存储空间分区结果与实际需求一致。
3.2.2 重复信息剔除效率
分别使用X86 架构、ARM 架构与移植流程平台对比分析重复信息剔除效率,对比结果如表1 所示。
表1 不同架构重复信息剔除效率对比分析
由表1 可知,使用X86 架构最高剔除效率为60%;使用ARM 架构最高剔除效率为75%;使用移植流程平台最高剔除效率为99%,由此可知,使用移植流程平台重复信息剔除效率较高。
该文设计了一个由X86 构架到ARM 构架的应用移植流程平台,以满足当前社会发展的需要,具有良好的市场前景和强大的扩展能力。通过实验可知,该平台存储空间分区结果与实际需求一致,其最高重复信息剔除效率高达99%,移植效果较好,具有较强的性能。根据平台后期开发和运行的需要,提出了初步解决方案,为平台的后期运行和产品开发提供了依据。