基于ARM Linux 嵌入式系统开发环境的快速构建方法* ①
2015-04-13陶维成姚学军
陶维成,姚学军
(芜湖职业技术学院软件创新中心,安徽 芜湖241006)
0 引 言
近年来,嵌入式系统广泛应用于移动智能、物联网、可穿戴计算、智慧城市等新兴领域.2014 年8月,在中国深圳举行的一年一度工业计算机及嵌入式系统展上,最受关注的是利用嵌入式系统技术作为物联网、智能家居等相关的智能化硬件解决方案[1].嵌入式系统除了应用于新兴领域外,在传统行业也得到了进一步应用,如工业控制、安防、航空航天、智能家居、智能交通等,在当前的生产生活中,嵌入式系统无处不在[2~3].
随着嵌入式系统技术和应用的不断发展和深入,从事嵌入式系统研究与开发的人员将越来越多,构建好嵌入式系统开发平台是进行研究、开发的重要基础环节.由于嵌入式系统开发环境相对于传统的PC 开发环境较为复杂,当前国内外尚无此类集成开发环境(IDE),鉴于此,本文以ARM S3C2440 作为开发板,以内核为Linux 2.6 的Linux作为嵌入式操作系统,快速构建嵌入式系统开发环境,其它嵌入式处理器、嵌入式操作系统,如ARM系列、MIPS,以及μC/OS、WinCE、Andorid 等,其构建方法和原理基本相同,本文不再赘述.最后,对构建的开发平台进行了测试,以及下一步工作.
1 构建嵌入式系统开发环境
在构建嵌入式系统开发环境时,事前在软件、硬件及其它工具方面应做一些准备工作,然后按照步骤,快速构建起嵌入式系统开发环境,实现开发产品的功能.
1.1 软硬件开发工具
在构建嵌入式系统开发平台时,需要准备基本软硬件工具.软件工具主要有:Linux 2.4 内核以上的操作系统及源代码、WindowsXP 或Window 7、VMware、FTP、GCC 交叉编译工具、JTAG 驱、串口通讯工具、Bootloader 源代码,如VIVI 或Uboot 或其它的BootLoaer 等.
硬件工具主要有:一台带有串口的PC 机用作主机ARM 目标板、串口线、交叉或直通以太网线、USB 数据线等.
构建完成后的嵌入式系统开发平台如图1 所示.
1.2 嵌入式系统开发环境构建步骤
构建嵌入式系统开发环境步骤包括:建立硬件环境;建立交叉编译环境;Bootloaer 的编译与移植;Linux 内核裁剪、编译与移植;根文件系统的建立与移植;验证性测试等.
1.2.1 主机工具配置与硬件环境的建立
主机上需具备的环境主要有:Windows XP 或Windows 7、安装虚拟机VMware6.0 以上版本、串口通讯工具,如超级终端或SecureCRT 或Linux minicom 等,在虚拟机中安装Linux 2.4 以上版本或安装双操作系统.其中,串口属性设置为:波特率为“115200”、数据位为“8”、奇偶校验为“无”、停止位为“1”、数据流控制为“无”.
硬件环境包括:(1)开发板串口与主机串口相连接;(2)开发板网口与主机网口连接;(3)JTAG与开发板相连,将开发板上的JTAG 打到JTAG 开关,以便用来烧写BootLoader.
1.2.2 Linux 内核的裁剪与移植
(1)建立交叉编译环境
下载与Linux 操作系统内核版本相对应的交叉编译工具到指定的目录下,如/usr/local/arm/cross-2.95.3.tar.bz2,解开交叉编译工具包,tar xjvf cross-2.95.3.tar.bz2.为了在任一目录都能执行交叉编译器,需要配置环境变量,使内核和其它应用程序均可使用诸如arm-linux-xx 来指定使用该交叉编译器.在/etc/profile 文件中添加交叉编译器的执行路径,如/usr/local/arm/2.95.3/bin,或在/.bashrc 中添加export PATH = /usr/local/arm/2.95.3/bin/:$PATH.
图1 嵌入式系统开发平台
(2)BootLoader 编译与烧写
BootLoader 的作用主要有:将操作系统内核从flash 拷贝到RAM 空间,并执行内核;初始化硬件;提供写入flash 的功能;基于命令的用户操作界面.
准备BootLoader 源文件,本文以VIVI 为例,其源代码包为vivi.tar.gz.将源代码包拷贝到相应目录下并解包,如tar xzvf/usr/local/arm/myarm/vivi.tar.gz.解完包之后,到vivi 目录下,用make menuconfig 对bootloader 进行配置,快速方法是选择默认配置文件,然后使用make 进行编译,编译完成后,在vivi 目录下生成一个名为vivi 的二进制文件.
用JTAG 烧写vivi 到开发板,执行JTAG 相应的命令,如Jflash/f:vivi,此后出现三次要求输入参数,第一次是让选择Flash,选0;第二次是选择JTAG 对flash 的两种功能,也选0;第三次是让选择起始地址,选0.此后等待大约3 ~5min 的烧写时间,当VIVI 烧写完毕后选择参数2,退出烧写,如图2 所示.
图2 Bootloaer 烧写
(3)Linux 内核配置、编译与移植
下载Linux 所需版本内核源代码包到指定目录下,解开包之后,产生一个名为kernel 源码目录.在进行嵌入系统开发时,应根据产品软硬件实际需求,对Linux 内核进行定制,最大程度缩小内核体积,可用可视化方式进行裁剪,make menuconfig,如图3 所示.
图3 Linux kernel 配置界面
当内核配置完成之后,接着就是编译内核,其命令为make clean、make dep、make zIame,当编译成功之后,生成zImage 文件,该文件位置在内核源码下的arch/arm/boot 下面.
通过串口写入内核到开发板.复位开发板,按空格键,进入vivi,输入:vivi >load flash kernel x 回车,如图4 所示.
图4 通过串口移植Linux 内核
1.2.3 移植根文件系统
准备好或自己制作根文件系统,通过串口或USB 下载到开发板上的flash 相应分区中,下载方法与内核烧写相同.vivi >load flash root x 回车.
当文件系统下载完成时,此时一个基于Linux的嵌入式系统开发环境基本构建完成.但需要注意的是,要实现主机、开发板之间互联互通,简单而又实用的办法是计算机网络通信,因而需要将它们组建成一个局域网,以便开发文件能够上传、下载和远程控制.
此外,开发人员应能较熟练使用Linux 常用命令、工具和服务、C/C++语言、GCC 编译器等.
2 字符设备驱动程序示例
字符设备是Linux 嵌入式系统主要设备之一,Linux 设备分为三类,一类为字符设备,如触摸屏、超声波传感器、红外传感器等,一类为块设备,如flash、硬盘等,一类为网络设备[4].这些设备需要相应的驱动程序来驱动,在Linux 中,驱动程序是内核的一部分.在整个嵌入式系统中,驱动程序的设计与开发属于板级支持包(BSP)范畴[5].
驱动程序开发包括两个部分,一是底层驱动设计,一是上层应用测试.一个Linux 字符设备驱动程序主要包括4 个部分:(1)所需要的头文件;(2)对设备的操作:打开(open)、控制(control)、关闭(close)等;(3)文件的操作(file_operations);(4)设备的注册与初始化、卸载(module_init、module_exit).下面以一LED 设备驱动为例给出Linux 字符设备驱动程序架构.
(1)头文件部分
(2)接口部分
(3)设备操作部分
(4)文件操作部分
(5)设备的初始化和卸载
3 小 结
嵌入式系统应用领域越来越广泛,好的开发环境无疑对开发起到便捷作用.本文阐述了嵌入式系统所需要的软硬件,接着详细地给出了构建一个嵌入式系统开发平台的步聚.下一步工作,开展对嵌入式系统集成开发环境的研究,以期为广大学习、研究、开发嵌入式系统人员提供性能较好的平台.
[1] 嵌入式系统已成智能硬件与物联网天下[EB/OL〛.http://www.esmchina.com/ARCH_2014_8_01_10.htm.
[2] 施乐平,杨征宇,马宪民等.ARM 嵌入式系统综述[J].中国测试,2012,38(12):14-16.
[3] 王树红.嵌入式系统的现状及发展趋势[J].太原大学学报,2007,8(2):121-122,139.
[4] 刘淼.嵌入式系统接口设计与Linux 驱动程序开发[M].北京:北京航空航天大学出版社,2006.
[5] 郑灵翔.嵌入式接口技术与Linux 驱动开发[M].北京:北京航空航天大学出版社,2010.