From 70e3ca0ecb60bdcedda11ff56a3b89ee487c80a6 Mon Sep 17 00:00:00 2001 From: byun Date: Wed, 11 Mar 2026 21:36:35 +0000 Subject: [PATCH] =?UTF-8?q?=EC=9B=B9=EC=86=8C=EC=BC=93=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ESP32_CAN_Logger-a.ino | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/ESP32_CAN_Logger-a.ino b/ESP32_CAN_Logger-a.ino index dcef3dd..31e9763 100644 --- a/ESP32_CAN_Logger-a.ino +++ b/ESP32_CAN_Logger-a.ino @@ -394,6 +394,7 @@ volatile bool loggingEnabled = false; volatile bool serialLoggingEnabled = false; volatile bool serial2LoggingEnabled = false; volatile bool sdCardReady = false; +uint32_t lastBroadcast = 0; // webUpdateTask broadcast 주기 제어 // Auto Trigger #define MAX_TRIGGERS 8 @@ -1610,6 +1611,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) } String json; serializeJson(allData, json); webSocket.sendTXT(num, json); + // ★ 연결 즉시 update 브로드캐스트 트리거 (다음 루프에서 500ms 기다리지 않고 즉시 전송) + lastBroadcast = 0; } else if (type == WStype_TEXT) { DynamicJsonDocument doc(44384); @@ -2126,24 +2129,33 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) void webUpdateTask(void *parameter) { vTaskDelay(pdMS_TO_TICKS(500)); + // ★ 핵심 개선: server.handleClient() + webSocket.loop()를 + // 10ms 루프로 빠르게 폴링 → WebSocket 핸드셰이크 지연 대폭 감소 + // (기존 500ms 루프 → 최악 500ms 대기, 개선 후 최악 10ms 대기) + // broadcastTXT(500ms 주기)와 분리해서 연결 수립만 먼저 빠르게 처리 while (1) { - // ★ server.handleClient()를 Core 0에서 호출 - // loop()(Core 1, Pri 1)는 canRxTask(Core 1, Pri 24)에 선점당해 실행 불가 + // ── 10ms마다: HTTP + WebSocket 핸드셰이크/수신 처리 ────── server.handleClient(); webSocket.loop(); // ★ msgPerSecond를 Core 0에서 직접 계산 - // (sdMonitorTask가 Core 1에서 canRxTask(Pri24)에 스타베이션될 수 있으므로) { uint32_t now = millis(); if (now - lastMsgCountTime >= 1000) { - uint32_t cur = totalMsgCount; // volatile 읽기 + uint32_t cur = totalMsgCount; msgPerSecond = cur - lastMsgCount; lastMsgCount = cur; lastMsgCountTime = now; } } + // ── 500ms마다: JSON 직렬화 + broadcastTXT (무거운 작업) ─ + if (millis() - lastBroadcast < 500) { + vTaskDelay(pdMS_TO_TICKS(10)); // 10ms 대기 후 루프 재진입 + continue; + } + lastBroadcast = millis(); + if (webSocket.connectedClients() > 0) { DynamicJsonDocument doc(16384); doc["type"] = "update"; @@ -2320,7 +2332,7 @@ void webUpdateTask(void *parameter) { if (jsonSize > 0 && jsonSize < 8192) webSocket.broadcastTXT(json); } - vTaskDelay(pdMS_TO_TICKS(500)); + // broadcastTXT 완료 후 즉시 루프 재진입 (10ms 대기는 위 continue에서) } }