以前の記事でESP32のCore1でメインの処理(LEDを光らせる)をしながらCore0でSDカード内の画像データを読み込むということをしたのだが、久しぶりに同じプログラムを書き込んだら「assert failed」というエラーが起きてしまった。
1 |
assert failed: xQueueGenericSend queue.c:832 (pxQueue->pcHead != ((void *)0) || pxQueue->u.xSemaphore.xMutexHolder == ((void *)0) || pxQueue->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle()) |
1 |
Backtrace: 0x4008344d:0x3ffb2e00 0x400880e1:0x3ffb2e20 0x4008d021:0x3ffb2e40 0x400888e6:0x3ffb2f70 0x400d5a61:0x3ffb2fb0 0x400d44ea:0x3ffb2fd0 0x400d4211:0x3ffb2ff0 0x400d3bfd:0x3ffb3010 0x400d4016:0x3ffb3030 0x400d3d7f:0x3ffb3050 0x400d3d94:0x3ffb3070 0x400d3fd0:0x3ffb30a0 0x400d40f0:0x3ffb30c0 0x400d413e:0x3ffb30e0 0x400d42f7:0x3ffb3100 0x400d2bd8:0x3ffb3120 0x400d2c8e:0x3ffb3150 0x400d347a:0x3ffb3180 0x400d3011:0x3ffb31e0 0x400d302f:0x3ffb3260 0x400d3aab:0x3ffb3280 0x400d156f:0x3ffb32a0 |
エラーの原因は不明なのだが、結論から言うとSD.begin()をSetup内ではなくCore0内で実行しないとエラーが出ることが判明。
もう一点、Core0をWhile(1)で無限ループさせるときは”vTaskDelay(1)”を挟まないとWatchDogエラーが起きるので注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include "SdFat.h" TaskHandle_t thp[1]; // マルチスレッドのタスクハンドル格納用 //SDカードの設定 const uint8_t SD_CS_PIN = SS; #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(24))//24MHz SdFs sd; FsFile dir; FsFile file; void setup() { Serial.begin(115200); /*ここでsd.begin()を実行するとエラー if(!sd.begin(SD_CONFIG)){ Serial.println("Card Mount Failed"); } else{ Serial.println("Card Mount Success"); }*/ //マルチコア設定 xTaskCreatePinnedToCore(Core0a, "Core0a", 4096, NULL, 3, &thp[0], 0); } void loop() { // メインで実行するプログラム Serial.println("*"); delay(10); } char* path; void Core0a(void *args) { //SDカードの認識 Serial.println("Initializing SD card..."); //sd.begin()はここで実行する if(!sd.begin(SD_CONFIG)){ Serial.println("Card Mount Failed"); } else{ Serial.println("Card Mount Success"); } while (1) { path = "/A.bmp"; if(!file.open(path, FILE_READ)){ Serial.println("Failed to open file"); } else{ Serial.println(path); //SDカードのファイルに対して繰り返し実行するプログラムを記載 file.close(); } vTaskDelay(1);//Watch Dog Timerエラー防止のため } } |
もう一つの解決法:ESP32ライブラリのバージョンを下げる
こっちを先に行えばよかった。。。
Boardマネージャのesp32を1.0.6に戻して書き込みを行うとエラーが起こらなくなります。
コメント