【问题标题】:SPIFSS code crashes after adding unrelated code添加无关代码后,SPIFSS 代码崩溃
【发布时间】:2017-02-06 02:02:58
【问题描述】:

我遇到了一个奇怪的行为。我正在使用 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子句后,向UART发送“XXX\r”并导致saveConfig()会导致异常错误。这令人费解,因为新代码甚至都没有运行。

异常错误如下;

Exception (3):

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

ctx: sys 

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

【问题讨论】:

  • 谁在这里增加buffer_index?
  • 未在相关代码中显示。在别处实施。
  • 将 charBuff 定义为 arduino 字符串,并对 cat 使用运算符重载:charBuff += cmd。您的代码有几个不安全的部分,所以请使用上层 api。

标签: arduino filesystems esp8266 arduino-esp8266 spiffs


【解决方案1】:

将char charBuff[3200]; 声明为全局而非函数内部。 Arduino ESP8266 的默认堆栈大小约为 4k。您的数组大小有溢出的风险。试试看它是否有效。我以前遇到过类似的问题。它对我有用。

可以通过修改 cores/esp8266/ 下的 cont.h 在内存限制内提高默认堆栈大小

编辑:Daniel Minion 在 cmets 中提供了有关修改默认堆栈大小的信息。

【讨论】:

  • 堆栈大小不是 4K 的最大值,而是默认大小。您可以通过修改 cores/esp8266/
猜你喜欢
  • 2018-06-18
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多