嵌入式知识要点arm03tts系统开发环境构成_第1页
嵌入式知识要点arm03tts系统开发环境构成_第2页
嵌入式知识要点arm03tts系统开发环境构成_第3页
嵌入式知识要点arm03tts系统开发环境构成_第4页
嵌入式知识要点arm03tts系统开发环境构成_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

达内IT达内IT培--PAGE1编名描级1*2*345注 达内IT达内IT培--PAGE2知识点列 嵌入式系统开发环境构 硬件平台介 软件开发环境建 GNUARM软件开发工具使 GNUARM汇编程序设计、常用伪操作、连接达内IT达内IT培--PAGE3嵌入式系统软件开发一般采用主机与目标板结合的交叉开发模式在开发PC机上的软件时,我们可以直接在PC机上编辑、编译、调试编写的软件,最终生成可供发布应用的软件版本。其从开发到最终应用都是在PC我们都知道嵌入式系统也是一个计算机系统,其同样由硬件和软件共同构成。比如一个RM的嵌入式系统,包括RM在内,还有lah、电源、通讯接口等一系列外设组成一台与PC机相似的系统。我们要开发一个嵌入式系统的软件,我们同样需要做和开发PC机软件类似的事情,如:编辑、编译、调试软件,不同的地方在于为嵌入式系统开发的软件最终要运行在具体的嵌入式系统的硬件平台上。嵌入式系统不同于通用计算机系统,一般是专有系统,不同应用方向,硬件、软件和其他系统可能都存在很大差异。针对不同的硬件平台,我们需要开发不同的软件。这样就存在这样一个问题,当一个嵌入式系统的硬件平台做完后,能像为PC其实,嵌入式系统的硬件设备刚做好时上面并没有软件,软件需要我们专门为其开发,也就是说,此时的嵌入式硬件设备上是空的,这一点很好理解,就像我们攒一台新电脑一样,机器内并没有系统,我们需要为其安装操作系统。不同的在于嵌入式系统的软件需要我们自行开发。此时,因为嵌入式硬件设备上是空白的,其上自然也不会有我们开发嵌入式系统软件所需达内IT达内IT培--PAGE10另外,嵌入式设备上的资源有限(如:主频,内存,外存等,开发软件所需要的工具软件如编译器等不能直接运行在嵌入式设备上,即便能运行效率也会比较低。同时,嵌入式系统一般是系统,只需要完成功能,比如一台MP3,实现歌曲,显示文本等基本功能就可以了,产品发布后最终的用户(MP3的使用者)有谁会在MP3上编辑文本,编译应用程序呢?可见,即便我们把编译器等工具软件放到嵌入式设备上,产品开发完成发布后,这些工具软件对最终的用户(使用者)是没有什么实用价值的,而且还占用了大量的空间(开发工具软件一般都还是比较大的,增加了产品的成本。为了解决这个问题,嵌入式开发者们想到的解决办法是将开发嵌入式软件的所需要的工具软件,如编辑器、编译器等运行在PC机上,编译出来的软件才运行在嵌入式设备上,这样很多问题就得到了比较合理的解决。我们把运行开发工具软件的PC机称为开发主机,将运行嵌入式软件的嵌入式设备称为目标机。这种开发工具软件运行在开发主机上,在开发主机上为嵌入式目标设备开发软件的方式嵌入式软件开发系统的一般构成由此可见,嵌入式软件开发系统一般由硬件工具、软件工具构成。嵌入式系统硬件开发环(各种线缆、调式器,器等)构成。软件工具方面不同的嵌入式系统,通常差异比较大,大概包括:编辑软件,编译、连接、调试软件,仿真软件,通讯软件,控制软件等等。有很多开发系统采用将编辑、编译、连接、调试、仿真等功能集成在以前的集成开发工具软件,这有点像微软的VS集成开发软件。CPU基本本课程采用的硬件平台为基于S5PV210基于ARMCortex-A8)微处理器的开发板。S5PV21032RISC性能高的应用处理器。主要应用于移动和一般的应用。它为3G和3.5G通信服务提供HW性能。S5PV210其主要特性如下:32/32KBI/DCache,512KBL2主频在800Mhz@1.1V,1Ghz@1.2V(2)64KBROM安全引导程序,128KBRAM(3)8ITU601/6564M16M(4)提供的MPEG-4/H.263/H.264编码和(1080@30帧/s,MPEG-2/VC1/Divx(1080P@30帧s(5)2D、3DAC-97音频编器接口和PCM串行音频接口ISIIC支持IRDA配置灵活的GPIO支持USB2.0OTG,高速(480MBPS支持USB2.0支持高速MMCSD实时时钟,锁相环,具有的定时器和看门狗定时器(14)32通道DMA8X8816位数据总线的SRAM/ROM/NORFlash16位数据总线的MUXED,ONENAND8NANDFlash32位数据总线(400Mb/s/引脚DDR)的移动DDR32位数据总线(400Mb/s/引脚DDR)的移动DDR2多加速特性包括 头接支持ITU–RBT601/656对于YCBCr4:2:2编器/预览输出图像产生(16/18/24位的RGB格式和YCbCr4:2:0/4:2:2格图象窗口化和变焦的功能图像镜像和轮换支持YX90180270H/W支持LCD多标准器①多标准编MPEG-4部分II简单协议规范编码/H.263协议规范3编码/VC1支持多部分电池和多标准②编码可变模块大小:16×16,16×8,8×168×8MPEG4ACDC 的帧内预测(固定模式决定MPEG4重新同步。具有RVLCMPEG-4/AVCFMO和ASO位率控制(CBR和VBR③工④前/后旋转/八个镜像/旋转模式全双工的VGA30fps编码/半双工720×48030帧/s(720×57625f帧/s)编码/JPEG压缩/解压缩达65536×65536编码格式:YCbCr4:2:2格式:YCbCr4:4:4/4:2:24:2:0/4:1:1YCbCr4:2:2或RGB565显示控制特性TFTLCD1024×768,800×480,640×480320×240,160x1604096×4k×4k支持五个窗口层作为PIP或OSD可编程OSC8Alpha 输入格式转换 /图形缩放向上/向下或缩放输入/输出彩色空间的转换,从YCbCrRGBRGBYCbCr本地接口显示。定标器用作TV 具有图像增强的TV(NTSC/PAL)编①支持NTSC-M/PAL- 兼容格式YCbCr4:2:0/4:2:2,16/18/24位RGB③内置MIE(移动图像增强器)引擎蓝色延展和Flesh-Tone动态水平的尖峰与LTI原始的,全屏和宽屏输出5.接接口特性AC97音频编器接可变采样率(48kHz和低于1通道立体声输入/1通道立体声输出/116位立体声(2声道)PCM主模式双向串行音频接口接受一个外部输入时钟来产确的音频时间可选的基于DMAISDAC1通道总线作为音频编器接口可选的基于DMA8/16支持IISMSBLSB可以在主或从模式下操作支持多种位时钟频率和编器的时钟频率16,24,32,48fs的位时钟频率和256,384,512,768fs的编器的时钟频率USBUSBUSBOTG2.0符合OTG1.0USB2.02.0配置只作为OTG设备,USB1.1设备,OTG迷你主设备,或USB1.1支持高速(480Mb/s,全速(12Mb/s)和低速(1.5Mb/sUSBUSB符合OHCI1.0符合USB1.1支持全速高达12Mb/sIrDAIrDAv1.1(1)的IrDA作为v1.1(1.152Mb/s和4Mb/sFIR(4Mb/sSIR(111.5kb/s)模式是由UART的IrDA1.064Tx/RxFIFO。4通道UARTDMA5678位串行数据传输/UART操作(UCLK支持IrDA1.0SIR(115.2kb/s)环回模式进试64TxFIFO64RxFIFOIC1通道多主设备IIC串行,8100kb/s在快速模式高达400kb/sSPI264字节缓冲器用来接收/基于DMA50Mb/s的发送/接收(全双工MIPI128字节(3232)TxFIFO256字节(3264)RXFIFO发送:PCLKb/s100Mb/s。16位SRAM式接口(i80接口8KBSRAM片上写FIFOFIFO(288字9.GPIO188GPIO。8×8A/D8ADC500k采样/S10 器设器设备特MMC/SD兼容多卡协议版本4.0兼容SD卡的协议版本1.0128字FIFO用作发送/基于DMA系统外系统外设特性DMADMA每个DMA每一个DMA832支持器到器,外设到器,器到外设,和外设到外设32IRQ硬件中断优先级IRQFIQ具有的定时器(脉宽调制具 的4通道32位定时器DMA132死区生成(4)16在超时时中断请求或系统RTC(实时时钟32.768kHz中断系统管ARMCortex-A8时钟频率最高是1GHzPLL,APLL,MPLL,EPLL和VPLL开发板基本配置我们使用的开发板如下所示。达达内IT培--PAGE14这块开发板使用的板+底板的设计,板上包括如CPU、内存、闪存晶振等部分,外设接口基本都位于底板上。从上图可以看到板和底板采用邮票孔方式接口焊接到一起。板构成框图如下,其配置包括:达内IT达内IT培--PAGE15底板接24RGBIIC、TOUCH 输出接口(经放大单元放大后输出USBHost2.0USBOTG2.0外扩SPI、IIC、ADC(四路)、外部中断(3路)、TTLUart接口,以上ADC外均可做为IOSD卡接口,TFLED指示复位按MIC耳机接BootSDIOWIFI接口(miniPCI接口座JTAGVGA开发板的内存地址映射如达达内IT培--PAGE17开发板启动开关选项说明1、S5PV210的启动方式选择达内IT达内IT培--PAGE20由上表可见,S5PV210支持从不同介质上加载启动代码,每种方式称为一种启动模式,同时我们也可以看到,S5PV210的启动模式是有OM[5:0]来控制的,以上引脚接不同的电平(高、低)就可以选择不同的启动模式。,ALl(USB23、板载拨码开关实物图(开发板右下角,靠近或按键处启动配1、从SD卡启动的跳线配置如下2、从Nand启动的跳线配置3、从USB启动的跳线配置嵌入式软件开发环境是由编辑工具,编译、连接、调试工具,通讯工具等。本课程开发主机系统选择为Linux兼容系统,所以编辑工具软件可以使用lnux下支持的任何文本编辑工具软件,推荐用vim,另外在wndows下可以使用ourceinght。开发调试工具软件我们使用GNURM工具集,其软件在开发板光盘或相应的实验代码中提供。串口终端软件,在inux下可以使用 ,ckermt,gtkerm等,在windows下可以使用SecureRT、putty和超级终端等。tftp网络通信软件在lnux系统下可以使用tfpd-hpa等,在windows下可以使用tftpd32。编辑、通信软件的安装都比较简单,只有按照其使用说明安装即可,或者参考经典案例中的方法。GNUARM工具集的安装配置需要经过两个步骤: :如/opt下面修改环境变量PATH设置,增加GNUARM工具软件的执行文件进过此两步,GNUARM工具集就可以使用了,可以再命令行输入:arm-linux-gcc-下面以将GNUARM工具集安装在 下为例说明其安装方法 arm-编辑用户 下的.bashrc文件,添加PATH路径设置 $vimPATH= $vimPATH=$PATH:/opt/arm-2009q3/bin: $arm-linux-$arm-linux- GNUARM1arm-linux-intmain(void){ return0;} oword的C程序 intmain(void){ return0;}在命令行输入如下命令:$arm-linux-$arm-linux- 这样我们就产生了一个名为.out的可执行文件,遗憾的是我们不能在x86平台的linux命令行下执行该文件,为什么呢?ar-linux-cc产生的不是可执行文件吗?我们可以尝试执行刚刚产生的可执行文件试试。则提示basha.outcannotexecutebinaryfilearm-linux-gcc编译o.c产生a.out件,然后执行该文件,则提示“bash:./a.out:cannotexecutebinaryfile”,原因在于arm-linux-gcc是我们用来为ARM体系结构的硬件平台开发软件的交叉编译ARMLinux发主机(X86)系统下的Linux系统中。我们可以使用Linux的file命令来查看一下刚刚产生的a.out的文件结构。命令行输入命令 可以看到如下信息:我们可以看到,刚刚产生的a.out是LSB(小端格式)的ELF(执行与连接)格式的文件,该文件是能够运行在ARMLinux环境下的可执行程序。我们还应该知道,我们用arm-linux- 编译一个程序,其实一般它是要经过如下预处理(Pre-编译汇编下面我们仍然 o.c来就具体来查看一下arm-linux-gcc是如何完成这四个步骤的预处理阶段$arm-linux- 在该阶段,编译器将上述代码中的stdio.h编译进来,用户可以使用GCC的选项“-E”来$arm-linux- 在此处,选项”-o”是输出文件,“o.i”文件为已经过预处理的C原始程序的内容入 o.i文件中。可以用文本编辑器,如vim查看一 o.i的内容编译阶$arm-linux- - -接下来进行的是编译阶段,在这个阶段中,arm-inuxgcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,r-linu-$arm-linux- - -汇编阶 - $arm-linux- 汇编阶段是把编译阶段生成的“.s”文件转成目标文件,使用者可使用选项“-c”就可产生“.o - $arm-linux- 阶在成功编译之后,就进入了阶段。在这里涉及到一个重要的概念:函数库。我们可以重新查看这个小程序,在这个程序中并没有定义printf的函数实现,且在预编译中包含进的”tdo.h”中也只有该函数的,而没有定义函数的实现,那么,是在哪里实现”printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为lbc..6的库文件中去了(或者采用精通连接时时有的.a文件中),在没有特别指定时,rm-inuxgc会到系统默认的搜索路径下进行查找,也就是到lic..6库函数中去,这样就能实现函数“printf”了,而这也就是的作用函数库一般分为静态库和动态库两种。静态库是指编译时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“a程序执行时由运行时文件加载库,这样可以节省系统的开销。动态库一般后缀名为,如前面所述的lbc.o6就是动态库。ar-linuxgcc在编译时默认使用动态库。完成了之后,arm-linux-gcc -oarm-linux-gcc常用命令行选项rm-inux-gcc编译器執行時可以有許多选项,但对于普通使用者来说只要知道其中常用的几个就够了。在這里列出几个最常用的选项:参 功 表示要求编译器产生所指定文件名的文件,因为默认的可执行文件名 a.out- 指定时要用到的函数库的搜 指定头文件h的搜 正常只会用 这个函数库,其他函数库需要用这个命令指定 只建立组合语文件 条件编译,搭配#ifdef#define用。如果有定义c 表示只要求编译器進行编译,而不要進行,产生以原始文件的文件命名但把其后缀名由c变成.o的目标文件 要求编译器在编译的時候提供以后对程序進行调试的信息 表示编译器对原始文件只进行预处理就停止,而不做编译、汇编和 表示编译器只進行编译,而不做汇编和链-O1/O2/O3编译器对程序提供的最优化选项,在编译的时候使用该选项,可以使产生的可执行文件的执行效率提高,编译器会根据CPU的架构编出优化的程序代码,需要多花一点编译时间。-O2比较常用 指定产生全部2、汇编器arm-linux-$arm-linux-$arm-linux- 3、连接器arm-linux-arm-linux- 用于连接目标文件和系统库中的函数代码(目标代码,示例用法如下: - 上例中将arm-linux-gcc提供的crt1.ocrti.o和上步骤生成的 o.o一起连接生成可 o.elf文件。4、文件格式转换arm-linux-用于文件格式转换,将上步生成 文件转换成二进制文件的示例用法如下 5、反汇编arm-linux- o.o o.o 这样就 o.o文件给反汇编 Disassemblyofsection{fp,addfp,sp, ;ldrr0,[pc, ;1c 0movr3, ;movr0,pop{fp, 6、elf格式文件查看:arm-linux-arm-linux-readelf可以用来查看elf$arm-linux-$arm-linux- 可以输 o.elf文件的文件头信息,以及段信息等等还可以通过arm-linux-readelf来看 o.elf用到了哪些动态库,使用用法如下 o.elf|grep我们可以看到输出如下信息: Sharedlibrary:可 o.elf用到了动态库libc.so.6,操作截屏如下7、静态库管理arm-linux-静态库管理软件,可以将产生的目标文件“.”文件生成或添加到库中,也可以查看库中有的目标文件等。使用的示例代码如下:$arm-linux-$arm-linux- o.o生 o.a库文件8arm-linux-生成elf$arm-linux-$arm-linux- 重定向输出的sym文件内容如下:000103ccd000103ccdd000104b8A bss_end 000104b8A bss_start000104b8A bss_start 000104b4D data_start000104b8A end 000083ccA 000083c4A 000103ccdinit_array_end000103ccdinit_array_startcT达达内IT培--PAGE34TT 000104b8A_bss_end 000104b8A_edata000104b8A_end000083acT_finiT_init000082c0T_start000082f8tcall_gmon_start000104b4Wdata_startcTU从 我们可以看到,程序中的标号的值9、去掉elf文件中不需要的信息和代码arm-linux-arm-linux-strip用于去掉文件中不使用的一些信息,如调试信息等,以减小目标文件的o.elf的大小是o.o1020码o$ o.elf大小变为2360, 看到使用arm-linux-strip处理前后 o.elf和 o.o文件大小的变化。GNUARMGNUARM汇编程序设计GNUARM @同一语句。“\”后不能有任何字符,包含空格和制表符(Tab)。label:可以使字母,数字,下划线组成,除局部标号外,必须以字母或下划线开头。GNUARMinstruction:ARM汇编指令,如 r0,转化成一条或多条arm指令,伪指令我们前面章节已经做过介绍,如nop伪指令 伪指令 r0,label伪指directive:GNUARM伪操作,伪操作只在汇编阶段起作用,其不会被转换成arm指令,只是用来控制汇编、连接器的动作,后续章节将具体介绍GNUARM工具支持的伪操作。注:通一行中,注:通一行中,ARM指令,伪指令,伪操,寄存器名称作要么大写,要么小写,不可以大小写混合。@comment:可选项,GNUARM汇编语言注释语句,@为注释标示符,comment达内IT达内IT培--PAGE37sGNUARM汇编程序举例:s@使用.section@使用.global@add64标号(可以看做函数名称 @6432 @.section第二行用.global伪操作 .section第二行用.global伪操作 add64为全局标号,本行中包括了伪操作和注释。add64,本行中包括了标号和注释。第六行使用add指令将分别存放在r0r26432位相加,add指令需要S”,本行中包括了汇编语句和注释。adcr1r36432位相加,本行中包括pGNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点( 关规范。本节介绍一下,GNUARM汇编中的部分伪操作。.sectionsection_name用户可以通过.ection伪操作来自定义一个段,每一个段以为开始,以下一个或者文件结尾为结束。这些段都有缺省的标志(flag),器可以识别这些标志。ELF格式允许的段标志:a:可分w:可写x:执行伪操作应用举例如下:.section.section.mysection@自定义数据段 使用预定义段.text、.data、.text.data{subsection}@初始.bss.text、.data和.bss将汇编系统预定义的编译到相应的代码段、数据段和bss段。要注意的是源程序中.bss段应该在.text之前。伪操作应用举例如下:.section.section<initializeddata.section<uninitializeddata.section.globl<instructioncodegoes.code16、code32、.thumb、.code16、.code32/.code16伪操作用来选择ARM或者Thumb指令集,.thumb伪操作等同于.code16,表明使用Thumb指令,类似的.arm等同于.code32 .include.include可以将指定的文件在使用位置处展开,一般是头文件。伪操作应用举例如下: .include .incbin 伪操作可以将原封不动的一个二进制文件编译到当前文件中。其中, 表明从文件开始跳过skip个字节开始文件,ount是的字数.align.align[ab .align和.balign用来指定数据的对齐方式。以某种对齐方式在未使用的区域填充值 .if、..if代码段根据一个表达式的值来决定是否要编译下面的代码,用 伪操作来表示条件判断的束,中间可以使用 来决定.if的条件不满足的情况下应该编译哪一部分代码.ifdef,.else代码段组语句。其中else.macro、.exitm和..macro@伪操作.macro定义一个宏.endm@.endm默认值。可以使用.exitm伪指令来退出宏。伪操作应用举例如下:.macro.macroSHIFTLEFTa,.if\b<MOV\a,\a,ASR#-MOV\a,\a,LSL语法定义.byte.byte.byte.short.short/.hword表达式.short.short.long、.word、..long/.word/.int表达式{,表达式.long .long 语法定义.quad.quad .quad 表达式{,表.srngaciz和.scii定义多个字符串。需要注意的是scii伪操作定义的字符串需要自行添加结尾字符'\0'。.string.string"abcd","efgh",.asciz"qwer","sun",.ascii .zero、.space.zero.space/.skip<number_of_bytes>分配number_of_bytes字节的数据空间,.zero伪操作用0填充内存,.space/.skip为fill_byte填充内存,若未指定该值,缺省填充0.rept、.rept数据定.endr@.rept.rept.byte.equ、语法格式.equ(.set)常量名,表达 .equabc3@让 .global/.globl.global和.globl用来定义一个全局的符号 .extern用于一个外部标号.ltorg.ltorg和.pool用于一个数据缓冲池 lpool)的开始,它可以分配很大的空间GNUARM接文件,输出文件可以是目标文件或可执行文件。我们可以通过命令行或者 每一个过程一般都由(linkerscript,常以lds作为文件的后缀名)控制。section器有个默认的内置连接,我们在linux下编写应用程序通常都是使用器默认 ,器内置的可用ld--verbose查看。器(arm-linux-ld)可以用-T选项指定自己 ,它将代替默认 格符号的赋值语句组成./**/之间的是注释。简单示在介绍描述文件令之前 先看看下述的简单例子以下脚本将输出文件 section定位在0x10000,datasection定位 { }:{*(.text);:{*(.data):{*(.bss)解释一下上述的例子:SECTIONSSECTIONS命令告诉ld如何把输入文件的sectionssection:将输入sectionsection;如何把输出sectionVMA)和进程地址空该命令格式如下:{}

本例中 MAND有达达内IT培--PAGE45 = = :{*(.text)赋 :{*(.text)输出section类型 = 赋值语句类 {*(.data)输出section类型 .bss.bss:{*(.bss)输出section类型 = 把符号置为0x10000(若不指定,则该符号的初始值为0) :{*(.text)} 将所有(*符号代表任意输入文件).text段合并成一个.text段,该段的地址由符号的值指定,即0x10000. = .data:{*(.data)}:将所有输入文件的.text段合并成一个.data段,该段的地址被置为 :{*(.bss)}:将所有输入文件的.bsssection合并成一个.bsssection,该section的地址被置为0x +.datasection的大小.连接器每读完一个section描述后,将符号的值增加该section的大小.注意:此处为一个输出sectionsectionsectionSECTIONS命令中提到,sectionsection有时把输入文件内的section称为输入section(inputsection),把输出文件内的section称为输出section(outputsectin).目标文件的每个section至少包含两个信息:名字和大小.大部分section的一块数据sectioncontents(section内容section可被标记为“loadable(可加载的)” section: section:在输出文件运行时,section内容将被载入进程地址空间中 section:section可被标记为“可分配的”.在输出文件运行时,在进程地址空间中空出大小同section指定大小的部分.某些情况下,这块内存必须被置零.用objdump-h命令查看相关信息.虚拟内存地址或程序地址空间地址)和LMA(loadmemoryaddress加载内存地址或进程地址空间地址).通常VMA和LMA是相同的.输出section描述具有如下格式 [(TYPE)]:{{{}如前面示例中的: :{*(.text)主要常用部分解释:SECTION_NAME:section名字SECTION左右的空白、圆括号、冒号是必须的,换行符sectionSECTION_NAMEsection比如:a.outtext、.data和.bsssection名。每 MAND为以下四种之一达内IT达内IT培--PAGE47符号赋值语句一个输入section直接包含的数据值一个特殊的输出section关键字sectionsectionsection FILENAME...)] SECTIONFILENAME文件名,可以是一个特定的文件的名字,也可以是一个字符串模式。SECTIONsection*(.text),表示所有输入文件的.textsection(*(EXCLUDE_FILE*crtend.o*otherfile.o).ctors))表示除crtend.o、otherfile.o件外的所有输入文件的.ctorssection。data.o(.data)表示data.odatasection。data.o表示data.o文件的所有section*(.textdata)表示所有文件的.textsectiondatasectiontextsection第一个文件的.datasection,第二个文件的.textsection,第二个文件的.data*(.text)*(.data)表示所有文件的.textsection和.datasection,顺序是:第一个文件的.textsection,第二个文件的.textsection,...,最后一个文件的.textsection,第一个文件的.datasection,第二个文件的.datasection,...,最后一个文件的.datasection字符串模式内可存在以下通配符:*[CHARS]:表示任意一个CHARS内的字符,可用-号表示范围,如:a-z:表示下在文件名内,通配符不匹配文件夹分隔符/,但当字符串模式仅包含通配符*时除外。任何一个文件的任意section只能在SECTIONS命令内出现一次。SECTIONS.data:{*(.data).data1:{data.o(.data)}data.o文件的.datasection在第一个 MAND命令内被使用了, MAND命令内将不会再被使用,也就是说即使连接器不报错,输出文件的.data1section的内容也是空的。 MAND命令内的文件名,任何一个文件的任何一个section都只能使用一次。MmapsectionsectionSECTIONS{.text:{*(.text).data:{*(.data).bss:{*(.bss)}这个例子中说明,所有文件的输入.textsection

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论