Using FatFs directly fails with a Guru Meditation Error
Posted: Thu Jan 07, 2021 3:51 pm
Hi,
I am developing an application with FS features and it uses directly FatFs API for FS operations. At some point I got crashes with the FS in SD card, I have tested FS in flash to see if there was any difference and it worked as expected.
So I went back to the basic example for SD card on the Github repository: https://github.com/espressif/esp-idf/tr ... ge/sd_card
(Note that I use IDF version 3.3.4)
The example works fine but I am required to use the FatFs API so I switched from POSIX to see if the example was working.
I only tried to change the file creation with the following code:
But I got a Guru Meditation:
- Is there something wrong in my code? The backtrace only points to FreeRTOS task code.
- In general are there any recommendations when using directly FatFs API? Even though this is supported I have the impression that no one really use the FS like this on ESP32.
The original issue I was investigating had the following backtrace:
But first I would like to know what I did wrong with the example, maybe it will help me understand this.
Thanks,
Benjamin
PS: I am using the ESP32 WROVER kit and since some of the JTAG and SD pins are shared, I cannot run gdb to investigate.
I am developing an application with FS features and it uses directly FatFs API for FS operations. At some point I got crashes with the FS in SD card, I have tested FS in flash to see if there was any difference and it worked as expected.
So I went back to the basic example for SD card on the Github repository: https://github.com/espressif/esp-idf/tr ... ge/sd_card
(Note that I use IDF version 3.3.4)
The example works fine but I am required to use the FatFs API so I switched from POSIX to see if the example was working.
I only tried to change the file creation with the following code:
Code: Select all
// First create a file.
ESP_LOGI(TAG, "Opening file");
FIL file;
FRESULT res;
res = f_open(&file, "/sdcard/hello.txt", FA_CREATE_ALWAYS);
if (FR_OK != res) {
ESP_LOGE(TAG, "Failed to open file for writing, result=%d", res);
return;
}
ESP_LOGI(TAG, "File opened");
So my questions are:I (0) cpu_start: App cpu up.
I (262) heap_init: Initializing. RAM available for dynamic allocation:
I (269) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (275) heap_init: At 3FFB3008 len 0002CFF8 (179 KiB): DRAM
I (281) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (287) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (294) heap_init: At 40089100 len 00016F00 (91 KiB): IRAM
I (300) cpu_start: Pro cpu start user code
I (318) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (320) example: Initializing SD card
I (320) example: Using SDMMC peripheral
***ERROR*** A stack overfloGuru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x4008652c PS : 0x00060633 A0 : 0x800865ca A1 : 0x3ffb5ce0
0x4008652c: prvCheckTasksWaitingTermination at C:/Tools/msys32/home/balix/esp-idf/components/freertos/tasks.c:4560
A2 : 0x00000000 A3 : 0x00000001 A4 : 0x00000001 A5 : 0x00000001
A6 : 0x00060021 A7 : 0x00000000 A8 : 0x80086516 A9 : 0x3ffb5cc0
A10 : 0x3ffb3ca0 A11 : 0x00000000 A12 : 0x00000000 A13 : 0x00000001
A14 : 0x00000003 A15 : 0x00060023 SAR : 0x00000000 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000048 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
ELF file SHA256: 5bdc9160105c94bf
Backtrace: 0x4008652c:0x3ffb5ce0 0x400865c7:0x3ffb5d00 0x40084d21:0x3ffb5d20
0x4008652c: prvCheckTasksWaitingTermination at C:/Tools/msys32/home/balix/esp-idf/components/freertos/tasks.c:4560
0x400865c7: prvIdleTask at C:/Tools/msys32/home/balix/esp-idf/components/freertos/tasks.c:4560
0x40084d21: vPortTaskWrapper at C:/Tools/msys32/home/balix/esp-idf/components/freertos/port.c:403
CPU halted.
- Is there something wrong in my code? The backtrace only points to FreeRTOS task code.
- In general are there any recommendations when using directly FatFs API? Even though this is supported I have the impression that no one really use the FS like this on ESP32.
The original issue I was investigating had the following backtrace:
So to me there seems to be something wrong maybe between FreeRTOS and the SD device driver.C:/Users/balix/ESP32-WROVER/esp-idf/components/freertos/queue.c:1442 (xQueueGenericReceive)- assert failed!
abort() was called at PC 0x4008931d on core 0
0x4008931d: xQueueGenericReceive at C:/Users/balix/ESP32-WROVER/esp-idf/components/freertos/queue.c:2038
ELF file SHA256: f3472044f1e23acb
Backtrace: 0x400880dd:0x3ffc9bc0 0x4008836d:0x3ffc9be0 0x4008931d:0x3ffc9c00 0x400fa2e2:0x3ffc9c40 0x40100511:0x3ffc9c90 0x400f7aa8:0x3ffc9cb0 0x400f7b23:0x3ffc9d20 0x400fb63d:0x3ffc9d50 0x400fb526:0x3ffc9d70 0x400fb921:0x3ffc9d90 0x400fb9
51:0x3ffc9db0 0x400fba6d:0x3ffc9dd0 0x400fd9a9:0x3ffc9e10 0x400f57b1:0x3ffc9e80 0x400f5ec6:0x3ffc9ea0
0x400880dd: invoke_abort at C:/Users/balix/ESP32-WROVER/esp-idf/components/esp32/panic.c:715
0x4008836d: abort at C:/Users/balix/ESP32-WROVER/esp-idf/components/esp32/panic.c:715
0x4008931d: xQueueGenericReceive at C:/Users/balix/ESP32-WROVER/esp-idf/components/freertos/queue.c:2038
0x400fa2e2: sdmmc_host_do_transaction at C:/Users/balix/ESP32-WROVER/esp-idf/components/driver/sdmmc_transaction.c:119
0x40100511: sdmmc_send_cmd at C:/Users/balix/ESP32-WROVER/esp-idf/components/sdmmc/sdmmc_cmd.c:34
0x400f7aa8: sdmmc_read_sectors_dma at C:/Users/balix/ESP32-WROVER/esp-idf/components/sdmmc/sdmmc_cmd.c:495
0x400f7b23: sdmmc_read_sectors at C:/Users/balix/ESP32-WROVER/esp-idf/components/sdmmc/sdmmc_cmd.c:447
0x400fb63d: ff_sdmmc_read at C:/Users/balix/ESP32-WROVER/esp-idf/components/fatfs/src/diskio_sdmmc.c:39
0x400fb526: ff_disk_read at C:/Users/balix/ESP32-WROVER/esp-idf/components/fatfs/src/diskio.c:69
0x400fb921: move_window at C:/Users/balix/ESP32-WROVER/esp-idf/components/fatfs/src/ff.c:4710
0x400fb951: check_fs at C:/Users/balix/ESP32-WROVER/esp-idf/components/fatfs/src/ff.c:4710
0x400fba6d: find_volume at C:/Users/balix/ESP32-WROVER/esp-idf/components/fatfs/src/ff.c:4710
0x400fd9a9: f_stat at C:/Users/balix/ESP32-WROVER/esp-idf/components/fatfs/src/ff.c:4710
But first I would like to know what I did wrong with the example, maybe it will help me understand this.
Thanks,
Benjamin
PS: I am using the ESP32 WROVER kit and since some of the JTAG and SD pins are shared, I cannot run gdb to investigate.