版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,嵌入式Linux应用程序开发,2,5.1 开发环境的建立 进行项目开发前,首先要做的是搭建一套基于Linux操作系统的应用开发环境,一般由目标板和宿主机所构成。 目标板用于运行操作系统和系统应用软件,而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主机来完成。 开发环境对硬件没有特殊的要求,但是为了双方之间建立连接关系,关键的接口包括串口、以太网口和USB口等是必不可少的,3,交叉编译环境的建立,交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。 在宿主机上对即将运行在目标机上的应用程序进行编译,生成可在目标机上运行的代码格式。 交叉编译环境是一个由编译器、连接
2、器和解释器组成的综合开发环境。 交叉编译工具主要包括针对目标系统的编译器gcc、目标系统的二进制工具binutils、目标系统的标准c库glibc和目标系统的Linux内核头文件,4,建立一个交叉编译工具链是一个相当复杂的过程,为了节省时间,网上有一些编译好的可用的交叉编译工具链可以下载。编译好的交叉编译工具链arm-linux- toolchains.tgz,只需简单地解压缩即可使用: tar xvzf arm-linux-toolchains.tgz C /arm9 假设工具链解压缩到目录/arm9。解压完毕后把工具链目录加入到环境变量PATH中即可,5,简单验证交叉编译工具,首先用文字输
3、入软件建立一个helloworld.c文件: #include intmain(void) printf(helloworldn); return0; 然后在命令行执行: $arm-linux-gcchelloworld.c-ohelloworld $filehelloworld 如果输出以下信息,说明成功建立了编译工具。 helloworld:ELF32-bitLSBexecutable,ARM,version1,dynamicallylinked(usessharedlibs),notstripped,6,5.2 Linux及开发工具的使用,GNU工具的开发流程如下: 编写C、C+语言或汇
4、编源程序,用gcc或g+生成目标文件,编写链接脚本文件,用链接器生成最终目标文件(elf格式),用二进制转换工具生成可下载的二进制代码。 Linux下的GNU调试工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成对目标板上Linux应用程序的远程调试。gdbserver是一个很小的应用程序,运行于目标板上,可监控被调试进程的运行,并通过串口与上位机上的gdb通信。开发者可以通过上位机的gdb输入命令,控制目标板上进程的运行,查看内存和寄存器的内容,7,gcc编译器的使用,gcc最基本的用法是:gcc options file. gcc的整个编译过程分别是:预处
5、理,编译,汇编和链接。 常用的选项: -o要求编译器生成指定文件名的可执行文件; -c表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由.c或.cc变成.o的目标文件; -g在编译的时候提供以后对程序进行调试的信息; -E只进行预处理就停止,而不做编译、汇编和链接; -S只进行编译,而不做汇编和链接; -O对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高; -Wall指定产生全部的警告信息,8,编译实例, gcc -o hello hello.c gcc编译器就会生成一个hello的可执行文件。在hello.c的当前目录下执行./
6、hello就可以看到程序的输出结果,在屏幕上打印出“Hello the world”的字符串来。 GNU编译器生成的目标文件默认格式为elf(executive linked file)格式,这是Linux系统所采用的可执行链接文件的通用文件格式。elf格式由若干个段(section)组成,由标准c源代码生成的目标文件中包含以下段: .text(正文段)包含程序的指令代码, .data(数据段)包含固定的数据,如常量,字符串等, .bss(未初始化数据段)包含未初始化的变量和数组等,9,Makefile文件和Make命令,Makefile文件描述了目标文件之间的依赖关系,以及指定编译过程中使用
7、的工具。 一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。 Makefile的好处就是“自动化编译”,一旦写好,只需要一个Make命令,整个工程完全自动编译,极大地提高了软件开发的效率,10,Makefile的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成可执行的二进制文件。Makefile中一般包含如下内容: 需要由make工具创建的项目,通常是目标(target)文件和可执行文件。 要创建
8、的项目依赖于哪些文件。 创建每个项目时需要运行的命令,11,例,example.o: example.c example.h g+ -c -g example.c 第一行指定example.o为目标,并且依赖于example.c和example.h文件。随后的行指定了如何从目标所依赖的文件建立目标。 当example.c或example.h文件在编译之后又被修改,则make工具可自动重新编译example.o,如果在前后两次编译之间,example.c和example.h均没有被修改,而且example.o还存在的话,就没有必要重新编译,12,make make是一个命令工具,是一个解释Mak
9、efile中指令的命令工具。 make命令执行时,需要一个Makefile文件,以告诉make命令怎么去编译和链接程序。一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的Makefile来执行,一切都是自动的,13,引导程序的移植,嵌入式软件系统4个层次 引导程序BootLoader 操作系统内核 文件系统 用户应用程序,14,PC机中的引导程序由BIOS,BIOS(其本质就是一段固件程序)和位于硬盘MBR中的引导程序一起组成。 BIOS在完成硬件检测和资源分配后,将硬盘MBR中的引导程序读到系统的RAM中,然后将控制权交给引导程序。 引导程序的主要运行任务是将内
10、核映像从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统,15,BootLoader是在操作系统内核或用户应用程序运行之前运行的一段小程序。 通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内核或用户应用程序准备好正确的环境,16,2BootLoader的启动过程,BootLoader的启动过程大多数分为阶段1和阶段2。阶段1主要包含依赖于CPU体系结构的硬件初始化代码,而且通常都是用汇编语言来实现的,以达到短小精悍的目的。这个阶段通常包括以下步骤: (1)硬件设备初始化。这是BootLoader开始就
11、执行的操作,其目的是为阶段2的执行,以及随后内核的执行准备好基本的硬件环境。 (2)为加载BootLoader的阶段2准备RAM空间。为了获得更快的执行速度,通常把阶段2加载到RAM空间来执行。 (3)拷贝BootLoader阶段2的代码到RAM空间中。 (4)设置好堆栈。 (5)跳转到阶段2的C程序入口点,17,BootLoader的阶段2通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。通常包括以下步骤: (1)初始化本阶段要使用到的硬件设备。 (2)检测系统内存映射。 (3)将内核映像和根文件系统映像从Flash上读到RAM空间中。 (4)为内核设置启动
12、参数。 (5)调用内核,18,VIVI简介,VIVI是韩国Mizi公司开发的BootLoader,可用于ARM9处理器的引导。VIVI利用串行通信为用户提供接口。 为连接VIVI,首先利用串口电缆连接宿主机和目标板,然后在主机上运行串口通信程序,并在目标板上正确设置VIVI以支持串口。正确连接后,就可以由串口通信程序显示提示信息,提示信息的最后一行如下所示: Press Return to start the LINUX now, any other key for vivi. VIVI有两种工作模式,启动模式 下载模式,19,VIVI命令,1load命令 将二进制文件载入到Flash或者RA
13、M load | vivi load flash kernel x,装载压缩映像文件zImage到flash存储器,地址是kernel分区,并采用xmodem传输协议。 2part命令 操作MTD分区信息 3param命令 用来设置或者察看参数 4boot命令 用来引导存储在flash存储器或者ram中的linux内核,20,5.4 Linux操作系统的移植,Linux系统实际上由两个比较独立的部分组成,即内核部分和系统部分。内核部分初始化并控制大部分硬件设备,为内存管理、进程管理、设备读写等工作做好一切准备;系统部分加载必需的设备,配置各种环境以便用户可以使用整个系统。 启动Linux系统的
14、过程:加载程序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码,Linux要将自己的剩余部分全部加载到内存、初始化所有的设备、在内存中建立好所需的数据结构(有关进程、设备、内存等)。到此为止,Linux内核已经控制了所有硬件设备 系统部分操作和使用这些硬件设备。内核加载设备并启动init守护进程,init守护进程会根据配置文件加载文件系统、配置网络、服务进程、终端等。一旦终端初始化完毕,我们会看到系统的欢迎界面,21,Linux内核功能,进程管理(包括调度和通信)、内存管理、设备管理、虚拟文件系统、网络。 Linux内核良好的分层结构将硬件相关的代码独立出来。系统移
15、植需要改动进程管理、内存管理和设备管理中被独立出来的那部分与硬件相关的代码。虚拟文件系统和网络则几乎与平台无关,它们由设备管理中的驱动程序提供底层支持。 开发者在完成自己的内核代码后如何将源代码融入到Linux内核中,增加相应的Linux配置选项,并最终被编译进Linux内核。Linux的内核配置系统,22,内核移植,Linux系统采用单一内核机制,但具有平台无关性和可扩展性。 将内核代码加入到Linux内核三个步骤。 确定把自己开发的代码放入到内核中的位置; 把自己开发的功能增加到Linux内核的配置选项中,使用户能够选择此功能; 构建子目录Makefile,根据用户的选择,将相应的代码编译
16、到最终生成的Linux内核中去,23,内核编译与下载,编译内核3个步骤: make dep 创建内核依赖关系 make zImage 创建内核镜像文件 make modules 创建内核模块 下载内核 。在下载内核前要保证BootLoader的正常运行,以VIVI为例。 (1)连接串口,在控制台下启动Minicom打开串口终端; (2)启动目标板,进入VIVI命令行工作模式; (3)执行“load flash kernel x”命令,开始下载内核; (4)在终端的等待状态下,先按下“Ctrl”不要松开,再按下“a”键,然后同时松开,再按下“s”键,进入下载模式; (5)选择Xmodem协议,下
17、载结束,即可保存内核文件到Flash中,24,系统移植,当内核在交叉编译成功后,加载到目标平台上正常启动,并出现类似VFS: Cant mount root file system的提示时,则表示可以开始系统移植方面的工作了。 系统移植实际上是一个最小系统的重建过程。,在此使用目标平台上的二进制代码生成这个最小系统。包括:init、libc库、驱动模块、必需的应用程序和系统配置脚本。一旦这些工作完成,移植工作就进入联调阶段了,25,5.5 应用程序的调试,在开发环境和操作系统建立后,就可以开始应用程序的开发了。应用程序的开发一般先在宿主机上调试完成,然后下载到目标板。为保证正常下载,必须建立可
18、靠的连接。 建立连接 应用程序的调试是在保证宿主机与目标机正确连接的基础上进行的,连接的方式主要有串口连接、网络连接和JTAG口连接等方式。JTAG口的连接在前面章节已详细介绍,在此介绍串口连接和网络连接两种方式,26,27,编写应用程序,include int main(void) printf(Hello, World! n); return 0; 保存文件名为hello.c。 在宿主机端编译并运行hello程序: gcc o hello hello.c hello 正确的结果将在主机的显示器上打印如下字符串: Hello,World! 编译在目标机上运行的hello程序: arm-linux-gcc o hello hello.c 如果在RedHat中运行,该程序将出现如下错误结果: hello bash: hello: cannot execute binary file 由于编译器采用的是arm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年文化和旅游部直属事业单位招聘应届毕业生52人(一)笔试模拟试题及答案解析
- 2026福建宁德市蕉城区教育局补充招聘紧缺急需人才5人(二)考试备考题库及答案解析
- 疫苗责任制度
- 监理服务责任制度
- 石了矿抓安全责任制度
- 砌筑责任制度
- 社保局疫情防控责任制度
- 社区林长责任制度
- 秘书岗位责任制度
- 管理层工作责任制度
- 2026年中学新团员入团测试题及答案
- (一模)东北三省三校2026年高三第一次联合模拟考试语文试卷(含答案详解)
- 2026河南郑州建设集团所属公司社会招聘工作人员44名笔试备考题库及答案解析
- 2026辽宁大连理工大学后勤处自聘管理岗位招聘2人笔试备考题库及答案解析
- 2026年吉安职业技术学院单招综合素质考试题库含答案详解
- 2026年安徽林业职业技术学院单招综合素质考试题库含答案解析
- 2026年春五年级下册数学教学计划(附教学进度表)
- 薄抹灰施工方案
- 2026年餐饮服务标准操作流程培训
- 2026年南京交通职业技术学院单招职业技能考试题库及答案详解(基础+提升)
- 雨课堂学堂在线学堂云《船》单元测试考核答案
评论
0/150
提交评论