ESP32のマルチコアでSDカードを読んで「assert failed」エラーが出て解決した話

ESP32

以前の記事でESP32のCore1でメインの処理(LEDを光らせる)をしながらCore0でSDカード内の画像データを読み込むということをしたのだが、久しぶりに同じプログラムを書き込んだら「assert failed」というエラーが起きてしまった。

assert failed: xQueueGenericSend queue.c:832 (pxQueue->pcHead != ((void *)0) || pxQueue->u.xSemaphore.xMutexHolder == ((void *)0) || pxQueue->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle())
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エラーが起きるので注意。

もう一つの解決法:ESP32ライブラリのバージョンを下げる

こっちを先に行えばよかった。。。
Boardマネージャのesp32を1.0.6に戻して書き込みを行うとエラーが起こらなくなります。

コメント

タイトルとURLをコピーしました