刘睿洋
(山东科技大学 山东省泰安市 271000)
嵌入式系统的构成上主要包括两个部分,即计算机的硬件部分和软件部分。ARM系列属于计算机硬件;Linux系统属于计算机软件类。嵌入式系统所以计算机技术成果,是建立在满足用户个性化需求的基础上的。在硬件和软件方面,具有加减特性,无论是部件的增加或者减少,都会保证系统的正常运行,而且系统的性能可靠。系统在运行中具有良好的灵活度,功耗比较低,而且成本得到有效控制,且具有长时间的待机时间。嵌入式系统中,ARM作为架构硬件平台存在。系统的各项操作80%以上都可以在这个平台上完成[1]。Linux系统所发挥的作用也是如此。ARM将位数不断扩展,功能也会不断增强,使得智能化的软件系统的建构更为方便。嵌入式系统的CPU与普通的计算机系统不同,ARM的编址上,内存与I/O设备是同时进行的,指令系统得到优化,指令的灵活度比较高,也提高了系统的运行效率。ARM将存储器使用寄存器代替,系统的运行速度得到提升。在编址的时候,将大端格式与小端格式结合,灵活的组织形式使得操作更加方便。ARM和Linux都是嵌入式系统具有代表性的产品,要在ARM平台下实现Linux嵌入式系统移植,就要针对相关的问题深入研究。
Linux系统作为一个操作系统,其是公开源代码的操作系统软件,开放的源代码,只要登上Linux官方网站,每个版本都可以下载后安装使用。这项功能与嵌入式系统的要求相符合,也就是说代码的使用的过程中是可以灵活定制的,以满足个性化需求,当然,在普通的计算机上可以运行,在任何的智能终端设备上也可以运行。根据有关统计数据显示,当前Linux软件已经在超过一半的智能设计软件上应用,内核使用模块化的配置,在使用中可以灵活组合。Linux软件有一个非常重要的特点就是编译非常容易。即便是非常简单的代码也可以使用GCC编译,代码模块化,使用make就可以统一编译。编译代码完成后,在下一次编译的时候,对修改之后的代码进行编译即可,编译时间缩短了,工作效率提高了。这种编译方法更加灵活,代码开发效率也有所提高[2]。
从Linux操作系统的构成上来看,引导程序、根文件系统和内核程序是重要的内容。Linux系统所具备的优势是其是可以移植的。在普通的计算机上将Linux系统安装好,安装的方法有两种选择,一种是单独安装,一种是虚拟机安装,之后进行交叉编译,程序再编译好之后,可以通过串行口下载,也可以通过模拟串行口下载到主机上,运行之前要做好调试工作。在Linux操作系统的应用中,修改I/O设备加方便,能够灵活调试软件和硬件。
构建交叉开放环境,需要将交叉工具链构建起来,主要采用如下的三种方法。
第一种方法,分步编译并将库和源代码都安装好,满足交叉编译工具链的需求,交叉编译工具链形成。使用这种方法有很大的难度,具备专业能力的人可以尝试使用这种方法,如果是普通用户,究和构建跨工具链的读者。如果只想使用交叉刀具链,可以考虑使用如下的两种方法[3]。
第二种方法,使用Crosstool-ng脚本工具进行一次编译,交叉编译工具链就能够形成。这种方法比第一种方法要简单得多,而且误差很小,建议使用。
第三种方法,下载直接通过Internet生成的交叉编译工具链。这种方法的优点是毋庸置疑的,当然,它既简单又容易,但同时也有一些缺点,即在应用的过程中有一定的局限性,毕竟它是由别人建造的,也就是说,它是固定不变的,没有很强的灵活性[4]。因此,用于生成的库和编译器版本与正在编译的程序很有可能存在不适应性。在使用过程中会有一些错误是无法解释的,所以使用这种方法的时候也要谨慎。cross tool-ng是一种脚本工具,交叉编译工具链的使用中能够适合各种平台。制作之前,需要安装软件才可以,诸如bison、crosstool、g++、patch、libncurses5-dev、libtool、flex texinfo automake等等。其中,crosstool脚本工具的使用中,可以将软件下载到本地,解压处理后就可以按照提示安装了。这种配置与内核的配置有相似制定出,将源码包路径设置好,将安装交叉编译器的路径设置好,根据需要对交叉编译器进行修改[5]。增加编译的时候,并行进程数增加,运行效率就会有所增加,编译的速度加快。将JAVA编译器编译,编译的时间就会有所减少。
u-boot编译好之后下载到计算机内存中就可以运行的。具体的操作过程是,将开发板网配置好之后,配置IP地址到内存,形成环境变量,为$setenv ipaddr 191.164.0.5,之后在nandflash的参数区保存。
在测试网络的过程中,设置好虚拟机的IP地址,191.164.0.7。
在网络测试中,如果存在没有连接好的问题,就要对网络进行检查并及时处理。网络正常运行之后,要检查开发板和虚拟机的IP地址,要求两者都处于同一个网段上。使用桥接的方式使得虚拟机网络运行正常。在开发板的连接过程中,对虚拟机进行静态IP地址设置[6]。
启动开发板的时候,可以切换到nandflash。具体的方法是,将开发板关闭,将SW1的开关4向4的那边波动。此时,开发板启动的时候,就可以通过nandflash启动。
kernel的配置中,第一次进去时候,不需要有任何的操作,推出的过程中可以看到配置信息是否保存的问题,此时已经要进行保存操作,这样就可以在.config中将开发平台的各项信息保存好,避免丢失[7]。
需要注意的是,make menuconfig的过程中,系统处于哪种运行状态?当有界面图形化呈现的时候,要知道为什么会这样?图形化的界面中有一些内容,要明确这些内容是从哪里来的?
当然,图形界面的形成不是偶然,是通过图形库实现的。在首次进行menuconfig制作的时候,系统中不会显示图形界面,而是报告了错误操作,并提示我们缺少ncurses devel。这个时候就需要进行libncurses 5-dev安装。受到图形库的支持,Sudo apt get install libncurses运行,就会有图形界面呈现出来。
当内核进行make menuconfig配置的时候,系统会自动将菜单配置读出来,这是kconfig在发挥作用,之后在kconfig保存。在内核的编译过程中,.config会被makefile调用,使得配置信息能够完整地保存下来,避免出现配置信息丢失的问题,此时需要正确选择源代码,还要将编译源代码作为重要的参考依据。这样的操作之后,对于内核的用户配置就可以明确了[8]。Kconfig是对应于内核的配置菜单。针对内核的源代码,如果需要将新的驱动程序添加到其中,就要对kconfig进行修改,将配置菜单添加到驱动程序中,就可以对驱动程序进行选择了。驱动程序的编译过程中,对驱动程序中的makefile要做出修改,以满足程序运行的需求。
内存地址为setenv bootcmd tftp 20008000;zImage;go 20008000。虚拟机的地址为setenv bootargs nfs nfsroot=191.166.1.189;开发板的地址为/source/rootfs ip=191.166.1.199。在启动用户程序的时候,首先启动的是init=/linuxrc,串口设置为ttySAC0,115200,波特率是115200。
将环境变量保存,对开发板复位操作。将nfs挂载的文件系统设置好之后测试能否启动,这样就可以看到效果了[9]。在进行.内核测试以及启动的时候,整个的过程都有一定的复杂性,所以在操作之前需要做好各项准备工作,保证测试工作正常进行,才能获得准确的测试值。
Linux系统的引导程序运行的过程中,与普通的计算机差不多,即熟悉的BIOS,最接近硬件的软件程序。Linux系统所发挥的作用是在嵌入式系统中发挥桥梁作用,软件和硬件连接起来。在移植的过程中,将传输指令放置在物理地址00000000h的位置,跳转到系统程序的入口,进行硬件初始化运行,这些硬件包括ARM硬件、I/O设备、缓存、存储器、并行端口、串行以及LCD驱动程序。在移植的过程中,最为重要的是bootloader编程,所要实现的目的是保证bootloader和硬件初始化的安全性和可靠性,对硬件进行分析,提高移植效率。
Linux内核在arm平台下的移植是运用通信的方式将开发的程序下载到产品中,这其中所涉及到的内容很多,诸如arch、kenel、lib、boot、Mach等等,还包括一些文件目录,均属于Linux文件系统。在移植操作的过程中:首先是地址的配置工作,其中所涵盖的内容包括计算机的IP地址配置、主机的IP地址配置和虚拟机的IP地址;其次是对文件进行配置,所涵盖的内容包括xshell通信文件、模拟终端接口以及menuconfig文件等等;再次是make file文件的生成,之后要做好编译调试工作。Linux系统的根文件中涵盖有多项内容,主要包括JFFS2、ext2、cmpfs等等。在配置文件系统的时候,要考虑到系统运行的需要选择相应的文件。比如,选择CRAFS是为了满足系统的内存需要[10]。
通过对上面内容的研究可以明确,在嵌入式系统的ARM硬件和Linux软件进行研究的过程中,对于其优势予以分析,提出Linux操作系统具有移植功能。在ARM平台下移植,需要将交叉开放的环境搭建起来,重视bootloader的选择和移植工作,对kernel合理配置,并进行编译,保证移植顺利进行。