From c446873682b25149e18e52e0a87759c0a2e8420a Mon Sep 17 00:00:00 2001 From: Alejandro Guerrero Date: Mon, 23 Feb 2026 15:55:32 +0100 Subject: [PATCH] =?UTF-8?q?perf(sd):=20unificar=20escritura=20de=20variabl?= =?UTF-8?q?es=20con=20snprintf=20Se=20reemplazan=20las=20m=C3=BAltiples=20?= =?UTF-8?q?llamadas=20secuenciales=20a=20=5FlogFile->print()=20por=20la=20?= =?UTF-8?q?construcci=C3=B3n=20de=20una=20cadena=20de=20texto=20=C3=BAnica?= =?UTF-8?q?=20en=20la=20RAM=20mediante=20snprintf.=20Esta=20refactorizaci?= =?UTF-8?q?=C3=B3n=20minimiza=20las=20operaciones=20de=20escritura=20sobre?= =?UTF-8?q?=20el=20bus=20SPI,=20reduce=20la=20latencia=20de=20guardado=20e?= =?UTF-8?q?n=20la=20SD=20y=20prepara=20la=20funci=C3=B3n=20flushToSD()=20p?= =?UTF-8?q?ara=20escalar=20a=20m=C3=BAltiples=20variables=20del=20veh?= =?UTF-8?q?=C3=ADculo=20sin=20riesgo=20de=20bloquear=20los=20ciclos=20de?= =?UTF-8?q?=20CPU=20del=20microcontrolador.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data_processor.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/data_processor.cpp b/src/data_processor.cpp index 9b638b1..bfc23b1 100644 --- a/src/data_processor.cpp +++ b/src/data_processor.cpp @@ -150,18 +150,19 @@ void DataProcessor::flushToSD() { // Verificamos que los punteros existan Y que el archivo esté abierto if (_sd && _logFile && _logFile->isOpen()) { -// 1. Escribimos al BUFFER (RAM) - Esto es instantáneo (microsegundos) - _logFile->print(millis()); - _logFile->print(","); - _logFile->println(car.ect); + // 1. ESTRUCTURACIÓN EN RAM (El método snprintf) + // Reservamos 128 bytes de memoria temporal. + char buffer[128]; + + // 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 - // 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 + _logFile->sync(); _last_sync_time = millis(); - // Serial.println("[SD] Sync realizado"); // Descomentar solo para debug } } -} +} \ No newline at end of file