搜索
bottom↓
回复: 23

请教:STM32编写代码如何有效减少Flash?

[复制链接]

出590入992汤圆

发表于 2021-9-13 20:59:24 | 显示全部楼层 |阅读模式
如题,看大多数提问和资料都是如何差减少RAM的。
奈何,最近移植代码,换成64KB的Flash,之前是70KB的Flash,想减少到64KB以下。
有没有一些有效方便的方式可以快速减少Flash的占用?(尽量少改代码,而且感觉改代码动用的风险太大了,也有一定的难度。)(查阅资料,在MDK中勾选Use micLIB确实一定程度可以,但是还是不够。)

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2021-9-13 21:22:05 | 显示全部楼层
优化等级试试,不过也很大风险

出0入475汤圆

发表于 2021-9-13 21:22:06 来自手机 | 显示全部楼层
再选优化等级嘛,侧重代码空间优化,

出0入8汤圆

发表于 2021-9-13 21:22:49 | 显示全部楼层
驱动层,直接用寄存器的方式配置,去掉库,只留必要的启动文件和头文件。
应用程,去掉用不到的函数,减少函数调用及嵌套。
有时候使用轻量RTOS可以带来程序框架的整洁,优化任务调度,也能减少代码量。
希望有用~

出870入263汤圆

发表于 2021-9-13 22:12:52 | 显示全部楼层
看map文件,对那种占用code比较大的模块下手。某些ST驱动库函数用自己寄存器操作代替。

出15入178汤圆

发表于 2021-9-13 22:25:49 | 显示全部楼层
切换到LL(LowLayer)库应该有所帮助

出0入0汤圆

发表于 2021-9-13 22:55:34 | 显示全部楼层
直接寄存器操作,各个外设优化,尤其是初始化,基本可以减少很多

出200入2554汤圆

发表于 2021-9-14 01:34:15 来自手机 | 显示全部楼层
改代码改到吐血的… 无捷径

出0入42汤圆

发表于 2021-9-14 07:17:24 来自手机 | 显示全部楼层
先确认开到了代码体积优化,然后排序开刀

出30入16汤圆

发表于 2021-9-14 07:58:22 来自手机 | 显示全部楼层
改进算法最明显

出100入312汤圆

发表于 2021-9-14 08:06:54 | 显示全部楼层
试试压缩再解压

出0入0汤圆

发表于 2021-9-14 09:46:02 | 显示全部楼层
设置里面的C/C++那一栏有个One ELF Section per Function.勾上这个也能减少flash大小

出0入75汤圆

发表于 2021-9-14 09:56:08 | 显示全部楼层
参考8L大神改盖革计的思路。

出0入0汤圆

发表于 2021-9-14 10:31:34 | 显示全部楼层
改为LL库~

出0入0汤圆

发表于 2021-9-14 10:41:01 | 显示全部楼层
如果已经把 按代码大小优化, 楼上提到的 One ELF Section per Function, 和使用 MicroLIB 这些选项都试过了

还有一招可以试试,就是像 sqlite 的 amalgamation 版本源码一样 ( https://www.sqlite.org/download.html ),
把所有 .c 的内容按顺序拼成一个 .c 来编译,我自己出于隐藏符号的目的用过,减少符号的同时代码也会更小。

出0入0汤圆

发表于 2021-9-14 11:17:03 | 显示全部楼层
稳定产品这么压缩弄个bug产品 老板就要祭奠你了

出130入20汤圆

发表于 2021-9-14 11:47:30 | 显示全部楼层
都用STM32了还抠这点成本,相比开优化或者死命改代码改到吐血和BUG满天飞,不如换用国产便宜的大容量pin to pin直接小改或不改就可以烧固件的替代品算了。

出0入362汤圆

发表于 2021-9-14 16:25:13 | 显示全部楼层
本帖最后由 tomzbj 于 2021-9-14 16:27 编辑

gcc的话, 先把编译选项改成-Os, 然后有可能的话去掉-u _printf_float, 再有可能的话尽量不用printf/sprintf/sscanf之类, 再就是尽量不用浮点运算, 纯整数.

补充一下, 编译选项一定要加上 -ffunction-sections -fdata-sections, 链接选项加上-Wl,--gc-sections, 这样就不会把未用到的代码链接到最终的二进制输出.

出0入0汤圆

发表于 2021-9-14 22:49:25 来自手机 | 显示全部楼层
其实很多MCU内部有隐藏的Flash,厂家做晶圆时不会搞这么多型号的,只是后期封装时根据需求做了很多型号,其实资源是按最大的型号来的。

出615入1076汤圆

发表于 2021-9-15 02:12:14 来自手机 | 显示全部楼层
編譯等級 -Os

按大小排一下,看一下哪個東東佔用空間多,優先處理大的

hal 函數中有很多判斷的分支沒用到的可以註釋掉,這樣能省不少空間、提升運行速度,而且不需要改變開發習慣(習慣是指使用 stm32cubemx 和 hal 庫)

出590入992汤圆

 楼主| 发表于 2021-9-15 16:09:12 | 显示全部楼层
谢谢大家回复。
把优化等级调整到就可以减少代码了(非常奇怪,我上次明明改优化等级编译,但是Flash没有减少,但是不知道为什么这次居然可以。)
代码从70KB减小到40KB左右。我对我代码比较有信心。应该不会有问题!

出0入8汤圆

发表于 2021-9-16 08:41:14 | 显示全部楼层
IAR应该比MDK代码小很多,

出100入113汤圆

发表于 2021-9-16 08:43:08 | 显示全部楼层
ST 我进本全是寄存器操作,使用自己的库。

出0入4汤圆

发表于 2021-10-15 11:43:10 | 显示全部楼层
1. 自己的驱动库
2. 优化等级最高级
3. 删除无用的代码
4. 优化代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 13:35

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

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