单片机如果存储空间紧张,就避免用 printf 类的函数 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
liuzhiyong

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

  •  1
     
  •   liuzhiyong Jun 9, 2025 4685 views
    This topic created in 325 days ago, the information mentioned may be changed or developed.

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

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

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

    ps:C 标准库是非常好的学习对象,无论是代码层面还是应用层面,值得把每个头文件都看一遍
    iseki
        19
    iseki  
       Jun 10, 2025 via Android
    记得小时候看过很久远的教程里,就说过 printf scanf 这俩函数背后拖着的一大堆东西,可能把 ROM 干爆(
    diivL
        20
    diivL  
       Jun 10, 2025
    printf 类函数的 fmt 也占不少空间,很可能比函数本身占的还多。
    sampeng
        21
    sampeng  
       Jun 10, 2025
    我都是 output 到串口之类的通信口。。简单可依赖。。。。
    muooOOO
        22
    muooOOO  
       Jun 10, 2025
    microLib ,就很香。当然也可以自己写个 print ,能够打印字符串就行了,最多在加一个打印变量
    383394544
        23
    383394544  
       Jun 10, 2025
    @ltyj2003 编译器写的汇编不一定是最优实现,有时还得直接写汇编。
    Niunai
        24
    Niunai  
       Jun 10, 2025
    缩小程序二进制文件的体积,通用做法是看 map 文件,根据 map 文件裁剪很直观。
    spadger
        25
    spadger  
       Jun 10, 2025
    wanei
        26
    wanei  
       Jun 10, 2025
    串口打印,按位操作,对着自己写的手册 debug
    PanuiQ
        27
    PanuiQ  
       Jun 11, 2025
    调试过一个龙芯 2K1000 裸跑的项目的设备驱动移植,printf 没实现,自己整了 3 个函数,分别打印字符串、十进制数和十六进制数,错误打印不出来,需要自己把原来驱动的打印信息,一条拆成好几条打印
    About     Help     Advertise     Blog     API     FAQ     Solana     2768 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 169ms UTC 14:03 PVG 22:03 LAX 07:03 JFK 10:03
    Do have faith in what you're doing.
    ubao msn 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