ESP8266使用EEPROM的正确方式

EEPROM其实是一个EEPROMClass类的实例,其定义如下

#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_EEPROM)
extern EEPROMClass EEPROM;
#endif

从这里可以看出只要没有定义NO_GLOBAL_INSTANCES和NO_GLOBAL_EEPROM那么便会定义EEPROM。·

对于这个类的实现其实很简单,但是通过阅读代码,其实它总是被缓存的。也就是说你的读写总是在内存进行的。

它 的标准步骤如下:

EEPROM.begin  ->EEPROM.read或者EEPROM.write->EEPROM.end

中间的read和write其实都是操作的缓存内存,也就是说这个写并没保存下来,如果断电,那么信息会丢失。在end里能过判断标志位来确定是否需要commit,commit里才会写回数据到flash,另外它提供了getDataPtr和getConstDataPtr来直接操作那块缓存。它们的区别就是getConstDataPtr因为是const的所以默认你不会改写缓存,也就不会对数据设标志脏。getDataPtr正好相反,无论你获取后是否改写都会有数据脏标志,因为人家也不知道你会不会改写这段内存。所以正常读取时建意使用getConstDataPtr。

另外begin需要传入缓存大小,这里begin也就是你读写的大小,它先会缓存flash的数据到内存,接着你的所有操作都是针对它来。所以以在没有调用begin前的操作都是无效的。另外使用完后一定要调用end,否则缓存会一直占用内存。

另外这个类还提供了两个模板函数,

template<typename T> 
  T &get(int const address, T &t) {
    if (address < 0 || address + sizeof(T) > _size)
      return t;

    memcpy((uint8_t*) &t, _data + address, sizeof(T));
    return t;
  }

  template<typename T> 
  const T &put(int const address, const T &t) {
    if (address < 0 || address + sizeof(T) > _size)
      return t;
    if (memcmp(_data + address, (const uint8_t*)&t, sizeof(T)) != 0) {
      _dirty = true;
      memcpy(_data + address, (const uint8_t*)&t, sizeof(T));
    }

    return t;
  }

可以看到get和put可以更方便的操作EEPROM。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值