Контрольный таймер задачи запускается во время инициализации 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: сработал сторожевой таймер задачи.
Есть ли какой-нибудь способ отключить сторожевой таймер задачи? Или есть какая-то другая проблема?
@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()
, похоже, не позволяет вам указать, когда должно истечь время ожидания.
- Можно ли использовать WiFi и Bluetooth/BLE в одном проекте ESP32?
- ESP32 SerialBluetooth отключается в течение секунды после подключения, но не BLEDevice/BLEServer
- Проблема с ESP32 bluetooth
- Минимизируйте размер программы ESP32, подключающейся к Bluetooth-устройству и запрашивающей HTTP-сервер одновременно.
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
Попробуйте добавить
esp_task_wdt_reset();
передSerialBT.begin(...)
., @MajenkoНичего не меняется, сторожевой таймер по-прежнему срабатывает, @Q Stollen