2016-09-28 7 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の\ rを」受け取る次いでsaveconfigのを(実行)SPIFSSに設定パラメータSSIDやパラメータが保存されているであろう。このコードは、まったく関係のないコードを追加するまでは問題なく動作します。

これは新しいコードの外観です。 、追加のelse節を追加するUARTに "XXXの\ rを" 送信してsaveconfigのを引き起こした後

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; 
     } 
    } 
} 

は()例外エラーが発生します。新しいコードが実行されていないので、これは困惑しています。

例外エラーは次のとおりです。

Exception (3): 

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

ctx: sys 

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

ここでwhoはbuffer_indexをインクリメントしますか? – cagdas

+0

問題のコードには示されていません。他の場所で実装されています。 – user781486

+0

arduino文字列としてcharBuffを定義し、cat:charBuff + = cmdに演算子オーバーロードを使用します。コードにはいくつかの安全でない部分がありますので、上位レベルのAPIを使用してください。 – cagdas

答えて

2

char charBuff[3200];はグローバルであり、関数内には存在しません。 Arduino ESP8266のデフォルトスタックサイズは約4kです。配列のサイズがオーバーフローの危険性があります。それを試して、それが動作するかどうかを確認します。私は前に同様の問題に遭遇しました。それは私のために働いた。

デフォルトのスタックサイズは、コア/ esp8266/

EDIT下cont.hを変更することで、メモリの制限内で上昇させることができる:デフォルトのスタックサイズの変更に関する情報はコメントでダニエル・ミニオンによって提供されました。

+1

正しい答えであることが確認されました。それは今働く。 – user781486

+2

スタックサイズは4Kの最大値ではなく、デフォルトサイズです。あなたは、coreres/esp8266 /の下でcont.hを修正することによって、あなたが望むように(メモリ制限内で) –

関連する問題