Search code examples
c++arduinoembeddedesp32

Program crashes when receiving data from eeprom


My program crashes every time when I try to run the code in this link. The problem seems to be in this line *((char*)&configuration + i) = (char)EEPROM.read(i);. I think there is no need to allocate memory for variable configuration since the variable configuration is already initialized.

int loadconfig() { 

  if(EEPROM.read(0) == config_ver[0] && EEPROM.read(1) == config_ver[1] &&
    EEPROM.read(2) == config_ver[2] && EEPROM.read(3) == config_ver[3]) {

    for(int i = 0; i <= sizeof(configuration_type); i++) {

      *((char*)&configuration + i) = (char)EEPROM.read(i);     //<------problem
    }
    return 1;
  }
  return 0;
} 

Whole code from the link:

#include <EEPROM.h>

#define CONFIG_VERSION "VER01"

// Where in EEPROM?
#define CONFIG_START 32

typedef struct
{
  char version[6]; // detect if setting actually are written
  int my_setting_integer;
} configuration_type;

// with DEFAULT values!
configuration_type CONFIGURATION = {
  CONFIG_VERSION,
  42
};

// load whats in EEPROM in to the local CONFIGURATION if it is a valid setting
int loadConfig() {
  // is it correct?
  if (EEPROM.read(CONFIG_START + 0) == CONFIG_VERSION[0] &&
      EEPROM.read(CONFIG_START + 1) == CONFIG_VERSION[1] &&
      EEPROM.read(CONFIG_START + 2) == CONFIG_VERSION[2] &&
      EEPROM.read(CONFIG_START + 3) == CONFIG_VERSION[3] &&
      EEPROM.read(CONFIG_START + 4) == CONFIG_VERSION[4]){

  // load (overwrite) the local configuration struct
    for (unsigned int i=0; i<sizeof(CONFIGURATION); i++){
      *((char*)&CONFIGURATION + i) = EEPROM.read(CONFIG_START + i);
    }
    return 1; // return 1 if config loaded 
  }
  return 0; // return 0 if config NOT loaded
}

// save the CONFIGURATION in to EEPROM
void saveConfig() {
  for (unsigned int i=0; i<sizeof(CONFIGURATION); i++)
    EEPROM.write(CONFIG_START + i, *((char*)&CONFIGURATION + i));
}

void setup() {
  Serial.begin(9600);
  Serial.println("Hello world!");  // prints hello with ending line break 

  if(loadConfig()){
    Serial.println("Config loaded:");
    Serial.println(CONFIGURATION.version);
    Serial.println(CONFIGURATION.my_setting_integer);
  }else{
    Serial.println("Config not loaded!");
    saveConfig(); // overwrite with the default settings
  }
}

void loop() {
  //every 5s increment and save the settings!
  delay(5000);
  CONFIGURATION.my_setting_integer++;
  saveConfig();
}

Solution

  • It is the "<=" in the for loop.

    Change it to "<" and try again.

    Hint: Typical Buffer Overflow problem