ARM编程技巧73996(精品).ppt
《ARM编程技巧73996(精品).ppt》由会员分享,可在线阅读,更多相关《ARM编程技巧73996(精品).ppt(41页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L DARM编程技巧编程技巧2TM2103v04 C/C+Compiler Hints&TipsAgendanARM 编译器优化编译器优化C/C+和汇编混合模式编程使用ARM编译器编码局部和全局数据讨论3TM3103v04 C/C+Compiler Hints&Tips优化级别优化级别n使用的编译器优化级别是可选择的使用的编译器优化级别是可选择的-O0-DEBUGn关闭大多数优化.n最好的调试信息,最少的优化-O1-DEBUGRELn多数优化选项许可n给一个满意的调
2、试,好的代码密度-O2-RELEASE(default)n完全的优化n有限的调试信息,最好的代码密度n为代码大小或运行速度的优化,可选择为代码大小或运行速度的优化,可选择:-Ospace(默认的默认的)或或-Otime.n使用使用-g 选像可包含源码级调试信息选像可包含源码级调试信息4TM4103v04 C/C+Compiler Hints&TipsnADS 编译器在所有级别中执行一些简单的优化编译器在所有级别中执行一些简单的优化ni.e.-O0,-O1,-O2n下面是一个例子:即使用下面是一个例子:即使用-O0,多余的表达式也被清除了多余的表达式也被清除了:nATPCS标准中子程序结果返回规
3、则n结果为32位整数,R0返回n结果为64位整数,R0,R1返回n位数更多时,用内存来传递n自动优化自动优化int f(int*p)return(*p=*p);armcc-c-O0f MOV r1,r0 MOV r0,#1 MOV pc,lr注意:在这种情况下,可使用C的关键字volatile 强制使用这些变量5TM5103v04 C/C+Compiler Hints&Tips使用使用“volatile”int f(volatile int*p)return(*p=*p);armcc-cf LDR r1,r0 LDR r0,r0 CMP r1,r0 MOVNE r0,#0 MOVEQ r0,#
4、1 MOV pc,lrint f(int*p)return(*p=*p);f MOV r0,#1 MOV pc,lrarmcc-cn这个代码用的编译级别是:-o26TM6103v04 C/C+Compiler Hints&Tipsn下面是一个冗余代码清除的例子,他只用了下面是一个冗余代码清除的例子,他只用了-o1的优化选项的优化选项:冗余代码的清除冗余代码的清除int dummy()int a=10,b=20;int c;c=a+b;return 0;armcc-c-O1dummy MOV r0,#0 MOV pc,lr7TM7103v04 C/C+Compiler Hints&Tips指令编
5、排指令编排n指令编排在高级优化选项中是有效的指令编排在高级优化选项中是有效的(-O1,-O2).n指令的重新编排是为了使要运行的代码更适合对应的核n为arm9和以后的处理器提高吞吐量(一般可达到4%),并防止互锁(interlock)n选择处理器可决定使用的运算法则,在默认情况下,使用针对ARM9的优化方案(对ARM7的运行没有影响)n例如例如:int f(int*p,int x)return*p+x*3;没用指令编排没用指令编排(-O0)使用指令编排使用指令编排(-O1,-O2)ADD r1,r1,r1,LSL#1LDR r0,r0,#0LDR r0,r0,#0ADD r1,r1,r1,LS
6、L#1ADD r0,r0,r1;interlock on ARM9ADD r0,r0,r1MOV pc,lrMOV pc,lrarmcc cpu arm7tdmiarmcc cpu arm9tdmi 8TM8103v04 C/C+Compiler Hints&TipsTail-call Optimization嵌套优化可避免在函数级里的不必要的返回在可能的情况下BL 译码成B在高级优化里有效(-O1,-O2).int main()int x=f();:int f()int y=g();return y;int g()return 10;B gBL f:MOV r0,#10MOV pc,lrBL
7、 f:STR lr,sp,#-4!BL gMOV r1,r0MOV r0,r1LDR pc,sp,#4MOV r0,#10 MOV pc,lr嵌套优化嵌套优化9TM9103v04 C/C+Compiler Hints&Tips内嵌函数(内嵌函数(inline)n内嵌可通过删除子函数调用的开销来提高性能内嵌可通过删除子函数调用的开销来提高性能n这个这个 inline 关键字显示哪个函数将被内嵌关键字显示哪个函数将被内嵌n在高级优化选项中,在高级优化选项中,ADS 1.2 编译器默认自动内嵌编译器默认自动内嵌n-Oautoinline(default-O2)n-Ono_autoline(defau
8、lt for-O0,-O1)n哪个函数是否被内嵌取决于:哪个函数是否被内嵌取决于:n他们是否被 _inline标示n优化的级别n-Otime/-Ospacen函数被调用的次数n如果函数在别的模块中不被调用,一个好的建议是用如果函数在别的模块中不被调用,一个好的建议是用static标识函数,否则,标识函数,否则,编译器将在内嵌译码里把该函数编译乘非内嵌的编译器将在内嵌译码里把该函数编译乘非内嵌的n加代码的长度n使调试信息更复杂Example.10TM10103v04 C/C+Compiler Hints&TipsInline exampleint bar(int a)a=a+5;return a
9、;int foo(int i)i=bar(i);i=i-2;i=bar(i);i+;return i;bar ADD r0,r0,#5 MOV pc,lrfoo STR lr,sp,#-4!BL bar SUB r0,r0,#2 BL bar ADD r0,r0,#1 LDR pc,sp,#4_inline int bar(int a)a=a+5;return a;int foo(int i)i=bar(i);i=i-2;i=bar(i);i+;return i;foo ADD r0,r0,#5 SUB r0,r0,#2 ADD r0,r0,#5 ADD r0,r0,#1 MOV pc,lr内
10、嵌例子内嵌例子11TM11103v04 C/C+Compiler Hints&TipsAgendaARM编译器的优化nC/C+和汇编混合模式编程和汇编混合模式编程使用ARM编译器编码局部和全局数据讨论12TM12103v04 C/C+Compiler Hints&TipsC和汇编的混合编程和汇编的混合编程nC/C+和汇编能很容易的混合和汇编能很容易的混合:n可实现在c中无法实现的处理器功能n使用新的或不支持的指令n产生更高效的代码n直接链接变量和程序直接链接变量和程序n确定符合程序调用规范n输入/输出相关的符号n编译器也可包含内嵌汇编编译器也可包含内嵌汇编n大多数arm指令集都可实现n寄存器操
11、作数可支持任意的c/c+的表达式n内嵌汇编代码可由编译器的优化器来传递13TM13103v04 C/C+Compiler Hints&TipsATPCS(arm/thumb程序调用规范)程序调用规范)r8r9/sbr10/slr11r12r13/spr14/lrr15/pcr0r1r2r3r4r5r6r7寄存器变量寄存器变量必须保护必须保护作为函数传递的参数值作为函数传递的参数值Scratch register(corruptible)Stack PointerLink RegisterProgram Counter编译器使用一套规则的来设置寄存器的用法ARM-Thumb Procedure
12、Call Standard or ATPCS(or APCS)CPSR 标志位可被函数调用所破坏任何和编译过的代码交互工作的汇编码在接口层必 须满足ATPCS的规范Register-如果如果 RWPI选项有效,作为栈的基地址选项有效,作为栈的基地址-如果软件堆栈检查有效,作为栈的限制值如果软件堆栈检查有效,作为栈的限制值-可作为临时的一个值栈一样来使用可作为临时的一个值栈一样来使用-子程序内部调用的可改写的寄存器子程序内部调用的可改写的寄存器-程序计数器程序计数器14TM14103v04 C/C+Compiler Hints&Tips在在C程序中调用汇编程序中调用汇编n在汇编程序中用在汇编程序
13、中用export name来定义来定义n在在C程序中直接调用程序中直接调用,用用EXTERN声明声明n正常链接正常链接extern void mystrcopy(char*d,const char*s);int main(void)const char*src=“Source”;char dest10;.mystrcopy(dest,src);.AREA StringCopy,CODE,READONLY EXPORT mystrcopymystrcopy LDRB r2,r1,#1 STRB r2,r0,#1 CMP r2,#0 BNE mystrcopy MOV pc,lr END这里所有的
14、参数都是可以用寄存器来传递的,所以不需要在汇编程序中使用PUSH/POP来保护CALL15TM15103v04 C/C+Compiler Hints&Tips内嵌汇编内嵌汇编n允许使用一些不能由编译器自动生允许使用一些不能由编译器自动生成的指令成的指令:nMSR/MRSn新的指令n协处理器指令n通常在关联的内嵌函数中使用通常在关联的内嵌函数中使用n使用使用C变量代替寄存器变量代替寄存器n不是一个真正的汇编文件n通过优化器实现nADS FAQ 入口入口“Using the Inline Assembler”#define Q_Flag 0 x08000000/Bit 27_inline void
15、 Clear_Q_flag(void)int temp;_asm MRS temp,CPSR BIC temp,temp,#Q_Flag MSR CPSR_f,temp_inline int mult16(short a,short b,int c)int temp;_asm SMLABB temp,a,b,c return temp;16TM16103v04 C/C+Compiler Hints&TipsAgenda ARM编译器的优化C/C+和汇编混合模式编程n使用使用ARM编译器编码编译器编码局部和全局数据讨论17TM17103v04 C/C+Compiler Hints&Tips参数传
16、递参数传递n开始四个字大小的参数直接使用寄存器的开始四个字大小的参数直接使用寄存器的R0-R3来传递来传递(快速且高效的快速且高效的)n更多的信息可参看ATPCSn如果需要更多的参数,将使用堆栈。如果需要更多的参数,将使用堆栈。(需要额外的指令和慢速的存储器操需要额外的指令和慢速的存储器操作作)n所以通常限制参数的个数,使它为所以通常限制参数的个数,使它为4或更少。或更少。n如果不可避免,把常用的参数前4个放在R0-R3中Example.18TM18103v04 C/C+Compiler Hints&TipsnParameter Passing(4 parameters)int func1(i
17、nt a,int b,int c,int d)return a+b+c+d;int caller1(void)return func1(1,2,3,4);func1 0 x000000:ADD r0,r0,r1 0 x000004:ADD r0,r0,r2 0 x000008:ADD r0,r0,r3 0 x00000c:MOV pc,lr caller1 0 x000014:MOV r3,#4 0 x000018:MOV r2,#3 0 x00001c:MOV r1,#2 0 x000020:MOV r0,#1 0 x000024:B func1Parameter Passing(4 par
18、ameters)19TM19103v04 C/C+Compiler Hints&TipsParameter Passing(6 parameters)nParameter Passing(6 parameters)func2 0 x000000:STR lr,sp,#-4!0 x000004:ADD r0,r0,r1 0 x000008:ADD r0,r0,r2 0 x00000C:ADD r0,r0,r3 0 x000010:LDMIB sp,r12,r14 0 x000014:ADD r0,r0,r12 0 x000018:ADD r0,r0,r14 0 x00001C:LDR pc,sp
19、,#4 caller2 0 x000020:STMFD sp!,r2,r3,lr 0 x000024:MOV r3,#6 0 x000028:MOV r2,#5 0 x00002C:STMIA sp,r2,r3 0 x000030:MOV r3,#4 0 x000034:MOV r2,#3 0 x000038:MOV r1,#2 0 x00003C:MOV r0,#1 0 x000040:BL func2 0 x000044:LDMFD sp!,r2,r3,pcint func2(int a,int b,intc,int,d,int e,int f)return a+b+c+d+e+f;int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 编程 技巧 73996 精品
限制150内