




已阅读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,r0LDRr0,r0CMPr1,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,#0LDRr0,r0,#0ADDr1,r1,r1,LSL#1ADDr0,r0,r1;interlockonARM9ADDr0,r0,r1MOVpc,lrMOVpc,lr,armcccpuarm7tdmi,armcccpuarm9tdmi,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”;chardest10;.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;_asmMRStemp,CPSRBICtemp,temp,#Q_FlagMSRCPSR_f,temp_inlineintmult16(shorta,shortb,intc)inttemp;_asmSMLABBtemp,a,b,creturntemp;,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,r140 x000014:ADDr0,r0,r120 x000018:ADDr0,r0,r140 x00001C:LDRpc,sp,#4caller20 x000020:STMFDsp!,r2,r3,lr0 x000024:MOVr3,#60 x000028:MOVr2,#50 x00002C:STMIAsp,r2,r30 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()dowhile()的循环中,用减到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=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)wordsize0 x000000:MOVr0,r0,LSL#1return(a*2);0 x000004:MOVpc,lrshorthalfsize(shortb)halfsize0 x000008:MOVr0,r0,LSL#17return(b*2);0 x00000c:MOVr0,r0,ASR#160 x000010:MOVpc,lrcharbytesize(charc)bytesize0 x000014:MOVr0,r0,LSL#25return(c*2);0 x000018:MOVr0,r0,LSR#240 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,r14LDRr4,0 x58LDRr1,r4,#0LDRr0,r4,#4LDMIAr1,r2,r3,r12STMIAr0,r2,r3,r12LDRr0,r4,#8LDRr1,r4,#0MOVr2,#0 xcBL_rt_memcpyLDRr0,r4,#8STRr0,r4,#4LDRr1,r4,#0LDMIAr1,r2,r3,r12STMIAr0,r2,r3,r12LDRr0,r4,#8LDRr1,0 x5cMOVr2,#0 xcSTRr0,r1,#0LDRr1,r4,#0BL_rt_memcpyLDMFDr13!,r4,pc,结构的打包,在结构里定义打包的元素代替结构的打包他将帮助减小访问输出的结构的开销ADSFAQ入口:Alignedv.unalignedaccessesanduseof_packed,_packedstructmystructintaligned_i;shortaligned_s;intunaligned_i;externstructmystructS;,short,int,U_int,U_int,_packed限定的数据为1字节对齐不实现字节对齐调整很高的访问代价,不会节省存储空间,优化的指针基地址,externinta;externintb;voidfoo(intx,inty)a=x;b=y;,优化外部全局
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七彩课堂下册数学试卷
- 政府茶叶采摘活动方案策划(3篇)
- 五一饮料促销活动方案策划(3篇)
- 气泡焊接施工方案(3篇)
- 云南白酒酒窖施工方案(3篇)
- 隐蔽工程房屋施工方案(3篇)
- 心理电影剪辑活动策划方案(3篇)
- 基础安全施工方案(3篇)
- 住宅夹层施工方案(3篇)
- 老年骨质疏松症的护理
- 2025湖南湘潭湘乡市融媒体中心招聘事业单位工作人员10人笔试备考题库及答案解析
- 2025至2030中国婚庆行业发展趋势分析与未来投资战略咨询研究报告
- 2025年职业病诊断医师资格考试(职业性化学中毒)历年参考题库含答案详解(5卷)
- 2025年安徽高考生物试题及答案
- 2025年国际汉语教师资格考试(对外汉语教学理论)历年参考题库含答案详解(5套)
- 2025年高校机房管理试题及答案
- ESG基础知识培训课件
- 泌尿系统常见疾病科普讲座
- 2025湖南省全日制用工劳动合同书
- 2025年中国南海研究院招聘事业编制人员考试笔试试题
- 食品合规管理课件
评论
0/150
提交评论