gmag11 / QuickESPNow

Wrapper for easy use of ESP-NOW on ESP32 and ESP8266
MIT License
82 stars 19 forks source link

Soft WDT reset #8

Closed blazoncek closed 5 months ago

blazoncek commented 9 months ago

First off, thank you for a very versatile library. It makes handling ESP-NOW very easy.

Unfortunately I am seeing "Soft WDT reset" on my ESP8266 installations when sending packets while connected to WiFi network.

My initialisation looks like this:

  if (enableESPNow) {
    quickEspNow.onDataRcvd(espNowReceiveCB);
    bool espNowOK;
    if (apActive) {
      DEBUG_PRINTLN(F("ESP-NOW initing in AP mode."));
      #ifdef ESP32
      quickEspNow.setWiFiBandwidth(WIFI_IF_AP, WIFI_BW_HT20); // Only needed for ESP32 in case you need coexistence with ESP8266 in the same network
      #endif //ESP32
      espNowOK = quickEspNow.begin(apChannel, WIFI_IF_AP);  // Same channel must be used for both AP and ESP-NOW
    } else {
      DEBUG_PRINTLN(F("ESP-NOW initing in STA mode."));
      espNowOK = quickEspNow.begin(); // Use no parameters to start ESP-NOW on same channel as WiFi, in STA mode
    }
    statusESPNow = espNowOK ? ESP_NOW_STATE_ON : ESP_NOW_STATE_ERROR;
  }

And for sending packets:

typedef struct PartialEspNowPacket {
  uint8_t magic;
  uint8_t packet;
  uint8_t segs;
  uint8_t data[247];
} partial_packet_t;

...

  if (enableESPNow && useESPNowSync && statusESPNow == ESP_NOW_STATE_ON) {
    partial_packet_t buffer = {'W', 0, (uint8_t)s, {0}};
    // send global data
    DEBUG_PRINTLN(F("ESP-NOW sending first packet.")); 
    memcpy(buffer.data, udpOut, 41);
    auto err = quickEspNow.send(ESPNOW_BROADCAST_ADDRESS, reinterpret_cast<const uint8_t*>(&buffer), 41+3);
    if (!err) {
      // send segment data
      buffer.packet++;
      size_t packetSize = 0;
      int32_t err = 0;
      for (size_t i = 0; i < s; i++) {
        memcpy(buffer.data + packetSize, &udpOut[41+i*UDP_SEG_SIZE], UDP_SEG_SIZE);
        packetSize += UDP_SEG_SIZE;
        if (packetSize + UDP_SEG_SIZE < sizeof(buffer.data)/sizeof(uint8_t)) continue;
        DEBUG_PRINTF("ESP-NOW sending packet: %d (%d)\n", (int)buffer.packet, packetSize+3);
        err = quickEspNow.send(ESPNOW_BROADCAST_ADDRESS, reinterpret_cast<const uint8_t*>(&buffer), packetSize+3);
        buffer.packet++;
        packetSize = 0;
        if (err) break;
      }
      if (!err && packetSize > 0) {
        DEBUG_PRINTF("ESP-NOW sending last packet: %d (%d)\n", (int)buffer.packet, packetSize+3);
        err = quickEspNow.send(ESPNOW_BROADCAST_ADDRESS, reinterpret_cast<const uint8_t*>(&buffer), packetSize+3);
      }
      if (err) {
        DEBUG_PRINTLN(F("ESP-NOW sending packet failed."));
      }
    }
  }

The snippet above deals with oversized packets and works well on ESP32 (also tested on ESP32-C3, but for some reason QuickEspNow will not work at all on ESP32-S2 but that is for another issue). The code above finishes/completes without issue on ESP8266 but a few seconds after it is executed soft watchdog triggers a reset.

I managed to dump crash log using exception decoder and it is attached below. Apparently espnowTxHandle() stalls somewhere.

Do you have any idea what might be wrong?

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

Exception (4):
epc1=0x40100e08 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

Level1Interrupt: Level-1 interrupt as indicated by set level-1 bits in the INTERRUPT register
  epc1=0x40100e08 in ets_intr_unlock at ??:?

>>>stack>>>

ctx: sys
sp: 3fffed70 end: 3fffffb0 offset: 0160
3fffeed0:  40267123 0000a916 0000a916 40267123  
3fffeee0:  00000000 0000a916 0083126e 00c38170  
3fffeef0:  00000033 3fff799c 3fff4492 00000000  
3fffef00:  3fff3268 0000a916 00000001 40267f88  
3fffef10:  000002b9 3fff3228 3fff4598 4025bc5d  
3fffef20:  402a5d40 3fff323c 3ffefd30 60000600  
3fffef30:  027879c4 3ffefd30 3fff323c 402a5d4d  
3fffef40:  402a5d92 3fffdab0 00000000 3fffdcb0  
3fffef50:  3ffefd48 3fffdab0 00000000 402a5993  
3fffef60:  40000f49 40000f49 3fffdab0 40000f49  
3fffef70:  40000e19 000d9ff3 bff00000 0000bfff  
3fffef80:  00000005 aa55aa55 000000ed 401067b1  
3fffef90:  401067b7 bff00000 0000bfff 67694400  
3fffefa0:  4010000d bff00000 000d9ff3 401000ab  
3fffefb0:  40296078 3fffef4c 40296029 3ffffef8  
3fffefc0:  3fffffd0 00000000 00000000 feefeffe  
3fffefd0:  feefeffe feefeffe feefeffe feefeffe  
3fffefe0:  feefeffe feefeffe feefeffe feefeffe  
3fffeff0:  feefeffe feefeffe feefeffe feefeffe  
3ffff000:  feefeffe feefeffe feefeffe feefeffe  
3ffff010:  feefeffe feefeffe feefeffe feefeffe  
3ffff020:  feefeffe feefeffe feefeffe feefeffe  
3ffff030:  feefeffe feefeffe feefeffe feefeffe  
3ffff040:  feefeffe feefeffe feefeffe feefeffe  
3ffff050:  feefeffe feefeffe feefeffe feefeffe  
3ffff060:  feefeffe feefeffe feefeffe feefeffe  
3ffff070:  feefeffe feefeffe feefeffe feefeffe  
3ffff080:  feefeffe feefeffe feefeffe feefeffe  
3ffff090:  feefeffe feefeffe feefeffe feefeffe  
3ffff0a0:  feefeffe feefeffe feefeffe feefeffe  
3ffff0b0:  feefeffe feefeffe feefeffe feefeffe  
3ffff0c0:  feefeffe feefeffe feefeffe feefeffe  
3ffff0d0:  feefeffe feefeffe feefeffe feefeffe  
3ffff0e0:  feefeffe feefeffe feefeffe feefeffe  
3ffff0f0:  feefeffe feefeffe feefeffe feefeffe  
3ffff100:  feefeffe feefeffe feefeffe feefeffe  
3ffff110:  feefeffe feefeffe feefeffe feefeffe  
3ffff120:  feefeffe feefeffe feefeffe feefeffe  
3ffff130:  feefeffe feefeffe feefeffe feefeffe  
3ffff140:  feefeffe feefeffe feefeffe feefeffe  
3ffff150:  feefeffe feefeffe feefeffe feefeffe  
3ffff160:  feefeffe feefeffe feefeffe feefeffe  
3ffff170:  feefeffe feefeffe feefeffe feefeffe  
3ffff180:  feefeffe feefeffe feefeffe feefeffe  
3ffff190:  feefeffe feefeffe feefeffe feefeffe  
3ffff1a0:  feefeffe feefeffe feefeffe feefeffe  
3ffff1b0:  feefeffe feefeffe feefeffe feefeffe  
3ffff1c0:  feefeffe feefeffe feefeffe feefeffe  
3ffff1d0:  feefeffe feefeffe feefeffe feefeffe  
3ffff1e0:  feefeffe feefeffe feefeffe feefeffe  
3ffff1f0:  feefeffe feefeffe feefeffe feefeffe  
3ffff200:  feefeffe feefeffe feefeffe feefeffe  
3ffff210:  feefeffe feefeffe feefeffe feefeffe  
3ffff220:  feefeffe feefeffe feefeffe feefeffe  
3ffff230:  feefeffe feefeffe feefeffe feefeffe  
3ffff240:  feefeffe feefeffe feefeffe feefeffe  
3ffff250:  feefeffe feefeffe feefeffe feefeffe  
3ffff260:  feefeffe feefeffe feefeffe feefeffe  
3ffff270:  feefeffe feefeffe feefeffe feefeffe  
3ffff280:  feefeffe feefeffe feefeffe feefeffe  
3ffff290:  feefeffe feefeffe feefeffe feefeffe  
3ffff2a0:  feefeffe feefeffe feefeffe feefeffe  
3ffff2b0:  feefeffe feefeffe feefeffe feefeffe  
3ffff2c0:  feefeffe feefeffe feefeffe feefeffe  
3ffff2d0:  feefeffe feefeffe feefeffe feefeffe  
3ffff2e0:  feefeffe feefeffe feefeffe feefeffe  
3ffff2f0:  feefeffe feefeffe feefeffe feefeffe  
3ffff300:  feefeffe feefeffe feefeffe feefeffe  
3ffff310:  feefeffe feefeffe feefeffe feefeffe  
3ffff320:  feefeffe feefeffe feefeffe feefeffe  
3ffff330:  feefeffe feefeffe feefeffe feefeffe  
3ffff340:  feefeffe feefeffe feefeffe feefeffe  
3ffff350:  feefeffe feefeffe feefeffe feefeffe  
3ffff360:  feefeffe feefeffe feefeffe feefeffe  
3ffff370:  feefeffe feefeffe feefeffe feefeffe  
3ffff380:  feefeffe feefeffe feefeffe feefeffe  
3ffff390:  feefeffe feefeffe feefeffe feefeffe  
3ffff3a0:  feefeffe feefeffe feefeffe feefeffe  
3ffff3b0:  feefeffe feefeffe feefeffe feefeffe  
3ffff3c0:  feefeffe feefeffe feefeffe feefeffe  
3ffff3d0:  feefeffe feefeffe feefeffe feefeffe  
3ffff3e0:  feefeffe feefeffe feefeffe feefeffe  
3ffff3f0:  feefeffe feefeffe feefeffe feefeffe  
3ffff400:  feefeffe feefeffe feefeffe feefeffe  
3ffff410:  feefeffe feefeffe feefeffe feefeffe  
3ffff420:  feefeffe feefeffe feefeffe feefeffe  
3ffff430:  feefeffe feefeffe feefeffe feefeffe  
3ffff440:  00000000 400042db feefeffe feefeffe  
3ffff450:  40004b31 3fff544c 00000040 003bc040  
3ffff460:  40107b04 feefeffe feefeffe feefeffe  
3ffff470:  40263138 00000000 00000040 003bc040  
3ffff480:  feefeffe feefeffe 3fff544c 402631c5  
3ffff490:  feefeffe feefeffe feefeffe feefeffe  
3ffff4a0:  feefeffe feefeffe feefeffe feefeffe  
3ffff4b0:  feefeffe feefeffe feefeffe feefeffe  
3ffff4c0:  00000000 400042db feefeffe feefeffe  
3ffff4d0:  40004b31 3fff544c 00000040 003bd740  
3ffff4e0:  40107b04 feefeffe feefeffe feefeffe  
3ffff4f0:  40263138 00000000 00000040 003bd740  
3ffff500:  feefeffe feefeffe 3fff544c 402631c5  
3ffff510:  feefeffe feefeffe feefeffe feefeffe  
3ffff520:  feefeffe feefeffe feefeffe feefeffe  
3ffff530:  feefeffe feefeffe feefeffe feefeffe  
3ffff540:  feefeffe feefeffe feefeffe feefeffe  
3ffff550:  feefeffe feefeffe feefeffe feefeffe  
3ffff560:  feefeffe feefeffe feefeffe feefeffe  
3ffff570:  feefeffe feefeffe feefeffe feefeffe  
3ffff580:  feefeffe feefeffe feefeffe feefeffe  
3ffff590:  00000040 00000000 0000000a 00000000  
3ffff5a0:  00000000 00000000 0000000a 00000000  
3ffff5b0:  00000040 3fff544c 003bc040 40268664  
3ffff5c0:  3fff4afc 00000008 00000078 40253902  
3ffff5d0:  00000000 feefeffe 00000000 402012a5  
3ffff5e0:  0000005e 402538e4 3fff4afc 00000008  
3ffff5f0:  00000007 00000040 000000c3 00000008  
3ffff600:  3fff4b74 feefeffe 40276c81 3ffe83c4  
3ffff610:  00000040 00000000 3ffff750 0000005e  
3ffff620:  00000008 00000000 3ffff640 00000000  
3ffff630:  00000040 3fff544c 003bd740 40268664  
3ffff640:  3fff4afc 00000004 00001740 40253902  
3ffff650:  3fff4afc 3fff4afc 00000008 402012a5  
3ffff660:  0000005e 402538e4 3fff4afc 00002000  
3ffff670:  00001fff 00001740 0000377f 00000004  
3ffff680:  3fff4b74 3ffff750 00000008 4020215e  
3ffff690:  00000008 3ffe83c4 3ffff750 3fff4afc  
3ffff6a0:  8010140c 3ffff7a0 8010140c 40201886  
3ffff6b0:  3ffff6dc 00000004 fe302064 feefeffe  
3ffff6c0:  c498f922 00000098 ffffffff ffffffff  
3ffff6d0:  0000001f 0000001e aff003cf 00000000  
3ffff6e0:  00001740 aff003cf 00000008 00000004  
3ffff6f0:  00000001 00000002 00000000 78000000  
3ffff700:  00000000 00000000 0000000d 00000000  
3ffff710:  00000000 3ffff6d8 500ffc30 00000001  
3ffff720:  00000005 feefeffe feefeffe 3fff4afc  
3ffff730:  0000000d 3ffff7a0 3ffffec9 40201bda  
3ffff740:  40202134 3ffff750 3fff2c48 4027706c  
3ffff750:  3fff4afc 3ffffec9 0000000d ffff0208  
3ffff760:  3ffffed6 00000000 3ffff7c0 3ffff7b8  
3ffff770:  feefeffe 00000001 3ffffed6 002ffc00  
3ffff780:  feefeffe feefeffe feefeffe 3fff5684  
3ffff790:  3fff2c48 3ffff7e0 3fff4afc 40204acb  
3ffff7a0:  0000005e 0000002a 0000001f 00001740  
3ffff7b0:  500ffc30 00010008 ffffffff ffffffff  
3ffff7c0:  3ffffec9 feefeffe feefeffe feefeffe  
3ffff7d0:  feefeffe 00000001 00000000 40253660  
3ffff7e0:  3ffff800 3ffff7f0 00000008 feefeffe  
3ffff7f0:  feefeffe feefeffe 00000000 00000000  
3ffff800:  3ffffef0 0000007f feefeffe feefeffe  
3ffff810:  feefeffe 3fff34e4 3fff2c48 40223002  
3ffff820:  feefeffe feefeffe feefeffe feefeffe  
3ffff830:  3ffff850 3ffff850 3ffffe50 3ffffe50  
3ffff840:  feefef00 feefeffe feefeffe feefef00  
3ffff850:  feefeffe feefeffe feefeffe feefeffe  
3ffff860:  feefeffe feefeffe feefeffe feefeffe  
3ffff870:  feefeffe feefeffe feefeffe feefeffe  
3ffff880:  feefeffe feefeffe feefeffe feefeffe  
3ffff890:  feefeffe feefeffe feefeffe feefeffe  
3ffff8a0:  feefeffe feefeffe feefeffe feefeffe  
3ffff8b0:  feefeffe feefeffe feefeffe feefeffe  
3ffff8c0:  feefeffe feefeffe feefeffe feefeffe  
3ffff8d0:  feefeffe feefeffe feefeffe feefeffe  
3ffff8e0:  feefeffe feefeffe feefeffe feefeffe  
3ffff8f0:  feefeffe feefeffe feefeffe feefeffe  
3ffff900:  feefeffe feefeffe feefeffe feefeffe  
3ffff910:  feefeffe feefeffe feefeffe feefeffe  
3ffff920:  00000000 00000000 0000001f 40100e30  
3ffff930:  feefeffe feefeffe 3fffc228 40106f49  
3ffff940:  4000050c feefeffe feefeffe feefeffe  
3ffff950:  00000005 00000000 00000020 40100e30  
3ffff960:  40260aa0 0000000c 00000005 4010341c  
3ffff970:  3ffeab65 401066b3 3ffee578 0000006c  
3ffff980:  40103fa7 3ffee578 000000ff 3ffffee0  
3ffff990:  0000006c 01d77d4e 3ffeeefc 40104184  
3ffff9a0:  3ffeb410 00000000 00000000 00000000  
3ffff9b0:  0000006c 01d77d4e 4010463e 00000100  
3ffff9c0:  3ffeb410 7fffffff 00002200 00000001  
3ffff9d0:  00000001 00000080 0000000a 00000000  
3ffff9e0:  00000000 00000000 0000001f 40100e30  
3ffff9f0:  3ffeb41c 2c9f0300 3fffc228 40106f49  
3ffffa00:  4000050c 3fffc200 00000022 3ffe83c4  
3ffffa10:  40241b14 00000030 00000010 ffffffff  
3ffffa20:  40241bd9 000000ff 0000000b 3fff307d  
3ffffa30:  00004bc6 00000000 000003e8 fffffffe  
3ffffa40:  000003b0 3fffc6fc 00000000 3fff2fdf  
3ffffa50:  00000000 00000000 3ffe87dc 00000030  
3ffffa60:  3fff6f14 3ffffee0 3ffffa80 4026090a  
3ffffa70:  3fff6f14 00000000 3fff33c4 40260ac4  
3ffffa80:  74685f05 5f047074 05706374 61636f6c  
3ffffa90:  0000006c 00000000 00000000 00000000  
3ffffaa0:  00000000 00000000 00000000 00000000  
3ffffab0:  00000000 00000000 00000000 00000000  
3ffffac0:  00000000 00000000 00000000 00000000  
3ffffad0:  00000000 00000000 00000000 00000000  
3ffffae0:  00000000 00000000 00000000 00000000  
3ffffaf0:  00000000 00000000 00000000 00000000  
3ffffb00:  3ffffb41 00000000 00000000 00000000  
3ffffb10:  00000000 00000000 00000000 3ffffee0  
3ffffb20:  00000000 00000001 00000001 40260605  
3ffffb30:  3fff6f14 00000000 3ffffee0 40260632  
3ffffb40:  00000052 00000000 00000000 00000000  
3ffffb50:  00000000 00000000 00000000 4026074a  
3ffffb60:  00000000 00000000 3fff33c4 40260a79  
3ffffb70:  00000000 00000000 00000000 00000000  
3ffffb80:  000005e0 00000000 401054b9 3ffeece0  
3ffffb90:  0000003c 00000000 00000000 000000fe  
3ffffba0:  0000001c 00000001 40106601 3ffeece0  
3ffffbb0:  3ffeecb0 00000000 00000000 3ffee950  
3ffffbc0:  401055ab 00040000 00000000 00040000  
3ffffbd0:  53002200 401055a8 00040000 0000007f  
3ffffbe0:  3ffeed28 4010450f 3ffeece0 40101bd4  
3ffffbf0:  3ffffc31 00000000 0000005a 4027ba05  
3ffffc00:  401060e9 2c9f0300 4000050c 3fffc278  
3ffffc10:  40104360 3fffc200 00000022 00000000  
3ffffc20:  00000001 00000000 0000000a 00000000  
3ffffc30:  00000001 00000000 0000000a 00000000  
3ffffc40:  40275d7c 3ffffdd0 00000017 3fffff50  
3ffffc50:  00000000 a0000000 00000000 0000001c  
3ffffc60:  00001000 00000000 00001000 3ffe83c4  
3ffffc70:  00000000 00000000 3ffffde0 40275e40  
3ffffc80:  3ffffd70 3ffffd73 00000000 3ffe97e8  
3ffffc90:  00000000 a0000000 40276c81 3ffe83c4  
3ffffca0:  00000003 00000000 3ffffde0 40275e40  
3ffffcb0:  00000005 00000000 00000020 40100e30  
3ffffcc0:  00000005 00000000 00000005 4010341c  
3ffffcd0:  3ffeab65 401066b3 3ffee578 4010341c  
3ffffce0:  40103fa7 3ffee578 3ffee578 00000001  
3ffffcf0:  0000006c 026d625b 3ffeeefc 40104184  
3ffffd00:  3ffeb404 00000000 00000000 40104184  
3ffffd10:  0000006c 026d625b 4010463e 00000100  
3ffffd20:  3ffeb404 7fffffff 00002200 00000001  
3ffffd30:  00000001 00000080 00002200 00000001  
3ffffd40:  3ffeb404 00000000 0000001f 026d625b  
3ffffd50:  3ffeb410 2c9f0300 4000050c 3fffc278  
3ffffd60:  40104360 3fffc200 00000022 4010341c  
3ffffd70:  00000005 00000000 00000020 40100e30  
3ffffd80:  00000005 00000000 00000005 4010341c  
3ffffd90:  3ffeab65 401066b3 3ffee578 4010341c  
3ffffda0:  40103fa7 3ffee578 3ffee578 ffffffff  
3ffffdb0:  00000000 00000000 0000001f 40100e30  
3ffffdc0:  3ffeb41c 00000000 3fffc228 40106f49  
3ffffdd0:  4000050c 0276c0ab 4010463e 00000100  
3ffffde0:  402447fc 00000030 00000020 ffffffff  
3ffffdf0:  00000000 00000000 0000001f 40100e30  
3ffffe00:  3fff03a9 00000000 3fffc228 40106f49  
3ffffe10:  4000050c 3fffc6fc 00000000 00000000  
3ffffe20:  4023b16f 00000030 00000010 ffffffff  
3ffffe30:  402483b1 3fff3594 8abb490e 40296029  
3ffffe40:  00000000 00000000 00000000 fffffffe  
3ffffe50:  40264e88 3fffc6fc 00000001 0000a1dc  
3ffffe60:  00000000 3fffdad0 3fff36f8 00000030  
3ffffe70:  4025247c 3ffffea0 00000000 ffffffff  
3ffffe80:  8a46a8c0 00ffffff fe46a8c0 3fff2de0  
3ffffe90:  00000000 3ffffec0 3ffffec0 4023f68c  
3ffffea0:  402705fc 8a46a8c0 402705fc 8a46a8c0  
3ffffeb0:  00000000 0000a1e1 153f7ced 00bb2c40  
3ffffec0:  40106e09 00c56cd0 40267012 3fff53e4  
3ffffed0:  40106eb6 3fff323c 00c56cd0 00000000  
3ffffee0:  4010708d 00c56cd0 3fff36d0 00000000  
3ffffef0:  3ffefd30 3fff36d0 3ffe8940 3fff36d0  
3fffff00:  0000a1e1 00000001 40266f64 3fffefb0  
3fffff10:  3fff36d0 0000a1e1 00000001 402670ad  
3fffff20:  0000a1e1 00000001 0000a1e1 40267123  
3fffff30:  00000000 0000a1e1 56872b02 00bb2c8c  
3fffff40:  00000000 00000000 3ffe8940 3fff36f8  
3fffff50:  3fffdad0 0000a1e1 00000001 40267f88  
3fffff60:  3fffdad0 00000001 0000a1e1 402483e1  
3fffff70:  402705fc 8a46a8c0 3fff34e4 40268e74  
3fffff80:  00000000 fffffffc 0000a1e0 3fff02a0  
3fffff90:  40263670 3ffe9cdf 3fff34e4 3fff36f8  
3fffffa0:  3fffdad0 00000000 3fff36cc 3fff36f8  
<<<stack<<<

0x40267123 in esp_try_delay(unsigned int, unsigned int, unsigned int) at ??:?
0x40267123 in esp_try_delay(unsigned int, unsigned int, unsigned int) at ??:?
0x40267f88 in delay at ??:?
0x4025bc5d in QuickEspNow::espnowTxHandle() at ??:?
0x402a5d40 in ets_timer_handler_isr at ??:?
0x402a5d4d in ets_timer_handler_isr at ??:?
0x402a5d92 in ets_timer_handler_isr at ??:?
0x402a5993 in ets_snprintf at ??:?
0x401067b1 in call_user_start_local at ??:?
0x401067b7 in call_user_start_local at ??:?
0x4010000d in call_user_start at ??:?
0x401000ab in app_entry_redefinable at ??:?
0x40296078 in cont_ret at cont.S.o:?
0x40296029 in cont_continue at cont.S.o:?
0x40107b04 in spi_flash_read at ??:?
0x40263138 in EspClass::flashRead(unsigned int, unsigned int*, unsigned int) at ??:?
0x402631c5 in EspClass::flashRead(unsigned int, unsigned char*, unsigned int) at ??:?
0x40107b04 in spi_flash_read at ??:?
0x40263138 in EspClass::flashRead(unsigned int, unsigned int*, unsigned int) at ??:?
0x402631c5 in EspClass::flashRead(unsigned int, unsigned char*, unsigned int) at ??:?
0x40268664 in flash_hal_read at ??:?
0x40253902 in littlefs_impl::LittleFSImpl::lfs_flash_read(lfs_config const*, unsigned int, unsigned int, void*, unsigned int) at ??:?
0x402012a5 in lfs_bd_read at lfs.c:?
0x402538e4 in littlefs_impl::LittleFSImpl::lfs_flash_read(lfs_config const*, unsigned int, unsigned int, void*, unsigned int) at ??:?
0x40276c81 in _printf_i at /workdir/repo/newlib/newlib/libc/stdio/nano-vfprintf_i.c:196 (discriminator 1)
0x40268664 in flash_hal_read at ??:?
0x40253902 in littlefs_impl::LittleFSImpl::lfs_flash_read(lfs_config const*, unsigned int, unsigned int, void*, unsigned int) at ??:?
0x402012a5 in lfs_bd_read at lfs.c:?
0x402538e4 in littlefs_impl::LittleFSImpl::lfs_flash_read(lfs_config const*, unsigned int, unsigned int, void*, unsigned int) at ??:?
0x4020215e in lfs_dir_find_match at lfs.c:?
0x40201886 in lfs_dir_fetchmatch at lfs.c:?
0x40201bda in lfs_dir_find at lfs.c:?
0x40202134 in lfs_dir_find_match at lfs.c:?
0x4027706c in _vsprintf_r at /workdir/repo/newlib/newlib/libc/stdio/vsprintf.c:63
0x40204acb in lfs_stat at ??:?
0x40253660 in littlefs_impl::LittleFSImpl::exists(char const*) at ??:?
0x40223002 in WS2812FX::loadCustomPalettes() at ??:?
0x40100e30 in ets_post at ??:?
0x40106f49 in ets_timer_disarm at ??:?
0x40100e30 in ets_post at ??:?
0x40260aa0 in esp8266::MDNSImplementation::MDNSResponder::_writeMDNSServiceDomain(esp8266::MDNSImplementation::MDNSResponder::stcMDNSService const&, bool, bool, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&) at ??:?
0x4010341c in pp_post at ??:?
0x401066b3 in lmacRxDone at ??:?
0x40103fa7 in rcReachRetryLimit at ??:?
0x40104184 in rcReachRetryLimit at ??:?
0x4010463e in wDev_ProcessFiq at ??:?
0x40100e30 in ets_post at ??:?
0x40106f49 in ets_timer_disarm at ??:?
0x40241b14 in notify(unsigned char, bool) at ??:?
0x40241bd9 in handleNotifications() at ??:?
0x4026090a in esp8266::MDNSImplementation::MDNSResponder::_writeMDNSRRDomain(esp8266::MDNSImplementation::MDNSResponder::stcMDNS_RRDomain const&, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&) at ??:?
0x40260ac4 in esp8266::MDNSImplementation::MDNSResponder::_writeMDNSServiceDomain(esp8266::MDNSImplementation::MDNSResponder::stcMDNSService const&, bool, bool, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&) at ??:?
0x40260605 in esp8266::MDNSImplementation::MDNSResponder::_udpAppendBuffer(unsigned char const*, unsigned int) at ??:?
0x40260632 in esp8266::MDNSImplementation::MDNSResponder::_udpAppend8(unsigned char) at ??:?
0x4026074a in esp8266::MDNSImplementation::MDNSResponder::_write8(unsigned char, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&) at ??:?
0x40260a79 in esp8266::MDNSImplementation::MDNSResponder::_writeMDNSServiceDomain(esp8266::MDNSImplementation::MDNSResponder::stcMDNSService const&, bool, bool, esp8266::MDNSImplementation::MDNSResponder::stcMDNSSendParameter&) at ??:?
0x401054b9 in lmacIsIdle at ??:?
0x40106601 in lmacTxFrame at ??:?
0x401055ab in lmacProcessTXStartData at ??:?
0x401055a8 in lmacProcessTXStartData at ??:?
0x4010450f in wDev_ProcessFiq at ??:?
0x40101bd4 in malloc at ??:?
0x4027ba05 in mem_malloc at /local/users/gauchard/arduino/arduino_esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/mem.c:210
0x401060e9 in lmacMSDUAged at ??:?
0x40104360 in wDev_ProcessFiq at ??:?
0x40275d7c in __ssputs_r at /workdir/repo/newlib/newlib/libc/stdio/nano-vfprintf.c:179
0x40275e40 in __ssputs_r at /workdir/repo/newlib/newlib/libc/stdio/nano-vfprintf.c:232
0x40276c81 in _printf_i at /workdir/repo/newlib/newlib/libc/stdio/nano-vfprintf_i.c:196 (discriminator 1)
0x40275e40 in __ssputs_r at /workdir/repo/newlib/newlib/libc/stdio/nano-vfprintf.c:232
0x40100e30 in ets_post at ??:?
0x4010341c in pp_post at ??:?
0x401066b3 in lmacRxDone at ??:?
0x4010341c in pp_post at ??:?
0x40103fa7 in rcReachRetryLimit at ??:?
0x40104184 in rcReachRetryLimit at ??:?
0x40104184 in rcReachRetryLimit at ??:?
0x4010463e in wDev_ProcessFiq at ??:?
0x40104360 in wDev_ProcessFiq at ??:?
0x4010341c in pp_post at ??:?
0x40100e30 in ets_post at ??:?
0x4010341c in pp_post at ??:?
0x401066b3 in lmacRxDone at ??:?
0x4010341c in pp_post at ??:?
0x40103fa7 in rcReachRetryLimit at ??:?
0x40100e30 in ets_post at ??:?
0x40106f49 in ets_timer_disarm at ??:?
0x4010463e in wDev_ProcessFiq at ??:?
0x402447fc in FourLineDisplayUsermod::handleButton(unsigned char) at ??:?
0x40100e30 in ets_post at ??:?
0x40106f49 in ets_timer_disarm at ??:?
0x4023b16f in handlePresets() at ??:?
0x402483b1 in WLED::loop() at ??:?
0x40296029 in cont_continue at cont.S.o:?
0x40264e88 in run_scheduled_recurrent_functions() at ??:?
0x4025247c in ESP8266WiFiSTAClass::localIP() at ??:?
0x4023f68c in NetworkClass::localIP() at ??:?
0x402705fc in StreamNull::~StreamNull() at ??:?
0x402705fc in StreamNull::~StreamNull() at ??:?
0x40106e09 in wdt_feed at ??:?
0x40267012 in yield at ??:?
0x40106eb6 in wdt_feed at ??:?
0x4010708d in ets_timer_arm_new at ??:?
0x40266f64 in __esp_suspend at ??:?
0x402670ad in __esp_delay at ??:?
0x40267123 in esp_try_delay(unsigned int, unsigned int, unsigned int) at ??:?
0x40267f88 in delay at ??:?
0x402483e1 in WLED::loop() at ??:?
0x402705fc in StreamNull::~StreamNull() at ??:?
0x40268e74 in uart_write at ??:?
0x40263670 in HardwareSerial::write(unsigned char const*, unsigned int) at ??:?

--------------- CUT HERE FOR EXCEPTION DECODER ---------------
gmag11 commented 5 months ago

Hi. Initialization seems to be ok. But it seems that you make something with sent buffer just after send. Normally you should wait until library calls the sent callback. Have a look to advancedespenow example. Here, dataSent is a callback that runs when last packet has been sent and confirmed (or timed out).

The result of QuickESPNOW.send does not mean actually that message has been sent but shows if call is ok.

I see a reference to HardwareSerial::write at the end your log. Normally this means that error is produced during a Serial.print statement. I think it is not your case, but be careful to not overload serial buffers. This happens to me when I do verbose debug without filtering. Keep that in mind.

I think it would be useful for simple applications to have a synchronous mode so that send function only returns when espnow internal library calls sent callback. I'll think about it.

blazoncek commented 5 months ago

Hi. Thanks for the explanation. I did check advancedespnow several times when writing above code. I didn't think I needed actual callback on dataSent as I do not need any confirmation or other use for that.

Yes, we need to send (up to) 6 packets (about 1400 bytes) that comprise a full payload. Everything needs to work asynchronously without delaying main loop as it is used for realtime data (calculating LED effects). I have assumed that QuickESPNOW handles such approach (and it seems it does well on ESP32).

BTW HardwareSerial might be a debugging trace.

gmag11 commented 5 months ago

QuickESPNOW works with a queue to send messages. It has a buffer for 3 messages. There is a process that consumes the queue and actually send messages through esp-now, but only if last packet is confirmed.

So, you can send up to 3 messages in a row without waiting, but if queue is full and you try to send a new message, then the older in the queue is discarded.

You can increase queue depth by tuning ESPNOW_QUEUE_SIZE into header files. It will consume about 300 bytes for every message.

I'm doing some changes in the library to allow synchronous sending, but, if your timing is critical, I would recommend to control it by yourself so that you may use full queue. With synchronous mode only one packet can be stored.

blazoncek commented 5 months ago

Hi. I was able to (logically) trace where the problem is (it is twofold).

1) calling delay() function from within ISR should not happen (assuming espnowTxTask_cb is called from OS timer interrupt) 2) sending a few messages in quick succession may enter a loop that takes too much time for WDT

Let's say you quickEspNow.send() 4 messages (overflowing queue). First call to espnowTxHandle() will set readyToSend to false until sending of a single packet completes (in tx_cb) but there are still 2 meesages in queue so it will enter while (!readyToSend) delay(1); loop which may be enough to trigger WDT as delay() is not permitted in ISR.

What I would do is break out of espnowTxHandle() instead of entering while (!readyToSend) loop and wait for next timer invocation of espnowTxTask_cb().

I still need to test my theory and may do a PR if it is correct and you think it worthwhile.

blazoncek commented 5 months ago

Update: Seems to work well. No more WDT reset.

blazoncek commented 5 months ago

One more thing.

When the ring buffer is full I would expect (and would be the correct way) for quickEspNow.send() to fail and not discard last message. That way it would be easy to handle such errors in the application.