2024年4月16日发(作者:)
总第268期
2012年第2期
计算机与数字工程
Computer&Digital Engineering
Vo1.40 No.2
l51
基于ARM的嵌入式Linux交叉编译环境的研究与实现
张欢庆
(1.山东师范大学信息科学与工程学院
摘要
济南
高丽。宋承祥。
商丘476000)(3.山东省教育厅济南250011) 250014)(2.商丘职业技术学院
构建交叉编译环境是嵌入式系统开发的基础,嵌入式开发的任何可执行程序都要使用交叉编译生成。文章详细介绍了如何构
建一套基于arm的嵌入式Linux交叉编译环境,通过仿真实验测试表明,能够使用x86平台的交叉编译工具开发ARM平台上运行的程序,
具有可靠的稳定性。
关键词嵌入式系统;交叉编译;linux;ARM;crosstool
TP311.1 中图分类号
Research and Implementation of Embedded Linux
Cross・compiling Environment Based on ARM
ZHANG Huanqing ’ GAO Li SONG Chengxiang。
(1.School of Information Science and Engineering,Shandong Normal University,Jinan 250014)
(2.Shangqiu Vocational and Technical College,Shangqiu 476000)(3.Education Department of Shandong Province,Jinan 250011)
Abstract Building cross—compiling environment is grounded in embedded system development,each of the executable program of em—
bedded development are generated by cross-compiling.This paper is focus on how to build a embedded Linux cross-compiling environment
based on arrlf,The artificial experiment result proves that using the cross-compiling tool of x86 platform can develop program which runs on
ARM platform.It also illustrated that the cross compiling environment had authentic stability.
Key Words embedded system,cross-compiling,AR
Class Number TP311.1
M,Linux,crosstool
1 引言
嵌入式系统是以应用为中心,以计算机技术为基础,软
件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、
功耗严格要求的专用计算机系统l】 ]。嵌入式系统开发的
第一步是搭建开发环境,可以直接在Linux上搭建,也可以
在Windows上通过cygwin来搭建,还可以利用VMware
本文采用Crosstool脚本工具来实现一次编译生成交
叉编译工具,该方法不仅比分步构建法简单很多,并且出错
的机会也非常少;而且比厂商提供的工具,容易修改,当系
统内核升级后,可以通过改变相关的配置文件的参数项,快
速实现新的交叉编译环境。对于嵌入式系统的开发来说非
常有用。
虚拟机进行构建。交叉编译环境是构建嵌入式Linux系统
开发环境过程中最为重要的一步l3]。在嵌入式系统开发
中,由于嵌入式开发板的存储空间和运算能力往往比较有
限,没有足够的硬件资源来运行编译和调试工具,所以,通
常嵌入式系统的软件开发需要采用交叉编译的方式,有效
地解决了这一问题。
2交叉编译原理
交叉编译简单地说,就是在一个平台上通过编译器编
译某个源程序,生成另一个平台上的可执行代码[5]。典型
的交叉编译指的是在PC机上编译出能在嵌入式目标机上
运行的可执行代码。因为嵌入式目标主机资源有限,不能
完成自身程序的编译工作,从另外一个角度,嵌入式主机上
运行的程序调试稳定后,很少需要修改,也没有必要具备完
目前,一般采用分步构建交叉编译环境或者使用由提
供开发板的公司制作的交叉编译工具_4]。分步构建交叉编
译环境的方法相对来说难度较大,通常情况下困难重重,制
成自身程序的编译工作。因此,在嵌入式系统开发时,往往
由宿主机开发程序,而目标机作为最后的执行机。两者在
开发时需要交替结合进行,如图1所示l_6]。
一
作过程中很容易出错或者编译不通过,并且编译过程需要
几个小时的时间,一般不容易成功。厂商提供的工具,都是
厂商测试通过的,可靠性很高,而且与开发板能够很好的吻
合,但是由于时间滞后的原因,往往都不是最新版本的,当
系统内核升级后,会出现兼容性问题。
般把编译程序的主机称为宿主机(Host),把运行程
序的嵌入式主机称为目标机(Target)。为了使宿主机上开
发的程序(应用程序和驱动程序)能够方便地下载到目标机
上运行,一般还要在宿主机上配置好网络,使其支持NFS
*收稿日期:2011年8月7日,修回日期:2011年9月13日
作者简介:张欢庆,男,硕士研究生,助教,研究方向:嵌入式系统、人工智能。高丽,女,硕士,助教,研究方向:智能计算。宋承祥,男,
博士,研究员,硕士生导师,研究方向:软件开发环境、电子政务。
152 张欢庆等:基于ARM的嵌人式Linux交叉编译环境的研究与实现 第4O卷
进行相应的修改。这两个文件是crosstool的编译的配置
/程序载入:宿主机到目、
RS232
文件。arm.dat主要用于配置文件、定义生成编译工具链的
名称以及定义编译选项。在ariD.,dat只需把编译生成的工
具链名称修改为:“TARGET—arm-linux”。gcc一3.3.6一
gblic 2.3.6.dat文件主要定义编译过程中所需要的库文件
以及它所定义的版本,如果在编译的过程中有些库文件不
存在时,crosstool会自动从相关网站上下载,相对比较智
!竺!:!竺
rj45
宿主机(x86) 目标机(tR入式设备)
图1嵌入式开发的交叉编译环境
或tftp等网络服务,从而实现两台机器之间的文件共享。
交叉编译环境一般由交叉编译器、交叉连接器和C程
能,也非常有用。在此只需要修改其中的LINUX—DIR,其
值为:linux 2.6.20。
序库glibc等一系列的交叉工具集组成l_7]。这些交叉工具
通过配置二进制工具Binutils包来产生。通常基于ARM
3.4执行ariD_,sh编译脚本
把arm.sh编译脚本文件和arm,dat与gcc-3.3.6一
的Linux交叉编译器为arm-linux gcc、交叉连接器arnl-
linux-ld。交叉编译过程如图2所示。
图2嵌入式开发的交叉编译过程
3构建交叉编译环境
3.1准备资源文件
从http://ftp:gnu.org上下载构建交叉编译工具链所
需的源文件[8 gcc-3.3.6.tar.gz、binutils-2.15.tar.bz2、
glibc-linuxthreads一2.3.2.tar.gz、linux-libc-headers一2.6.12.
0.tar.bz2和glibe一2.3.6.tar.gz;然后在http://ftp.kerne1.
org上下载linux内核源文件linux 2.6.2O.tar.gz;最后从
http://kege1.com/crosstool站点下载构建工具crosstool一
0.42.tar.gz。
为了便于管理和使用,在/home/rainfall/下新建一个目
录soure_file存放这些资源文件。然后在/home/rainfall下
使用tar命令解压crosstool-0.42.tar.gz。
3.2创建编译脚本文件
在/home/rainfall/crosstool-0.42目录下,创建一个
arlTl,sh的编译脚本,然后使用vi命令编辑其中的内容,如
下:
#!/bin/sh
set—ex
TARBALLS
DIR=/home/rainfall/source_file
RESULT
TOP=/opt/crosstool
export TARBALLSDIR RESULT-TOP
GOZ
LANGUAGES=”C,c+十”
export GCC
_
LANGUAGES
#really,you should do the mkdir before running this,
#and chown/opt/crosstool to yourself SO you don’t need tO run
as root.
mkdir P¥RESUL『_TOP
#build the toolchain.Takes a couple hours and a couple giga—
bytes.
eval cat arlT1.dat gcc-3.3.6一glibc-2.3.6.dat’sh al1.sh notest
echo Done.
3.3建立crosstool的配置文件
arrfu sh脚本文件中evaI命令需要使用的alTfl,dat和
gec-3.3.6 gblic 2.3.6.dat两个文件,需要根据系统的配置
gblic一2.3.6.dat配置文件准备好后,通过执行arm,sh脚本
来编译交叉编译工具,在crosstool一0.42目录下执行命令:
“
.
/ar.msh”。一般需要经过一个小时的漫长编译之后,在
opt/crosstool目录下生成新的交叉编译工具,内容如下
arm linux addr21ine arm-linux-ar arm linux as arm-linux-c++
arm linux c++filt arm-linux-cpp arm linux g++arm-linux-gcc
arm-linux-gcc-3.3.6 arm linux gccbug arm linux gcov arm-linux-
gprof
arm linux ld arm-linux-nm arm-linux objcopy armqinux-objdump
arm linux ranlib arm linux readelf arm-linux-size arm-linux-strings
arm-linux-strip fix-embedded-paths
其中,bin目录下是交叉编译器和一些工具,如编译器
arm linux gec是C交叉编译器,arm linux g+十是c++编
译器,arm-linux-as是汇编器,arm linux ld是链接器。还有
一
些常用的工具,如arm linux-ohjeopy是二进制转换工具,
arm linux strip用来去掉影像文件的调试信息,使得文件变
小等。对于一般的应用这几个工具已经足够了。
3.5添加环境变量
生成交叉编译工具链之后,并不表示交叉编译工具链
已经可以使用,还需要修改linux的环境变量PATH,否则
是不能使用刚才的交叉编译工具链进行嵌入式开发的。在
linux系统“/etc/bash.bashrc”文件的最后一行,将生成的编
译工具链路径添加上即可,其代码为“export PATH一/
opt/erosstool/gcc-3.3.6 glibc一2.3.6/arm-tinux/bin:
¥PATH”。设置完环境变量,交叉编译工具链也就全部构
建完成。
3.6仿真验证测试
我们使用Windows操作系统+VMware工具+Linux
操作系统的仿真环境进行测试[9],采用开源项目SkyEye模
拟ARM硬件环境[1 。从官方网站上下载skyeye 1.3.2
一
rc1.tar.gz,然后将其安装到Linux操作系统中。使用sky—
eye前,必须要对它进行配置。skyeye.conf文件是skyeye
的默认配置文件。通过编写合适的skyeye.conf文件,可以
配置出任何skyeye支持的硬件环境。
由于s3e2410在国内比较流行,了解的人比较多。同
时,skyeye对这一平台的支持也是非常成熟且资源丰
富L1 。我们采用在由skyeye模拟的s3c2410x这一硬件平
台,进行硬件的仿真测试。下面是进行仿真验证测试用的
基于s3c2410x芯片skyeye.conf配置文件。
cpu:arm920t
math:s3c2410x
#physical memory
mem
_
bank:map:M,type—RW,addr一0x00000000,size一
0x00800000.file=./xxx.bin
2012年第2期 计算机与数字工程 153
memS1Ze
bank:map—M,type—RW,addr一0xc0800000,
0x00800000
#all peripherals I/O mapping area
mem
bank:map—I,type—RW,addr一0x48000000,
S1Ze :
0x20000000
mem
_
bank:map—I,type—RW,addr一0x19000300,size一
0x00800020
在linux系统中利用vi编辑器编写一个example.c,其内容如下:
#define UFCON0((volatine unsigned int*)(0x50000020))
void example()
、
char*t一”this is an artificial experiment based on sky—
eye!n”;
for(;*t;t++)
*UFCON0=*t:
while(1);
)
在Linux系统的终端命令里分别依次运行arm-linux-
gcc、arm-linux-ld、arm-linux-objcopy命令,经过一系列的处
理后,最终生成一个只包含程序机器码的二进制文件ex—
ample.bin。
将配置文件skyeye.conf中“file一./xxx.bin”的xxx.
bin改为example.bin,并且把skyeye.conf与example.bin
放置在同一个文件夹下。在终端中运行skyeye命令,就会
看到如下结果,如图3所示。
图3仿真实验生成结果
4结语
本文介绍了一种利用crosstool构建基于ARM的嵌入
式Linux的交叉编译环境的方法,通过使用开源项目Sky—
Eye模拟ARM硬件环境进行仿真验证测试,实验结果表明
能够使用x86一ARM的交叉编译工具进行ARM平台上的
嵌入式系统开发,具有可靠的稳定性。
参考文献
[1]吕京建,肖海桥.面向二十一世纪的嵌入式系统综述[J].电子
质量,2001(8):10—13.
LV Jingjian,XIAO Haiqiao.Embedded System for 21st Cen—
tury[J].Electronics Quality,2001(8):10—13.
[2]张玢,孟开元,田泽.嵌入式系统定义探讨[J].单片机与嵌入式
系统应用,2011,11(121):6-8.
ZHANG Bin,MENG Kaiyuan,TIAN Ze.Discussion on the
Definition of Embedded System[J].Microcontrollers 8L Em—
bedded Systems,201I,I1(121):6-8.
[3]康涌泉,桑楠,邹楚雄,等.嵌人式Linux交叉开发环境[J].计
算机应用,2006,26(s1):261-263.
KANG Yongquan,SANG Nan,ZOU Chuxiong,et a1.Em—
bedded Linux Cross-development Environment[J].Computer
Applications,2006,26(S1):261—263.
[41贺丹丹,张帆,刘峰.嵌入式Linux系统开发教程[M].北京:清
华大学出版社,2010:149—151.
HE Dandan,ZHANG Fan,LIU Feng.Embedded Linux Sys—
tenr Development Course[M].BeiJing:Tsinghua University
Press,2010:149—151. ’
[5]尤盈盈,孟利民.构建嵌入式linux交叉编译环境[J].计算机与
数字工程,2006,34(6):31—32,78.
Y0U Yingying,MENG Limin.Building Embedded Linux
Cross—compling Environment[J].Computer&Digital Engi—
neering,2006,34(6):31-32,78.
[6]俞辉,李永,何旭莉,等.嵌入式Linux程序设计案例与实验教
程[M].北京:机械工业出版社,2009:12—13.
YU Hui,I I Yong,HE Xuli,et a1.Embedded Linux Program
Design Case and Practice Course[M].BeiJing:China Machine
Press,2009:12-13.
[71李宇丽.基于ARM的嵌入式Linux系统的研究及应用[D].西
安:西安电子科技大学计算机学院,2007:18—20.
LI Yuli.The Research and Application of Embedded Linux
System Based on ARM[D].Xi’an:School of Computer Science
&Technology,Xidian University,2007:18—20.
[8]李亚锋,欧文盛.ARM嵌入式Linux系统开发从入门到精通
[M].北京:清华大学出版社,2007:37—47.
LI Yafeng,OU Wensheng.ARM Embedded Linux System
eDvelopment from guide to master[M].BeiJing:Tsinghua U—
niversity Press,2007:37—47.
[9]刘永林,梁莹,王诗琴,等.基于Linux的嵌入式交叉编译环境
的建立及实现[J].电脑开发与应用,2011,24(7):68—70.
UU Yonglin,LIANG Ying,WANG Shiqin。et a1.Building-up
and Realization of Embedded Cross—compiler Environment
aBsed on Linux[J].Computer Development 8L Applications,
2011,24(7):68—70.
[101陈渝,杨晔,李明,等.嵌入式系统仿真环境--SkyEye[J].电子
设计应用,2004(2):69—71.
CHEN Yu,YANG Ye,LI Ming,et a1.Embedded System
Simulation Environment-SkyEye[J].Electronic Design&
Application,2004(2):69—71.
[11]龙新辉,陈俊杰.基于嵌入式Linux的以太网卡驱动设计与实
现口].舰船电子工程,2011,31(3).
LONG Xinhui,CHEN Junjie.Design and Implementation of
Ethernet Driver Based on Embedded Linux[J].Ship Electron—
ic Engineering,201i,31(3).
[121李无言.一步步写嵌入式操作系统一ARM编程的方法与实践
[M].北京:电子工业出版社,2011:15—17.
LI Wuyan.Writing Embedded Operating System step by step-
technique and practice of ARM program[M].BaiJing:Pub—
lishing House of Electronics Industry,2011:15—17.
发布者:admin,转转请注明出处:http://www.yc00.com/web/1713278904a2217607.html
评论列表(0条)