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

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

  •  1
     
  •   liuzhiyong · 11 天前 · 3510 次点击

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

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

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

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