版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D嵌入式软件开发嵌入式软件开发2TM266v06 Embedded Software Development嵌入式开发过程嵌入式开发过程“PC软件软件”hello world独立的嵌入式应用独立的嵌入式应用当程序员开始开发一个基于ARM应用的时候,你可以使用ARM的ADS编写类似于“HELLO WORLD”的程序,使用ARMulator或者在评估板上来调试,但当你把他移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的:n 硬件环境中所使用的C库函数
2、n 目标板上的存储器资源n 应用程序的初始化3TM366v06 Embedded Software Development议程议程nPC软件的构造软件的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE4TM466v06 Embedded Software DevelopmentADS默认的标准默认的标准C库库ANSI Cinput/outputerror handlingstack &heapsetupotherSemihosting Support应用程序调用的应用程序调用的C库库函数函数eg: fputc()设
3、备驱动层设备驱动层使用使用semihosting SWIseg: _sys_write()调试工具环境调试工具环境C LibraryDebug AgentC库函数功能是支持PC软件软件的,而目标板上的可执行软件则依赖相关的硬件资源;在ARM体系中,我们可以采用semihosting通过相应的驱动来进行调试。5TM566v06 Embedded Software DevelopmentADS默认的存储器映射默认的存储器映射n在默认的情况下,我们链接、定位、在默认的情况下,我们链接、定位、运行在运行在0 x8000nheap 被直接放置在数据区的上面被直接放置在数据区的上面n堆栈的基地址是通过调试
4、环境从堆栈的基地址是通过调试环境从C库库函数的函数的Startup Code 里读取出来的。里读取出来的。nARMulator = from configuration file (peripherals.ami) ndefault = 0 x08000000nMulti-ICE = from debugger internal variable $top_of_memoryndefault = 0 x80000RORWZI0 x8000链接时确定由调试环境提供Heap(malloc,alloc)Stack6TM666v06 Embedded Software DevelopmentC Lib
5、raryUser Code应用程序启动应用程序启动_mainncopy code and datanzero uninitialized data_rt_entryset up application stack and heapinitialize library functionscall top-level constructors (C+)Exit from applicationmain( )causes the linker to pull in library initialization code程序入口点7TM766v06 Embedded Software Developm
6、entAgenda一个PC软件的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE8TM866v06 Embedded Software Development重定向重定向C库函数库函数 (1)SemihostingSupportANSI Cinput/outputn你可以使用适合你目标板运行的驱动来替换标准你可以使用适合你目标板运行的驱动来替换标准C库中的设备驱动。库中的设备驱动。 Eg: printf( ) 可打印到可打印到LCD上,而不是打印控制台上上,而不是打印控制台上input/outputANSI CC Libr
7、aryUser CodeDebug AgentTarget HardwareRetarget9TM966v06 Embedded Software Development重定向重定向C库函数库函数(2)n要重定向要重定向C库函数库函数,简单的办法是使用你自己的可执行的简单的办法是使用你自己的可执行的semihosting SWIs来代来代替原来的替原来的C库函数,从而来满足你的系统要求库函数,从而来满足你的系统要求 比如说比如说, the printf()系列函数系列函数(sprintf()除外) 都会调用都会调用fputc(). 在默认情况在默认情况下下fputc()的执行使用了semiho
8、sting SWI. 用下面的语句来代替:用下面的语句来代替:extern void sendchar(char *ch);int fputc(int ch, FILE *f) /* e.g. write a character to an LCD */ char tempch = ch; sendchar(&tempch); return ch;n可查看在ADS Embedded example目录下的retarget.c,可看到更多的重定向例子可看到更多的重定向例子 n你可以确定有不在连接时使用semihosting SWI 的吗?.10TM1066v06 Embedded Sof
9、tware Development消除消除C库函数中的库函数中的semi hostingn为了确保在连接时没有函数使用了为了确保在连接时没有函数使用了semi hosting SWIs ,你可以在程序中加入你可以在程序中加入下面的句子:下面的句子:#pragma import(_use_no_semihosting_swi) n如果在程序中仍然使用了如果在程序中仍然使用了semihosting ,编译时将会报错:编译时将会报错:Error: Symbol _semihosting_swi_guard multiply definedn修改修改:n 如果使用 (check -verbose li
10、nker output for occurrences of I use_ semihosting_ swi), 那么连接器将会把那些使用了smeihosting 的程序列出来, 然后:n提供你自己可运行的功能函数。n在在ADS 1.2 编译器和库函数手册编译器和库函数手册, 表表4-2给出了所有使用了给出了所有使用了semihosting的的C库函库函数。数。n注意注意: 连接器在用户自己的应用代码中不会出现任何有关连接器在用户自己的应用代码中不会出现任何有关 semihosting SWI使使用的报告。用的报告。11TM1166v06 Embedded Software Developme
11、ntAgenda一个PC软件的构造定制定制标准C库函数到目标板 定制定制IMAGE的存储器映射到目标板的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE12TM1266v06 Embedded Software Development分散加载(分散加载(Scatterloading)n在一个实际应用当中,你可能并不想在在一个实际应用当中,你可能并不想在0 x8000处开始运行。处开始运行。n大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交叉出现的。n分散加载提供了一种把你的代码和数据放在不同的存储器定位上的办法n分散加载定义了两种类型的存储器区域。
12、nLoad 区: - 在reset/load时保留了应用程序的代码和数据 (典型应用为 ROM).nExecution 区 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个load区都可创建一个或多个可执行区。n分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数给给armlink使用使用 eg: armlink program.o -scatter scatter.scf -o program.axf13TM1366v06 Embedded Software DevelopmentExecu
13、te ViewRAM0 x100000 x180000 x40000 x0000ROMRO分散加载分散加载(简单例子简单例子)只读代码和数据保存在ROM中C库函数初始化代码 (在 _main) 将 :从ROM拷贝RW数据到RAM在RAM中的ZI 数据初始化RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWFill with zerosZICopyRW14TM1466v06 Embedded Software DevelopmentExecute ViewRAM0 x100000 x180000 x40000 x0000ROMROLOAD_ROM
14、0 x0000 0 x4000RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWScatter 描述文件描述文件n通配符(*)语法允许简单的对CODE 和DATA 进行分组EXEC_ROM 0 x0000 0 x4000 * (+RO)RAM 0 x10000 0 x8000 * (+RW,+ZI)RWZI15TM1566v06 Embedded Software DevelopmentRORWZIROCODERO -DATARO -CODEAB链接器放置规则链接器放置规则n在每个可执行区,链接器通过一些基本的规则来放置在每个可执行区,链接器通过
15、一些基本的规则来放置CODE 和和DATAn基本的排序方法是通过属性来安排的基本的排序方法是通过属性来安排的:nRO 领先于RW ,RW 领先于ZIn有相同的属性时,CODE 在DATA之前放置。n更多的排序方法决定于:更多的排序方法决定于:n输入的组名按字母排序, n在ARMLINK命令行中指定的顺序。neg: armlink file1.o file2.o Asection Afrom file1.osection Afrom file2.o16TM1666v06 Embedded Software Development在在SCATTOR 文件中的对象排序文件中的对象排序n为了把特定的为
16、了把特定的CODE 和和DATA 放在指定的地址上,你可以不考虑标准的放置规则放在指定的地址上,你可以不考虑标准的放置规则n使用使用+FIRST 和和 +LAST ,直接把第一个和最后一个对象放在可执行区。直接把第一个和最后一个对象放在可执行区。n图例:把VECTOR表放在区的开始。LOAD_ROM 0 x0000 0 x4000 EXEC_ROM 0 x0000 0 x4000 vectors.o (Vectors, +FIRST) file1.o (+RO) file2.o (+RO) :在可执行区内,scattor 文件中要排序的对象对输出image没有影响链接器的标准放置规则仍然适用1
17、7TM1766v06 Embedded Software DevelopmentROOT区区LOAD_ROM 0 x0000 0 x4000 ; start address and length EXEC_ROM 0 x0000 0 x4000 ; root (load = exec address) _main.o (+RO) ; copying code * (Region$Table) ; RO/RW addresses to copy * (ZISection$Table) ; ZI addresses to zero RAM 0 x10000 0 x8000 * (+RO) ; Al
18、l other RO areas * (+RW,+ZI) ; program variables Must be in a root regionoutside root region一个 root 区是一个可执行区,它的加载地址等于执行地址。18TM1866v06 Embedded Software DevelopmentRoot区要点区要点n一个 root 区是一个可执行区,它的加载地址等于执行地址.n每个每个scatter描述文件必须最少包含一个描述文件必须最少包含一个root区,并且最少要包含下列内容:区,并且最少要包含下列内容:n_main.o 含有拷贝code/data的代码nRe
19、gion$Table 和 ZISection$Table 含有将要拷贝的code/data的地址,他是由链接器产生的,不是一个对象文件。(所以*必须用)Error: L6202E: Section Region$Table cannot be assigned to a non-root region.Error: L6202E: Section ZISection$Table cannot be assigned to a non-root region.n注意注意: 如果如果 * (+RO)被定位在被定位在 root 区区,在此之前的将被自动放置在此之前的将被自动放置nMain应用程序的入
20、口点必须放在应用程序的入口点必须放在root区。区。Error: L6203E: Entry point (0 x08000000) lies within non-root region EXE_FLASH.19TM1966v06 Embedded Software DevelopmentRun-time 存储器管理存储器管理 SemihostingSupportANSI CStack &HeapSetupStack &HeapSetupANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget如何设置stack和 h
21、eap来满足我们的目标存储器? n我们已经通过执行我们已经通过执行_user_initial_stackheap()把把C标准库的运行存储器标准库的运行存储器模式修改到目标平台上。模式修改到目标平台上。20TM2066v06 Embedded Software DevelopmentStack 和和 Heap 初始化初始化C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryinitialize library functionscall top-level constructors (C+)Exit
22、from applicationmain( )cause linker to pull in library initialization codeImage Entry Point_user_initial_stackheap( )set up application stack and heap21TM2166v06 Embedded Software DevelopmentRun-time 存储器模式存储器模式n你必须决定在放置你必须决定在放置stack和和heap时所使用的区域是单一的区时所使用的区域是单一的区(one-region model)或是不同的两个区或是不同的两个区(two
23、-region model)HeapStackStackOne region modelTwo region modelHBSBSBHBHL单一存储器模式是默认方式为了实现多区域模式,你可以使用 use_two_region_memory在所有的模式下,软件堆栈检查要许可。编译开关是: -apcs /swst 指定堆栈限制 (为 two-region 模式)heap is checked against stack pointerHeapheap is checked against heap limit(SL)22TM2266v06 Embedded Software Development
24、_user_initial_stackheap( )n可以用可以用C或汇编来写,他要返回:或汇编来写,他要返回:nHeap 基地址在R0 ,STACK 的基地址在R1.nHeap 的限制地址在R2,STACK的限制地址在R3EXPORT _user_initial_stackheap_user_initial_stackheapLDR r0, =0 x80000 ;HBLDR r1, =0 x88000 ;SB; r2 not used (HL); r3 not used (SL)MOV pc, lrHeapStackHeap 的限制地址在单一模式是不被使用的。Stack 的限制地址只在软件堆
25、栈检查许可的情况下才有效。HB = 0 x80000SB = 0 x8800023TM2366v06 Embedded Software Development警告警告! n当使用分散加载时你必须执行当使用分散加载时你必须执行 _user_initial_stackheap()n在在C库初始化代码内的库初始化代码内的_user_initial_stackheap() 的默认执行是在映像文件的的默认执行是在映像文件的RW/ZI数据段后放置数据段后放置HEAP。n使用 Image$RW$Base / Image$ZI$Base 连接符号n这些符号对scatterloading是无效的。n在在ADS
26、 1.1和早期版本的软件中:和早期版本的软件中:n符号被设置为0X0, heap被定位在这!nHeap的并发使用,无论是直接(e.g. with malloc()或间接(by use of argc/argv)的都可能破坏向量表或其他代码,典型的结果是不可预知的程序在运行时出错了。n在在ADS 1.2:n符号没有定义,应用程序不会联接:Error: L6218E: Undefined symbol Image$ZI$Limit (referred from sys_stackheap.o).24TM2466v06 Embedded Software DevelopmentAgenda一个PC软
27、件的构造裁减标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化复位和初始化深层次的存储器器映象考虑编译和调试IMAGE25TM2566v06 Embedded Software DevelopmentThe Vector TableAREA Vectors, CODE, READONLYIMPORT Reset_Handler; import other exception handlers; ENTRYBReset_HandlerBUndefined_HandlerBSWI_HandlerBPrefetch_HandlerBData_HandlerNOP; Reserved
28、 vectorBIRQ_Handler; FIQ_Handler will follow directlyEND在使用scatterloading+FIRST时直接定位在0X0(或 0 xFFFF0000)ENTRY 直接告诉链接器这是一个入口点,防止某些段被删除中断向量表中断向量表26TM2666v06 Embedded Software Development初始化步骤初始化步骤C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryinitialize library functionscall t
29、op-level constructors (C+)Exit from applicationmain( )tells linker to link in library initialization codeImage Entry Point_user_initial_stackheap( )set up stack & heapreset handlerinitialize stack pointersconfigure MMU/MPUsetup cache/enable TCM$Sub$main( )enable caches & interrupts27TM2766v0
30、6 Embedded Software DevelopmentROM or RAM at 0 x0?n需要一个有效的地址在需要一个有效的地址在 0 x0这项功能可被编码在像RESET HANDLER 一样的模块中在本章结束的时候,我们还会讲到。ROM0 x100000 x180000 x40000 x0000AliasedROMReset HandlerROM/RAM RemappingRAM0 x100000 x180000 x40000 x0000ROMROM at 0 x0Reset HandlerVectorsReset Handler0 x40000 x0000RAMVectors2
31、8TM2866v06 Embedded Software DevelopmentROM/RAM Remapping 下面的例子可像Reset handler 一样在源码中编码。; - Integrator CM control regCM_ctl_reg EQU 0 x1000000C ; Address of CM Control RegisterRemap_bit EQU 0 x04 ; Bit 2 is remap bit of CM_ctl ENTRY; On reset, an alias of ROM is at 0 x0, so jump to real ROM. LDR pc,
32、 =Instruct_2 Instruct_2 ; Remap by setting Remap bit of the CM_ctl register LDR r1, =CM_ctl_reg LDR r0, r1 ORR r0, r0, #Remap_bit STR r0, r1; RAM is now at 0 x0.; The exception vectors must be copied from ROM to RAM (in _main); Reset_Handler follows on from here这个功能也可在有mmu时使用ROM/RAM的重定向的重定向29TM2966v
33、06 Embedded Software Development初始化栈的指针初始化栈的指针; - Amount of memory (in bytes) allocated for stacksLen_FIQ_Stack EQU 256Len_IRQ_Stack EQU 256 Offset_FIQ_Stack EQU 0Offset_IRQ_Stack EQU Offset_FIQ_Stack + Len_FIQ_Stack Reset_Handler LDR r0, stack_base ; located by scatter file; Enter each mode in turn
34、 and set up the stack pointer MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp, r0, #Offset_FIQ_Stack MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp, r0, #Offset_IRQ_Stack ; System mode stack is set up last MSR CPSR_c, #Mode_SYS:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp,
35、 r0, #Offset_SYS_Stack; Set up stack limit if needed LDR r10, stack_limit ; located by scatter file30TM3066v06 Embedded Software Development局部存储器设置局部存储器设置nrun-time的存储器必须在的存储器必须在C库初始化前定义库初始化前定义n如果你使用的ARM7芯片还有MMU/MPU,它必须设置;nROM/RAM 的重新映射必须完成。nTCMs(Tightly coupled memory) 如果有如果有TCM,典型的必须使能它。典型的必须使能它。n请
36、注意:在TCM使能之前,要屏蔽ROMn在Cache打开之前要返回。n在在c库初始化代码运行之后,如果库初始化代码运行之后,如果cache被使能,可以避免与被使能,可以避免与cache相关的问题;相关的问题;31TM3166v06 Embedded Software Development扩展功能扩展功能n系统初始化代码通常在进入主应用之前运行系统初始化代码通常在进入主应用之前运行n当然,reset handler 不是一个适合使能中断和使能caches地方。n在reset handler最后应该放一个C运行库初始化代码nEG。 IMPORT _main B _mainn我们可使用我们可使用$S
37、ub和和$Super功能来包装符号功能来包装符号extern void $Super$main(void);void $Sub$main(void) cache_enable();/ enables caches int_enable(); / enables interrupts sys_to_usr_mode();/ change mode - see next slide $Super$main();/ calls original main()n相关描述可在相关描述可在ADS 1.2 Linker and Utilities Guide - 4.4章查阅到。章查阅到。32TM3266v
38、06 Embedded Software Development运行模式考虑运行模式考虑n主应用程序运行在何种模式是要考虑的重要问题。主应用程序运行在何种模式是要考虑的重要问题。n用户模式(User mode)是非特权模式(unprivileged mode)-保护你的系统n系统初始化代码只能运行在特权模式系统初始化代码只能运行在特权模式(privileged mode)。n需要执行特权操作 比如:使能中断。n如果你的应用要运行在管理模式如果你的应用要运行在管理模式,简单的在管理模式下退出你的简单的在管理模式下退出你的reset handler 就可。就可。n如果你想在用户模式下运行你的应用,
39、你需在如果你想在用户模式下运行你的应用,你需在$Sub$main( )改变为用户模式改变为用户模式n当然, _user_initial_stackheap( ) 必须有权使用你的应用模式寄存器。n解决办法是在系统模式里退出reset handlern所有C库初始化代码有权使用用户寄存器,但是仍然可以执行特权操作。33TM3366v06 Embedded Software DevelopmentAgenda一个PC软件的构造裁减标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE34TM3466v06 Embedded Software
40、 Development长跳转长跳转VeneersROM_LOAD 0 x0000 ROM_EXEC 0 x0000 * (+RO) RAM 0 x80000000 farfunc.o (+RO) * (+RW,+ZI) /* main.c */int main(void) farfunc(); /* farfunc.c */ void farfunc(void); :代码段可被远距离分开放置 (比BL的跳转范围还远)链接器可自动增加长跳转Veneers,远距离的函数可被成功调用。0 x00000000 bl Ven$AA$L$farfunc:Ven$AA$L$farfunc ldr pc,p
41、c,#-4dcd 0 x80000000:0 x80000000:mov pc,lr35TM3566v06 Embedded Software Development存储器映射寄存器存储器映射寄存器n你可以使用你可以使用scatterloading来放置外设寄存器的存储器映射来放置外设寄存器的存储器映射n在文件中定义它在文件中定义它 e.g. timer_reg.cstruct volatile unsigned reg1; /* timer control */ volatile unsigned reg2; /* timer value */ timer_reg;在存储器映射的请求地址上增
42、加另外的可执行区来放置他们在存储器映射的请求地址上增加另外的可执行区来放置他们:LOAD_FLASH 0 x24000000 0 x04000000 : TIMER 0 x40000000 UNINIT timer_reg.o (+ZI) :UNINIT 显示在显示在 ZI 段没有被初始化为段没有被初始化为0。36TM3666v06 Embedded Software DevelopmentStack 和和 Heap 区区(1)n你也可以在你也可以在SCATTER文件中放置文件中放置stack和和heapn在汇编原文件里定义在汇编原文件里定义stack 和和heap 区区 比如比如. stac
43、kheap.sn这个空间直接保留一个为0的存储器块AREA stack, DATA, NOINITSPACE 0 x3000 ; Reserve stack spaceAREA heap, DATA, NOINITSPACE 0 x3000 ; Reserve heap spaceEND37TM3766v06 Embedded Software DevelopmentStack 和和 Heap 区区(2)n增加一个可执行区来定位这个区域增加一个可执行区来定位这个区域LOAD_FLASH 0X24000000 0 x04000000:STACK 0 x1000 UNINIT ; length =
44、 0 x3000 stackheap.o (stack) ; stack = 0 x4000 to 0 x1000HEAP 0 x15000 UNINIT ; length = 0 x3000 stackheap.o (heap) ; heap = 0 x15000 to 0 x18000nHeap的基地址起始为的基地址起始为 0 x15000. Stack的最大地址为的最大地址为 0 x4000.38TM3866v06 Embedded Software DevelopmentStack 和和 Heap 区区 (3)n链接器将产生一个为每个可执行区的基地址和限制地址的符号指针链接器将产生一个
45、为每个可执行区的基地址和限制地址的符号指针n在你的代码中引入这些符号IMPORT |Image$STACK$ZI$Base|IMPORT |Image$STACK$ZI$Limit|IMPORT |Image$HEAP$ZI$Base|IMPORT |Image$HEAP$ZI$Limit|stack_baseDCD |Image$STACK$ZI$Limit|stack_limitDCD |Image$STACK$ZI$Base|heap_baseDCD |Image$HEAP$ZI$Base|heap_limitDCD |Image$HEAP$ZI$Limit|n使用使用DCD指令为这些段
46、命名指令为这些段命名39TM3966v06 Embedded Software Development_user_initial_stackheap( )n在在reset handler,这个这个stack指针指针 (r13)和和stack 限制值限制值(r10) 通常设置了,他通常设置了,他们分别通过们分别通过R1和和R3作为参数传递给作为参数传递给 _user_initial_stackheapIMPORT _use_two_region_memoryEXPORT _user_initial_stackheap_user_initial_stackheapLDR r0, heap_base
47、; SB value setup in reset handler LDR r2, heap_limit; SL value setup in reset handlerMOV pc, lrStackHeap这个_user_initial_stackheap( )例子实现了两个存储器区域模式。 必须引用 _use_two_region_memory,在这HEAP被检查,它是HEAP的限制值,而不是STACK指针40TM4066v06 Embedded Software Development存储器映射例子存储器映射例子16 bitRAM0 x100000 x180000 x40000 x000
48、0Fast32 bitRAMVector TableStackException HandlersRW & ZIHeapFlash0 x240000000 x28000000Reset HandlerROPeripherals0 x40000000外设控制寄存器的地址映射直接在FLASH运行的代码大小16位 RAM 被用来保存数据和HEAP区一些紧急的代码和数据可放在快速的RAM区41TM4166v06 Embedded Software DevelopmentSCATTER文件例子文件例子 : :16bitRAM 0 x10000 * (+RW,+ZI) HEAP 0 x15000
49、UNINIT stackheap.o (heap) TIMER 0 x40000000 UNINIT timer_reg.o (+ZI) FLASH 0 x24000000 0 x04000000 FLASH 0 x24000000 0 x04000000 init.o (Init, +First) * (+RO) 32bitRAM 0 x0000 vectors.o (Vect, +First) handlers.o (+RO) STACK 0 x1000 UNINIT stackheap.o (stack) :这个scatter文件执行上页所显示的存储器映射。42TM4266v06 Emb
50、edded Software DevelopmentAgenda一个PC软件的构造裁减标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试编译和调试IMAGE43TM4366v06 Embedded Software Development不使用段的消除和程序的入口点不使用段的消除和程序的入口点n在默认的情况下,链接器将从最终的在默认的情况下,链接器将从最终的image文件中删除一些从不使用的代码文件中删除一些从不使用的代码段,或从未使用的数据段。段,或从未使用的数据段。n要查看哪些段被删除了,在链接时用: -info unused.n为了确保
51、不删除重要的段为了确保不删除重要的段(比如:中断向量表比如:中断向量表) :n使用汇编指令entry标示所有的入口点(c库有一个入口点:_main(),n使用-entry选择其中一个入口点作为image的入口,否则,链接器将给警 告:Image does not have an entry point. (Not specified or not set due to multiple choices)n在生成在生成ROMmable image 使推荐使用下面的链接命令:使推荐使用下面的链接命令:armlink obj1.o obj2.o -scatter scatter.scf -info unused -entry 0 x0 -o prog.axf44TM4466v06 Embedded Sof
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF(陕) 033-2020 超声波水浸探伤系统校准规范
- 提升学生兴趣的工作措施计划
- 《计算机的日常维护》课件
- 2024-2025学年年七年级数学人教版下册专题整合复习卷28.2 解直角三角形(3)(含答案)
- 《保护支持与运动》课件
- 《保险学引言》课件
- 前台工作环境的美化建议计划
- 组织年度人事工作总结大会计划
- 小型工程机械相关行业投资规划报告
- 井下波速测量仪相关项目投资计划书
- 五年级上册数学教案-总复习(1)-人教新课标
- 菩萨蛮黄鹤楼(毛泽东).中职课件电子教案
- 电气焊安全操作规程15篇
- 2023高中学业水平合格性考试历史重点知识点归纳总结(复习必背)
- 校园安全教育(完美版)ppt
- 小学语文人教一年级上册(统编)-富全学校语文教案丁代英
- 水库建设项目施工组织设计
- 国家开放大学实验学院生活中的法律第三单元测验答案
- 诗朗诵社团活动记录
- 第3章 细胞命运的决定(章节课程)
- 《积极心理学》课程教学大纲.docx
评论
0/150
提交评论