Escribir código que "funcione" es solo la primera mitad del trabajo de un ingeniero de firmware. En la industria, el código que controla maquinaria pesada o fluidos a presión (como el Gas LP) debe ser auditable, escalable y mantenible. A este proceso de mejora interna, sin cambiar el comportamiento externo, se le llama Refactorización.
Una revisión técnica estricta busca erradicar "Código Espagueti" (lógica entrelazada), eliminar "Números Mágicos" (valores literales en el código sin explicación) y establecer una Arquitectura Modular. Además, en sistemas críticos automotrices e industriales, se siguen estándares como MISRA-C, que prohíbe ciertas prácticas de C que son propensas a errores silenciosos.
if(presion > 250), nadie sabrá si 250 son PSI, bares o pulsos crudos del ADC. Reemplázalos siempre por directivas #define MAX_PRESION_PSI 250 o const.GPIOA->ODR = 1;). Debe llamar a una función semántica (ej. bomba_encender();) que viva en un archivo de capa inferior (Driver/HAL).Ejercicio 1: Analiza el siguiente bloque de código. Representa una refactorización donde pasamos de un "código espagueti" acoplado, a un firmware industrial limpio, semántico y modular usando macros y abstracción.
#include <stdint.h>
#include <stdbool.h>
// =========================================================================
// ❌ ANTES (Código Espagueti Amateur - NO HACER)
// =========================================================================
/*
void despachar_gas_malo(uint16_t adc_val) {
// ¿Qué es 3500? ¿Qué es PORTB? Pésima legibilidad.
if (adc_val > 3500) {
PORTB &= ~(1 << 4);
} else {
PORTB |= (1 << 4);
}
}
*/
// =========================================================================
// ✅ DESPUÉS (Arquitectura Modular Profesional)
// =========================================================================
// --- 1. ARCHIVOS DE CONFIGURACIÓN (config.h) ---
#define UMBRAL_PRESION_MAX_ADC 3500 // Límite de seguridad de 85% de llenado
#define ESTADO_SEGURO_OFF 0
#define ESTADO_ACTIVO_ON 1
// --- 2. CAPA DE DRIVERS DE HARDWARE (valvula_driver.c) ---
// Esta función abstrae el silicio del STM32/ESP32. Si mañana cambias
// de microcontrolador, SOLO modificas esta función.
void driver_valvula_principal_set(uint8_t estado) {
if (estado == ESTADO_ACTIVO_ON) {
// Pseudo-código de hardware
// GPIOB->BSRR = (1 << 4);
} else {
// GPIOB->BSRR = (1 << 20); // Reset pin
}
}
// --- 3. CAPA DE APLICACIÓN LOGICA (control_gas.c) ---
// Lógica pura. Entendible por cualquier ingeniero que la lea.
bool evaluar_seguridad_tanque(uint16_t lectura_actual_adc) {
if (lectura_actual_adc >= UMBRAL_PRESION_MAX_ADC) {
return false; // Peligro
}
return true; // Seguro
}
void despachador_maquina_estados(uint16_t sensor_adc) {
if (evaluar_seguridad_tanque(sensor_adc) == false) {
// Cierre inmediato, código semántico
driver_valvula_principal_set(ESTADO_SEGURO_OFF);
// disparar_alarma_visual();
} else {
// Operación normal
driver_valvula_principal_set(ESTADO_ACTIVO_ON);
}
}
// --- PUNTO DE ENTRADA ---
int main(void) {
while(1) {
uint16_t adc_crudo = 3600; // Simulación de lectura del sensor
despachador_maquina_estados(adc_crudo);
}
return 0;
}
Objetivo del día: Aseguramiento de Calidad y Trazabilidad del Código.
Tu sistema industrial de medición de Gas LP constará de miles de líneas de código en C repartidas entre FreeRTOS, drivers de I2C, rutinas de interrupción y cálculos de punto fijo[cite: 6]. Si mezclas los cálculos del precio a pagar con los comandos de hardware que encienden el motor trifásico, el día que ocurra un "bug" (ej. un cobro incorrecto), tendrás miedo de tocar el código por temor a provocar una explosión física de los relés.
Al implementar esta limpieza y separación en capas, logras un firmware Hardware Agnostic (Independiente del Hardware). La lógica matemática del gas vivirá en funciones puras que puedes compilar y probar matemáticamente en tu PC (Test Unitario). Solo la capa inferior (Drivers) interactuará con la PCB física diseñada en KiCad[cite: 6]. Esta es una práctica requerida si buscas certificar tu equipo bajo normativas internacionales.
1. ¿Por qué es peligroso dejar código comentado (código muerto) dentro de la versión final del firmware?
Respuesta: Además de generar ruido visual, el código muerto confunde a futuros desarrolladores (o a ti mismo meses después), ya que no queda claro si ese bloque fue deshabilitado temporalmente por una prueba o porque causaba un fallo grave. El historial de versiones (Git) existe para guardar código viejo; el archivo principal de tu tesis debe estar impecable.
2. ¿Qué es el Análisis Estático de Código?
Respuesta: Es el uso de herramientas de software (como Cppcheck, SonarQube o los "Linters" integrados en los IDE) que leen tu código fuente sin ejecutarlo para encontrar posibles desbordamientos de buffer, variables no utilizadas y violaciones a estándares como MISRA-C, ayudando a limpiar el código de forma automatizada antes de compilarlo.