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 
  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 
  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。

你可能感兴趣的:(ESP01S,arduino,算法,microsoft)