您的位置:首页 > 运维架构 > Linux

基于HK-2000 OEM的嵌入式Linux开发

2007-12-11 13:11 363 查看
HK-2000硬件操作手册V2.doc

v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

st1\:*{behavior:url(#ieooui) }

嵌入式开发环境的建立

嵌入式Linux
开发环境一般由如下几部分构成:Linux
服务器(宿主机)、个人PC机、嵌入式目标板和将它们连接在一起的网络环境,其具体结构如图所示:

图 linux开发环境的结构

如图所示的嵌入式Linux
开发环境中,Linux
服务器作为嵌入式Linux
内核编译、应用程序编译的公共平台,一般由单独的一台PC
机充当,安装常用的桌面标准Linux
操作系统,如RedHat
Linux 等。

工作站即为普通的局域网络计算机,可以是一台或多台,以支持小组项目开发,工作站一般安装常用的Windows
操作系统,仍然可以完成各种日常工作,当需要使用Linux
服务器资源时,可从工作站远程登录到Linux
服务器,以完成各项需要的操作。

嵌入式Linux
开发是宿主机—目标机(HOST-TARGET)交叉开发,这样你的系统编译工具要换成交叉编译工具,对于这个,你只需要指明它的路径即可,需要交叉开发环境,并且建立交叉编译环境:

你可以在HK-2000 的光盘中得到预先编译的交叉编译工具cross-2.95.3.tar.bz2。交叉编译工具一般由专门的机构负责维护,可以从网站http://www.arm.linux.org.uk上免费下载,当然得需要编译,网站上一般提供原码。以下描述已经编译好的交叉编译环境的建立过程:

首先以Root
身份在Linux
服务器上新建一个用于嵌入式Linux
开发的工作目录:/home/work,以后所有的开发工作都在这个目录下进行。

编译工具以压缩包的形式,文件名为:cross-2.95.3.tar.bz2,包括linux-arm-gcc编译器和一些实用程序,位于光盘的目录:Software\Linux\tools,我们要把交叉编译工具安装在Linux服务器的/usr/local/目录下。

当拿到压缩文件后,在Linux服务器的/usr/local目录新建子目录arm:

# cd
/usr/local

#
mkdir arm ;建立ARM目录

从PC机上通过FTP方式,将光盘中的文件cross-2.95.3.tar.bz2传输到Linux服务器的/usr/local/arm目录,然后以远程登录的方式,进行解压安装的操作:

# bunzip2
cross-2.95.3.tar.bz2

# tar jxvf
cross-2.95.3.tar.bz2

当以上的工作完成以后,就会在当前目录生成一个名为2.95.3的子目录,表明交叉编译器已经成功安装到了/usr/local/arm下。进入/usr/local/arm/2.95.3子目录,列表查看目录所包含的内容。

# cd
/usr/local/arm/2.95.3

#
ls

Arm-linux
bin include info lib man share test-if-write

嵌入式编译工具就安装在这个目录中,可以完成源代码的编译。

这样你的开发环境已经建立在/usr/local/arm/2.95.3/bin
下面,当然你需要使用的时候,应该指出编译器的位置。

嵌入式Linux内核的配置与编译

Linux之所以能成为一种流行的嵌入式操作系统,除具有功能强大、高性能、稳定性好以及源代码开发等优势以外,其最大的特点是Linux内核具有非常良好的结构,可由用户根据特定的系统需求,对内核进行配置或裁减,而这一特点恰恰满足了嵌入式应用的差异性需求。

嵌入式系统最大的特征是差异性,几乎每一个嵌入式应用都是唯一的,这种差异性体现在硬件方面,就表现为系统可以采用不同的微处理器架构,如X86、ARM、PowerPC、MIPS等,同时,即使采用同一种微处理器架构,不同生产商生产的微处理器也会有不小的差异,运行在这些嵌入式微处理器上的操作系统也会有所相同,因此,如何得到一个适合在某个特定的嵌入式系统上运行的Linux内核,是我们首先要解决的问题。

我们提供可以稳定运行在HK-2000的嵌入式Linux内核包,位于光盘目录:Develop\linux\source。

将该Linux内核源代码包linux-2.4.27.tar.gz拷贝到Linux服务器上我们约定的工作目录:/home/work,然后执行如下命令解压:

#tar
zxvf linux-2.4.27.tar.gz

该命令执行完毕后,生成目录linux-2.4.27.tar.gz。进入该目录,我们进行随后的操作。

Linux内核的配置(或裁剪)是与嵌入式系统的应用需求相适应的。尽管Linux内核功能强大,支持的设备众多,但对于一个特定的嵌入式应用来说,可能只会使用到其中的部分功能,而对于其它不使用的部分,如果让它驻留在系统中,不但耗费系统资源,同时还会增加系统安全隐患,因此,内核配置的目的,就是保留系统需要的功能,去掉不必要的部分,使操作系统以最精简、最优化的状态运行。

Linux内核支持三种配置方式,第一种方式是基于命令行的问答方式,针对每一个内核配置选项会有一个提问,回答“y”包含该项功能,回答“n”则不包含该项功能。通过执行make config可以开始第一种方式。

第二种是菜单式的,用户可以在Linux服务器或网络中的某个工作站进行操作,执行make
menuconfig命令以后,会出现一个配置菜单,通过该菜单可以很方便的进行内核的配置。

第三种方法也是采用菜单方式进行配置的,但必须在Linux服务器上执行。通过执行make
xconfig可以开始第三种方式。

显然,三种方式的实质是相同的,我们通常使用第二种方式进行配置,这种方式简单明了,受条件制约小。

执行如下命令:

#
make menuconfig

注意:该命令可能需要超级用户权限。

系统出现图所示的内核配置界面:

图 嵌入式Linux内核的配置界面

用户也许对配置选项的意义不是完全明白,可以先不用管他,我们已经对内核做了比较合理的配置,建议在开始接触时不要做修改。

当用户在根据自己的系统需求配置好内核,退出配置菜单时,需要保存修改后的内核配置,如图4-3所示。

图 嵌入式Linux内核配置保存界面

若用户选择不保存,则进行的所有配置操作无效,内核配置仍然为原来的状态,若选择保存,系统会在当前目录下生成一个.config文件,其后要进行的内核编译就是根据这个.config文件来进行条件编译以生成相应的可执行文件的。

当完成对Linux内核的配置以后,内核仍然以源代码的方式存在,不能直接下载到嵌入式系统运行,因此,需要对内核进行编译,生成最终可以在嵌入式系统上运行的可执行代码。

依次执行如下命令,对Linux内核进行编译:

#make
clean ;该命令用于清除旧的编译文件

#make
dep ;该命令用于生成系统相应的依赖文件

#
./automake

当你以极大的耐心执行完以上的步骤,如果运气不错的话,会在当前目录下生成内核压缩映象文件uImage,好啦,停下来喘口气吧!

在HK-2000上开发Linux应用程序

前面章节描述了如何组建一个基本的平台:基于AT91RM200的硬件系统和嵌入式操作系统Linux,而最终完成的我们的具体任务的工作是由应用程序来承担的,有了嵌入式操作系统,你就可以像在PC平台上一样,实现各种功能强大的应用。

本节的内容,就是描述如何在HK-2000的Linux操作系统上,完成一个最简单的应用程序。

4.3.1
Linux应用程序的开发流程

基于嵌入式Linux的应用程序开发流程,与基于Windows的应用程序开发有很大的不同。在Windows环境中,开发者习惯使用各种集成编译开发环境,完成程序编辑、编译和运行。

而在Linux下开发应用程序,目前还缺乏比较简单、高效的开发工具和手段,同时,由于应用程序的最终运行平台是嵌入式目标系统,但程序开发仍然需要在PC+Linux平台完成,因此,在程序的开发与调试过程中,需要频繁的在Linux服务器和嵌入式目标平台交换信息。由于以上这些原因,基于嵌入式Linux的应用程序开发,还是一个相对比较复杂的过程,但随着嵌入式Linux的推广使用,基于嵌入式Linux应用程序的开发会变得越来越方便和容易。

有几种开发模式可以用于基于嵌入式Linux应用程序的开发,但最常用的方式有如下两种,即FTP方式和NFS方式。

1.
FTP
方式

FTP方式是首先在Linux服务器上编辑源文件,然后交叉编译,最后生成可执行文件,并将生成的可执行文件通过FTP方式下载到嵌入式目标系统上运行。

因此,当开发者在Linux服务器上完成了应用程序的编辑和编译,生成可执行文件以后,需要在嵌入式目标系统上通过FTP方式,下载编译好的可执行文件到嵌入式目标系统上运行,如果程序运行错误,则回到Linux服务器上修改源文件并重新编译、下载运行,直到程序正确运行为止。

FTP方式需要Linux服务器运行FTP服务,同时要求嵌入式目标系统端运行FTP客户程序。

FTP方式是一种常用的嵌入式Linux应用程序开发方式,其流程如图所示。

图 FTP方式的应用程序开发流程



2. NFS
方式

NFS方式也是首先在Linux服务器上编辑源文件,然后交叉编译,最后生成可执行文件,但生成的可执行文件不再通过FTP等方式下载到嵌入式目标系统,而是在嵌入式目标系统端通过NFS方式挂载Linux服务器的共享分区,让应用程序直接运行在嵌入式目标系统,并进行调试。

NFS方式需要Linux服务器端和嵌入式目标系统端均能支持NFS文件系统。

与其他方式相比较,NFS方式具有较高的调试效率,是一种经常采用的方法。NFS方式的开发流程如图所示。

图 NFS方式的应用程序开发流程

当开发人员完成了应用程序的调试与开发,可以将调试好的应用程序下载到嵌入式目标系统的Flash文件系统,或直接编译到嵌入式Linux内核并烧写到系统的Flash,从而最终形成一个独立的嵌入式应用系统。

我们推荐用户使用NFS方式进行应用程序的方法。

在以下的部分,我们将以一个简单的示例程序来说明基于嵌入式Linux应用程序的开发过程。

一个简单的应用程序

我们使用一个最简单的示例,来说明基于嵌入式Linux的应用程序开发过程。示例程序完成1~100的累加求和,运行时输出每一步的累加结果和最后的总和。

1. FTP方式

第一步:编辑应用程序。

在Linux服务器的工作目录/home/work,使用VI文本编辑器编辑应用程序,应用程序名为test.c:

# vi test.c

程序代码如下:

/* this is a simple
calculate program */

#include <stdio.h>

int main(void)

{

int i,sum=0,temp_sum=0;

for(i=1;i<=10;i++)

{

sum=sum+i;

temp_sum=sum;

printf("temp_sum =
%d\n",temp_sum);

}

printf("Calculate finished!
sum = %d\n",sum);

return 0;

}

编辑完源代码后,保存文件并退出VI。

第二步:编译应用程序。

键入如下命令编译应用程序:

# arm-linux-gcc -o test
test.c

当命令执行完毕以后,会在当前目录下生成可执行文件test。

第三步:通过FTP方式将可执行文件test下载到嵌入式目标系统运行。

启动嵌入式目标系统的Linux,使用超级终端作为其用户操作界面,切换到Linux的可写目录,如\var,键入如下命令使用FTP方式登陆Linux服务器:

# ftp 192.168.0.100

192.168.0.100为Linux服务器的IP地址。输入合法的用户名和密码,登陆到Linux服务器,执行如下命令将可执行文件test下载到嵌入式目标系统的当前目录。

# bin
;以二进制方式传输文件

# get test ;将文件test下载到HK-2000的当前目录

# bye

当以上命令执行完毕以后,可执行文件test下载到嵌入式目标系统的当前目录。

第四步:修改文件属性,运行应用程序。

可执行文件test下载到嵌入式目标系统后,可能不具有可执行属性,键入如下命令修改文件属性,并运行应用程序:

# chmod 777 test
;修改文件属性为可执行;

# ./test ;运行应用程序;

此时,用户可以看到应用程序的运行效果,输出每一步的求和结果和总的累加和。

2. NFS方式

第一步:编辑应用程序。

在Linux服务器的工作目录/home/work,使用VI文本编辑器编辑应用程序,应用程序名为test.c。

注意该目录必须是Linux服务器的输出共享目录。

# vi test.c

程序代码如下:

/* this is a simple
calculate program */

#include <stdio.h>

int main(void)

{

int i,sum=0,temp_sum=0;

for(i=1;i<=10;i++)

{

sum=sum+i;

temp_sum=sum;

printf("temp_sum =
%d\n",temp_sum);

}

printf("Calculate finished!
sum = %d\n",sum);

return 0;

}

编辑完源代码后,保存文件并退出VI。

第二步:编译应用程序。

键入如下命令编译应用程序:

# arm-linux-gcc -o test
test.c

当命令执行完毕以后,会在当前目录下生成可执行文件test。

第三步:在嵌入式目标系统端挂载Linux服务器的输出共享目录,并运行应用程序。

启动嵌入式目标系统的Linux,使用超级终端作为其用户操作界面,键入如下命令挂载Linux服务器的输出共享目录:

# mkdir /mnt/nfs
;建立Linux服务器输出共享目录的挂载点;

# mount –t nfs
192.168.0.100:/home/work /mnt/nfs -o nolock

# cd /mnt/nfs

# ls

此时,嵌入式目标系统端所显示的内容即为Linux服务器的输出目录的内容,可执行文件test就在该共享目录下,运行该程序:

# ./test

此时,用户可以看到应用程序的运行效果,输出每一步的求和结果和总的累加和。

显然,由于NFS方式省去可执行文件从Linux服务器传输到嵌入式目标系统端的过程,当开发的应用程序比较复杂时,采用该方式可以大大提高应用程序的开发效率。

4.3.3 固化应用程序并自动运行

无论是使用FTP方式,还是NFS,应用程序都没有固化到系统中,但在实际的嵌入式应用中,用户需要将已经调试完成的程序固化到系统的Flash存储器,并希望系统启动时可以自动运行。

应用程序可以以静态的方式,放入Linux源代码中,然后重新编译Linux源码并下载到嵌入式系统运行,但这种方式很不灵活,只要用户修改了应用程序,就需要重新编译并下载,使用非常不方便。

HK-2000在Nor
Flash和NAND
Flash上均实现了文件系统支持,用户可以象操作PC的硬盘一样,对相关目录进行读写,这些目录都具有掉电不丢失数据的特性。

在HK-2000系统Linux启动以后,用户可以使用命令df,查看系统的分区信息:

# df

此时显示系统的分区信息:

/dev/mtd/4 64M /mnt/Nand

用户可以将调试好的应用程序,如前所述的test,通过NFS或FTP方式拷贝到某个目录下,只要用户不将其删除,该文件就会一直存在。

然后用户可以编辑文件/usr/etc/rc.local,该文件为系统启动时的自动执行文件,用户可以将需要启动运行的程序路径及文件名添加到这里,就可以实现在系统启动时的程序自动运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐