你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
qianfan 发布时间:2015-10-25 19:12
本帖最后由 QianFan 于 2015-10-25 20:42 编辑 ( V$ |0 S! N. y
0 a5 }; M: f7 C' ]6 l
    在上一篇帖子(https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html),我们使用gcc和Makefile成功的点亮了一盏led灯。却发现程序有点大,占用了6K多的代码空间。相比keil mdk下的代码量,这个确实大的多。这并不是我们使用的gcc的原因,也不是gcc链接newlibc库的原因。而是我们没有选择任何优化的参数。(下图是未经任何优化的代码大小)
, Z/ g  @/ j5 r' K' B Screenshot from 2015-10-25 19:06:56.png
6 P  P: o3 ~8 Y  X& v. w8 T8 d, U
-Os优化:
' N. h% _( x1 H8 v  ^说到代码的优化,在单片机中,由于flash空间过小,我们并不会过多的考虑优化代码运行的速度,而是要考虑代码占用的空间。这样,首先想到的是-Os优化。可以参考网址:http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-Os-919 。对-Os的解释如下:
- s# l; C+ d4 G# q; E* `) A, D>Optimize for size. -Os enables all -O2 optimizations that do not typically
1 s" w2 K) y! `, V1 u! y" S>increase code size. It also performs further optimizations designed
& b; Q/ l7 f7 K3 U* f6 @>to reduce code size. + Z! h! }/ y5 k4 O
在Makefile中,对CFLAGS编译命令添加-Os,如下图所示:(在Makefile中,#是注释一行的意思)/ }& G% H7 B! o5 h  V$ I8 Y8 O
Screenshot from 2015-10-25 19:07:51.png 2 q- K0 ]4 D; K7 f- x, P9 N7 Z
接着执行make clean,将上次的*.o文件删除,在重新执行make all。
' f+ G  B" g% F* d/ o% O" O$ o Screenshot from 2015-10-25 19:09:07.png
- m+ \) C  ~" z$ p( a- X$ a# ~可以看到,加了-Os优化之后,代码减小到了3K多点。8 N7 Q8 q+ L# f9 P3 y
. {8 j# T. i0 o( W" g
4 W& t9 _* h. H; {- ]9 P. x
-ffunction-sections -fdata-sections 优化:
8 u7 K5 G  \5 P; B对3K的流水等代码并不满意。毕竟keil mdk产生的才不足2K。我们还要对其再次优化。在gnu option index参考手册中,看到这个优化命令:8 Y5 R5 y% p* M1 `* E0 J8 u: V5 G
Screenshot from 2015-10-25 19:23:28.png ) p( `, v# P+ h- H% k% B
Screenshot from 2015-10-25 19:22:51.png
( [2 r% i; \3 j1 R. f% T, e. Fffunction-section,fdata-section这两个命令可以是函数或者数据存放在自己独立的sections中。这两个命令是编译命令。而gc-sections是回收无用的sections。gc-sections是链接命令。不过ffucntion-section,fdata-sections和g参数连用,用于调试的时候,可能会产生什么问题。修改Makefile,增加这几个命令。去掉之前添加的-Os命令. X4 C9 u" G8 N
Screenshot from 2015-10-25 19:28:45.png
! z1 E$ C; g; \# H8 K  ^' v- `同样,make clean,make all之后:(代码竟然降到1680字节了!)7 M( x# e+ w3 U% H" b1 W2 \, G3 j0 q8 P
Screenshot from 2015-10-25 19:29:27.png : j2 }4 \5 X5 S6 d/ ^
) o) m2 g: h+ }2 r  R1 P
- ~& ]& p9 `$ I% _
ffunction-sections,fdata-sections,Os连用:9 x; K. d+ l4 L. m7 q6 r# p" ?
下面我们将这几个命令都用上在试一下:4 h0 c' N$ V7 P4 [+ l/ m! N
Screenshot from 2015-10-25 19:31:34.png
( m0 B3 E& `1 U6 E4 t. B同样,make clean,make all之后:这个似乎是我们的终极目标了。4 d; d& ~, B5 J2 l1 N! N! L
Screenshot from 2015-10-25 19:32:22.png
. Q/ C" w! V( t% k1 \5 v( H

blink_op.zip

下载

390.53 KB, 下载次数: 167

收藏 2 评论5 发布时间:2015-10-25 19:12

举报

5个回答
yanhaijian 回答时间:2015-10-25 21:21:30
对这个感兴趣。
王某某 回答时间:2018-1-22 22:16:14
很强!依照你的代码,我成功的也把自己的stm32驱动起来了!
& b4 @1 ]6 f8 P' g赞一个!
swapkernel1111 回答时间:2018-6-29 17:25:07
linuxfor 回答时间:2018-12-13 10:25:15
,优化可以降低很多呀
马超飞燕 回答时间:2019-1-28 16:59:37
学习,谢谢分享。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版