• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liuzhiyong
V2EX  ›  程序员

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

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

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

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

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

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