perf(sd): unificar escritura de variables con snprintf

Se reemplazan las múltiples llamadas secuenciales a _logFile->print() por la construcción de una cadena de texto única en la RAM mediante snprintf. Esta refactorización minimiza las operaciones de escritura sobre el bus SPI, reduce la latencia de guardado en la SD y prepara la función flushToSD() para escalar a múltiples variables del vehículo sin riesgo de bloquear los ciclos de CPU del microcontrolador.
This commit is contained in:
Alejandro Guerrero 2026-02-23 15:55:32 +01:00
parent 9072c162df
commit c446873682

View file

@ -150,18 +150,19 @@ void DataProcessor::flushToSD() {
// Verificamos que los punteros existan Y que el archivo esté abierto // Verificamos que los punteros existan Y que el archivo esté abierto
if (_sd && _logFile && _logFile->isOpen()) { if (_sd && _logFile && _logFile->isOpen()) {
// 1. Escribimos al BUFFER (RAM) - Esto es instantáneo (microsegundos) // 1. ESTRUCTURACIÓN EN RAM (El método snprintf)
_logFile->print(millis()); // Reservamos 128 bytes de memoria temporal.
_logFile->print(","); char buffer[128];
_logFile->println(car.ect);
// Ensamblamos la cadena en la RAM. snprintf devuelve la longitud real de la cadena.
int len = snprintf(buffer, sizeof(buffer), "%lu,%d\n", millis(), car.ect);
_logFile->write(buffer, len);
// 2. SYNC CONTROLADO // 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) { if (millis() - _last_sync_time > _sync_interval_ms) {
_logFile->sync(); // Aquí sí gastamos tiempo, pero solo 1 vez por segundo _logFile->sync();
_last_sync_time = millis(); _last_sync_time = millis();
// Serial.println("[SD] Sync realizado"); // Descomentar solo para debug
} }
} }
} }