您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第9章开发环境和调试技术(初稿)
第9章开发环境和调试技术提纲1、交叉开发环境模式概述2、宿主机环境3、目标板环境4、交叉编译工具链5、gdb调试器6、远程调试7、内核调试8、网络调试1、交叉开发环境模式概述什么是嵌入式系统◦“以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。”硬件上的局限性◦存储空间小◦处理器频率低◦缺少存储、输入输出设备宿主机—目标板交叉开发模式组成部分◦宿主机:平时使用的桌面计算机◦目标板:嵌入式开发板介绍◦利用宿主机上已有的成熟的开发工具,专门针对目标板定制一套系统,包括引导程序、内核和文件系统,然后下载到目标板上运行。宿主机—目标板交叉开发模式开发过程◦在宿主机上编写代码,并通过交叉编译工具编译出能够在目标板上运行的程序,然后下载到目标板上测试执行,最后利用宿主机上的调试工具对目标板上运行的程序进行远程调试。特点◦使用和桌面开发一样的工具,降低学习成本。◦充分利用宿主机的开发环境。宿主机—目标板连接方式串口◦利用串口给目标板发送命令,同时也可以接受目标板返回的信息并显示。◦宿主机可以通过串口往目标板传送文件;◦目标板可以把程序运行的结果返回并显示。◦串口驱动程序的实现相对比较简单,缺点是传输速度慢,并不适用于传输大量数据的场合。以太网◦以太网是当今局域网采用的最通用的通信协议标准。◦它使用简单,配置灵活,支持广泛,传输速率快,安全可靠,缺点是网络驱动的实现比较复杂。宿主机—目标板连接方式USB◦USB是UniversalSerialBus通用串行总线)的缩写,现已成为PC的标准,基于USB标准的设备被广泛使用。◦一种快速、灵活的总线接口,与其它通信接口相比,USB接口的特点是易于使用。◦支持热插拔,无需用户自己配置,系统会自动搜索驱动并安装。◦USB是典型的主从结构,两端分别需要不同的驱动程序。JTAG◦JTAG是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试。◦在嵌入式系统领域,几乎所有的处理器都支持JTAG,调试器的单步调试和断点都需要和JTAG交涉。◦可以使用JTAG将程序烧写到目标板上。2、宿主机环境串口终端BOOTP协议TFTP协议交叉编译Make工具串口终端串口的用途◦作为终端执行命令,管理嵌入式系统。◦使用zmodem协议等传送小文件。串口终端◦超级终端(WindowsXP)◦Minicom(Linux)BOOTP协议什么是BOOTP协议◦引导协议(BootstrapProtocol,BOOTP)是一种基于TCP/IP的协议,它最初在RFC951中定义,如今在通用计算机上广泛使用的DHCP协议就是从BOOTP协议扩展而来。BOOTP协议使用TCP/IP网络协议中的UDP67/68两个通讯端口。BOOTP协议用途◦用于无盘客户机从服务器得到自己的IP地址、服务器的IP地址、启动映象文件名、网关信息等等BOOTP处理过程第一步,在主机平台运行BOOTP服务的情况下,目标板由BootLoader启动BOOTP,此时目标板还没有IP地址,它就用广播形式以IP地址0.0.0.0向网络中发出IP地址查询的请求,这个请求帧中包含了客户机的网卡MAC地址。第二步,主机平台上的BOOTP服务器接收到的这个请求帧,根据这帧中的MAC地址在Bootptab启动数据库中查找这个MAC的记录,如果没有此MAC的记录则不响应这个请求;如果有就将FOUND帧发送回目标板。FOUND帧中包含的主要信息有目标板的IP地址、服务器的IP地址、硬件类型、网关IP地址、目标板MAC地址和启动映象文件名。第三步,目标板就根据FOUND帧中的信息通过TFTP服务器下载启动映象文件。TFTP协议什么是BOOTP协议◦TFTP的全称是TrivialFileTransferProtocol,即“简单文件传输协议”,它是TCP/IP协议族中的一个在客户端和服务端之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP特点◦不提供用户名和口令◦TFTP协议传输由客户端发起交叉编译背景◦目标文件在不同架构间由于采用的CPU指令集不同等原因不能通用。定义◦交叉编译就是在一个架构的机器下编译另一个架构的目标文件。◦需要安装交叉编译工具链make工具GNUmake是一种常用的编译工具,通过它,开发人员可以很方便地管理软件编译的内容、方式和时机,从而能够把主要精力集中在代码的编写上。make会自动根据文件修改时间来判断源文件中哪些部分有更新,通过解释Makefile文件内的规则并执行相应的命令,重新编译链接这些更新过的文件。make工作过程编写Makefile◦Makefile由一系列规则组成,每条规则说明要生成哪些目标文件、生成目标文件所依赖的其它文件以及生成目标文件所需要的命令。编译过程◦通过查看时间戳来确认依赖文件是否比目标文件更新,如果是则重新执行这条规则的命令,并进一步地执行依赖这些中间目标文件的规则,层层推进,最后生成新的结果文件。需要重新编译的情况所有的依赖文件都没有被编译过,则对每个源文件进行编译并进行链接,生成最后的可执行程序。源文件在上次编译之后被修改过,则在本次执行make的时候将会被重新编译。头文件在上次编译之后被修改过,则所有包含此头文件的源文件在本次执行make的时候将将会被重新编译。Makefile示例#MakefileExampleforMathmath:main.odisplay.oplus.ominus.omulti.odivide.omod.ogcc-omathmain.odisplay.oplus.ominus.omulti.odivide.omod.omain.o:main.cdefs.hdisplay.hgcc-cmain.cdisplay.o:display.cdefs.hdisplay.hgcc-cdisplay.cplus.o:plus.cdefs.hgcc-cplus.cminus.o:minus.cdefs.hgcc-cminus.cmulti.o:multi.cdefs.hgcc-cmulti.cdivide.o:divide.cdefs.hgcc-cdivide.cmod.o:mod.cdefs.hgcc-cmod.c.PHONY:cleanclean:-rmmain.odisplay.oplus.ominus.omulti.odivide.omod.oMakefile基本规则TARGET…:PREREQUISITES…COMMAND#command前面使用tab缩进说明:TARGET:规则的目标。通常是最后所要生成的可执行文件名或者为了生成这个目标而必需的中间过程的目标文件名。PREREQUISITES:规则的依赖。生成规则目标所需要的文件列表,通常一个目标依赖于一个或多个文件。COMMAND:规则执行的命令。生成规则目标所需要执行的命令,可以是shell下面的任何命令组合。3、目标板环境JTAG接口BootLoaderJTAG接口简介作为硬件测试手段,JTAG的功能与CPU状态无关,可驱动设备的所有外部引脚并读入数据,而且在设备内部夺取外部的连接点(与通往外部的各个pin脚一一连接)。各个cell为了形成SerialShiftRegister而相连。整体的接口由5个pin脚来控制(TDI,TMS,TCK,nTRST,TDO)。其功能包括:测试线路连线和端子的连接状态;测试设备间的连接状态;进行Flashmemory烧写等BootLoader简介BootLoader是系统加电后运行的第一段代码。完成初始化硬件设备、创建内核需要的信息等工作,最后调用操作系统内核。对硬件的依赖非常强,不同的体系结构、不同的嵌入式板级设备配置都会对BootLoader有不同的需求。4、交叉编译工具链交叉编译工具链是一个由编译器、链接器和解释器组成的集成开发环境。和本地编译类似,交叉编译的过程也是由编译、链接等阶段组成,源程序通过交叉编译器编译成目标模块,并由交叉链接器加载库最后链接成可在目标平台上执行的程序代码。交叉编译过程源程序编辑器目标文件交叉编译器可执行程序交叉链接器库文件交叉编译的构建从头编译◦编译难度大,不适合初学者。脚本编译◦需要选择合适的脚本工具,例如crosstool下载使用◦下载指定平台编译好的二进制包。相关工具交叉编译工具链主要包括:◦标准库:glibc◦编译器:gcc◦链接器:ld◦汇编器:as◦调试器:gdb标准库:glibc最初是自由软件基金会为其GNU操作系统所写,但目前最主要的应用是配合Linux内核,成为GNU/Linux操作系统一个重要的组成部分。是Linux系统中最底层的API,几乎其它任何运行库都会直接或间接地依赖于glibc。除了封装系统调用之外,还提供一些基本的功能,例如open、malloc、printf、exit等等。编译器:gcc支持不同的编程语言,它被目前许多Unix/Linux系统作为默认的标准编译器。支持多种处理器架构上,并且在商业、专利和开源软件开发环境中广泛使用。支持嵌入式系统平台。binutils是一组开发工具包,包括连接器、汇编器和其他用于目标文件和档案的工具。其中包括:addr2line、ar、as、ld、nm、objdump、ranlib、readelf调试器:gdb是一款功能非常强大的调试器,既支持多种硬件平台,也支持多种编程语言,目前gdb支持的调试语言有C/C++、Java、Fortran、Modula-2等多种语言。不仅用于本地调试,还可以用于远程调试,非常适合嵌入式系统开发使用。5、gdb调试使用gdb可以完成下面这些任务:◦运行程序,可以给程序加上所需的任何调试条件;◦在给定的条件下让程序停止;◦检查程序停止时的运行状态;◦通过改变一些数据,可以更快地改正程序的错误。6、远程调试以调试器和被调试程序是否在同一台机器区分◦本地调试◦远程调试嵌入式系统大多使用远程调试方式远程调试解决方案—插桩方案◦需要在目标操作系统和宿主机调试器内分别添加一些功能模块,然后二者互通信息调试,这种方案称为插桩(stub)远程调试原理被调试程序入口点运行调试器指定通信端口向目标系统发送调试信息触发异常调用异常处理程序转入调试端口通信宿主机目标机远程调试原理运行在目标板上的被调试程序,一经初始化,在入口点会调用设置断点的函数,主动触发异常然后由异常处理程序控制,异常处理程序将会调用调试端口通信模块,监听宿主机调试器发送的调试信息。双方通信一旦建立,就可以根据远程调试协议进行调试。远程调试方法使用ROMMonitor调试目标机目标板程序使用kgdb调试系统内核使用gdbserver调试用户空间应用程序gdb远程调试功能由宿主机gdb和目标板调试stub共同构成。两者通过串口或TCP连接,采用gdb远程串行协议(RemoteSerialProtocol,RSP)连接。RSP定义了宿主机gdb和被调试的目标板程序进行通信时数据包的格式。它是一种基于消息的ASCII码协议,包含了内存读写、寄存器查询、程序运行等命令。gdbserver远程调试Linux内核嵌入式Linux内核gdb被调试程序及源代码gdbserver被调试程序stub串口或网络连接调试通信宿主机目标机7、内核调试Linux内核的规模之庞大,单靠阅读代码查找BUG已经非常困难。而Linux内核的开发人员出于保证内核代码正确性的考虑,不愿意在Linux内核源代码中添加调试器。所以对Linux内核进行调试一直是项艰苦的工作。内核调试技术◦内核打印函数printk◦内核源代码调试kgdb内核打印函数printk函数具有良好的健壮性,不受内核运行条件的限制,在系统运行的任何阶段都可以使用。和C标准库中的printf函数不同的是,printk函数可以指定一个日志级别。内核
本文标题:第9章开发环境和调试技术(初稿)
链接地址:https://www.777doc.com/doc-921447 .html