ARM嵌入式软件开发.ppt_第1页
ARM嵌入式软件开发.ppt_第2页
ARM嵌入式软件开发.ppt_第3页
ARM嵌入式软件开发.ppt_第4页
ARM嵌入式软件开发.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式软件开发、嵌入式开发流程、“PC软件”、独立的嵌入式应用程序、程序员开始开发基于ARM的应用程序时,可以使用ARM的ADS编写像“HELLOWORLD”这样的程序可以在评估板上调试,但可以在将他移植到独立的嵌入式应用程序设备上时,初始化硬件环境中使用的c库函数目标板上的内存资源应用程序,通过议程, PC软件的构建自定义标准c库函数目标板到自定义IMAGE的内存映射目标板的复位和初始化深度级别的内存映射图像是考虑到IMAGE的编译和调试的ADS默认标准c库输出错误处理,堆栈文件* f (/* e.g.writeacharactertoanlcd */chartemp ch=ch; 可以看到

2、sendchar(adsembeddedexample目录中的retarget.c。 你可以看到更多的重定向示例。 您能确认连接时没有使用semihostingSWI吗?您可以删除c库函数中的semihosting,并向程序中添加以下语句,以确保连接时没有使用semihostingswis:# pragma import (_ _ use _ no _ semi hosting _ swi ) 如果程序中使用semihosting,则在编译时显示错误:使用error : symbol _ _ semi hosting _ swi _ guardmultiplydined更改: (check-b

3、eversou encesofiuse_semihosting_swi ),连接器列出使用smeihosting的程序,并提供可以自己执行的功能函数。 在ADS1.2编译器和库函数文档中,使用semihosting的所有c库函数如表4-2所示。 注意:连接器在用户自己的应用程序代码中没有关于使用semihostingSWI的报告。 Agenda,构建一个PC软件自定义标准c库函数将自定义IMAGE内存映射复位到目标板上,初始化深层次内存映射,是IMAGE编译和调试、分布式加载(sc 大多数嵌入式系统具有存储器设备,其地址空间与整个存储器映射交叉出现。 分布式负载提供了一种将你的代码和数据放置在

4、不同内存位置的方法,分布式负载定义了两种内存区域。 加载区域: reset/load时保存应用程序的代码和数据(通常的应用程序为ROM).Execution区域-在执行程序时保存程序的代码和数据。 在启动应用程序时,可以在每个load区域中创建一个或多个可执行区域。 分布式加载的应用程序将详细的内存映射保存在描述文件中,并在armlink上使用eg : armlink program.o-scatter scatter.SCF-o program.axf作为参数,以实现分布式加载(简单只读代码和数据保存在ROM中的c库函数初始化代码(_main )初始化ZI数据,将ROM中的RW数据复制到RA

5、M中,Scatter描述文件、通配符(* )语法可简化CODE和DATA 在EXEC_ROM0 x00000 x4000*(RO)、链接器配置规则各可执行区域中,链接器通过几个基本规则配置代码和数据的基本排序方法是,根据属性配置的:RO领先RW,RW具有与ZI相同的属性更多排序方法是通过按字母顺序对输入的组名进行排序,并按ARMLINK命令行中指定的顺序进行排序来决定的。 为了对eg:armlinkfile1.ofile2.o、SCATTOR文件中的对象进行排序,并在不考虑标准部署规则的情况下使用FIRST和LAST将特定代码和数据放置到指定地址上图例:将VECTOR表放置在节的开头。在loa

6、d _ rom0x 00000 x 4000 exec _ rom0x 00000 x 4000 可执行区域内,执行程序startaddressandlength exec _ rom0x 00000 x 4000; root (加载=exec地址) _ _ _ _ main.o (ro ); 复印代码* (region $ $ table ) ro/rwaddressestocopy * (zi section $ $ table ) ziaddressestozero ram0x 100000 x 8000 * (ro ) allotherroareas ZI) programvariab

7、les,Mustbeinarootregion,outsiderootregion,root区域是可执行区域,加载地址与执行地址相等。 根区域的点,根区域是可执行区域,负载地址与执行地址相同。 每个scatter描述文件必须至少包含根区域,并且至少包含以下内容: _ _ main.o -复制代码/数据的代码Region$Table和zisection$table-包含要复制的代码/数据的地址。 由链接器而不是对象文件生成的地址。 (所以*必须) error : l 6202 e : section region $ $ tablecannotbeassignertoanon-root regi

8、on.error : l 6202 e : sectionzisection $ $ tablecanno 如果ion .注意:*(ro )位于根区域中,则之前的主应用程序自动位于的入口点必须位于根区域中。 error : l 6203 e :进入点(0x 0800000 ) lieswithinnon-rootregionexe _ flash .运行时内存管理,SemihostingSupport,ANSIC,sta PS; r 2不使用(HL ) R3不使用(sl ) mov PC,lr,Heap,堆栈,Heap的限制地址在单模式下不被使用。 堆栈限制地址仅在软件堆栈检查许可证的情况下有

9、效。的。 HB=0 x80000,SB=0 x88000,警告! 如果使用分布式加载,则必须执行_user_initial_stackHEAP ()。 c库初始化代码中_user_initial_stackheap ()的默认运行是将heap放置在图像文件的RW/ZI数据段之后。 使用image $ $ rw $ $ base/image $ $ zi $ $ base连接符号的符号对scatterloading无效。 在ADS1.1之前的软件版本中,符号设置为0X0,heap放在此处。heap的并用可能会破坏向量和其他代码,无论是直接(e.g.withmalloc () ),还是间接(byu

10、seofargc/argv )。在ADS1.2:中没有定义符号,不合并应用程序: error : l 6218 e : undefinedsymbolimage $ $ zi $ $ limit (referredromsys _ stack heap.o ) 一个PC软件结构削减标准c库函数将目标板的定制IMAGE内存映射到目标板复位和初始化的深层次内存映射IMAGE、TheVectorTable、AREAVectors、co 考虑READONLYIMPORTReset_Handler的编译和调试的importotherexceptionhandlers; entrybreset _ han

11、dlerbundefined _ handlerbswi _ handlerbprefetch _ handler bdata _ handler nop; ReservedvectorBIRQ_Handler; 使用scatterloading FIRST时,fiq _ handlerwillfollowdirectlyend直接位于0X0(或0 xffff 0 中断向量表,初始化步骤,CLibrary、user code _ _ maincopycodeanddatazerouninstallitializeddata,ImageEntryPoint,$ sub $ $ main () e

12、nab addressofcmcontrolregisterremap _ bite hqu0x 04; Bit2isremapbitofCM_ctlENTRY; Onreset,analiasofROMisat0 x0,somjumpingrealrom.ldrpc,=Instruct_2Instruct_2; remapystetingremapbitfthecm _ ctlsregisterldrr 1,=CM_ctl_regLDRr0,r1ORRr0,r0,#Remap_bitSTRr0,r1; RAMisnowat0 x0 . theexpertpotecovittrosmsmstb

13、ecopiedforomtoram (in _ _ main ) reset _ handlerfollowsonfromhere此功能在有mmu的情况下也可以使用。 ROM/RAM重定向,初始化堆栈指针-amountofmemory(inbytes ) allocatedforstackslen _ fiq _堆栈equ 256 len _ IRQ _堆栈equ 256offset _ fiq _堆栈equ0offset _ IRQ _堆栈quoffset _ fiq _堆栈len _ locatedbyscatterfile; entereachmodeinturnsetuppthesta

14、ckpointermsrcpsr _ c,# mode _ fiq : or : I _ bit : or : f _ bit; nointerrupssup,r0,#Offset_FIQ_StackMSRCPSR_c,# mode _ IRQ : or : I _ bit : or : f _ bit; NointerruptsSUBsp,r0,#Offset_IRQ_Stack; systemmodestackissetplasticsrcpsr _ c,# mode _ sys : or : I _ bit : or : f _ bit; NointerruptsSUBsp,r0,#Of

15、fset_SYS_Stack; setustpstacklimitifneededldrr10、stack_limit; 如果在初始化c库之前使用了ARM7芯片和MMU/MPU,则locatedbyscatterfile、本地存储设置和运行时存储必须完成ROM/RAM的重新映射。 TCMs (tightlycoupledmemory )通常必须能够实现TCM。 请注意,在启用TCM之前,掩码ROM会在高速缓存打开之前返回。 执行c库初始化代码后,如果启用了cache,则可以避免与cache相关的问题。扩展、系统初始化代码通常在进入主应用程序之前执行。 resethandler不是启用中断和缓存

16、的合适位置。 必须在resethandler的末尾加上c运行时库初始化代码EG。 您可以使用import_mainb_main$sub和$Super功能包装名为externvoid$Super$main(void )的符号,void $ sub $ $ main (void ) cache _ enable (); /enablescachesint_enable (); /enableesinterrupssys _ to _ usr _ mode (); /change mode-seeextslide $ super $ $ main (); /callsoriginalmain ()的

17、说明可在ads 1.2 linkerandutilitiesguide-4.4章中参考。 考虑到执行模式,主应用正在哪个模式下运行是重要的问题。 用户模式不是特权模式-保护系统初始化代码只能在特权模式下运行。 需要执行像:这样的特权操作。 当应用程序正在管理模式下运行时,只需要以管理模式结束resethandler即可。 要在用户模式下运行应用程序,必须在$Sub$main ()中更改为用户模式。 _user_initial_stackheap ()必须具有使用应用程序模式寄存器的权限。 解决方法是在系统模式下结束resethandler的所有c库初始化代码,有权使用用户寄存器,但可以执行特权操作。、Agenda、PC软件的结构削减标准c库函数考虑目标板的定制IMAGE的内存映射到目标板的复位和初始化深度级别的内存映射的IMAGE的编译和调试, 长跳veneers rom _ load0x 0000 rom _ exec0x 0000 * (ro ) ram0x 800

温馨提示

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

最新文档

评论

0/150

提交评论