




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式软件开发,嵌入式开发过程,“PC软件”,独立的嵌入式应用,当程序员开始开发一个基于ARM应用的时候,你可以使用ARM的ADS编写类似于“HELLOWORLD”的程序,使用ARMulator或者在评估板上来调试,但当你把他移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的:硬件环境中所使用的C库函数目标板上的存储器资源应用程序的初始化,议程,PC软件的构造定制标准C库函数到目标板定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,ADS默认的标准C库,ANSIC,input/output,errorhandling,stackintfputc(intch,FILE*f)/*e.g.writeacharactertoanLCD*/chartempch=ch;sendchar(可查看在ADSEmbeddedexample目录下的retarget.c,可看到更多的重定向例子你可以确定有不在连接时使用semihostingSWI的吗?.,消除C库函数中的semihosting,为了确保在连接时没有函数使用了semihostingSWIs,你可以在程序中加入下面的句子:#pragmaimport(_use_no_semihosting_swi)如果在程序中仍然使用了semihosting,编译时将会报错:Error:Symbol_semihosting_swi_guardmultiplydefined修改:如果使用(check-verboselinkeroutputforoccurrencesofIuse_semihosting_swi),那么连接器将会把那些使用了smeihosting的程序列出来,然后:提供你自己可运行的功能函数。在ADS1.2编译器和库函数手册,表4-2给出了所有使用了semihosting的C库函数。注意:连接器在用户自己的应用代码中不会出现任何有关semihostingSWI使用的报告。,Agenda,一个PC软件的构造定制标准C库函数到目标板定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,分散加载(Scatterloading),在一个实际应用当中,你可能并不想在0 x8000处开始运行。大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交叉出现的。分散加载提供了一种把你的代码和数据放在不同的存储器定位上的办法分散加载定义了两种类型的存储器区域。Load区:-在reset/load时保留了应用程序的代码和数据(典型应用为ROM).Execution区在程序执行的同时保留了程序的代码和数据。在应用程序启动期间,每个load区都可创建一个或多个可执行区。分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数给armlink使用eg:armlinkprogram.o-scatterscatter.scf-oprogram.axf,分散加载(简单例子),只读代码和数据保存在ROM中C库函数初始化代码(在_main)将:从ROM拷贝RW数据到RAM在RAM中的ZI数据初始化,Scatter描述文件,通配符(*)语法允许简单的对CODE和DATA进行分组,EXEC_ROM0 x00000 x4000*(+RO),链接器放置规则,在每个可执行区,链接器通过一些基本的规则来放置CODE和DATA基本的排序方法是通过属性来安排的:RO领先于RW,RW领先于ZI有相同的属性时,CODE在DATA之前放置。更多的排序方法决定于:输入的组名按字母排序,在ARMLINK命令行中指定的顺序。eg:armlinkfile1.ofile2.o,在SCATTOR文件中的对象排序,为了把特定的CODE和DATA放在指定的地址上,你可以不考虑标准的放置规则使用+FIRST和+LAST,直接把第一个和最后一个对象放在可执行区。图例:把VECTOR表放在区的开始。,LOAD_ROM0 x00000 x4000EXEC_ROM0 x00000 x4000vectors.o(Vectors,+FIRST)file1.o(+RO)file2.o(+RO):,在可执行区内,scattor文件中要排序的对象对输出image没有影响链接器的标准放置规则仍然适用,ROOT区,LOAD_ROM0 x00000 x4000;startaddressandlengthEXEC_ROM0 x00000 x4000;root(load=execaddress)_main.o(+RO);copyingcode*(Region$Table);RO/RWaddressestocopy*(ZISection$Table);ZIaddressestozeroRAM0 x100000 x8000*(+RO);AllotherROareas*(+RW,+ZI);programvariables,Mustbeinarootregion,outsiderootregion,一个root区是一个可执行区,它的加载地址等于执行地址。,Root区要点,一个root区是一个可执行区,它的加载地址等于执行地址.每个scatter描述文件必须最少包含一个root区,并且最少要包含下列内容:_main.o含有拷贝code/data的代码Region$Table和ZISection$Table含有将要拷贝的code/data的地址,他是由链接器产生的,不是一个对象文件。(所以*必须用)Error:L6202E:SectionRegion$Tablecannotbeassignedtoanon-rootregion.Error:L6202E:SectionZISection$Tablecannotbeassignedtoanon-rootregion.注意:如果*(+RO)被定位在root区,在此之前的将被自动放置Main应用程序的入口点必须放在root区。Error:L6203E:Entrypoint(0 x08000000)lieswithinnon-rootregionEXE_FLASH.,Run-time存储器管理,SemihostingSupport,ANSIC,StackHBLDRr1,=0 x88000;SB;r2notused(HL);r3notused(SL)MOVpc,lr,Heap,Stack,Heap的限制地址在单一模式是不被使用的。Stack的限制地址只在软件堆栈检查许可的情况下才有效。,HB=0 x80000,SB=0 x88000,警告!,当使用分散加载时你必须执行_user_initial_stackheap()在C库初始化代码内的_user_initial_stackheap()的默认执行是在映像文件的RW/ZI数据段后放置HEAP。使用Image$RW$Base/Image$ZI$Base连接符号这些符号对scatterloading是无效的。在ADS1.1和早期版本的软件中:符号被设置为0X0,heap被定位在这!Heap的并发使用,无论是直接(e.g.withmalloc()或间接(byuseofargc/argv)的都可能破坏向量表或其他代码,典型的结果是不可预知的程序在运行时出错了。在ADS1.2:符号没有定义,应用程序不会联接:Error:L6218E:UndefinedsymbolImage$ZI$Limit(referredfromsys_stackheap.o).,Agenda,一个PC软件的构造裁减标准C库函数到目标板定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,TheVectorTable,AREAVectors,CODE,READONLYIMPORTReset_Handler;importotherexceptionhandlers;ENTRYBReset_HandlerBUndefined_HandlerBSWI_HandlerBPrefetch_HandlerBData_HandlerNOP;ReservedvectorBIRQ_Handler;FIQ_HandlerwillfollowdirectlyEND,在使用scatterloading+FIRST时直接定位在0X0(或0 xFFFF0000)ENTRY直接告诉链接器这是一个入口点,防止某些段被删除,中断向量表,初始化步骤,CLibrary,UserCode,_maincopycodeanddatazerouninitializeddata,ImageEntryPoint,$Sub$main()enablecaches-IntegratorCMcontrolregCM_ctl_regEQU0 x1000000C;AddressofCMControlRegisterRemap_bitEQU0 x04;Bit2isremapbitofCM_ctlENTRY;Onreset,analiasofROMisat0 x0,sojumptorealROM.LDRpc,=Instruct_2Instruct_2;RemapbysettingRemapbitoftheCM_ctlregisterLDRr1,=CM_ctl_regLDRr0,r1ORRr0,r0,#Remap_bitSTRr0,r1;RAMisnowat0 x0.;TheexceptionvectorsmustbecopiedfromROMtoRAM(in_main);Reset_Handlerfollowsonfromhere这个功能也可在有mmu时使用,ROM/RAM的重定向,初始化栈的指针,;-Amountofmemory(inbytes)allocatedforstacksLen_FIQ_StackEQU256Len_IRQ_StackEQU256Offset_FIQ_StackEQU0Offset_IRQ_StackEQUOffset_FIQ_Stack+Len_FIQ_StackReset_HandlerLDRr0,stack_base;locatedbyscatterfile;EntereachmodeinturnandsetupthestackpointerMSRCPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit;NointerruptsSUBsp,r0,#Offset_FIQ_StackMSRCPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit;NointerruptsSUBsp,r0,#Offset_IRQ_Stack;SystemmodestackissetuplastMSRCPSR_c,#Mode_SYS:OR:I_Bit:OR:F_Bit;NointerruptsSUBsp,r0,#Offset_SYS_Stack;SetupstacklimitifneededLDRr10,stack_limit;locatedbyscatterfile,局部存储器设置,run-time的存储器必须在C库初始化前定义如果你使用的ARM7芯片还有MMU/MPU,它必须设置;ROM/RAM的重新映射必须完成。TCMs(Tightlycoupledmemory)如果有TCM,典型的必须使能它。请注意:在TCM使能之前,要屏蔽ROM在Cache打开之前要返回。在c库初始化代码运行之后,如果cache被使能,可以避免与cache相关的问题;,扩展功能,系统初始化代码通常在进入主应用之前运行当然,resethandler不是一个适合使能中断和使能caches地方。在resethandler最后应该放一个C运行库初始化代码EG。IMPORT_mainB_main我们可使用$Sub和$Super功能来包装符号externvoid$Super$main(void);void$Sub$main(void)cache_enable();/enablescachesint_enable();/enablesinterruptssys_to_usr_mode();/changemode-seenextslide$Super$main();/callsoriginalmain()相关描述可在ADS1.2LinkerandUtilitiesGuide-4.4章查阅到。,运行模式考虑,主应用程序运行在何种模式是要考虑的重要问题。用户模式(Usermode)是非特权模式(unprivilegedmode)-保护你的系统系统初始化代码只能运行在特权模式(privilegedmode)。需要执行特权操作比如:使能中断。如果你的应用要运行在管理模式,简单的在管理模式下退出你的resethandler就可。如果你想在用户模式下运行你的应用,你需在$Sub$main()改变为用户模式当然,_user_initial_stackheap()必须有权使用你的应用模式寄存器。解决办法是在系统模式里退出resethandler所有C库初始化代码有权使用用户寄存器,但是仍然可以执行特权操作。,Agenda,一个PC软件的构造裁减标准C库函数到目标板定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,长跳转Veneers,ROM_LOAD0 x0000ROM_EXEC0 x0000*(+RO)RAM0 x80000000farfunc.o(+RO)*(+RW,+ZI),/*main.c*/intmain(void)farfunc();/*farfunc.c*/voidfarfunc(void);:,代码段可被远距离分开放置(比BL的跳转范围还远)链接器可自动增加长跳转Veneers,远距离的函数可被成功调用。,0 x00000000blVen$AA$L$farfunc:Ven$AA$L$farfuncldrpc,pc,#-4dcd0 x80000000:0 x80000000:movpc,lr,存储器映射寄存器,你可以使用scatterloading来放置外设寄存器的存储器映射在文件中定义它e.g.timer_reg.cstructvolatileunsignedreg1;/*timercontrol*/volatileunsignedreg2;/*timervalue*/timer_reg;在存储器映射的请求地址上增加另外的可执行区来放置他们:LOAD_FLASH0 x240000000 x04000000:TIMER0 x40000000UNINITtimer_reg.o(+ZI):UNINIT显示在ZI段没有被初始化为0。,Stack和Heap区(1),你也可以在SCATTER文件中放置stack和heap在汇编原文件里定义stack和heap区比如.stackheap.s这个空间直接保留一个为0的存储器块AREAstack,DATA,NOINITSPACE0 x3000;ReservestackspaceAREAheap,DATA,NOINITSPACE0 x3000;ReserveheapspaceEND,Stack和Heap区(2),增加一个可执行区来定位这个区域LOAD_FLASH0X240000000 x04000000:STACK0 x1000UNINIT;length=0 x3000stackheap.o(stack);stack=0 x4000to0 x1000HEAP0 x15000UNINIT;length=0 x3000stackheap.o(heap);heap=0 x15000to0 x18000Heap的基地址起始为0 x15000.Stack的最大地址为0 x4000.,Stack和Heap区(3),链接器将产生一个为每个可执行区的基地址和限制地址的符号指针在你的代码中引入这些符号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|使用DCD指令为这些段命名,_user_initial_stackheap(),在resethandler,这个stack指针(r13)和stack限制值(r10)通常设置了,他们分别通过R1和R3作为参数传递给_user_initial_stackheap,IMPORT_use_two_region_memoryEXPORT_user_initial_stackheap_user_initial_stackheapLDRr0,heap_base;SBvaluesetupinresethandlerLDRr2,heap_limit;SLvaluesetupinresethandlerMOVpc,lr,Stack,Heap,这个_user_initial_stackheap()例子实现了两个存储器区域模式。必须引用_use_two_region_memory,在这HEAP被检查,它是HEAP的限制值,而不是STACK指针,存储器映射例子,16bitRAM,0 x10000,0 x18000,0 x4000,0 x0000,Fast32bitRAM,VectorTable,Stack,ExceptionHandlers,Flash,0 x24000000,0 x28000000,Peripherals,0 x40000000,外设控制寄存器的地址映射,直接在FLASH运行的代码大小,16位RAM被用来保存数据和HEAP区,一些紧急的代码和数据可放在快速的RAM区,SCATTER文件例子,这个scatter文件执行上页所显示的存储器映射。,Agenda,一个PC软件的构造裁减标准C库函数到目标板定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,不使用段的消除和程序的入口点,在默认的情况下,链接器将从最终的image文件中删除一些从不使用的代码段,或从未使用的数据段。要查看哪些段被删除了,在链接时用:-infounused.为了确保不删除重要的段(比如:中断向量表):使用汇编指令entry标示所有的入口点(c库有一个入口点:_main(),使用-entry选择其中一个入口点作为image的入口,否则,链接器将给警告:Imagedoesnothaveanentrypoint.(Notspecifiedornotsetduetomultiplechoices)在生成ROMmableimage使推荐使用下面的链接命令:armlinkobj1.oobj2.o-scatterscatter.scf-infounused-entry0 x0-oprog.axf,输出选项,链接器产生ELF/DWARF2格式的映像文件,选择适当的调试器下载调试为把elf映像文件转为ROMmable格式使用fromelf,例如.:fromelfimage.axf-bin-oimage.bin产生binary格式的文件可烧入到适当的ROM,Flash或EPROM-Emulator,等.其他ROMmable格式的文件也可由fromelf产生,例如.:Motorola32bitHex(-m32)Intel32bitHex(-i32)IntellecHex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省2025年下半年海船船员适任考试和评估计划船舶结构与货运综合练习题及答案
- 慢性舌扁桃体炎合并吞咽困难护理查房
- 阿拉尔市2025-2026学年八年级下学期语文期末模拟试卷
- 安徽省亳州市涡阳县2023-2024学年高一上学期期末考试历史试卷及答案
- 社区街道消防课件
- 内科细节管理-推进护理服务
- 社区电动车安全知识培训课件
- 浙江省嘉兴市2024-2025学年高一上学期期末检测生物试卷(含答案)
- 贵州省贵阳市花溪区燕楼中学2024-2025学年七年级下学期6月质量监测数学试卷(含部分答案)
- 车间水暖安装合同范本
- 留疆战士考试题库及答案
- 心衰病患者护理查房课件
- TSG11-2020 锅炉安全技术规程
- 哲学导论(完整版)
- 合成孔径雷达
- 四年级上册可爱的榆林全册教案
- 金属封闭母线
- 北师大版数学四年级下册全册教案设计
- 汉语拼音发音表(适合初学者和老年人)
- 购物中心商场商户促销活动管理制度
- 中国工商银行个人贷款申请表
评论
0/150
提交评论