《第七章 嵌入式应用程序开发培训讲学》由会员分享,可在线阅读,更多相关《第七章 嵌入式应用程序开发培训讲学(27页珍藏版)》请在金锄头文库上搜索。
1、第七章 嵌入式应用程序开发,学习目标: 1、了解嵌入式应用程序的基本架构 2、熟悉嵌入式应用程序的开发流程 3、掌握Linux环境下嵌入式应用程序的开发方法,7.1嵌入式应用程序的体系架构,嵌入式系统由嵌入式硬件和嵌入式软件组成。嵌入式软件呈现明显的层次化倾向,从与硬件相关的设备驱动、BSP(板级支持包)到操作系统内核、FS文件系统、GUI图形界面、数据库,以及用户层的应用软件等,各部分可以清晰地划分出来,如图所示:,7.2嵌入式应用程序的开发流程,1.系统需求分析,系统需求一般分为功能性需求和非功能性需求两个方面。功能性需求是系统的基本功能,如输入输出信号、操作方式等;非功能需求包括系统性能
2、、成本、功耗、体积、重量等因素。在这一阶段要对拟开发的项目进行可行性分析,可从两个方面入手:一是分析技术的可行性,对现有软件和成熟的技术进行研究,看能否实现项目要求;二是分析经费的可行性,看目前的经济条件能否适应项目要求,最后写出一份系统需求分析报告。,7.2嵌入式应用程序的开发流程,2.体系结构设计,体系结构设计,描述系统如何实现系统功能和非功能需求,包括对硬件、软件和执行机构的功能划分,以及系统的软件和硬件的选型等。一个好的体系结构是设计成功与否的关键。 在这一阶段要解决怎么做的问题,可分为系统框架设计和详细设计两个阶段。框架设计根据需求分析的结果和系统设计目标,将系统分解为若干个子系统,
3、确定每个子系统的功能、各子系统之间的关联。详细设计确定各个子系统的名称、功能描述、算法方案、输入输出接口与信息等等。,7.2嵌入式应用程序的开发流程,3.硬件、软件协同设计,根据上一阶段的设计方案,基于体系结构,对系统的硬件和软件进行详细设计。为了缩短系统开发周期,设计往往是并行的。嵌入式系统设计的工作大部分集中在软件设计上,采用面向对象、组件技术、模块化设计是现代软件工程常用的方法。,7.2嵌入式应用程序的开发流程,4.系统集成,系统集成是把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进模块设计过程中的错误。,7.2嵌入式应用程序的开发流程,5.总体测试,一般在需求阶段就开始写测
4、试计划,包括测试用例、测试标准和测试方法。测试可分为模块测试、集成测试、系统测试和验收测试等。模块测试一般由程序编写者进行,按模块或类进行测试。集成测试是将几个或所有模块集成后进行的测试,测试模块的接口、关联,共同工作所完成的功能和达到的性能。系统测试则是从用户的角度出发进行的测试,包括对最终运行环境的测试。接收测试是根据项目需求的描述,测试系统是否达到接收标准。每项测试都要求有完整的测试记录,开发者要根据测试结果修改程序。程序修改完以后,再进行回归测试。前一阶段的测试若没有发现问题,则进入下一阶段的测试。,7.2嵌入式应用程序的开发流程,6.运行维护,运行程序是软件设计的最终目标,到此设计过
5、程已基本完成。但是由于前面几个环节中可能因为考虑不周而导致在运行过程中出现各种可能的问题,这时开发者有责任进行维护,返回到问题环节进行处理,如此反复可使得最终程序能较好地满足用户需求。,7.3 Linux环境下Hello World应用程序的实现,1.熟悉目标机硬件资源 开发嵌入式应用程序的第一步是熟悉目标机硬件资源,了解处理器的型号与特点,熟悉存储器及I/O端口的地址分配。最为理想的状况是根据应用需要自己设计目标机。在缺乏数字电路、模拟电路、电路板设计知识和技能的情况下,可通过购买开发板作为开发阶段的目标机,待软件开发完成后,如果需要批量生成所开发的产品,则再重新设计与生产目标机。,7.3
6、Linux环境下Hello World应用程序的实现,2.配置开发环境 开发应用程序需要开发环境,包括安装Linux虚拟机、交叉编译器、DNW或超级终端、Xmanager系统,配置串口、并口参数,关闭防火墙,架设SMB和NFS服务器,建立面向目标机和Linux虚拟机连接等。,7.3 Linux环境下Hello World应用程序的实现,3.建立引导程序 购买的目标机一般都带有已经编译好的BootLoader,可能是vivi,也可能是uboot等。如果目标机中已经建立BootLoader,则可以直接使用。如果没有,或开发者对目标机自带的BootLoader不够满意,则可以重新烧写。需要重新烧写的
7、BootLoader可以在系统自带的BootLoader基础上进行修改,也可以从官方网站下载一个基本的BootLoader,再根据应用系统的设计目标进行修改和编译,生成一个最适合应用需求的BootLoader,最后再烧写到目标机中。,7.3 Linux环境下Hello World应用程序的实现,4.下载Linux内核 以Linux作为操作系统的嵌入式系统,其内核是存储在NAND Flash特定区域中的。对于购买的目标机,一般随机带有Linux内核程序。如果没有,则应该自己动手编辑和编译。如果虽然已有,但不能满足应用系统的需求,则可以如前所述,先从官方网站下载一个基本内核,然后根据需要进行裁剪,
8、最后再编译成内核映像文件,下载到NAND FLASH的内核区域。,7.3 Linux环境下Hello World应用程序的实现,5.建立根文件系统 在为一个嵌入式系统开发应用程序之前,必须在目标机的NAND FLASH中建立根文件系统。根据应用需求的差别,可以选择建立不同种类的根文件系统。YAFFS根文件系统以其存取速度快、占用系统资源少、支持大文件和良好的垃圾收集机制,得到大多数开发者的认同 。,7.3 Linux环境下Hello World应用程序的实现,5.建立根文件系统 建立根文件系统的一般方法是,先从官方网站下载Busybox工具进行功能裁剪,产生一个最基本的根文件系统,再根据应用需
9、求添加其他程序。由于默认的启动脚本一般都不会符合应用需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包括/etc/init.d/rc.S、/etc/profile、/etc/.profile等,自动挂载文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般为只读,需要使用mkcramfs等工具产生映像文件。,7.3 Linux环境下Hello World应用程序的实现,6.编写应用程序 当以上工作都成功完成以后,一个应用系统的软硬件工作平台准备完毕,接下来的工作就是编写应用程序了。 操作步骤如下: (1)首先建立工作目录,在此
10、假设为/usr/local/hello。 (2)选用文本编译器vi,编写程序源代码。 对于本例源代码比较简单,如下所示: #include int main(void) printf(Hello, World! n); return 0; 保存文件名为hello.c。,7.3 Linux环境下Hello World应用程序的实现,6.编写应用程序 (3)编译在目标机上运行的hello程序: # cd /tmp # arm-linux-gcc o hello hello.c 如果在Linux虚拟机中运行,该程序将出现如下错误结果: # ./hello bash: hello: cannot ex
11、ecute binary file 由于编译器采用的是arm-linux-gcc编译器,因此使用上述命令编译出来的程序只能在ARM处理器上运行,不能在X86平台上运行。,7.3 Linux环境下Hello World应用程序的实现,7.调试应用程序 调试嵌入式Linux应用程序一般通过网络共享方式进行,具体操作步骤为: (1)在宿主机上建立NFS网络共享 将/tools/application配置为NFS共享目录。 (2)将共享目录挂载到目标机 通过mount命令,将宿主机中的应用程序目录挂载到目标机的/mnt中。 在宿主机上打开Xmanager Xshell窗口,启动到目标机的连接,挂载共享
12、目录: /mnt/yaffs mount t nfs o nolock 192.168.0.100:/tools/application /mnt/host,7.3 Linux环境下Hello World应用程序的实现,7.调试应用程序 接着就可以调试应用程序了: /mnt/yaffscd /mnt/host /mnt/host./hello Hello world! 根据运行结果,分析应用程序的正确性。如果发现问题,则可以再回到宿主机的/tools/application/hello目录下,打开hello.c源程序,修改、编译,再转到Xmanager Xshell目标机窗口中进行调试,如此反
13、复,直到程序达到设计目标。,7.3 Linux环境下Hello World应用程序的实现,8.下载应用程序 调试完成的应用程序最终需要下载到目标机中,下载时可以加入目标机的根文件系统,也可以存储到yaffs文件系统中。下载可以选择串口、网络或USB方式,一般通过网络共享方式。,7.3 Linux环境下Hello World应用程序的实现,8.下载应用程序 (1)加入目标机根文件系统 具体操作步骤如下: 首先确定加入方案,即在目标机的根文件系统下,以何种方式存储应用程序。一般可将应用程序保存在目标机的/usr目录下。 然后,进入宿主机的Linux虚拟机中,按设计方案,将应用程序拷贝到待制作的目标
14、机根文件系统中。 #cd /tools/rootfs/usr #mkdir hello #cp /tools/application/hello/hello /hello 接着,通过mkcramfs工具重新生成目标机根文件系统root.cramfs。 最后,借助vivi下的tftp命令,将root.cramfs下载到目标机中。,7.3 Linux环境下Hello World应用程序的实现,8.下载应用程序 (2)加入目标机yaffs文件系统 因为yaffs文件系统是可读写系统,因此,当确定将应用程序加入yaffs系统时,可以不必重新下载目标机根文件系统,只需要将应用程序通过网络共享方式拷贝到目
15、标机指定目录中即可。具体操作如下:首先,通过mount命令,将宿主机中的应用程序目录挂载到目标机的/mnt中: /mnt/yaffs mount t nfs o nolock 192.168.0.100:/tools/application /mnt/host 接着进入应用程序共享目录,将应用程序拷贝到yaffs文件系统的指定目录中: /mnt/yaffsmkdir hello /mnt/yaffscp /mnt/host/hello/hello hello,7.3 Linux环境下Hello World应用程序的实现,9.应用程序的执行 应用程序的执行有多种方式,以下是三种常用方式: (1)
16、直接运行 如果应用程序是类似于hello的程序,则可以在目标机Linux下直接运行。 /mnt/yaffscd /hello /mnt/yaffs./hello,7.3 Linux环境下Hello World应用程序的实现,9.应用程序的执行 应用程序的执行有多种方式,以下是三种常用方式: (2)通过脚本文件运行 当应用程序的启动需要执行多个命令时,一般将多个需要执行的命令编写在一个.sh的脚本文件中,通过执行脚本文件来启动应用程序。 /mnt/yaffsvi hello.sh /预先执行的命令行 ./hello 保存后,产生hello.sh脚本文件。启动应用程序时,执行如下命令: /mnt/yaffshello.sh Hello world!,7.3 Linux环境下Hello World应用程序的实现,9.应用程序的执行 应用程序的执行有多种方式,以下是三种常用方式: (3)开机自动运行 如果应用程序需要在开机时自动运行,则可将需要运行的程序名编写在/etc/rc.d/rc.local文件中。 /mnt/yaffsvi rc.local /添加启动应用程序的命令行 /m