feat(can): 优化批量发送性能并修复竞态问题
- 帧间添加5ms延时,暂停CAN反馈避免与批量SPI竞争导致偶发崩溃 - 单次批量容量从48帧提升至128帧,最大body大小从12KB增至48KB - 单帧超时从400ms降至80ms,失败后不再拖慢整体速度 - 暂停0xC1反馈任务降低worker竞态和WDT风险 - 中途致命错误后跳过后续帧发送,避免每帧等待超时 - 添加详细的JSON错误响应格式 - 修复内存分配失败时的资源清理问题 refactor(wifi): 优化冷启动流程避免电源竞争 - 电源轨稳定等待策略调整:POWERON/BROWNOUT复位时等待200ms - 仅BROWNOUT复位后清除PHY校准数据,避免每次上电全量校准 - 电源稳定等待期间等待400ms后再进行NVS/WiFi操作 - WiFi启动前延时从500ms调整为300ms - BOD阈值适当放宽避免上电瞬间复位 perf(monitor): 调整堆内存监控策略 - 内存紧张时增大健康监控间隔:低于8KB时从3s增至10s - 避免日志输出消耗更多堆内存造成雪崩效应 docs(readme): 更新冷启动优化说明 - 详细描述电源轨稳定等待机制 - 说明仅BROWNOUT后才强制PHY重校准的策略 - 解释避免与GD32抢电流的设计考虑 style(html): 更新前端资源版本号 - 更新CSS和JavaScript文件的版本参数 - 修复页面加载时的资源缓存问题 fix(ble): 修复阶段显示状态问题 - 终态阶段全部显示为完成状态(绿色) - 优化状态栏样式更新逻辑 feat(ota): 优化SPI通信超时处理 - 将总超时拆分为发送和轮询两个阶段 - 禁止轮询单独占用500ms避免短超时批量卡顿 - 优化极短超时情况下的时间分配策略 refactor(can): 减少批量操作时的日志输出 - SPI失败和GD32拒绝时按类型聚合日志 - 每32次相同错误才输出一次完整日志 - 避免大量错误时UDP/格式化耗尽堆内存
This commit is contained in:
+20
-12
@@ -318,8 +318,8 @@ esp_err_t WifiOta::initSta()
|
||||
// esp_wifi_start() 内部会触发 PHY 初始化和校准
|
||||
// 如果校准未完成就启动射频,可能导致连接失败
|
||||
if (WifiOta::instance().m_coldBoot) {
|
||||
DEBUG_INFO("WIFI", "冷启动: 等待 PHY 就绪...");
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
DEBUG_INFO("WIFI", "冷启动: wifi_start 前再等 300ms...");
|
||||
vTaskDelay(pdMS_TO_TICKS(300));
|
||||
}
|
||||
|
||||
ESP_ERROR_CHECK(esp_wifi_start());
|
||||
@@ -533,12 +533,12 @@ void WifiOta::onBleOtaEnd()
|
||||
*/
|
||||
bool WifiOta::earlyInit()
|
||||
{
|
||||
DEBUG_INFO("WIFI", "=== WiFi 早期初始化 (调度器启动前) ===");
|
||||
DEBUG_INFO("WIFI", "=== WiFi 早期初始化 ===");
|
||||
|
||||
// ★ 冷启动检测:判断是否为上电复位
|
||||
// ★ 冷启动检测:判断是否为上电/欠压复位
|
||||
esp_reset_reason_t reset_reason = esp_reset_reason();
|
||||
WifiOta::instance().m_coldBoot = (reset_reason == ESP_RST_POWERON || reset_reason == ESP_RST_BROWNOUT);
|
||||
|
||||
|
||||
DEBUG_INFO("WIFI", "复位原因: %d (%s), 冷启动: %s",
|
||||
reset_reason,
|
||||
(reset_reason == ESP_RST_POWERON) ? "POWER_ON" :
|
||||
@@ -551,6 +551,13 @@ bool WifiOta::earlyInit()
|
||||
"OTHER",
|
||||
WifiOta::instance().m_coldBoot ? "是" : "否");
|
||||
|
||||
/* 与 GD32/CAN 收发器同板上电时,电源上升沿慢 + 负载大。
|
||||
* 若立刻清 PHY/开 WiFi 全量校准,易触发 brownout,表现为「上电起不来,拔插才好」。 */
|
||||
if (WifiOta::instance().m_coldBoot) {
|
||||
DEBUG_INFO("WIFI", "冷启动: 电源轨稳定等待 400ms(再做 NVS/WiFi)...");
|
||||
vTaskDelay(pdMS_TO_TICKS(400));
|
||||
}
|
||||
|
||||
esp_err_t err = nvs_flash_init();
|
||||
bool nvs_erased = false;
|
||||
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
||||
@@ -569,20 +576,21 @@ bool WifiOta::earlyInit()
|
||||
DEBUG_INFO("WIFI", "NVS 初始化成功");
|
||||
}
|
||||
|
||||
// ★ 冷启动时强制清除 WiFi NVS 缓存,避免残留脏数据
|
||||
// 长时间断电后 NVS 中的 WiFi 配置缓存可能不一致
|
||||
// ★ 冷启动:只清 WiFi 连接缓存;勿在每次 POWERON 都清 PHY。
|
||||
// 全量 PHY 校准电流大,与 GD32 同时上电易 brownout → 必须再插拔才能起来。
|
||||
// 仅在欠压复位后清 PHY,避免校准脏数据死循环。
|
||||
if (WifiOta::instance().m_coldBoot) {
|
||||
// 清除 WiFi 驱动内部 NVS 缓存键
|
||||
err = clearNvsNamespace("nvs.net80211");
|
||||
if (err == ESP_OK) {
|
||||
DEBUG_DBG("WIFI", "冷启动: 已清除 WiFi NVS 缓存 (nvs.net80211)");
|
||||
} else {
|
||||
DEBUG_INFO("WIFI", "冷启动: 无 WiFi NVS 缓存分区,跳过清除");
|
||||
}
|
||||
// 同样清除 PHY 校准数据分区,强制下次全量校准
|
||||
err = clearNvsNamespace("phy");
|
||||
if (err == ESP_OK) {
|
||||
DEBUG_DBG("WIFI", "冷启动: 已清除 PHY 校准缓存,将重新校准");
|
||||
if (reset_reason == ESP_RST_BROWNOUT) {
|
||||
err = clearNvsNamespace("phy");
|
||||
if (err == ESP_OK) {
|
||||
DEBUG_WARN("WIFI", "BROWNOUT 后: 已清除 PHY 校准,将重新校准");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user