V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liuzhiyong
V2EX  ›  程序员

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

  •  1
     
  •   liuzhiyong · 3 天前 · 3309 次点击

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

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

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

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