周兆丰,侯向锋
(湖北师范学院,黄石435002)
以手机和信息家电为代表的嵌入式系统的应用开发已经成为现代工业最热门的领域之一,其灵魂就是嵌入在其中的计算机系统——嵌入式系统。嵌入式系统仿真环境是支持嵌入式系统软件开发的一种快速、高效和低成本的工具,对于提高嵌入式系统的开发效率和开发质量具有重要意义。SkyEye是一个支持多架构、多核并且具有高度可扩展性的硬件仿真平台,是国内最优秀的开源软件(opensource software)项目之一,中文名字是“天目”。SkyEye的目标是在通用的Linux和Windows平台实现一个仿真集成开发环境,模拟常见的嵌入式计算机系统,使μ Clinux以及μ C/OS-II等多种嵌入式操作系统和各种系统软件(如TCP/IP、图形子系统、文件子系统等)能够良好运行,并可对它们进行源码级的分析和测试。
如果要学习Linux操作系统或者进行嵌入式系统开发,但缺少硬件支持,嵌入式系统仿真环境软件SkyEye将是一个非常有效的学习工具和开发手段。如果想研究与具体硬件无关的系统软件(如TCP/IP协议栈等),采用SkyEye可以有效地提高工作效率。
构建基于SkyEye的嵌入式系统仿真环境是借助于该仿真环境进行学习和研究的前提。但是目前基于Sky-Eye的嵌入式系统仿真环境的构建没有详细、系统的说明资料。在不同版本的Linux环境下,采用源码安装方式安装软件所需的库文件和软件包的种类各不相同。安装编译源码时所需的库文件和软件包,也就是编译环境的配置。通常源码安装需要编译器(预处理器、C编译器和汇编器),链接器等开发工具以及相关的程序库(C或C++标准库和特殊软件需要的支持库)支持。而像SkyEye这样的专业软件安装还需要额外的库文件和软件包支持,并且所需的库文件和软件包随着Linux版本的不同而不同,安装过程较为复杂。这也是SkyEye源码安装难以成功的最主要原因。
因此在SkyEye的安装过程中,配置编译环境是比较困难的,更是至关重要的。本文在说明基于SkyEye的嵌入式系统仿真环境如何构建的过程中,详细讲述了如何配置SkyEye所需的编译环境,为快速构建基于 SkyEye的嵌入式系统仿真环境提供了良好的方案。
SkyEye在Linux上的安装方式主要有两种,分别是二进制的RPM包安装和源码安装。
二进制的RPM包安装主要是针对普通用户的,通过命令rpm–ivh skyeye-1.2.9-rc1.i386.rpm就可以将其安装到默认的/opt/skyeye路径下。RPM包安装虽然被广泛应用于 Radhat、Fedora、SUSE 和 Mandriva等 Linux版本,但仍然有很多其他的Linux版本不支持此安装方式,因此其应用受到很大限制。
源码安装就是需要对源代码进行重新编译的安装。这种安装方式不仅适用于所有版本的Linux系统,而且可以自行修改编译参数、增加或删除相应功能。最新的Linux软件版本一般都是先以源码形式出现的,所以源码安装方式在Linux上最为流行。本文讨论的基于SkyEye的嵌入式系统仿真环境的构建也是以源码安装方式进行的。
构建基于SkyEye的嵌入式系统仿真环境通常需要以下几个的步骤:
①配置编译环境;
②SkyEye软件安装;
./configure;
make;
make install;
③交叉工具链安装;
④测试。
能否正确配置好所需要的编译环境是源码编译成功与否的关键所在。配置SkyEye的编译环境,就是安装编译SkyEye源码时所需要的开发工具包、关键库文件、头文件等。由于Linux版本以及安装风格的多样性,导致很难确定SkyEye所需要的编译环境。下面以刚安装好未作任何设置的Ubuntu环境为例,讲述如何正确、有效地配置SkyEye所需要的编译环境。
为了提高安装效率,需要对Ubuntu系统作一些必要的设置,如切换到root用户和更新源列表source.list等。
(1)切换到root用户
安装是需要权限的,在 root用户下操作可以省去很多麻烦。更改root用户步骤如下:
①sudo passwd root;(输入当前用户密码后并设置root用户新密码)
②su root;(输入新密码后进入root用户)
(2)更新源列表source.list
source.list就是下载软件和更新系统的源列表,对用户成功安装SkyEye非常重要。可以通过netselect和netselect-apt命令自动生成源列表,也可以手动操作得到。手动操作的步骤如下:
①在ubuntu论坛上(http://wiki.ubuntu.org.cn/Template:8.04source)找到与 Ubuntu8.04对应的源列表,然后再根据实际的网络情况选择更新源;
②通过cd/etc/apt,进入apt目录;
③通过cp soure.list source.list_bak,备份源列表;
④通过gedit source.list,把需要的源(如成都电子科技大学、上海交通大学、中国科技大学)复制到最前端,然后保存;
⑤通过apt-get update,更新源列表,并借助于提示看选择是否合适。若存在不合适的源,则删除,最终可使下载的速度达到最佳。
如何快速、有效、全面地配置SkyEye所需要的编译环境是本文讨论的重点,也是构建基于SkyEye的嵌入式系统仿真环境的难点。要配置SkyEye所需要的编译环境,首先要明确SkyEye需要什么样的开发工具和软件包支持。用户可以通过下面几种方法来获得所需要的信息并进行相关的配置。
①通过SkyEye提供的 INSTALL、README和UserManual来得到源码安装所需要的信息。权威的官方资料给出了必要的信息和常规的安装步骤,但是信息不够全面,没有告诉用户如何针对具体的 Linux平台(如Ubuntu)去配置编译环境,用户仍然需要去自己查找所需要的软件包,难度较大。
②通过分析configure.in等文件得到。因为configure.in文件是对由autoscan扫描源代码后形成的configure.scan更改得来的,是形成configure脚本文件的基础,是执行./configure命令的主要依据,所以其提供的信息最全。但是要想从中提取出SkyEye所需要的信息,必须具有一定的专业知识。因此该方法不适用于一般的用户。
③通过apt-cache showsrc skyeye命令语句得到。showsrc命令会列举出SkyEye编译时依赖的软件包。用户只要通过“apt-get install+软件包列表”命令,就可以安装绝大多数必需的软件包,在多数情况下都可以配置好SkyEye所需要的编译环境。
④通过apt-get build-dep skyeye命令语句得到。build-dep是专门配置将要安装软件所需编译环境的语句。利用该命令配置的编译环境比方法③配置得更全面。
但是利用方法③和方法④配置SkyEye的编译环境是有前提的,那就是Ubuntu的软件库里要有 SkyEye软件存在。对于Ubuntu8.04来讲,软件仓库中SkyEye的版本为1.2.3(Ubuntu9.10软件库中SkyEye的版本为1.2.5),版本相对较老。因为新老版本的SkyEye所需要的编译环境大体相似,所以可以利用方法③或方法④来配置编译环境。但是配置后,还需要再安装新版本额外需要的软件包。
⑤通过auto-apt run./configure命令自动得到。当采用源码方式安装一个软件,却因为缺少头文件而失败时,auto-apt可以搜索到包含头文件的包并自动安装该文件。虽然此方法需要先安装build-essential软件包,但是可以获得较完整的编译环境。
该配置方法是直接针对configure脚本来进行自动安装的,适用范围很广。无论是新版本的软件还是旧版本的,无论Ubuntu软件库中是否存在要安装的软件,只要configure脚本信息全面,就可以把编译环境配置成功。
在Ubuntu8.4环境下,安装SkyEye的一种最简单的方法就是通过apt-get install skyeye命令语句来实现。安装的是软件库中的SkyEye1.2.3,版本较老,而且只具备基本功能。
对于源码安装来说,安装之前需要先对源码包进行解压,然后进入解压后的目录。通过下面的命令实现:
tar xzvf skyeye-1.2.9-rc1.i386.tr.gz;
cd skyeye-1.2.9-rc1;
进入目录后,用户可以通过下面几种方法来实现SkyEye的安装:
(1)基本安装
通过这种安装方法,用户可以得到SkyEye-1.2.9版本最基本的功能。安装步骤如下:
①apt-apt-get install build-essential;
build-essential软件包包含一个列表,表中列出了在编译Ubuntu软件包时所必需的软件包(如C与C++编译器等)。
②apt-get install binutils-dev;
binutils-dev软件包是GNU二进制工具(BFD开发文件),依赖于binutils,安装此软件包会同时安装binutils软件包。binutils是一套用来构造和使用二进制文件所需要的工具,是用来编译、测试和分析软件的。binutils最重要的成员是汇编器as和链接器ld,还包括一些二进制代码工具。
③apt-get install libreadline5-dev;
readline库用于向需要提供命令行界面的不同程序提供一个一致的用户界面。libreadline5-dev依赖于软件包libncurses-dev,安装libreadline5-dev时会同时安装libncurses-dev软件包。
④./configure--prefix=/usr/local|tee simple_install.log;
./configure主要是用来测试编译环境的,成功执行该命令后会生成一个makefile文件。该文件包含编译的过程和所需要的库。--prefix=/usr/local是用来指定安装路径的。tee simple_install.log是用来生成一个日志文件的,生成的日志文件记录了./configure的执行过程。这样可以供用户详细分析整个过程和找出缺少的文件信息。
⑤make;
按照makefile文件来编译和执行。
⑥make install;
把编译好的文件安装到指定目录。
(2)通过build-dep或showsrc提供的软件包列表安装
利用build-dep或showsrc命令安装的主要区别在于,build-dep可以自动安装build-essential软件包文件,而showsrc不会。下面给出利用build-dep命令安装skyeye的步骤:
①apt-get build-dep skyeye;
创建skyeye的配置环境;
②apt-get install libreadline5-dev;
③./configure-prefix=/usr/local|tee build-dep_install.log;
④make;
⑤make install。
(3)通过auto-apt安装
使用auto-apt命令前,需要先安装该命令并更新数据库。通过下面的命令实现:
apt-get install auto-apt;
auto-apt update&&updatedb&&update-local。
auto-apt工具安装好以后,再通过下面的步骤来安装SkyEye:
①apt-get install libreadline5-dev;
②apt-get install gawk;
awk是一个程式语言,对于资料的处理具有很强的功能。gawk是GNU所做的awk,gawk包含awk的所有功能。
③apt-get install f77;
f77就是指GNU的Fortran77编译器。auto-apt可以自动安装,但是当找不到相应文件时,不会自动跳过此文件的安装(如gawk与 f77)。安装步骤②与③是为了使auto-apt更顺利地执行。
④auto-apt run./configure-prefix=/usr/local|tee auto-apt_instll.log;
⑤make;
⑥make install。
用户通过方法(1)安装SkyEye,只能得到其最基本的功能。建议用户使用方法(2)或方法(3)安装SkyEye。方法(2)适用于所有版本的SkyEye;而方法(3)只适用于具有configure脚本的SkyEye的安装,也就是说版本要在1.2.5以上。但是方法(2)不能完全提供新版本需要的编译环境,还需安装新版本额外需要的软件包。方法(3)几乎可以满足编译环境的需要,除非auto-apt在configure脚本中没有发现需要安装的软件包。另外需要注意的是,在执行./configure或者make阶段警告是不影响正常安装的,但是错误提示的问题必须要解决,否则安装不成功。
本文以无MMU的 ARM7TDMI为测试用处理器内核,所以要安装交叉编译工具链arm-tools-elf20030314.sh。安装步骤如下:
①通过chmod+x arm-elf-tools-20030314.sh增加可执行属性;
②通过vi arm-elf-tools-20030314.sh打开此文件,然后到arm-elf-tools-20030314.sh文件的第39行,将tail+${SKIP}${SCRIPT}|gunzip|tar xvf–语句改为tail-n+${SKIP}${SCRIPT}|gunzip|tar xvf–并保存,以消除本身存在的错误;
③通过sh arm-elf-tools-20030314.sh解压此工具包到默认目录;
④通过输入arm-elf-再按Tab键,看是否出现一系列的arm-elf-xxx二进制工具,如果有 arm-elf-gdb等,则说明需要的工具已经在安装目录下;
⑤通过ldd arm-elf-gdb测试一下,看是否有(not found)文字。如果没有,则说明此调试工具可以用。其余类同。
利用SkyEye-1.2.9自带的测试例子arm_hello来验证搭建的交叉编译环境是否成功。测试步骤如下:
①利用cd/usr/local/testsuite/arm_hello命令进入测试例子目录;
②执行make指令,编译出可执行程序;
③执行skyeye–e hello后进入(skyeye)状态;
④在(skyeye)提示符下输入 start命令,启动调试功能;
⑤在(skyeye)提示符下输入 run命令,输出结果如图1所示。
图1 测试结果
测试结果说明测试程序arm_hello运行正常,证明了搭建的基于SkyEye-1.2.9的嵌入式系统仿真环境是成功的。
因为SkyEye-1.0.0之前的版本用户较少,所以本文只对SkyEye1.0.0及其以后的版本进行了安装测试。下面的测试都是基于apt-get build-dep skyeye来配置编译环境的。
①SkyEye-1.0.0、SkyEye-1.2.3及SkyEye-1.2.4的安装测试
因为SkyEye-1.0.0、SkyEye-1.2.3及 SkyEye-1.2.4三个版本都没有configure脚本,所以安装SkyEye-1.0.0时直接用make编译就可以了,而SkyEye-1.2.3与Sky-Eye-1.2.4需要用make NO_DBCT=1来编译。编译后把binary文件夹中的 skyeye可执行文件拷贝到/usr/local/bin中就可以了。
②SkyEye-1.2.5、SkyEye-1.2.6、SkyEye-1.2.7 及SkyEye-1.2.8的安装测试。
因为SkyEye-1.2.5、SkyEye-1.2.6、SkyEye-1.2.7 及SkyEye-1.2.8五个版本存在configure脚本,所以安装时需先执行./configure脚本,以生成makefile文件。五个版本都可以顺利地执行./configure。在执行make时,只有SkyEye-1.2.8需要安装texinfo软件包,命令为apt-get install texinfo。
最后执行make install就可以正确安装SkyEye了。由于测试程序方法与SkyEye-1.2.9类似,本文不再赘述。
总之,多个版本SkyEye的测试结果证明,本文提出的仿真环境构建方案是正确的、可行的。
[1]宋靖,吴庆波.嵌入式系统仿真运行环境SkyEye应用研究[J].微处理机,2007(2).
[2]陈渝,杨晔,李明,等.嵌入式系统仿真环境——SkyEye[J].电子设计应用,2004(2).
[3]王利明.一个开放源码的嵌入式仿真环境——SkyEye[J].单片机与嵌入式系统应用,2003(9).