Ошибка при записи структуры в EEPROM на ESP32 S3

Настройки ESP32 S3:

Сам модуль: https://www.waveshare.com/wiki/ESP32-S3-Touch-LCD-4.3

Файл SAVE.h:

#pragma once
#include <Arduino.h>

struct SAVE  {
  bool ACTIVE[3]              = {true, true, true};
  bool LIMITATION             = false;
  float LIMIT                 = 0;
  uint8_t ACTIV_NAMBER[3]     = {1, 2, 0};    
  float CURRENT_HOUR[3][5];
  float WATT_HOUR[3][5];

  uint32_t SET_MILLISECOND[3][5];   //Время для расчёта емкости

  uint16_t COLOR[3][3]        = {
                                {0xffff, 0xf800, 0x07e0},
                                {0xffff, 0xf800, 0x07e0},
                                {0xffff, 0xf800, 0x07e0},
                              };
  
};

Основной файл:

#include <EEPROM.h>
SAVE SAVE;
void EEPROM_SAVE()                                                                      
{
  EEPROM.begin(512);
  EEPROM.put(1, SAVE);
  EEPROM.commit();
  EEPROM.end();
}

При вызове функции EEPROM_SAVE() модуль пишет ошибку и перезапускается:

Guru Meditation Error: Core  1 panic'ed (Cache disabled but cached memory region accessed). 

Core  1 register dump:
PC      : 0x40056f64  PS      : 0x00060034  A0      : 0x803792b5  A1      : 0x3fc97ef0  
A2      : 0x3fca9870  A3      : 0x3c0edec0  A4      : 0x0000fa00  A5      : 0x3fca9870  
A6      : 0xbad00bad  A7      : 0xbad00bad  A8      : 0x00000000  A9      : 0x3fca4b04  
A10     : 0x01ffffff  A11     : 0x3fc96bdc  A12     : 0x3fca90e0  A13     : 0x3fca90a0  
A14     : 0x3fc96bfc  A15     : 0x3fca90fc  SAR     : 0x00000004  EXCCAUSE: 0x00000007  
EXCVADDR: 0x00000000  LBEG    : 0x40056f5c  LEND    : 0x40056f72  LCOUNT  : 0x00000f9f  

Backtrace: 0x40056f61:0x3fc97ef0 0x403792b2:0x3fc97f00 0x4037945f:0x3fc97f20 0x4037a332:0x3fc97f40 0x403798f1:0x3fc97f70 0x40041a76:0x3fca9030 0x40376419:0x3fca9050 0x40384ed1:0x3fca9070 0x40385903:0x3fca90a0 0x40384912:0x3fca90e0 0x4037601c:0x3fca9160 0x4200e461:0x3fca91b0 0x42016a01:0x3fca91d0 0x42017021:0x3fca91f0 0x42017355:0x3fca9210 0x42015aae:0x3fca9290 0x42016082:0x3fca9320 0x42016805:0x3fca9390 0x42015583:0x3fca93b0 0x42007485:0x3fca93e0 0x420024cf:0x3fca9410 0x42003846:0x3fca9430 0x4200bba4:0x3fca9470 0x4037df66:0x3fca9490

Первый раз работаю с ESP32 S3, уважаемые форумчане, подскажите в чём дело?

Ого.

И как ты этого добился? У тебя почему-то выключен кэш. Если твоя программа целиком не в кэше, то при попытке ее исполнения, произойдет cache miss, прерывание, затем процессор обратится к SPI0, чтобы вычитать недостающие данные.

Включи Debug Level: Verbose.

Авось что-то прояснится.

Строго говоря, у ESP32S3 нет никакого EEPROM. Там это эмулируется флешом. Регион EEPROM находится в самом начале:

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,

Щас я приеду домой, попробую твой когд скомпилировать и запустить.

Ты хотя бы регистр у переменной поменяй.

2 лайка

Код, который я смогу скомпилировать и запустить пришли пожалуйста.

Тут твою проблему обсуждают, например: Bot Challenge

Код шли.

Я так думаю, ты и язык Си первый раз видишь.

1 лайк

я бы для начала установил стандартную схему патриции ну или 2+2

Вечером с работы приду, добавлю.

А что патриции? “Собрались у Капитолия выпить малость алкоголия”? Или ещё чего?

2 лайка

Собственно спасибо за решение.
У меня стаяла версия ESP32 от Espressif System 3.2.0.
Как я понял дело в прерываниях, для них нужно прописывать IRAM_ATTR вот только, в проекте я не использую прерывания, а в библиотеках IRAM_ATTR прописан для каждого прерывания.
Тогда я обратил внимание на это сообщение:

actually after migrating to esp-idf 3.2 i felt with this issue only ones in a while. the similar code with esp-idf 3.1 i did’t met with this issue.

Поставил версию ESP32 от Espressif System 3.1.0 и всё заработало без проблем.

1 лайк

Шо, даже с этим:

???

А что с этим не так? Попробуйте сами, оно отлично работает, при чем не только в c++;

А сами-то как будете отличать объект от его типа?

Я так привык, для меня это не вызывает ни каких проблем.

Можно так. Просто сопровождать такой код сможет только автор.

Тебя не заменят на работе, если код сможешь сопровождать только ты)

1 лайк

я 2000 пришел в одну контору, так вот там такой же сидел, по каждому пустяку думал по неделям, щеки раздувал и денег просил за каждый чих.
я его “творение” за месяц заново переписал и этого “ученого” выперли взашей))
так что не обольщайся, есть варианты.

2 лайка

Это шутка была, но видать у кого-то триггер)

ааа
шутите вы примерно так же, как и код пишите

2 лайка

Это мой стиль, если я больше ни где не буду использовать эту структуру, то зачем мне её переименовывать?
Если же мне её нужно наплодить, то я уже назову так, например:

SAVE SAVE_HOUSE;
SAVE SAVE_ROOM[10];

это понятно
за венгерскую нотацию господин ничего не слышал?