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 代码空间较大
初步分析 查看反汇编,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
file:///D:/Program%20Files/wizdata/temp/b5126e70-0bf1-4b94-9f28-592a80d0b25d/128/index_files/f6975641-23fa-4328-998b-bf401dda6967.png
后续分析 使用无优化的方式,两种写法都是用 BL B() 的方式,代码空间大小差距不大。
一周热门 更多>