Контрольный таймер задачи запускается во время инициализации Bluetooth

Плата ESP32-Dev-WROOM-32D не может установить соединение Bluetooth из-за контрольного таймера задачи. Вот мой код:

#include "BluetoothSerial.h"
// проверьте, включен ли Bluetooth
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); 
  Serial.println("The device started!");
}

Программа работает нормально до тех пор, пока SerialBT.begin("ESP32test"); где он зависает и не продолжает работать. Сообщение, которое запустило устройство! не печатается. Вместо этого через некоторое время запускается сторожевой таймер задачи: E (24791) task_wdt: сработал сторожевой таймер задачи.

Есть ли какой-нибудь способ отключить сторожевой таймер задачи? Или есть какая-то другая проблема?

, 👍1

Обсуждение

Попробуйте добавить esp_task_wdt_reset(); перед SerialBT.begin(...)., @Majenko

Ничего не меняется, сторожевой таймер по-прежнему срабатывает, @Q Stollen


1 ответ


1

SerialBT.begin("ESP32test") зависает, и поскольку ESP32 плохо справляется с зависающим кодом, он жалуется на это.

ESP32 работает под управлением операционной системы реального времени (FreeRTOS). Тот факт, что это операционная система реального времени, означает, что выполнение кода должно быть гарантированно завершено в течение определенного периода времени. Вы часто будете видеть функции RTOS, содержащие ограничение по времени, в течение которого блокирующая функция должна завершить выполнение, например:

    uart_wait_tx_done(uart_num, 100); // время ожидания составляет 100 тиков RTOS (TickType_t)

(из документов ESP-IDF)

FreeRTOS поставляется с API задач. Каждая задача может выполнять код, но они должны дать другим задачам возможность тоже выполнить код. Я думаю, что когда задача блокируется, это не позволяет другим задачам выполнять работу на том же процессоре. (но я не могу найти источники, подтверждающие это)

setup() запускается в одной из задач RTOS, и когда SerialBT.begin() блокирует задачу слишком долго, диспетчер задач жалуется, что задача зависает. Если задача заблокирована каким-то циклическим кодом, то обычно помогает запустить vTaskDelay(), чтобы ненадолго передать задачу диспетчеру задач.

Поскольку ваша задача блокируется одним вызовом, с этим ничего не поделаешь, учитывая, что SerialBT.begin(), похоже, не позволяет вам указать, когда должно истечь время ожидания.

,