【实验】嵌入式应用程序开发入门
一.实验目的
通过一个最简单,最基本的嵌入式应用程序,熟悉基本的嵌入式应用程序开发环境和工具,理解基本的嵌入式程序设计方法和流程。二、实验原理和说明
1. 开发环境绝大多数的Linux 软件开发都是以native 方式进行的,即本机(HOST)开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即板子上系统)运行开发工具和调试工具。通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC 机)上,对应的开发板叫做目标板。
开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行。)然后把可执行文件下载到目标机上运行。调试时的方法很多,可以使用串口,以太网口等,具体使用哪种调试方法可以根据目标机处理器所提供的支持作出选择。宿主机和目标板的处理器一般都不相同,宿主机为Intel 处理器, 而目标板如HHARM9-EDU 为SAMSUNG S3C2410,GNU 编译器提供这样的功能,在编译编译器时可以选择开发所需的宿主机和目标机从而建立开发环境。所以在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的PC 机作宿主开发机,对于嵌入式Linux,宿主机上的操作系统一般要求为Redhat Linux,在此,华恒推荐使用Redhat 9.0作为本套开发系统的宿主机PC操作系统。
在宿主机上我们要建立交叉编译调试的开发环境。环境的建立需要许多的软件模块协同工作,这将是一个比较繁杂的工作,但现在已完全由套件中光盘的安装而自动完成了。
这种宿主机(HOST)――目标板(TARGET)的开发模式下的系统连接图如图2-1所示:
图2-1
宿主机上交叉编译开发环境由GNU开发工具集构成,它们在安装华恒软件光盘时被复制到宿主机的/opt/host/armv4l目录下。
其中最主要的开发工具有:
(1) 源代码编辑:vi(m)。vi(m)是LINUX世界中最好用,使用最为广泛的编辑器。
(2) 编译:armv4l-unknown-linux-as(汇编代码)/armv4l-unknown-linux-gcc(C代码)/armv4l-unknown-linux-g++(C++代码)。LINUX内核及应用程序采用GNU gcc作为C编译器。gcc已经成功的移植到不同的处理器平台上。
(3) 链接:armv4l-unknown-linux-ld。
(4) 辅助工具:armv4l-unknown-linux-objcopy / armv4l-unknown-linux –ar/ armv4l-unknown-linux –nm。
3. 应用程序开发流程
应用程序的开发有间接和直接在目标板上开发两种模式。
3.1间接方式
先在宿主机(Intel CPU)上调试通过后,再移植到目标板上。移植的工作包括两个方面:
(1) 函数库的问题。在程序移植时可能会有函数未定义的问题。对于这种问题, 一般要求开发者自己编制这些要用到却又未定义的函数。
(2) 要修改Makefile以选择适合目标板的编译工具。
3.2通用开发模式
直接在目标板上进行开发(通用开发模式,建议采用该模式)。将宿主机和目标板通过以太网连接,在宿主PC 机上运行minicom 作为目标板的显示终端,在目标板上通过NFS (网络文件系统) 来mount宿主机硬盘,让应用程序直接运行在目标板上进行调试。下面给出这种直接TARGET开发模式下的开发流程图。
假设/HHARM9-EDU/application/hello/hello 是我们要调试的应用。
开发流程:
a1、用串口和以太网将宿主机和目标板连接起来
a2、在宿主机上创建目录mkdir hello,在hello目录下编辑Makefile(可复制其它目录下的过来简单修改即可)和程序的.c文件,然后再进行进行编译make /opt/host/armv4l/bin/armv4l-unknown-linux-gcc –o hello hello.c
a3、将编译好的hello移至根目录,然后chmod 777 hello
a4、在宿主机上启动minicom作为目标板的仿真终端
a5、假设宿主机的IP地址为192.168.2.122,在开发板上输入mount –o nolock 192.168.2.122:/ /mnt
a6、进入开发板的mnt目录: cd /mnt,运行hello程序 ./hello 调试信息通过串口打印在宿主机的minicom屏幕上这样便可进行应用程序的调试。有问题,便切换去编辑编译,重新在开发板上运行,直至程序工作正常。
调试成功以后,把应用程序添加到ramdisk文件系统映像中,就可以下载,烧写新的ramdisk映像文件。
三.实验内容和步骤
1. 在根目录下创建名为hello的目录。
2.编写对应的Makefile文件。
注意:编译器要用/opt/host/armv4l/bin/armv4l-unknown-Linux-gcc。Makefile中每行的缩进不允许用多个空格,而必须用TAB键,否则编译就会有莫名其妙的错误。应用程序默认的栈的大小为8K。可以在Makefile为其指定堆栈大小,例如要增大该应用程序的堆栈容量,就在其Makefile中增加如下一句:FLTFLAGS = -s 65536
3.编写hello.c,通过printf函数向终端上输出字符串。
4.执行make,生成可执行文件hello。
注意:一定要学会看make打印的错误。一般的,在有许多错误的情况下,一定要查看第一个error,warning是不需要理会的。
5.运行并检查结果。
用串口线将PC与板子的第一个串口连接起来。在宿主机上启动minicom 作为仿真终端,在目标板上mount上宿主机根目录,切换到hello所在目录执行hello。如果有问题,便切换回宿主机上编辑编译,重新mount和执行,直到正确为止。正确结果是minicom上将显示”Hello World!”字符串。
附录、烧写zImage和ramdisk.image.gz (这边只是下载,ram中启动,不烧写)
1、硬件连接: 电源,串口,网线
2、linux :tftp 配置,网络设置,
3、把HHARM9-EDU/image下的zImage,ramdisk.image.gz拷贝到tftpboot下,cp命令
4、启动实验箱,快速按 y 进入PPCBOOT,出现提示符 #SMDK2410
5、输入help 可以看到PPCBOOT所支持的指令
6、printenv 打印显示目前的配置,
7、tftp 30008000 zImage 下载zImage 到SDRAM 30008000
8、tftp 30800000 ramdisk.image.gz 下载到30800000
9、go 30008000 启动