04.Ubuntu下开发STM32--优化程序大小

16 篇文章 1 订阅

在上一篇帖子(https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html),我们使用gcc和Makefile成功的点亮了一盏led灯。却发现程序有点大,占用了6K多的代码空间。相比keil mdk下的代码量,这个确实大的多。这并不是我们使用的gcc的原因,也不是gcc链接newlibc库的原因。而是我们没有选择任何优化的参数。(下图是未经任何优化的代码大小)

img

-Os优化

说到代码的优化,在单片机中,由于flash空间过小,我们并不会过多的考虑优化代码运行的速度,而是要考虑代码占用的空间。这样,首先想到的是-Os优化。可以参考网址:http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-Os-919 。对-Os的解释如下:

  • Optimize for size. -Os enables all -O2 optimizations that do not typically
  • increase code size. It also performs further optimizations designed
  • to reduce code size.

在Makefile中,对CFLAGS编译命令添加-Os,如下图所示:(在Makefile中,#是注释一行的意思)

img

接着执行make clean,将上次的*.o文件删除,在重新执行make all。

img

可以看到,加了-Os优化之后,代码减小到了3K多点。

-ffunction-sections -fdata-sections 优化

对3K的流水等代码并不满意。毕竟keil mdk产生的才不足2K。我们还要对其再次优化。在gnu option index参考手册中,看到这个优化命令:

img

img

ffunction-section,fdata-section这两个命令可以是函数或者数据存放在自己独立的sections中。这两个命令是编译命令。而gc-sections是回收无用的sections。gc-sections是链接命令。不过ffucntion-section,fdata-sections和g参数连用,用于调试的时候,可能会产生什么问题。修改Makefile,增加这几个命令。去掉之前添加的-Os命令。

img

同样,make clean,make all之后:(代码竟然降到1680字节了!)

img

-ffunction-sections,fdata-sections和-Os连用

下面我们将这几个命令都用上在试一下:

img

同样,make clean,make all之后:这个似乎是我们的终极目标了。

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值