单片机如果存储空间紧张,就避免用 printf 类的函数 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
liuzhiyong
V2EX    程序员

单片机如果存储空间紧张,就避免用 printf 类的函数

  liuzhiyong 124 天前 4057 次点击
这是一个创建于 124 天前的主题,其中的信息可能已经有所发展或是发生改变。

工作中把一些功能弄到较为低端的单片机,代码是现成的。倒腾之后编译,单片机存储不够了。

使劲把用不到的代码注释掉,存储空间还是不够。最后注释掉 printf 类的函数( sprintf 、snprintf 之类的),立刻节省了很多单片机的存储空间。

27 条回复    2025-06-11 09:38:26 +08:00
v1
    1
v1  
   124 天前   1
外挂 eeprom ,片内 boot 引导,从片外 flash 启动固件
tbxark
    2
tbxark  
   124 天前
大学时候写单片打印设置宏, 只有 debug 的时候开启。release 的时候去掉。
seers
    3
seers  
   124 天前 via iPhone
听说过很多 printf 在单片机造成的 bug ,不知道真的假的
huluhulu
    4
huluhulu  
   124 天前
printf 太占用系统资源了,存储和内容都挺占的,一般用 uart 打印日志比较经济划算。
loveour
    5
loveour  
   124 天前   5
想起来之前同事打日志查性能问题,最后发现最耗的是日志。。
TerryRobles
    6
TerryRobles  
   124 天前
单片机也不支持 printf 啊,是我用的太低端吗。
someonesnone
    7
someonesnone  
   124 天前 via Android
printf 应该只有 debug 注释开启才启用, 你的环境不区分 debug release 吧...
36963
    8
36963  
   124 天前
用汇编写吧。。。c 再怎么翻译都不如汇编节省的
ysc3839
    9
ysc3839  
   124 天前 via Android
printf 整套解析逻辑都是运行时进行的,只要用了,就得把全部代码都打包进去。
有的 printf 实现非常复杂,甚至是图灵完备的
https://news.ycombinator.com/item?id=25691598
levelworm
    10
levelworm  
   124 天前
这种可以自己写吧?有些最小的 C 库可以试试看。
383394544
    11
383394544  
   123 天前
现在的 LLM 有能力把 C 变成可用的汇编代码吗
villivateur
    12
villivateur  
   123 天前
把 printf 的 %f 功能去掉再试试,打印浮点数极其消耗资源
KeysPAN
    13
KeysPAN  
   123 天前
我记得大部分 print 是重定义到串口的,sprintf 这些能少用就少用。如果是 wifi 芯片还好,随便造
junyee
    14
junyee  
   123 天前
可以使用微型的 clib 库,或手搓一个 printf .
只要这个函数大概占 1KB 的空间吧.
ayyll
    15
ayyll  
   123 天前
@383394544 没有 翻译一个函数都够呛 别说整个工程了
multigram
    16
multigram  
   123 天前
查下工程 map 文件吧,看下哪些代码占 ROM
ltyj2003
    17
ltyj2003  
   123 天前 via Android
@383394544 这不该是编译器的活吗?
null2error
    18
null2error  
   123 天前
C Standard Library ( libc )受害者+1

ps:C 标准库是非常好的学习对象,无论是代码层面还是应用层面,值得把每个头文件都看一遍
iseki
    19
iseki  
   123 天前 via Android
记得小时候看过很久远的教程里,就说过 printf scanf 这俩函数背后拖着的一大堆东西,可能把 ROM 干爆(
diivL
    20
diivL  
   123 天前
printf 类函数的 fmt 也占不少空间,很可能比函数本身占的还多。
sampeng
    21
sampeng  
   123 天前
我都是 output 到串口之类的通信口。。简单可依赖。。。。
muooOOO
    22
muooOOO  
   123 天前
microLib ,就很香。当然也可以自己写个 print ,能够打印字符串就行了,最多在加一个打印变量
383394544
    23
383394544  
   123 天前
@ltyj2003 编译器写的汇编不一定是最优实现,有时还得直接写汇编。
Niunai
    24
Niunai  
   123 天前
缩小程序二进制文件的体积,通用做法是看 map 文件,根据 map 文件裁剪很直观。
spadger
    25
spadger  
   123 天前
wanei
    26
wanei  
   123 天前
串口打印,按位操作,对着自己写的手册 debug
PanuiQ
    27
PanuiQ  
   122 天前
调试过一个龙芯 2K1000 裸跑的项目的设备驱动移植,printf 没实现,自己整了 3 个函数,分别打印字符串、十进制数和十六进制数,错误打印不出来,需要自己把原来驱动的打印信息,一条拆成好几条打印
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     945 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 25ms UTC 22:48 PVG 06:48 LAX 15:48 JFK 18:48
Do have faith in what you're doing.
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86