操作EEPROM导致8266复位-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2809|回复: 8

操作EEPROM导致8266复位

[复制链接]
发表于 2020-3-1 19:15 | 显示全部楼层 |阅读模式

setup()里增加了EEPROM_Init();  函数就不行了,去掉的话运行正常

//读取失败或读到密钥或长度不对,就采用默认值
void EEPROM_Init(void)                       //FLASH初始化
{
  char write_data[100];                      //用户数据存储空间
  uint16_t i;
  uint8_t Key_len;

  EEPROM.begin(3000 + 100);                  //申请操作100字节数据
  for(i = 0; i < 100; i ++)
  {
    write_data[i] = EEPROM.read(i + 3000);   //读数据
  }

  Key_len = write_data[0];
  Serial.printf("Key_len = %d\r\n", Key_len);

  if ((Key_len < 5) || (Key_len > 20))        //读到的长度不对,认为是第一次上电,用默认值
  {
    pKey = KEY;
  }
  else
  {
    pKey = (char *)zalloc(Key_len + 1);
    strncpy(pKey, write_data + 10, Key_len);
  }

  Serial.printf("Key:%s\r\n", pKey);
}



void setup()
{
  Serial.begin(115200);                           //初始化串口
  BLINKER_DEBUG.stream(Serial);

  pinMode(LED_BUILTIN, OUTPUT);                   //初始化有LED的IO
  digitalWrite(LED_BUILTIN, HIGH);                //高为关,低为开
  EEPROM_Init();                                  //FLASH初始化

  Blinker.begin(auth);                            //使用smartconfig进行配网//初始化blinker
  Blinker.attachData(dataRead);                   //注册回调函数,当有设备收到APP发来的数据时会调用对应的回调函数pKey

  Button1.attach(button1_callback);               //组件回调函数

。。。。。。。。。。。。。。



但是从串口打印信息来看,早就过了EEROM函数运行的地方了,也不知道哪里导致的复位

HTTP server started
Open http://192.168.8.109/update in your browser to update
Open http://192.168.8.109/set in your browser to set
[1132] WiFi Connected.
[1134] IP Address:
[1136] 192.168.8.109
[5003] Freeheap: 7136
[5006] mDNS responder started
[5007] webSocket_MQTT server started
[5007] ws://9CE8EF10FE7PE7TM8X7DJUZK.local:81
[7140] Connecting to MQTT...
[9400] MQTT Connected!
[9401] Freeheap: 7416
[9401] =======================================================
[9401] =========== Blinker Auto Control mode init! ===========
[9405] Warning!EEPROM address 0-1279 is used for Auto Control!
[9410] =========== DON'T USE THESE EEPROM ADDRESS! ===========
[9416] =======================================================

Exception (28):
epc1=0x4022684a epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffd70 end: 3fffffc0 offset: 01a0
3fffff10:  00000000 3fff0158 3ffeff58 40202e49  
3fffff20:  4027ff14 80ff0073 3fff0424 00001778  
3fffff30:  3fff0afc 3fff0158 3ffeff58 40205c90  
3fffff40:  0000046c 3fff0158 3ffeff58 40213241  
3fffff50:  3fff0f90 00000001 3ffefdd0 40226b74  
3fffff60:  00f42400 38ffe28b 3ffefd00 40213ec9  
3fffff70:  000024b9 00000000 00001388 4022658c  
3fffff80:  00000000 00000000 00000001 3fff10ec  
3fffff90:  3fffdad0 00000000 3fff10ac 40213fac  
3fffffa0:  3fffdad0 00000000 3fff10ac 40224db4  
3fffffb0:  feefeffe feefeffe 3ffe856c 40100325  
<<<stack<<<

last failed alloc call: 4021E948



发表于 2020-3-1 21:42 | 显示全部楼层
本帖最后由 Creeper666 于 2020-3-1 21:52 编辑

EEPROM.begin(3000 + 100);                  //申请操作100字节数据

操作100字节不应该是EEPROM.begin(100);吗


 楼主| 发表于 2020-3-2 08:13 | 显示全部楼层
Creeper666 发表于 2020-3-1 21:42
EEPROM.begin(3000 + 100);                  //申请操作100字节数据

操作100字节不应该是EEPROM.begin(10 ...

EEPROM.begin(100);是操作前面0-99地址的100字节,我是操作从3500~3599的100字节
发表于 2020-3-2 08:53 | 显示全部楼层
本帖最后由 Creeper666 于 2020-3-2 08:55 编辑
wudianjun2001 发表于 2020-3-2 08:13
EEPROM.begin(100);是操作前面0-99地址的100字节,我是操作从3500~3599的100字节

begin只是请求操作的字节而不是起始位置
要操作的起始位置写是在read和write里面的

官方文档https://arduino-esp8266.readthed ... braries.html#eeprom
 楼主| 发表于 2020-3-2 09:52 | 显示全部楼层
本帖最后由 wudianjun2001 于 2020-3-2 09:53 编辑
Creeper666 发表于 2020-3-2 08:53
begin只是请求操作的字节而不是起始位置
要操作的起始位置写是在read和write里面的

测试过了EEPROM.begin(100);是不行的,读都读不对数据。EEPROM.begin(3100);的话可以读取到正确数据。
源代码,这个输入的长度是从0~size地址读到一个缓冲区的,所以要操作3100处的数据的话,输入100肯定是错的

void EEPROMClass::begin(size_t size) {
  if (size <= 0)
    return;
  if (size > SPI_FLASH_SEC_SIZE)
    size = SPI_FLASH_SEC_SIZE;

  size = (size + 3) & (~3);

  if (_data) {
    delete[] _data;
  }

  _data = new uint8_t[size];
  _size = size;

  noInterrupts();
  spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(_data), _size);
  interrupts();
}
发表于 2020-3-2 10:33 | 显示全部楼层
wudianjun2001 发表于 2020-3-2 09:52
测试过了EEPROM.begin(100);是不行的,读都读不对数据。EEPROM.begin(3100);的话可以读取到正确数据。
源 ...

好吧,关于EEPROM我涉足不深,莫得更多经验
发表于 2020-3-2 22:34 | 显示全部楼层
楼主解决了没有,我是发现使用blinker后 操作eeprom会出错 但是我的是写数据EEPROM.commit返回写入失败,不知咋搞
 楼主| 发表于 2020-3-3 10:21 | 显示全部楼层
一席残梦乱天涯 发表于 2020-3-2 22:34
楼主解决了没有,我是发现使用blinker后 操作eeprom会出错 但是我的是写数据EEPROM.commit返回写入失败,不 ...

不要写到blinker的系统占用EEPROM区域
发表于 2020-6-22 08:16 | 显示全部楼层
wudianjun2001 发表于 2020-3-3 10:21
不要写到blinker的系统占用EEPROM区域

不是这个原因 好像是镀锡额函数操作错误导致 后来解决了 谢谢哈
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 05:39 , Processed in 0.079895 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表