Сбой кода SPIFSS после добавления несвязанного кода

Я сталкиваюсь со странным поведением. Я использую ESP8266 Arduino SPIFFS для хранения настроек конфигурации. Вот соответствующая часть mycode;

void loop()
{
      handleUartRxOk();
}

void handleUartRxOk() {
    String cmd;

    char charBuff[3200];
    char char_print[50];
    static bool terminatorReceived = false;

    char incomingChar = 0;   // for incoming serial data

    if (Serial.available()) {
        incomingChar = Serial.read();
        saveChar(incomingChar);

        if (incomingChar == '\r') {
            terminatorReceived = true;
        }

        if (terminatorReceived) {
            buffer[buffer_index - 1] = '\0';
            cmd = String(buffer);
            if (cmd == "XXX") {
                ConfigSettings.ssid = "SSID_XX";
                ConfigSettings.password = "PASSWORD_XX";
                saveConfig();
            } 

            buffer_index = 0;
            terminatorReceived = false;
        }
    }
}

В приведенном выше коде UART получит команду "XXX\r", затем запустит saveConfig(), которая сохранит параметры конфигурации ssid и параметры в SPIFSS. Этот код работает отлично, пока я не добавлю больше кода, который совершенно не связан.

Вот так выглядит новый код.

void handleUartRxOk() {
    String cmd;

    char charBuff[3200];
    char char_print[50];
    static bool terminatorReceived = false;

    char incomingChar = 0;   // for incoming serial data

    if (Serial.available()) {
        incomingChar = Serial.read();
        saveChar(incomingChar);

        if (incomingChar == '\r') {
            terminatorReceived = true;
        }

        if (terminatorReceived) {
            buffer[buffer_index - 1] = '\0';
            cmd = String(buffer);
            if (cmd == "XXX") {
                ConfigSettings.ssid = "SSID_XX";
                ConfigSettings.password = "PASSWORD_XX";
                saveConfig();
            } 

            //Why does adding this else statement cause saveConfig() to crash when run?
            else {
                    strcat(charBuff, cmd.c_str());
                }   

            buffer_index = 0;
            terminatorReceived = false;
        }
    }
}

После добавления дополнительного предложения else отправка "XXX \ r" в UARt и вызов saveConfig() приведут к ошибке исключения. Это озадачивает, так как новый код даже не запускается.

Ошибка исключения, как показано ниже;

Exception (3):

epc1=0x401002f0 epc2=0x00000000 epc3=0x00000000 excvaddr=0x400072f6 depc=0x00000
000

ctx: sys 

sp: 3fff06b0 end: 3fffffb0 offset: 01a0

1 ответ

Декларировать char charBuff[3200]; как глобальный, а не внутри функции. Arduino ESP8266 имеет размер стека по умолчанию около 4k. Ваш размер массива рискует переполнением. Попробуйте и посмотрите, работает ли это. Я сталкивался с подобной проблемой раньше. Это сработало для меня.

Размер стека по умолчанию можно увеличить в пределах памяти, изменив cont.h в cores/esp8266/

РЕДАКТИРОВАТЬ: Информация об изменении размера стека по умолчанию была предоставлена ​​Дэниелом Миньоном в комментариях.

Другие вопросы по тегам