Сбой при отключении bluedroid

у меня есть ESP32, и я хочу использовать deepsleep, когда он не используется. Перед отправкой в спящий режим я очищаю все, поэтому отключите, деинициализируйте и отключите все, что я построил раньше. Но я получаю сбой, когда пытаюсь отключить bluedroid. Кто-нибудь знает, почему это происходит?

void bt_deinit() {
    
    Serial.println("Deinit AVRC");
    if (esp_avrc_ct_deinit() != ESP_OK)
        Serial.write("Failed to deinit avrc");

    Serial.println("Deinit A2DP");
    if (esp_a2d_source_deinit() != ESP_OK)
        Serial.println("Failed to deinit a2dp");

    Serial.println("disable bluedroid");
    if (esp_bluedroid_disable() != ESP_OK)
        Serial.println("Failed to disable bluedroid");

    Serial.println("Deinit bluedroid");
    if (esp_bluedroid_deinit() != ESP_OK)
        Serial.println("Failed to deinit bluedroid");

    Serial.println("Stop BT");
    if (btStop() == false)
        Serial.println("Failed to stop bt");
}

выход:

Port closed
Uploading to I/O board
Opening port
Port open
Hello there!
Bluetooth init success
good night
Deinit AVRC
Deinit A2DP
disable bluedroid
/home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/queue.c:719 (xQueueGenericSend)- assert failed!
abort() was called at PC 0x4008de6f on core 0

Backtrace: 0x40091918:0x3ffce3b0 0x40091b49:0x3ffce3d0 0x4008de6f:0x3ffce3f0 0x4013bfb6:0x3ffce430 0x4013c5f6:0x3ffce460 0x400fdbe2:0x3ffce480 0x400fdc35:0x3ffce4a0 0x400fe12e:0x3ffce4c0 0x400f6bd9:0x3ffce4e0 0x4008e559:0x3ffce510

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (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:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
Hello there!
Bluetooth init success

это прекрасно работает, если я просто не деинициализирую все и не отправлю его прямо спать. Но это не самый элегантный способ.

, 👍2

Обсуждение

upvote для хорошо представленного вопроса ... к сожалению, у меня нет опыта, чтобы помочь вам ..... возможно, что-то не закончило выключение .... вставьте задержку перед отключением bluedroid .... может быть, это порядок событий.... может быть, сначала остановите, а затем отключите.... возможно, обратный порядок последовательности запуска, @jsotola


1 ответ


1

декодированный backtrace в вашем вопросе отсутствует, одним из вариантов увидеть трассировку стека является https://github.com/littleyoda/EspStackTraceDecoder

я не знаю точно, является ли это вашим случаем или нет, но вызов esp_ble_gap_stop_scanning() перед esp_bluedroid_deinit (), возможно, избегает вашего сбоя.

,