IAR 优化Balance BL 函数跳转

2019-07-20 10:19发布

本帖最后由 16777216 于 2017-12-26 09:27 编辑

开发环境:IAR:6.60.1.5099

优化等级: high balance
file:///D:/Program%20Files/wizdata/temp/b5126e70-0bf1-4b94-9f28-592a80d0b25d/128/index_files/e250c490-0043-46c9-981b-aa5f4de74bcb.jpg

现象:有一个工程需要增加一个通信功能,该功能总共有4个函数,称为 A,B,C,D,其中A函数调用B,C,D,A函数被工程中的原来的函数调用。在A函数内,BCD函数均被流水调用多次(30次)。
B函数的调用一般形式为 B(0x12,pbuf)   每次调用B的pbuf参数2都是一样的,参数1是各种常数,不要问我为什么参数2不变为啥还要这个参数,我也不知道,历史传承。
调用树简单如下所示:
file:///D:/Program%20Files/wizdata/temp/b5126e70-0bf1-4b94-9f28-592a80d0b25d/128/index_files/a7f13c97-1a01-486b-8c39-24108d60c82a.png
两种写法:
  • mode-1        将A,B,C,D 函数放置在init.c 中,main.c 中extern A();
  • mode-2        将A,B,C,D 函数放置在main 中,main.c 头声明 A();
发现代码空间差距2K,mode-2 代码空间较大

1.png
初步分析查看反汇编,iar 设置输出汇编,发现汇编出来的代码不一致,在mode1 中,A 调用B(30次)均使用  BL  B()   的函数形式,在mode-2中,A 调用B(30次)前十多次使用  BL  B()   的函数形式,在后面10多次使用展开B函数的形式,汇编直接包含了B的参数。
实际代码如下
file:///D:/Program%20Files/wizdata/temp/b5126e70-0bf1-4b94-9f28-592a80d0b25d/128/index_files/c78a6eda-a0d7-46d5-8bba-1166b4476aa2.png 3.png
2.png

file:///D:/Program%20Files/wizdata/temp/b5126e70-0bf1-4b94-9f28-592a80d0b25d/128/index_files/f6975641-23fa-4328-998b-bf401dda6967.png

后续分析使用无优化的方式,两种写法都是用 BL  B() 的方式,代码空间大小差距不大。













0条回答

一周热门 更多>