mirror of
https://github.com/esphome/esphome.git
synced 2026-07-10 17:05:36 +00:00
[bk72xx] Fix ~100ms loop stalls by raising main task priority
The BK72xx SDK creates the main Arduino task at FreeRTOS priority 3, which is lower than all WiFi (4-5), LwIP (4), and TCP/IP (7) tasks. This causes the main loop to be preempted for ~100ms whenever WiFi background processing runs (beacon handling, DHCP, WPA supplicant). By contrast, RTL87xx creates its main task at osPriorityRealtime (the highest priority), so it never experiences this issue. Raise the BK72xx main task priority to 6 during arch_init(): above WiFi/LwIP tasks (4-5) so they don't preempt the main loop, but below the TCP/IP thread (7) so packet processing keeps priority. This is safe because ESPHome yields voluntarily via yield_with_select_() and the Arduino mainTask yield() after each loop() iteration. Tested on CB3S (BK7231N) - loop time drops from ~110ms to ~14ms.
This commit is contained in:
@@ -6,6 +6,9 @@
|
||||
#include "esphome/core/helpers.h"
|
||||
#include "preferences.h"
|
||||
|
||||
#include <FreeRTOS.h>
|
||||
#include <task.h>
|
||||
|
||||
void setup();
|
||||
void loop();
|
||||
|
||||
@@ -20,6 +23,21 @@ void IRAM_ATTR HOT delayMicroseconds(uint32_t us) { ::delayMicroseconds(us); }
|
||||
void arch_init() {
|
||||
libretiny::setup_preferences();
|
||||
lt_wdt_enable(10000L);
|
||||
#ifdef USE_BK72XX
|
||||
// BK72xx SDK creates the main Arduino task at priority 3, which is lower than
|
||||
// all WiFi (4-5), LwIP (4), and TCP/IP (7) tasks. This causes ~100ms loop
|
||||
// stalls whenever WiFi background processing runs, because the main task
|
||||
// cannot resume until every higher-priority task finishes.
|
||||
//
|
||||
// By contrast, RTL87xx creates the main task at osPriorityRealtime (highest).
|
||||
//
|
||||
// Raise to priority 6: above WiFi/LwIP tasks (4-5) so they don't preempt the
|
||||
// main loop, but below the TCP/IP thread (7) so packet processing keeps priority.
|
||||
// This is safe because ESPHome yields voluntarily via yield_with_select_() and
|
||||
// the Arduino mainTask yield() after each loop() iteration.
|
||||
static constexpr UBaseType_t MAIN_TASK_PRIORITY = 6;
|
||||
vTaskPrioritySet(nullptr, MAIN_TASK_PRIORITY);
|
||||
#endif
|
||||
#if LT_GPIO_RECOVER
|
||||
lt_gpio_recover();
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user