Последовательный ввод NodeMCU V3 приводит к фатальному исключению 9 (LoadStoreAlignmentCause)

Я создаю простой интерфейс в стиле telnet для экспериментальных настроек своего проекта. Я получаю все последовательные выходные данные, отправленные на последовательный порт (и USB на ПК). Код работает нормально, но если я попытаюсь прочитать из Serial или проверю 'Serial.available()', я получу:

Неустранимая ошибка 9 (LoadStoreAlignmentCause)

Определение: bool pridaj_cely(uint8_t source_from=0, uint8_t line_LCD=0);

Код:

bool Vstup::pridaj_cely(uint8_t source_from, uint8_t line_LCD) {
  uint8_t i = 0;
  Serial.println(F("one piece input read"));
  switch (origin) {
    case 0: { //Serial
        int16_t znak = -1;
        while (Serial.available() < 0) {
          Serial.print(F("."));
          delay(100);
        }
        Serial.print(F("Somothing is comming"));
        while (Serial.available() > 0) {
          celok[i] = Serial.read();
          if (i < 12)  i++;
        }
      }
      break;
  }
  return 1;
}

Кодекс Приожения:

bool pripojenie(bool force_it = 0) {
  Serial.println(("Beginning connection routine"));
  kolo = millis();
  while (!WiFi.isConnected()) {
    int8_t sieti = WiFi.scanComplete();
    Serial.printf("Search result %X", sieti);
    switch (sieti) {
      case -2:
        Serial.println(("\tSearch begins"));
        WiFi.scanNetworks(1);
        delay(50);
        break;
      case -1:
        Serial.print(("."));
        delay(300);
        break;
      default: //This is the relevant case
        Vstup odpoved;
        Serial.ciara;
        Serial.ciara;
        Serial.printf(("Found %X networks"), sieti);
        Serial.ciara;
        Serial.println();
        for (uint8_t i = 0; i < sieti; i++) {
          Serial.printf("%d: %s, Kanál:%d (%ddBm) %s\n", i, WiFi.SSID(i).c_str(), WiFi.channel(i), WiFi.RSSI(i), WiFi.encryptionType(i) == ENC_TYPE_NONE ? "Otvorena" : "");
        }
        Serial.ciara;
        Serial.println(("\nChose network number:"));
        odpoved.pridaj_cely(0);
        // -------------------Never gets past this one-------
        if ((odpoved.Nacislo10() >= 0) && (odpoved.Nacislo10() < sieti)) {
          Serial.printf(("Zadaj heslo pre %s\n"), WiFi.SSID(odpoved.Nacislo10()).c_str());
          String heslo = Serial.readString();
          Serial.print(F("Dostal som "));
          for (uint8_t i = 0; i > heslo.length(); i++) Serial.print(heslo[i]);
          Serial.println();
          Serial.printf(("Vybral som možnosť číslo %d a sieť: "), odpoved.Nacislo10(), WiFi.SSID(odpoved.Nacislo10()).c_str());
          //WiFi.begin(WiFi.SSID(odpoved.Nacislo10()).c_str(), heslo);
        } else Serial.printf(("Nesprávny výber %d"), odpoved.Nacislo10());
    }
  }
}

Я прокомментировал все функции, использующие выводы. Исходный код компилируется без проблем.

Я добавляю результат декодера исключений, так как это не помогло мне решить проблему.

Результаты стека декодирования
0x40202a8d: __yield() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 105
0x40202355: Stream::timedRead() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp строка 37
0x40202392: Stream::readString() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp, строка 240
0x402013b6: pripojenie(bool) в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 315
0x40203411: malloc(size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp строка 95
0x40204548: umm_malloc(size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp строка 1685
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296
0x4020141c: pripojenie_samo(unsigned char) в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 327
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296
0x40204bb1: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/ xtensa-lx106-elf/include/С++/4.8.2/функциональная строка 2073
0x4020197c: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include /С++/4.8.2/функциональная строка 2300
0x4020e5b8: sys_check_timeouts в строке core/timeouts.c 368
0x40202957: loop_task(ETSEvent*) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 133
0x4020ac9a: __ssputs_r в /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c строка 233
0x40206938: _printf_i в /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf_i.c строка 194
0x4020ac9a: __ssputs_r в /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c строка 233
0x402034b4: malloc_loc(size_t, char const*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp строка 126
0x40204548: umm_malloc(size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp строка 1685
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296
0x40204738: umm_realloc(void*, size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp строка 1745
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296
0x4020299c: esp_yield() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 91
0x40202f53: задержка (длинный без знака) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp строка 54
0x40201a89: ESP8266WiFiScanClass::scanNetworks(bool, bool, unsigned char, unsigned char*) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 98
0x40203942: uart_write(uart_t*, char const*, size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/uart.cpp строка 498
0x4020299c: esp_yield() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 91
0x40202f53: задержка (длинный без знака) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp строка 54
0x402015fd: loop() в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 460
0x40201410: pripojenie_samo(unsigned char) в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 325
0x40204bb8: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106- elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/С++/4.8.2/функциональная строка 1934
0x40204ba4: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/ xtensa-lx106-elf/include/С++/4.8.2/функциональная строка 2069
0x40201e50: HardwareSerial::setDebugOutput(bool) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/HardwareSerial.cpp строка 79
0x40202a4c: loop_wrapper() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 125

строка 325 является функцией-оболочкой, поскольку асинхронное сканирование может вызывать только функцию void определенного типа и вызывает pripojenie_samo(uint8_t бессмысленно)

Серийный вывод: (после перевода на английский язык)


Decoding stack results
0x40202a8d: __yield() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 105
0x40202355: Stream::timedRead() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp line 37
0x40202392: Stream::readString() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp line 240
0x402013b6: pripojenie(bool) at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 315
0x40203411: malloc(size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp line 95
0x40204548: umm_malloc(size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp line 1685
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x4020141c: pripojenie_samo(unsigned char) at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 327
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x40204bb1: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073
0x4020197c: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 2300
0x4020e5b8: sys_check_timeouts at core/timeouts.c line 368
0x40202957: loop_task(ETSEvent*) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 133
0x4020ac9a: __ssputs_r at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c line 233
0x40206938: _printf_i at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf_i.c line 194
0x4020ac9a: __ssputs_r at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c line 233
0x402034b4: malloc_loc(size_t, char const*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp line 126
0x40204548: umm_malloc(size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp line 1685
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x40204738: umm_realloc(void*, size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp line 1745
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x4020299c: esp_yield() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 91
0x40202f53: delay(unsigned long) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp line 54
0x40201a89: ESP8266WiFiScanClass::scanNetworks(bool, bool, unsigned char, unsigned char*) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 98
0x40203942: uart_write(uart_t*, char const*, size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/uart.cpp line 498
0x4020299c: esp_yield() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 91
0x40202f53: delay(unsigned long) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp line 54
0x402015fd: loop() at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 460
0x40201410: pripojenie_samo(unsigned char) at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 325
0x40204bb8: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 1934
0x40204ba4: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 2069
0x40201e50: HardwareSerial::setDebugOutput(bool) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/HardwareSerial.cpp line 79
0x40202a4c: loop_wrapper() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 125

ets 8 января 2013, первая причина: 2, режим загрузки: (3,6)

загрузка 0x4010f000, длина 1384, комната 16
хвост 8
контрольная сумма 0x2d
сумма 0x2d
v8b899c12
~лд

SDK:2.2.1(cfd48f3)/Core:2.5.2=20502000/lwIP:STABLE-2_1_2_RELEASE/клей:1.1-7-g82abda3/BearSSL:a143020

, 👍-1

Обсуждение

декодировать дамп стека исключения. https://github.com/me-no-dev/EspExceptionDecoder, @Juraj

Добавлено, но я не вижу соответствующей информации, просто разочарован тем, что чип содержит полные пути если я закомментирую все Serial-available() и Serial .read(), остальная часть кода будет работать, @Tomas

пути находятся в файле на вашем компьютере. декодирование берет отладочную информацию из файлов, созданных при сборке, но не загруженных в MCU., @Juraj

Спасибо, но проблема осталась, @Tomas

сборка для декодирования совпадала с кодом, который вылетел? дамп стека указывает на сбой в pripojenie(bool), @Juraj

pripojenie создает экземпляр класса Vstup (а затем вызывает pridaj_cely для этого экземпляра, которому удается сообщить «прочитанный ввод одной части» в последовательный порт, а затем сбрасывается, как указано выше. То же самое происходит, если код достигает Serial.available() или Serial.read() в других функциях., @Tomas

Я перевел и добавил функцию приположения, в данном случае она вызывается из асинхронного сканирования, @Tomas


1 ответ


Лучший ответ:

1

Я понял это Кажется, существуют понятные ограничения, если какая функция может быть запущена в результате асинхронного сканирования (которое, похоже, не прерывает выполнение циклической функции) Поэтому, если я использовал delay(x) или цикл while до тех пор, пока не будет введен ввод по последовательному порту, MCU сбрасывается по истечении отведенного времени. Я переписал код для запуска функции из цикла после завершения сканирования, и теперь все работает нормально. Я предполагаю, что Arduino не подходит для параллельного программирования

,