下载此文档

ARM编程技巧.ppt


文档分类:IT计算机 | 页数:约41页 举报非法文档有奖
1/ 41
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/ 41 下载此文档
文档列表 文档介绍
ARM 编程技巧
Agenda
ARM 编译器优化
C/C++和汇编混合模式编程
使用ARM编译器编码
局部和全局数据讨论
优化级别
使用的编译器优化级别是可选择的
-O0---DEBUG
关闭大多数优化.
最好的调试信息,最少的优化
-O1---DEBUGREL
多数优化选项许可
给一个满意的调试,好的代码密度
-O2---RELEASE (default)
完全的优化
有限的调试信息,最好的代码密度
为代码大小或运行速度的优化,可选择: -Ospace (默认的)或-Otime.
使用-g 选像可包含源码级调试信息
ADS 编译器在所有级别中执行一些简单的优化
. -O0, -O1, -O2
下面是一个例子:即使用-O0,多余的表达式也被清除了:
ATPCS标准中子程序结果返回规则
结果为32位整数,R0返回
结果为64位整数,R0,R1返回
位数更多时,用内存来传递
……
自动优化
int f(int *p)
{
return (*p = = *p);
}
-c -O0
f
MOV r1, r0
MOV r0, #1
MOV pc, lr
注意:在这种情况下,可使用C的关键字volatile 强制使用这些变量
使用“volatile”
int f(volatile int *p)
{
return (*p = = *p);
}
-c
f
LDR r1,[r0]
LDR r0,[r0]
CMP r1,r0
MOVNE r0,#0
MOVEQ r0,#1
MOV pc,lr
int f(int *p)
{
return (*p = = *p);
}
f
MOV r0,#1
MOV pc,lr
-c
这个代码用的编译级别是:-o2
下面是一个冗余代码清除的例子,他只用了-o1的优化选项:
冗余代码的清除
int dummy()
{
int a=10, b=20;
int c;
c=a+b;
return 0;
}
-c -O1
dummy
MOV r0, #0
MOV pc, lr
指令编排
指令编排在高级优化选项中是有效的(-O1, -O2).
指令的重新编排是为了使要运行的代码更适合对应的核
为arm9和以后的处理器提高吞吐量(一般可达到4%),并防止互锁(interlock)
选择处理器可决定使用的运算法则,在默认情况下,使用针对ARM9的优化方案(对ARM7的运行没有影响)
例如:
int f(int *p, int x)
{ return *p + x * 3; }
没用指令编排(-O0) 使用指令编排(-O1,-O2)
ADD r1,r1,r1,LSL #1 LDR r0,[r0,#0] LDR r0,[r0,#0] ADD r1,r1,r1,LSL #1 ADD r0,r0,r1 ; interlock on ARM9 ADD r0,r0,r1 MOV pc,lr MOV pc,lr
–cpu arm7tdmi
–cpu arm9tdmi
Tail-call Optimization
嵌套优化可避免在函数级里的不必要的返回
在可能的情况下BL 译码成B
在高级优化里有效(-O1, -O2).
int main() { int x = f(); : }
int f() { int y = g(); return y; }
int g() { return 10; }
B g
BL f :
MOV r0, #10 MOV pc, lr
BL f :
STR lr,[sp,#-4]! BL g MOV r1,r0 MOV r0,r1 LDR pc,[sp],#4
MOV r0, #10 MOV pc, lr
嵌套优化
内嵌函数(inline)
内嵌可通过删除子函数调用的开销来提高性能
这个 inline 关键字显示哪个函数将被内嵌
在高级优化选项中,ADS 编译器默认自动内嵌
-Oautoinline (default -O2)
-Ono_autoline (default for -O0,-O1)
哪个函数是否被内嵌取决于:
他们是否被__inline标示
优化的级别
-Otime / -Ospace
函数被调用的次数
如果函数在别的模块中不被调用,一个好的建议是用static标识函数,否则,编译器将在内嵌译码里把该函数编译乘非内嵌的
加代码的长度
使调试信息更复杂
Example...
Inline example
int bar(int a)
{
a=a+5;
return a;
}
int foo(int i)
{
i=

ARM编程技巧 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数 41
  • 收藏数 0 收藏
  • 顶次数 0
  • 上传人 中国课件站
  • 文件大小 0 KB
  • 时间2011-10-11
最近更新