- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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返回 位数更多时,用内存来传递 …… 使用 “volatile” 冗余代码的清除 下面是一个冗余代码清除的例子,他只用了-o1的优化选项: 指令编排 指令编排在高级优化选项中是有效的(-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 #1ADD r0,r0,r1 ; interlock on ARM9 ADD r0,r0,r1MOV pc,lr MOV pc,lr 内嵌函数(inline) 内嵌可通过删除子函数调用的开销来提高性能 这个 inline 关键字显示哪个函数将被内嵌 在高级优化选项中,ADS 1.2 编译器默认自动内嵌 -Oautoinline (default -O2) -Ono_autoline (default for -O0,-O1) 哪个函数是否被内嵌取决于: 他们是否被 __inline标示 优化的级别 -Otime / -Ospace 函数被调用的次数 如果函数在别的模块中不被调用,一个好的建议是用static标识函数,否则,编译器将在内嵌译码里把该函数编译乘非内嵌的 加代码的长度 使调试信息更复杂 Agenda ARM编译器的优化 C/C++和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论 C和汇编的混合编程 C/C++ 和汇编能很容易的混合: 可实现在c中无法实现的处理器功能 使用新的或不支持的指令 产生更高效的代码 直接链接变量和程序 确定符合程序调用规范 输入/输出相关的符号 编译器也可包含内嵌汇编 大多数arm指令集都可实现 寄存器操作数可支持任意的c/c++的表达式 内嵌汇编代码可由编译器的优化器来传递 ATPCS(arm/thumb程序调用规范) 在C程序中调用汇编 在汇编程序中用export name来定义 在C程序中直接调用,用EXTERN声明 正常链接 内嵌汇编 允许使用一些不能由编译器自动生成的指令: MSR / MRS 新的指令 协处理器指令 通常在关联的内嵌函数中使用 使用C变量代替寄存器 不是一个真正的汇编文件 通过优化器实现 ADS FAQ 入口 “Using the Inline Assembler” Agenda ARM编译器的优化 C/C++和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论 参数传递 开始四个字大小的参数直接使用寄存器的R0-R3来传递(快速且高效的) 更多的信息可参看ATPCS 如果需要更多的参数,将使用堆栈。(需要额外的指令和慢速的存储器操作) 所以通常限制参数的个数,使它为4或更少。 如果不可避免,把常用的参数前4个放在R0-R3中 Parameter Passing (4 parameters) int func1(int a, int b, int c, int d) { return a+b+c+d; } int caller1(void) { return func1(1,2,3,4); } Parameter Passing (6 parameters) Parameter Passing (6 parameters) func2 0x000
文档评论(0)