搜索
bottom↓
回复: 20

avrgcc代码优化:不链接未调用函数和用rjmp替换jmp实现方法

[复制链接]

出0入0汤圆

发表于 2007-10-24 16:55:58 | 显示全部楼层 |阅读模式
最近逛avrfreaks收到几个好贴。

1. 不链接未调用函数:
用avr studio的project option的工程,在该选项对话窗口的custom options里的[All files]里添加-ffunction-sections,
然后选择[Linker Options],添加-Wl,--gc-sections。重新编译。

用mfile或自己写makefile的,CFLAGS += -ffunction-sections,LDFLAGS += -Wl,--gc-sections。重新编译。

-ffunction-sections:不用此参数时,.o里代码部分只有.text段;使用此参数,则会使每个函数单独成为一段,比如函数func1()成为.text.func1段,但对链接后代码大小没影响。
--gc-sections:这是avr-ld的参数,通过-Wl,<option>由gcc把option里的参数传递给avr-ld。它使得链接器ld链接时删除不用的段。
这样,因为每个函数自成一段(即可以看作函数=段),如果有某个函数未被任何函数/段调用,则ld不会链接它。

2. 用rjmp/rcall替换jmp/call(即省空间,又提高运行速度):
jmp:Words 2 (4 bytes) Cycles: 3, call:Words 2 (4 bytes) Cycles: 4, devices with 16 bit PC
rjmp:Words 1 (2 bytes) Cycles: 2, rcall:Words 1 (2 bytes) Cycles: 3 devices with 16-bit PC

艺芯的avrgcc参数翻译里有个参数-mshort-calls,会强行替换所有的jmp/call为rjmp/rcall,当所选芯片的flash<=8K时,winavr默认开了这个选项。
但当芯片flash大于8K时,默认全用jmp/call。因为rjmp/rcall有8K跳转限制,如果代码有8K外跳转/调用那么链接时会发生错误,无法生成elf、hex。
当然如果你使用-mshort-calls编译时一切正常,那么你的代码里没有8K以上跳转/调用。

如果使用-mshort-calls后有错误,请看下面:

大的代码一般仍有部分跳转/调用在8K以内,如果全用jmp/call,浪费较大,此时可以用这个参数,
用avr studio的project option的工程,在该选项对话窗口的custom options里的[Linker Options],添加-Wl,--relax。
用mfile或自己写makefile的,LDFLAGS += -Wl,--relax。
这样,avr-ld在链接时会计算各个跳转/调用的范围,如果在相对跳转空间内,则用rjmp/rcall替换jmp/call。
注意:有时-Wl,--relax会造成ld运行错误(就是出现向m$报告错误那种对话框),应当加上-Wl,--gc-sections就行了,目前原因不明。

看下我的测试工程(使用了通用的文件,但很多函数没用到):
WinAVR-20070525

-Os
81314 Bytes

-Os -ffunction-sections -Wl,--gc-sections
75142 Bytes

-Os -ffunction-sections -Wl,--gc-sections -Wl,--relax
74806 Bytes

如果掌握了链接脚本,还能进一步手工优化,扩大-Wl,--relax的替换范围,甚至直接用-mshort-calls代替。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2007-10-24 16:59:08 | 显示全部楼层
好!正事!。。。

出0入0汤圆

发表于 2007-10-24 17:28:23 | 显示全部楼层
-ffunction-sections
-Wl,--gc-sections
太感谢了。

出0入0汤圆

发表于 2007-10-24 18:19:26 | 显示全部楼层
太强了,可惜英文不好,快30岁的人了,学英文还来的及吗?老了。

出0入0汤圆

发表于 2007-10-24 21:17:32 | 显示全部楼层
好贴,留个记号.

出0入0汤圆

发表于 2007-10-25 13:07:13 | 显示全部楼层
不错!

出0入0汤圆

发表于 2007-10-25 21:47:01 | 显示全部楼层
顶,好贴!

出0入0汤圆

发表于 2007-10-26 17:43:56 | 显示全部楼层
好贴,留个记号.

出0入0汤圆

发表于 2007-10-27 15:03:16 | 显示全部楼层
留个记号

出0入0汤圆

发表于 2007-12-5 19:35:32 | 显示全部楼层
真的不错!

出0入22汤圆

发表于 2007-12-5 20:42:21 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2007-12-5 21:11:08 | 显示全部楼层
好贴,谢谢!

出0入0汤圆

发表于 2008-5-20 11:51:31 | 显示全部楼层
好,谢谢!

出0入0汤圆

发表于 2009-3-25 22:43:53 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-3-26 11:12:33 | 显示全部楼层
这个不错,呵呵。

出0入0汤圆

发表于 2009-9-26 02:04:36 | 显示全部楼层
good!

出0入0汤圆

发表于 2009-11-16 19:02:58 | 显示全部楼层
精彩

出0入147汤圆

发表于 2009-12-24 14:58:17 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-12-19 19:31:35 | 显示全部楼层
marki一下

出0入0汤圆

发表于 2011-4-9 17:36:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-26 21:34:57 | 显示全部楼层
受益匪浅
帮大忙了
多谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 04:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表