摘要:本文描述了ARM7 与uCLinux 操作系统的特点,详细讨论了基于ARM7 与uCLinux开发的平台构建过程。利用构建好的开发平台,通过示例来说明了基于NFS 方式的嵌入式Linux 的应用程序开发流程,该开发平台将进一步应用于放射性气体气溶胶连续监测系统的数据采集。
0 引言
随着网络、通信、多媒体和信息家电时代的到来,嵌入式系统在经历了近 20 年的发展历程之后,进入了一个全新的发展阶段。Linux 操作系统以其稳定性好、可靠性高、源代码公开、可裁剪等优点已成为嵌入式领域的一股新兴力量,具有巨大的市场潜力和商业价值。而ARM 处理器是目前应用的最为广泛的嵌入式处理器架构。因此,将Linux 操作系统移植到ARM 处理器平台上并应用于实际的产品是最为流行的嵌入式产品解决方案。
放射性气体气溶胶监测系统的数据采集与处理一般是以 8 位单片机作为控制核心,直接导致硬件电路复杂、设计和调试难度加大、集成度低、稳定性差、系统升级难度较大等缺点。因此,本文采用LPC2210+uCLinux 的开发模式来设计整个监测系统的数据采集与处理模块,能够很好的提升整个系统的稳定性和可操作性。其中LPC2210 是基于32 位ARM7TDMI 内核的处理器,uCLinux 操作系统是开放源代码的嵌入式Linux 的典范之作,主要针对没有MMU(存储器管理单元)的处理器,具有良好的可移植性和优秀的网络功能。
1 硬件平台介绍
硬件平台采用 LPC2210 为系统硬件核心开发板,系统框图如图1 所示。主要包括:存储系统、系统接口、用户接口3 个部分。LPC2000 系列ARM7 处理器I/O 口供电电源为3.3V,内核及片内外设供电电源为1.8V,所以,系统设计为3.3V 应用系统。该系列的处理器可以使用外部时钟源,内部PLL 电路可调整系统时钟,使系统运行速度更快(CPU 最大操作时钟为60MHz)。
该硬件平台扩展了2MB NOR Flash 和8MB PSRAM。为了方便程序调试以及最终代码的固化应用,使用LPC2210 外部存储器接口的Bank0 和Bank1 地址空间。在使用uCLinux操作系统时,NOR Flash 用来存放bootloader 程序,以便于加载并引导放在NAND Flash 中的uCLinux 内核。
LPC2210 具有外部总线接口,设计电路为16 位总线方式对网卡芯片RTL8019AS 进行访问,即数据总线D0~D15 与网卡芯片的SD0~SD15 连接,由于RTL8019AS 工作电压是5V,而LPC2210 的I/O 电压是3.3V,故需在总线上串接470 欧的保护电阻。网卡芯片的Vih 最小值为2.0V,故与LPC2210 连接时不需要加电平转换芯片。
2 嵌入式Linux 开发平台的构建
本研究采用在宿主机上编写程序,然后通过交叉编译生成目标平台上可以运行的可执行文件,最后下载到目标板的特定位置运行的方法构建平台,即通常称为的“宿主机+目标板”的开发模式,如图2 所示。目标板分别通过RS-232 串口和RJ-45 以太网接口与宿主机连接。
宿主机上需要运行 2 个窗口,即宿主机本机操作窗口和串口终端窗口。宿主机操作窗口可以是本机的操作终端,也可以是通过远程登录登录到Linux 服务器的操作界面。串口终端窗口可以是Linux 下的minicom,也可以是windows 下的超级终端。目标板可以看成一台计算机,串口终端就相当于这台计算机的显示器,作为人机交互界面。在宿主机编译、链接后得到的可执行文件下载到目标板上运行。
2.1 uCLinux 操作系统的移植
在开始移植操作系统之前,先准备好移植所需要的软件包,主要包括:交叉编译所需的编译工具包、uCLinux 源码包、完整的bootloader 程序及根文件系统。上述二种工具包都有众多版本,本文分别选择的是uCLinux-dist-20040408.tar.gz、arm-elf-tools-20040427.sh。整个移植工作分为三步:建立交叉编译环境;编译配置内核;bootloader 及根文件系统的移植。
2.1.1 建立交叉编译环境
将工具包 arm-elf-tools-20040427.sh 拷贝到目录/usr/src 下,为其增加可执行权限(#chmod755 arm-elf-tools-20040427.sh);然后安装arm-elf-gcc(# ./ arm-elf-tools-20040427.sh),安装完毕后查看/usr/local/bin 目录下是否存在arm-elf-gcc 等文件,如存在,表明交叉编译器安装成功;最后是添加交叉编译的路径,这一步在安装过程会自动执行和保存,并在下次启动之后仍然有效(#export PATH=$PATH:/usr/local/arm-elf/bin)。至此,交叉编译环境已经建立完毕。
2.1.2 交叉编译uCLinux 内核
在交叉编译内核之前,首先要对编译选项进行配置。为了配置过程的直观性,一般选择“make menuconfig”命令,进入uCLinux v3.1.0 Configuration 界面,主要是设置嵌入式处理器的型号以及操作系统的版本,然后选择Default all settings 后进行编译即可。交叉编译工作一次由以下命令完成:
#cd /usr/src/uCLinux-dist // uCLinux-dist 为uCLinux 源代码所在目录
#make distclean // 清除上一次编译所产生的辅助文件和目标文件
#make menuconfig // 通过文本菜单方式配置uCLinux
#make dep // 建立源代码文件的依赖关系
#make //编译内核
编译结束之后会在 uCLinux 安装目录下建立romfs 和images 两个目录。其中romfs 为romfs 文件系统的临时存放目录;images 为生成的目标代码目录,其中romfs.img 为romfs文件系统的映像文件,image.bin 为文件系统和内核代码的目标文件。
2.1.3 bootloader 及根文件系统的移植
通过 RS-232 串口将完整的bootloader 程序下载到目标板的NOR Flash 中。主要工作是在WinXP 下设置超级终端,波特率38400、8 位数据位、1 位停止位、无奇偶校验位、无流控制。通过运行下载程序,可以将bootloader 下载到NOR Flash 中。
建立 uCLinux 超级终端,设置波特率为115200、8 位数据位、1 位停止位、无奇偶校验位、无流控制。命名为uCLinux。然后启动开发板,在超级终端中也即嵌入式开发板的“显示器”中,可以看到bootloader 的启动界面,通过FlashFXP 软件可以将目录bin、boot、etc下的文件下载到开发板。
2.1.4 uCLinux 的启动
通过 bootloader 转载和引导刚刚生成的内核和文件系统。bootloader 引导内核的方式是:将内核影像文件和根文件系统下载至PSRAM 中直接启动,而不是从NAND Flash 中读入PSRAM,这种方法不需要烧写Flash。如图3 是uCLinux 操作系统启动后的界面。
2.2 NFS 辅助开发环境的建立
网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作。因此,通过建立NFS,把Linux 宿主机上的特定分区共享到待调试的目标板上,就可以直接在目标板上操作Linux 宿主机的特定分区,同时可以在线对程序进行调试和修改,大大方便了软件的开发。故NFS 是嵌入式Linux 开发的一个重要组成部分,下面详细说明如何建立NFS 辅助开发环境。
2.2.1 宿主机端NFS 服务器的配置
以 root 身份登录Linux 服务器,编辑/etc 目录下的共享目录配置文件exports,指定共享目录及权限等。
执行如下命令编辑文件 /etc/exports:
#vi /etc/exports
在该文件中添加如下内容:
/home/work 192.168.0.* (rw, sync, no_root_squash)
然后保存退出。
添加的内容表示允许 IP 地址范围在192.168.0.*的计算机以读写的权限来访问/home/work 目录。
其中,/home/work 也称为服务器输出共享目录;rw 读写权限;sync 数据同步写入内存和硬盘;no_root_squash 为NFS 服务器共享目录用户的属性,如果用户是root,那么对于这个共享目录来说就具有root 权限。
接着执行如下命令,以启动端口映射:
#/etc/rc.d/init.d/portmap start
最后执行如下命令启动 NFS 服务,此时NFS 就会激活守护进程,然后开始*client 端的请求:
#/etc/rc.d/init.d/nfs start
在 NFS 服务器启动后,还需检查Linux 服务器的防火墙等设置(一般需要关闭防火墙服务),确保没有屏蔽掉NFS 使用的端口和允许通信的主机,主要是检查Linux 服务器iptables,ipchains 等选项的设置,以及/etc/hosts.deny,/etc/hosts.allow 等文件。
到此,宿主机端 NFS 服务器配置完成。
最后在宿主机上进行 NFS 服务器的回环测试,验证共享目录是否能够被访问。在宿主机上运行如下命令:
# mount –t nfs –o nolock 192.168.0.10:/home/work /mnt
# ls /mnt
命令将宿主机的 NFS 输出共享目录挂载到/mnt 目录下,因此如果NFS 配置正确的话,应该可以在/mnt 目录下看到/home/work 共享目录的内容。
2.2.2 目标板端NFS 客户端的配置
在宿主机端的设置成功之后,还需要对客户端进行相关的设置。在目标板系统的命令行下,执行如下命令来进行NFS 共享目录的挂载:
/> mkdir /mnt/nfs //建立宿主机输出共享目录的挂载点
/> mount –t nfs –o nolock 192.168.0.10:/home/work /mnt/nfs
/> cd /mnt/nfs
/> ls
此时,目标板终端所显示的内容即为宿主机的输出目录的内容,即宿主机的输出目录/home/work 通过NFS 映射到了嵌入式目标板的/mnt/nfs 目录。由于Linux 默认下不启动NFS,每次宿主机进入Linux 之后都要重新完成NFS 的启动和挂载,比较麻烦。可以将以上的命令写入宿主机的脚本文件/etc/rc.d/rc.local 中,宿主机启动时会执行此文件。
3 嵌入式Linux 应用程序的开发
完成上述工作之后,嵌入式Linux 开发平台搭建成功。在这个平台上即可以进行相关应用程序的开发。本文采用NFS 方式进行应用程序的开发。
基于 NFS 方式的应用程序开发,首先在宿主机上通过vi 编辑器进行源代码的编辑,然后通过交叉编译,最后生成可执行文件,在嵌入式目标板端通过NFS 方式挂载宿主机的共享分区,让应用程序直接运行在嵌入式目标系统,并进行调试。基于 NFS 方式的开发流程如图4 所示。
当开发人员完成了应用程序的调试之后,可以将调试好的应用程序下载到目标系统的Flash 中或者直接编译到嵌入式Linux 内核中,从而最终形成一个独立的嵌入式应用系统。下面介绍一个示例来说明基于嵌入式 Linux的应用程序开发流程。该示例使用MiniGUI的静态框、按钮和编辑框空间,实现一个Login 系统登录的对话框。对话框中要求输入用户名和密码,如果输入正确的用户名和密码(例如用户名为51,密码为888888)则进入系统(显示一个主窗口),否则弹出错误对话框,并要求用户再次输入用户名和密码。实现本示例之前,必须确保已经搭建好MiniGUI 编译和开发板上的运行环境。
实验步骤如下:
第一步:编辑源程序
在宿主机的工作目录/home/work 下使用vi 编辑器编辑源程序,源程序名为login.c。
部分程序源代码如下:
// 定义对话框
static DLGTEMPLATE MyDlg =
WS_EX_NONE,
2, 50, 235, 190,
"登录",
0,
0,
6,
NULL,
0
};
// 定义对话框中的控件
static CTRLDATA CtrlInitData[] =
{
{ "static",
WS_VISIBLE | SS_SIMPLE,
25,10, 200, 16,
IDC_SLOGIN,
"请输入用户名和密码.",
0,
WS_EX_NONE
},
{ "static",
WS_VISIBLE | SS_SIMPLE,
10,40, 60, 16,
IDC_SUSER,
"用户名:",
0,
WS_EX_NONE
},
{ "static",
WS_VISIBLE | SS_SIMPLE,
10,80, 60, 16,
IDC_SPASS,
"密码:",
0,
WS_EX_NONE
},
{ "edit",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
70,40, 140,25,
IDC_EUSER,
"",
0,
WS_EX_NONE
},
{ "edit",
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_PASSWORD | WS_TABSTOP,
70,80, 140,25,
IDC_EPASS,
"",
0,
WS_EX_NONE
},
{ "button",
WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
80,120, 80,25,
IDOK,
"确定",
0,
WS_EX_NONE
}
};
//设置用户名和密码
#define USER_NO 3
static char *g_user[USER_NO] = {"root",
"51",
"WXM"
};
static char *g_pass[USER_NO] = {"******",
"888888",
"2046"
};
第二步:修改对应的 Makefile.am 文件,设置编译login.c 文件
在命令行下输入 # make
当命令执行完毕之后,会在当前目录下生成名为login 的可执行文件。
第三步:在目标板挂载共享目录,并运行程序。
/> cd usr
/>usr> portmap&
[26]
/usr> mount –t nfs 192.168.0.10:/home/work /usr/pro –o nolock //挂载共享目录
/>cd /usr/pro
/usr/pro ./login //运行程序,显示登入对话框
第四步:使用目标板上的功能键 0~9 输入用户名和密码,使用TAB 键转移到下一个焦点,使用BACK 键删除已输入的字符,使用ENTER 确定输入。当用户名和密码输入正确时,登录成功,登入界面被关闭,并显示一个MiniGUI 主窗口。如图5 示:
4 结束语
作为实时放射性气体气溶胶监测系统的数据采集系统开发的重要组成部分,本文通过分析ARM7 和uCLinux 特点,将二者有机结合,构建了ARM7+uCLinux 的嵌入式通用开发平台,并展示了应用该开发平台开发应用程序的详细过程。该平台的应用克服了大多数实时监测系统因采用8 位单片机为控制核心实现数据采集而带来的硬件电路复杂、稳定性差、升级困难等问题。故本文作者创新点:通过采用ARM7+uCLinux 的嵌入式通用开发平台克服了大多数实时监测系统硬件电路复杂、稳定性差、升级困难等缺点;同时采用该开发平台在开发过程中使用NFS 方式下载开发的应用程序,为嵌入式应用软件的开发节省了大量的时间,大大提高了开发效率。