From 9993acaba6ec982f44704b34b66e5cff0b5b805f Mon Sep 17 00:00:00 2001 From: alejandrogs73 Date: Tue, 16 Dec 2025 13:53:09 +0100 Subject: [PATCH] perf(sd): activar escritura por buffer y sync periodico - Se elimina el guardado fisico forzado en cada mensaje CAN. - Ahora los datos se acumulan en RAM y se guardan en la SD cada 1 segundo. - Esto evita que el procesador se bloquee y pierda datos. - Nota: riesgo de perder maximo 1s de log (minimo comparado al riesgo de perder paquetes del CAN por que se bloquee el procesador con el codigo anterior) si se corta la energia de golpe. --- include/data_processor.hpp | 4 ++++ src/data_processor.cpp | 15 +++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/data_processor.hpp b/include/data_processor.hpp index 1fa8135..33b4992 100644 --- a/include/data_processor.hpp +++ b/include/data_processor.hpp @@ -30,6 +30,10 @@ private: SdFile* _logFile; CarState car; + uint32_t _last_sync_time = 0; + const uint32_t _sync_interval_ms = 1000; // Guardar físicamente cada 1 segundo (ajustable) + // Esto optimiza tiempos. Los datos se guardan a la velocidad del CAN en RAM y cada 1 segundo se vuelcan a la SD. Cosa mucho más optima ya que la SD es relativamente lenta comparada al CAN + void flushToSD(); // Guardado físico }; diff --git a/src/data_processor.cpp b/src/data_processor.cpp index 1c8d32c..9b638b1 100644 --- a/src/data_processor.cpp +++ b/src/data_processor.cpp @@ -150,15 +150,18 @@ void DataProcessor::flushToSD() { // Verificamos que los punteros existan Y que el archivo esté abierto if (_sd && _logFile && _logFile->isOpen()) { - // 1. Escribimos los datos +// 1. Escribimos al BUFFER (RAM) - Esto es instantáneo (microsegundos) _logFile->print(millis()); _logFile->print(","); _logFile->println(car.ect); - // 2. SYNC - // Esto fuerza a la SD a guardar físicamente los datos AHORA MISMO, - // pero mantiene el archivo abierto para la siguiente vuelta. - _logFile->sync(); - + // 2. SYNC CONTROLADO + // Solo obligamos a la tarjeta a "escribir de verdad" si ha pasado X tiempo. + // Esto evita detener el CAN cada 10ms. + if (millis() - _last_sync_time > _sync_interval_ms) { + _logFile->sync(); // Aquí sí gastamos tiempo, pero solo 1 vez por segundo + _last_sync_time = millis(); + // Serial.println("[SD] Sync realizado"); // Descomentar solo para debug + } } }