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,否则缓存会一直占用内存。
另外这个类还提供了两个模板函数,文章来源:https://www.toymoban.com/news/detail-532529.html
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。文章来源地址https://www.toymoban.com/news/detail-532529.html
到了这里,关于ESP8266使用EEPROM的正确方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!