ESP32 sending medium sized JPEG picture - Interrupt wdt timeout on CPU1
Posted: Sun Dec 08, 2019 8:10 am
I'm receiving JPG picture from a device connected to ESP32 with serial connection (baud rate 921600). Receiving part is done using the following code:
If the line about publishing is commented out, I can receive messages from the device, including jpg, which appears to be not corrupted (begins with ff d8 and ends with ff d9). If I try sending the jpg with client.publish(using pubsubclient library for Arduino), then esp 32 immediately after receiving message on face_enroll topic reboots with the following backtrace:
The MQTT_MAX_PACKET_SIZE is set to 50000(changing it to 55000 doesn't make a difference). I have also tried publishing with client.beginPublish and write(payload, length) (or write(payload to send single bytes), all with the same result...
What I found working, sort of, is publishing bytes of jpg image right after receiving them from the device, or buffering them to buf[5000] array and then publishing them. Unfortunately the jpg image is corrupted when publishing this way (a lot of ff bytes in the body of jpg, doesn't end with ff d9, impossible to open).
Is there any work around this issue? It doesn't seem to be memory related...
- if (String(topic) == "esp32/face_enroll") {
- /*here is some code related to getting message from the device and parsing it, I omit it because this part works as expected*/
- byte incomingByte = 0;
- byte nextByte = 0;
- bool jpeg = 0;
- byte jpeg_image[50000];
- int i=0;
- Serial.println("init");
- if (mf1_jpeg.available() > 0)
- {
- Serial.println("data");
- incomingByte = mf1_jpeg.read();
- if (incomingByte == 0xFF)
- { nextByte = mf1_jpeg.read();
- if (nextByte == 0xD8) { jpeg = 1; i = 2; jpeg_image[0]=incomingByte; jpeg_image[1]=nextByte; Serial.println("jpg begin");}
- }
- }
- while (jpeg)
- {
- incomingByte = mf1_jpeg.read();
- jpeg_image[i]=incomingByte;
- i++;
- if (incomingByte == 0xFF)
- { nextByte = mf1_jpeg.read();
- if (nextByte == 0xD9) {
- jpeg = 0;
- jpeg_image[i]=nextByte;
- Serial.println("jpg end");
- //client.publish("esp32/jpg", jpeg_image, 50000, false);
- Serial.println("finished");
- }
- }
- }
- break;}
- }
- if (!detected) { client.publish("esp32/result", "no_face_detected"); Serial.println("no_face_detected");}
- detected = 0;
- delay(5);
- }
Code: Select all
Connecting to orangepi
...
WiFi connected
IP address:
192.168.43.159
Attempting MQTT connection...connected
ets Jun 8 2016 00:22:57
rst:0x8 (TG1WDT_SYS_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1)
Core 1 register dump:
PC : 0x40081372 PS : 0x00050034 A0 : 0x40084774 A1 : 0x3ffbe7a0
A2 : 0x3ffbec00 A3 : 0x00000000 A4 : 0x00000001 A5 : 0x4008b2e0
A6 : 0x00000004 A7 : 0x3ffb8614 A8 : 0x3ff40000 A9 : 0x00000008
A10 : 0x00000000 A11 : 0x00000200 A12 : 0x00000000 A13 : 0x3ffb1db0
A14 : 0x3ffb8000 A15 : 0xbaad5678 SAR : 0x00000013 EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
Core 1 was running in ISR context:
EPC1 : 0x4000bff0 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x40081372
Backtrace: 0x40081372:0x3ffbe7a0 0x40084771:0x3ffbe7d0 0x4000bfed:0x3ffb1e00 0x40089ce9:0x3ffb1e10 0x400d8547:0x3ffb1e30 0x400d859d:0x3ffb1e70 0x400d47d9:0x3ffb1ea0 0x400d48c7:0x3ffb1ec0 0x400d4c9e:0x3ffb1ee0 0x400d3986:0x3ffb1f20 0x400d1029:0x3ffb1f60 0x400d4e6f:0x3ffb1fb0 0x40088b7d:0x3ffb1fd0
Core 0 register dump:
PC : 0x4013e01a PS : 0x00060134 A0 : 0x800d7d12 A1 : 0x3ffbbff0
A2 : 0x00000000 A3 : 0x00000001 A4 : 0x00000000 A5 : 0x00000001
A6 : 0x00060320 A7 : 0x00000000 A8 : 0x800d6d5a A9 : 0x3ffbbfc0
A10 : 0x00000000 A11 : 0x40084f14 A12 : 0x00060320 A13 : 0x3ffbb650
A14 : 0x3ff000e0 A15 : 0x00000001 SAR : 0x00000000 EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
Backtrace: 0x4013e01a:0x3ffbbff0 0x400d7d0f:0x3ffbc010 0x4008a361:0x3ffbc030 0x40088b7d:0x3ffbc050
Rebooting...
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1)
Core 1 register dump:
PC : 0x40081346 PS : 0x00050034 A0 : 0x40084774 A1 : 0x3ffbe7a0
A2 : 0x3ffbec28 A3 : 0x00000002 A4 : 0x00000001 A5 : 0x4008b2e0
A6 : 0x00000004 A7 : 0x3ffb8614 A8 : 0x00000000 A9 : 0x3ff50000
A10 : 0x00000200 A11 : 0x00000200 A12 : 0x00000000 A13 : 0x3ffb1db0
A14 : 0x3ffb8000 A15 : 0xbaad5678 SAR : 0x00000013 EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
Core 1 was running in ISR context:
EPC1 : 0x4000bff0 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x40081346
Backtrace: 0x40081346:0x3ffbe7a0 0x40084771:0x3ffbe7d0 0x4000bfed:0x3ffb1e00 0x40089ce9:0x3ffb1e10 0x400d8547:0x3ffb1e30 0x400d859d:0x3ffb1e70 0x400d47d9:0x3ffb1ea0 0x400d48c7:0x3ffb1ec0 0x400d4c9e:0x3ffb1ee0 0x400d3986:0x3ffb1f20 0x400d1029:0x3ffb1f60 0x400d4e6f:0x3ffb1fb0 0x40088b7d:0x3ffb1fd0
Core 0 register dump:
PC : 0x4013e01a PS : 0x00060134 A0 : 0x800d7d12 A1 : 0x3ffbbff0
A2 : 0x00000000 A3 : 0x00000001 A4 : 0x00000000 A5 : 0x00000001
A6 : 0x00060120 A7 : 0x00000000 A8 : 0x800d6d5a A9 : 0x3ffbbfc0
A10 : 0x00000000 A11 : 0x40084f14 A12 : 0x00060120 A13 : 0x3ffbb6c0
A14 : 0x00000000 A15 : 0x3ffbbce0 SAR : 0x00000000 EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
Backtrace: 0x4013e01a:0x3ffbbff0 0x400d7d0f:0x3ffbc010 0x4008a361:0x3ffbc030 0x40088b7d:0x3ffbc050
Rebooting...
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
Connecting to orangepi
...
What I found working, sort of, is publishing bytes of jpg image right after receiving them from the device, or buffering them to buf[5000] array and then publishing them. Unfortunately the jpg image is corrupted when publishing this way (a lot of ff bytes in the body of jpg, doesn't end with ff d9, impossible to open).
Is there any work around this issue? It doesn't seem to be memory related...