You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何裁剪Attiny45平台DHT11温湿度计代码以降低存储占用

代码体积优化方案(按缩减效果从高到低排序)

1. 移除官方DHT库,手写极简DHT11读取逻辑

官方DHT库为兼容全系列Arduino开发板、DHT11/22/AM2302等多型号传感器,包含大量冗余分支判断与兼容代码,是当前体积超标最大的原因。DHT11单总线协议非常简单,仅需20余行寄存器操作的代码即可实现读取,单这一项可缩减1~1.5KB程序体积。

2. 替换Arduino标准IO函数为寄存器操作

pinMode、digitalWrite、digitalRead这类标准函数为了兼容全系列芯片的所有引脚,内部做了大量引脚合法性判断、端口映射逻辑,单函数就占上百字节体积。ATTiny45引脚数量极少,直接操作DDRB(方向寄存器)、PORTB(输出寄存器)、PINB(输入寄存器)即可实现IO控制,替换后可缩减至少300字节体积。

3. 移除millis依赖,改用WDT计数实现计时

Arduino的millis功能依赖定时器0中断实现,中断服务函数、计时逻辑本身占300~500字节体积。你的应用本身就用WDT做8秒定时唤醒,直接用一个字节变量累计WDT唤醒次数即可实现所有计时需求,完全可以移除millis相关的全部代码,还能顺带降低休眠功耗。

4. 优化数码管段码转换逻辑

当前toSegments用switch分支实现,可改为存在Flash空间的常量数组,既省RAM又省Flash:

const uint8_t seg_table[] PROGMEM = {
  0b01111110, //0
  0b00110000, //1
  0b01101101, //2
  0b01111001, //3
  0b00110011, //4
  0b01011011, //5
  0b01011111, //6
  0b01110000, //7
  0b01111111, //8
  0b01111011  //9
};
// 读取段码直接调用pgm_read_byte(&seg_table[value])即可

这一项可缩减约100字节体积。

5. 精简自定义shiftOut函数

当前实现的shiftOut存在冗余变量与操作:

  • 循环变量i、pinState改为uint8_t类型,无需用16位int
  • 移除if分支,直接用位运算赋值pinState = (toBeSent >> i) & 1;
  • 移除没必要的digitalWrite(dataPin, 0)后置操作
    精简后可缩减约50字节体积。

6. 编译选项调整

在ATTiny核心的编译选项中开启-Os最小体积优化,开启链接时优化(LTO),关闭串口、模拟输入等未使用的外设支持编译选项,可额外缩减100~200字节体积。

完成前3项优化即可将程序体积压缩到3520字节限制以内,全部优化完成后可剩余至少500字节的Flash空间预留后续功能迭代。


内容的提问来源于stack exchange,提问作者ElectroBadger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:54:03