您好,欢迎访问三七文档
第6章嵌入式软件开发基础第6章嵌入式软件开发基础6.1嵌入式软件开发语言6.2嵌入式软件开发流程6.3调试工具和方法6.4C语言程序的结构6.3仿真环境6.1嵌入式软件开发语言汇编(与体系结构相关)C语言(最常用语言)C++语言(面向对象,C语言的扩展)JAVA(面向对象,可移植性强)脚本语言(不需要编译)6.2嵌入式软件开发流程嵌入式应用的生成特点编译汇编链接加载程序嵌入式应用的生成特点C语言程序的生成分成编译、汇编、链接等几个步骤。最终的目标文件的主要部分是处理器可执行的机器代码组合。根据系统的不同,目标文件除了可执行的二进制代码部分外,可能还包括一定的头。嵌入式应用的生成特点集成开发环境:ADS(ArmDeveloperSuite),主要需要使用以下工具:编译器:armcc.exe(编译成ARM指令汇编)和tcc.exe(编译成Thumb指令汇编)汇编器:armasm.exe链接器:armlink.exeARM-LinuxGCC交叉编译系统,则主要使用以下工具:编译器:arm-lixux-gcc(可以统一编译-汇编过程)汇编器:arm-linux-as链接器:arm-linux-ld嵌入式应用的生成特点编译器链接器C代码汇编器汇编代码机器代码可执行程序调试器ADS:armcc.exe\tcc.exeLinux:arm-liunx-gccADS:armasm.exeLinux:arm-linux-asADS:armlink.exeLinux:arm-linux-ldADS:armsd.exe或axd.exeLinux:gdb\gdbserver编译(Compile)编译(Compile)是指从高级语言转换成汇编语言的过程。从本质上编译是一个文本转换的过程(从文本文件到文本文件)。编译包含了C语言的语法解析和生成汇编语言两个步骤。。汇编(Assemble)汇编(Assemble)是指从汇编语言程序生成目标系统的二进制代码(机器代码)的过程。相对于编译过程的语法解析,汇编的过程相对简单。这是因为对于一款特定的处理器,其汇编语言和二进制的机器代码是一一对应的。链接(Link)链接(Link)过程将汇编成的多个机器代码组合成一个可执行程序。一般来说,通过编译和汇编过程,每一个源文件将生成一个目标文件。链接器的作用就是将这些目标文件组合,组合的过程包括了代码段、数据段等部分的合并,以及添加相应的文件头。6.3调试工具和方法嵌入式调试的特点打印调试信息JTAG调试远程gdb调试嵌入式调试的特点在嵌入式系统中,调试的概念相对复杂。对于其调试过程,程序主体运行在目标机上,主机所起的作用是获得程序运行中的信息,并通过人工或者程序的方式分析这些信息。因此嵌入式调试的基础是需要一条从主机到目标机的通讯通道。程序运行信息主机目标机控制命令通信通道打印调试信息打印调试信息是基本的调试方式,printf()标准输出,在嵌入式系统中,这种输出的通讯通道可能是串口或者网络协议。在某些系统中,没有实现标准输出,这就需要开发者自己开发调试手段。JTAG调试JTAG是JointTestActionGroup的简称。JTAG使用边界扫描(Boundary-Scan)的方式调试:在正常的运行状态下,这些边界扫描寄存器对于芯片是透明的;在调试的运行状态下,通过这些边界扫描寄存器单元,可以实现对芯片输入输出信号的观察和控制。远程GDB调试在远程GDB调试中,调试器是运行在主机(host,桌面电脑)的应用程序,被调试的程序是运行在目标(target)上。它通过插桩(stub)的方式实现,即在目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。调试器与被调程序的通信:Gdb和调试stub通过GDB串行协议进行通信。6.4C语言程序的结构C语言目标文件中的段执行程序内部细节目标文件各段的链接C语言程序的执行C语言目标文件中的段C语言的目标文件一般包含三个主体段:代码段(Code,又称Text)只读数据段(ROData)读写数据段(RWData)代码段Code(代码段)ROdata(只读数据段)RWdata(读写数据段)数据段只读区读写区执行程序内部细节1#includestdio.h2#includestdlib.h34constcharro_data[1024]={Thisisreadonlydata};5charrw_data_1[1024]={Thisisglobalreadwritedata};6staticcharrw_data_2[1024]={Thisisinternalreadwritedata};7staticcharzero_data_1[1024];8执行程序内部细节9intmain(intargc,char*argv[])10{11staticcharzero_data_2[1024];12inti;13charstack_data_1[100];14charstack_data_2[]={InitstackData};15char*memptr;16memptr=(char*)malloc(1024);17if(NULL==memptr)18{19printf(mallocerror\n);20return-1;21}22else23{24printf(mallocsuccessfully\n);25}26for(i=0;i1024;i++)27{28zero_data_1[i]='a';29}执行程序内部细节30strcpy(stack_data_1,stackdata1);31strcpy(memptr,datainheap);3233printf(ro_data:%s\n,ro_data);34printf(rw_data_1:%s\n,rw_data_1);35printf(rw_data_2:%s\n,rw_data_2);36printf(stack_data_1:%s\n,stack_data_1);37printf(stack_data_2:%s\n,stack_data_2);38printf(memptr:%s\n,memptr);3940free(memptr);41return0;42}目标文件各段的链接CodeFile1.o………………RODataRWDataCode1ROData1RWData1File2.oCode2ROData2RWData2链接Code1Code2ROdata1ROdata2RWdata1RWdata2可执行程序可执行文件其主体部分依然是代码段(Code)、只读数据段(ROData)、读写数据段(RWData)三个段,这三个段由各个目标文件(.o)经过“组合”而成。C语言程序的执行程序运行内存Code(代码段)ROData(只读数据段)RWData(读写数据段)BSS(未初始化数据段)Heap(堆区)Stack(栈区)动态区程序放置内存Code(代码段)ROData(只读数据段)RWData(读写数据段)复制初始化静态区C语言程序的执行程序运行内存RWData(读写数据段)BSS(未初始化数据段)Heap(堆区)Stack(栈区)动态区程序放置内存Code(代码段)ROData(只读数据段)RWData(读写数据段)复制初始化静态区6.4仿真环境源代码编译成主机程序主机运行目标机代码源代码编译成主机程序x86编译器交叉编译器下载主机调试环境目标机运行环境程序源代码主机程序目标机程序目标机程序主机运行目标机代码交叉编译器下载主机仿真环境目标机运行环境程序源代码目标机程序目标机程序指令模拟器课程结束
本文标题:嵌入式软件开发基础
链接地址:https://www.777doc.com/doc-6355409 .html