ARM嵌入式软件开发.ppt_第1页
ARM嵌入式软件开发.ppt_第2页
ARM嵌入式软件开发.ppt_第3页
ARM嵌入式软件开发.ppt_第4页
ARM嵌入式软件开发.ppt_第5页
免费预览已结束,剩余44页可下载查看

下载本文档

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

文档简介

嵌入式软件开发 嵌入式开发过程 PC软件 独立的嵌入式应用 当程序员开始开发一个基于ARM应用的时候 你可以使用ARM的ADS编写类似于 HELLOWORLD 的程序 使用ARMulator或者在评估板上来调试 但当你把他移植到独立的嵌入式应用设备中时 下面这些问题就成为我们首要考虑的 硬件环境中所使用的C库函数目标板上的存储器资源应用程序的初始化 议程 PC软件的构造定制标准C库函数到目标板定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE ADS默认的标准C库 ANSIC input output errorhandling stack heapsetup other SemihostingSupport 应用程序调用的C库函数eg fputc 设备驱动层使用semihostingSWI seg sys write 调试工具环境 CLibrary DebugAgent C库函数功能是支持PC软件的 而目标板上的可执行软件则依赖相关的硬件资源 在ARM体系中 我们可以采用semihosting通过相应的驱动来进行调试 ADS默认的存储器映射 在默认的情况下 我们链接 定位 运行在0 x8000heap被直接放置在数据区的上面堆栈的基地址是通过调试环境从C库函数的StartupCode里读取出来的 ARMulator fromconfigurationfile peripherals ami default 0 x08000000Multi ICE fromdebuggerinternalvariable top of memorydefault 0 x80000 RO RW ZI 0 x8000 链接时确定 由调试环境提供 Heap malloc alloc Stack CLibrary UserCode 应用程序启动 maincopycodeanddatazerouninitializeddata 程序入口点 Agenda 一个PC软件的构造定制标准C库函数到目标板定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE 重定向C库函数 1 SemihostingSupport ANSIC input output 你可以使用适合你目标板运行的驱动来替换标准C库中的设备驱动 Eg printf 可打印到LCD上 而不是打印控制台上 input output ANSIC CLibrary UserCode DebugAgent TargetHardware Retarget 重定向C库函数 2 要重定向C库函数 简单的办法是使用你自己的可执行的semihostingSWIs来代替原来的C库函数 从而来满足你的系统要求比如说 theprintf 系列函数 sprintf 除外 都会调用fputc 在默认情况下fputc 的执行使用了semihostingSWI 用下面的语句来代替 externvoidsendchar char ch intfputc 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 x4000 EXEC ROM0 x00000 x4000 vectors o Vectors FIRST file1 o RO file2 o RO 在可执行区内 scattor文件中要排序的对象对输出image没有影响链接器的标准放置规则仍然适用 ROOT区 LOAD ROM0 x00000 x4000 startaddressandlength EXEC ROM0 x00000 x4000 root load execaddress main o RO copyingcode Region Table RO RWaddressestocopy ZISection Table ZIaddressestozero RAM0 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 Stack HeapSetup Stack HeapSetup ANSIC CLibrary UserCode DebugAgent TargetHardware Retarget 如何设置stack和heap来满足我们的目标存储器 我们已经通过执行 user initial stackheap 把C标准库的运行存储器模式修改到目标平台上 Stack和Heap初始化 CLibrary UserCode maincopycodeanddatazerouninitializeddata ImageEntryPoint Run time存储器模式 你必须决定在放置stack和heap时所使用的区域是单一的区 one regionmodel 或是不同的两个区 two regionmodel Heap Stack Stack Oneregionmodel Tworegionmodel HB SB SB HB HL 单一存储器模式是默认方式为了实现多区域模式 你可以使用use two region memory在所有的模式下 软件堆栈检查要许可 编译开关是 apcs swst指定堆栈限制 为two region模式 heapischeckedagainststackpointer Heap heapischeckedagainstheaplimit SL user initial stackheap 可以用C或汇编来写 他要返回 Heap基地址在R0 STACK的基地址在R1 Heap的限制地址在R2 STACK的限制地址在R3 EXPORT user initial stackheap user initial stackheapLDRr0 0 x80000 HBLDRr1 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 interrupts ROMorRAMat0 x0 需要一个有效的地址在0 x0 这项功能可被编码在像RESETHANDLER一样的模块中在本章结束的时候 我们还会讲到 ROM 0 x10000 0 x18000 0 x4000 0 x0000 AliasedROM ROM RAMRemapping RAM 0 x10000 0 x18000 0 x4000 0 x0000 ROM ROMat0 x0 ResetHandler ROM RAMRemapping 下面的例子可像Resethandler一样在源码中编码 IntegratorCMcontrolregCM ctl regEQU0 x1000000C AddressofCMControlRegisterRemap bitEQU0 x04 Bit2isremapbitofCM ctlENTRY Onreset analiasofROMisat0 x0 sojumpto real ROM LDRpc Instruct 2Instruct 2 RemapbysettingRemapbitoftheCM ctlregisterLDRr1 CM ctl regLDRr0 r1 ORRr0 r0 Remap bitSTRr0 r1 RAMisnowat0 x0 TheexceptionvectorsmustbecopiedfromROMtoRAM in main Reset Handlerfollowsonfromhere这个功能也可在有mmu时使用 ROM RAM的重定向 初始化栈的指针 Amountofmemory inbytes allocatedforstacksLen FIQ StackEQU256Len IRQ StackEQU256 Offset FIQ StackEQU0Offset IRQ StackEQUOffset FIQ Stack Len FIQ Stack Reset 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的重新映射必须完成 TCM s 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 x0000 ROM EXEC0 x0000 RO RAM0 x80000000 farfunc 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 4 dcd0 x80000000 0 x80000000 movpc lr 存储器映射寄存器 你可以使用scatterloading来放置外设寄存器的存储器映射在文件中定义它e g timer reg cstruct volatileunsignedreg1 timercontrol volatileunsignedreg2 timervalue timer reg 在存储器映射的请求地址上增加另外的可执行区来放置他们 LOAD FLASH0 x240000000 x04000000 TIMER0 x40000000UNINIT timer 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 x3000 stackheap o stack stack 0 x4000to0 x1000 HEAP0 x15000UNINIT length 0 x3000 stackheap o heap heap 0 x15000to0 x18000 Heap的基地址起始为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映像文件转

温馨提示

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

评论

0/150

提交评论