2016-09-28 2 views
0

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

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 \ г», а затем запустить 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; 
     } 
    } 
} 

После добавления дополнительного другое положения, посылая «XXX \ г» к УАППАМ и вызывая Saveconfig() вызовет ошибку исключения. Это вызывает недоумение, поскольку новый код даже не запускался.

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

Exception (3): 

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

ctx: sys 

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

Кто увеличивает здесь buffer_index? – cagdas

+0

Не отображается в коде. Реализовано в других местах. – user781486

+0

Определите charBuff как строку arduino и используйте перегрузку оператора cat: charBuff + = cmd. В вашем коде есть несколько небезопасных частей, поэтому используйте api верхнего уровня. – cagdas

ответ

2

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

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

EDIT: Информация о модификации размера стека по умолчанию был предоставлен Daniel Minion в комментарии.

+1

Подтвержден правильный ответ. Он работает сейчас. – user781486

+2

Размер стека не равен _maximum_ 4K, это размер по умолчанию. Вы можете увеличить его до максимума (в пределах объема памяти, конечно), изменяя cont.h в ядрах/esp8266 / –

Смежные вопросы