《ARM编程技巧》PPT课件.ppt_第1页
《ARM编程技巧》PPT课件.ppt_第2页
《ARM编程技巧》PPT课件.ppt_第3页
《ARM编程技巧》PPT课件.ppt_第4页
《ARM编程技巧》PPT课件.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

ARM编程技巧 Agenda ARM编译器优化C C 和汇编混合模式编程使用ARM编译器编码局部和全局数据讨论 优化级别 使用的编译器优化级别是可选择的 O0 DEBUG关闭大多数优化 最好的调试信息 最少的优化 O1 DEBUGREL多数优化选项许可给一个满意的调试 好的代码密度 O2 RELEASE default 完全的优化有限的调试信息 最好的代码密度为代码大小或运行速度的优化 可选择 Ospace 默认的 或 Otime 使用 g选像可包含源码级调试信息 ADS编译器在所有级别中执行一些简单的优化i e O0 O1 O2下面是一个例子 即使用 O0 多余的表达式也被清除了 ATPCS标准中子程序结果返回规则结果为32位整数 R0返回结果为64位整数 R0 R1返回位数更多时 用内存来传递 自动优化 intf int p return p p armcc c O0 fMOVr1 r0MOVr0 1MOVpc lr 注意 在这种情况下 可使用C的关键字volatile强制使用这些变量 使用 volatile intf volatileint p return p p armcc c fLDRr1 r0 LDRr0 r0 CMPr1 r0MOVNEr0 0MOVEQr0 1MOVpc lr intf int p return p p fMOVr0 1MOVpc lr armcc c 这个代码用的编译级别是 o2 下面是一个冗余代码清除的例子 他只用了 o1的优化选项 冗余代码的清除 intdummy inta 10 b 20 intc c a b return0 armcc c O1 dummyMOVr0 0MOVpc lr 指令编排 指令编排在高级优化选项中是有效的 O1 O2 指令的重新编排是为了使要运行的代码更适合对应的核为arm9和以后的处理器提高吞吐量 一般可达到4 并防止互锁 interlock 选择处理器可决定使用的运算法则 在默认情况下 使用针对ARM9的优化方案 对ARM7的运行没有影响 例如 intf int p intx return p x 3 没用指令编排 O0 使用指令编排 O1 O2 ADDr1 r1 r1 LSL 1LDRr0 r0 0 LDRr0 r0 0 ADDr1 r1 r1 LSL 1ADDr0 r0 r1 interlockonARM9ADDr0 r0 r1MOVpc lrMOVpc lr armcc cpuarm7tdmi armcc cpuarm9tdmi Tail callOptimization 嵌套优化可避免在函数级里的不必要的返回在可能的情况下BL译码成B在高级优化里有效 O1 O2 intmain intx f intf inty g returny intg return10 嵌套优化 内嵌函数 inline 内嵌可通过删除子函数调用的开销来提高性能这个inline关键字显示哪个函数将被内嵌在高级优化选项中 ADS1 2编译器默认自动内嵌 Oautoinline default O2 Ono autoline defaultfor O0 O1 哪个函数是否被内嵌取决于 他们是否被 inline标示优化的级别 Otime Ospace函数被调用的次数如果函数在别的模块中不被调用 一个好的建议是用static标识函数 否则 编译器将在内嵌译码里把该函数编译乘非内嵌的加代码的长度使调试信息更复杂 Example Inlineexample 内嵌例子 Agenda ARM编译器的优化C C 和汇编混合模式编程使用ARM编译器编码局部和全局数据讨论 C和汇编的混合编程 C C 和汇编能很容易的混合 可实现在c中无法实现的处理器功能使用新的或不支持的指令产生更高效的代码直接链接变量和程序确定符合程序调用规范输入 输出相关的符号编译器也可包含内嵌汇编大多数arm指令集都可实现寄存器操作数可支持任意的c c 的表达式内嵌汇编代码可由编译器的优化器来传递 ATPCS arm thumb程序调用规范 r8 r9 sb r10 sl r11 r12 r13 sp r14 lr r15 pc r0 r1 r2 r3 r4 r5 r6 r7 寄存器变量必须保护 作为函数传递的参数值 Scratchregister corruptible StackPointerLinkRegisterProgramCounter 编译器使用一套规则的来设置寄存器的用法ARM ThumbProcedureCallStandardorATPCS orAPCS CPSR标志位可被函数调用所破坏任何和编译过的代码交互工作的汇编码在接口层必须满足ATPCS的规范 Register 如果RWPI选项有效 作为栈的基地址 如果软件堆栈检查有效 作为栈的限制值 可作为临时的一个值栈一样来使用 子程序内部调用的可改写的寄存器 程序计数器 在C程序中调用汇编 在汇编程序中用exportname来定义在C程序中直接调用 用EXTERN声明正常链接 externvoidmystrcopy char d constchar s intmain void constchar src Source chardest 10 mystrcopy dest src AREAStringCopy CODE READONLYEXPORTmystrcopymystrcopyLDRBr2 r1 1STRBr2 r0 1CMPr2 0BNEmystrcopyMOVpc lrEND 这里所有的参数都是可以用寄存器来传递的 所以不需要在汇编程序中使用PUSH POP来保护 CALL 内嵌汇编 允许使用一些不能由编译器自动生成的指令 MSR MRS新的指令协处理器指令通常在关联的内嵌函数中使用使用C变量代替寄存器不是一个真正的汇编文件通过优化器实现ADSFAQ入口 UsingtheInlineAssembler defineQ Flag0 x08000000 Bit27 inlinevoidClear Q flag void inttemp asm MRStemp CPSRBICtemp temp Q FlagMSRCPSR f temp inlineintmult16 shorta shortb intc inttemp asm SMLABBtemp a b c returntemp Agenda ARM编译器的优化C C 和汇编混合模式编程使用ARM编译器编码局部和全局数据讨论 参数传递 开始四个字大小的参数直接使用寄存器的R0 R3来传递 快速且高效的 更多的信息可参看ATPCS如果需要更多的参数 将使用堆栈 需要额外的指令和慢速的存储器操作 所以通常限制参数的个数 使它为4或更少 如果不可避免 把常用的参数前4个放在R0 R3中 Example ParameterPassing 4parameters intfunc1 inta intb intc intd returna b c d intcaller1 void returnfunc1 1 2 3 4 func10 x000000 ADDr0 r0 r10 x000004 ADDr0 r0 r20 x000008 ADDr0 r0 r30 x00000c MOVpc lrcaller10 x000014 MOVr3 40 x000018 MOVr2 30 x00001c MOVr1 20 x000020 MOVr0 10 x000024 Bfunc1 ParameterPassing 4parameters ParameterPassing 6parameters ParameterPassing 6parameters func20 x000000 STRlr sp 4 0 x000004 ADDr0 r0 r10 x000008 ADDr0 r0 r20 x00000C ADDr0 r0 r30 x000010 LDMIBsp r12 r14 0 x000014 ADDr0 r0 r120 x000018 ADDr0 r0 r140 x00001C LDRpc sp 4caller20 x000020 STMFDsp r2 r3 lr 0 x000024 MOVr3 60 x000028 MOVr2 50 x00002C STMIAsp r2 r3 0 x000030 MOVr3 40 x000034 MOVr2 30 x000038 MOVr1 20 x00003C MOVr0 10 x000040 BLfunc20 x000044 LDMFDsp r2 r3 pc intfunc2 inta intb intc int d inte intf returna b c d e f intcaller2 void returnfunc1 1 2 3 4 5 6 Thiscodeiscompiledwith O2 Ono autoinline 循环终止 在for while do while 的循环中 用减到0代替加到某个值 比如 用下面的代替 for loop 1 loop total loop ADD CMP 代替为 for loop total loop 0 loop SUBS 尽量减少循环的次数代码小 且使用更少的寄存器 Example LoopTermination Countupintfact1 intlimit inti intfact 1 for i 1 i limit i fact fact i returnfact Countdownintfact2 intlimit inti intfact 1 for i limit i 0 i fact fact i returnfact fact20 x000000 MOVSr1 r00 x000004 MOVr0 10 x000008 MOVEQpc lr0 x00000c MULr0 r1 r00 x000010 SUBSr1 r1 10 x000014 BNE0 x0c0 x000018 MOVpc lr fact10 x000000 MOVr2 10 x000004 MOVr1 10 x000008 CMPr0 10 x00000c BLT0 x200 x000010 MULr2 r1 r20 x000014 ADDr1 r1 10 x000018 CMPr1 r00 x00001c BLE0 x100 x000020 MOVr0 r20 x000024 MOVpc lr Thiscodeiscompiledwith O2 Otime 除法操作 1 ARM核不含除法硬件除法通常用一个运行库函数来实现运行需要很多的周期 unsigneddiv unsigneda unsignedb return b a divB rt udiv unsigneddiv2 unsignedb return b 2 div2MOVr0 r0 LSR 1MOVpc lr 一些除法操作在编译时作为特例来处理除2操作 被左移代替 除法操作 2 在 O1和 O2 使用 Otime 其他的常量将使用一个标准的乘法序列来完成例如 实时除法程序使用CLZ指令只有V5te体系结构才有效 用下面的办法来选择C pragmaimport use realtime divisionAssembler IMPORT use realtime division div10MOVr1 r0LDRr0 0 xCCCCCCCDUMULLr2 r1 r0 r1MOVr0 r1 LSR 3MOVpc lr unsigneddiv10 unsignedc return c 10 余数 模算法 余数的操作符 通常使用模算法如果这个值的模不是2的n次幂 它将花费大量的时间和代码空间避免这种情况发生的办法使用if 作状态检查比如说 count的范围是0到59count count 1 60 用下面的句子代替if count 60 count 0 moduloADDr1 r0 1MOVr0 0 x3cBL rt udivMOVr0 r1 test and resetADDr0 r0 1CMPr0 0 x3cMOVCSr0 0 这个代码用 O1 Ospace 编译 浮点 软件浮点库 fplib 默认 fpusoftvfp orsoftfpa 浮点协处理器VFP ARM10andARM9 fpuvfp orvfpv1orvfpv2 FPA egARM7500fe nowobsolete fpufpa软件浮点仿真 FPE 通过未定义的异常来捕获协处理器指令VFP andFPA 实际上是硬件协处理器和仿真的混合要求支持代码去实现混合运算在AFS1 3和以后的版本里有VFP的支持代码 在ADS的FPA里 在thumb代码使用fp处 vfp系统用 fpusoftvfp vfp编译使用 auto float constants预防常量被处理为双精度类型 关闭警告用 Wk Example floatfoo floatnum1 floatnum2 floattemp temp2 temp num1 num2 temp2 num2 num2 returntemp2 temp Floatingpointexamples Agenda ARM编译器优化C C 和汇编混合模式编程使用ARM编译器编码局部和全局数据 变量类型 全局和静态变量保留在RAM里需使用loads stores访问外部存储器局部变量通常放在寄存器中 用来快速且高效的处理如果编译器的寄存器分配算法认为超过现有的寄存器数量 将把变量压入栈中对局部变量 用word sized int 代替halfword和byte 为了确保不受其他条件的影响 可特别指定使用32 bit寄存器变量 intwordsize inta wordsize 0 x000000 MOVr0 r0 LSL 1return a 2 0 x000004 MOVpc lr shorthalfsize shortb halfsize 0 x000008 MOVr0 r0 LSL 17return b 2 0 x00000c MOVr0 r0 ASR 16 0 x000010 MOVpc lrcharbytesize charc bytesize 0 x000014 MOVr0 r0 LSL 25return c 2 0 x000018 MOVr0 r0 LSR 24 0 x00001c MOVpc lr 变量大小 堆栈的用法 C C 代码的堆栈使用 堆栈用来保留 子程序的返回地址 溢出 的局部变量局部数组和结构体注意 函数越小越好 更少的变量 更少的 溢出 更少数量的 live 变量 比如 函数里每个点保存的有用的数据 避免使用大的局部结构体或数组 使用malloc free代替 避免递归 堆栈使用估计 链接使用 callgraph显示静态堆栈的开销 html文件 编译时使用软件堆栈检查 apcs swst在栈结束点设置watchpoint测试堆栈定义大的栈填充某个值 看覆盖了多少 从而判定栈的使用情况ARMulator映射文件拒绝访问栈下面的区域 栈溢出将导致一个dataabort异常stackuse cARMulator模式 跟踪堆栈的大小 用ARMulator的统计来输出报告 当要对堆栈使用情况进行估计时 使用 worstcase 全局数据布局 charone shorttwo charthree intfour char short char e g 声明的数据 Declaredalignment12bytes 4bytesofpadding Optimalalignment8bytes Zerobytesofpadding ADS1 1 将自动用此风格排序 short 全局数据保存在存储器里 不是寄存器需要load store指令来访问用物理尺寸的边界对齐ADS1 2会优化在一个模块里的全局数据的布局用 Ono data reorder将关闭排序 不对齐访问 ARM硬件需要在自然尺寸的边界访问内存Word访问在word尺寸Halfword访问在halfword尺寸Byte访问在byte尺寸不对齐访问遗留代码特定协议需要必须告诉编译器 让它产生适当的指令序列使用 packed属性可能导致多字节访问代替单字节访问用LDM指令的结果有2字 转变为生成单字不对齐数据的访问所产生的意外的结果取决于指令的使用将是不可预知的 指针的对齐 必须非常小心指针的对齐可能导致程序的失败 includeint a int 0 x1000 int b int 0 x2000 char c char 0 x3001 packedint d voidfoo void memcpy b a 12 memcpy c a 12 b int c memcpy b a 12 d packedint c memcpy void d a 12 STMFDr13 r4 r14 LDRr4 0 x58LDRr1 r4 0 LDRr0 r4 4 LDMIAr1 r2 r3 r12 STMIAr0 r2 r3 r12 LDRr0 r4 8 LDRr1 r4 0 MOVr2 0 xcBL rt memcpyLDRr0 r4 8 STRr0 r4 4 LDRr1 r4 0 LDMIAr1 r2 r3 r12 STMIAr0 r2 r3 r12 LDRr0 r4 8 LDRr1 0 x5cMOVr2 0 xcSTRr0 r1 0 LDRr1 r4 0 BL rt memcpyLDMFDr13 r4 pc 结构的打包 在结构里定义打包的元素代替结构的打包他将帮助减小访问输出的结构的开销ADSFAQ入口 Alignedv unalignedaccessesanduseof packed packedstructmystruct intaligned i shortaligned s intunaligned i externstructmystructS short int U int U int packed限定的数

温馨提示

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

评论

0/150

提交评论