DÍA 347 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

La Inyección de Fallos (Fault Injection)

En la validación de sistemas de misión crítica, no basta con probar que el sistema hace lo que debe hacer bajo condiciones normales. El Fault Injection (Inyección de Fallos) es una técnica donde el ingeniero introduce deliberadamente errores en el hardware o software para observar el comportamiento de las defensas. En nuestra tesis, la defensa principal ante un colapso es el Independent Watchdog (IWDG) acoplado al Continuous Journaling (Día 335).

El "Deadlock" Simulado

Para demostrar esto en vivo ante el comité, no vamos a frotar un globo en la placa para generarle estática. Vamos a programar una función oculta que deshabilite globalmente las interrupciones del ARM Cortex-M4 (__disable_irq()) y entre en un bucle infinito (while(1)). Esto simula el peor escenario posible: un Deadlock donde ni siquiera el SysTick del procesador funciona. Ante los ojos del jurado, la máquina parecerá completamente muerta... hasta que el perro guardián (Watchdog) muerda.

GUION DE DEFENSA: SECUENCIA DEL CRASH TEST EN VIVO TIEMPO (Segundos) 1. OPERACIÓN NORMAL Válvula ABIERTA Conteo en Pantalla: 15.2 L SRAM Journaling Activo 2. EL SABOTAJE (INYECCIÓN) "Pulsar Botón Oculto" Interrupciones OFF Pantalla CONGELADA (17.5 L) Válvula CERRADA (Hardware) Silencio de 2 Segundos 3. HARDWARE RESET IWDG Timeout Reached Sistema Reinicia Brutalmente 4. RESURRECCIÓN INSTANTÁNEA Lee SRAM Backup Salta Boot Screen Válvula ABIERTA (17.5 L) EL JURADO SOLO VE: La pantalla parpadea un instante y la venta continúa. Prueba irrefutable de que un fallo de software no provoca pérdidas de dinero.

⚙️ Procedimiento Práctico: El Guion de la Defensa

Paso 1: El Setup Narrativo (Pre-Strike).
Durante tu defensa, mientras proyectas el Diagrama Maestro (Día 346), le dices al jurado: "La teoría dicta que el sistema es resiliente. Permítanme demostrarlo empíricamente. Iniciaremos un despacho de gas. Observen cómo fluye el volumen en la pantalla." Activas la máquina, el contactor suena "Clack!" y la válvula abre.

Paso 2: La Ejecución (The Strike).
A mitad del despacho (ej. a los 10 litros), dices: "En este momento, simularé que una descarga electromagnética masiva (EMI) ha corrompido el bus y el procesador ha entrado en un estado de Deadlock (bucle infinito). Nada responde." Presionas el botón secreto en la placa. La pantalla se congela. El jurado observa un silencio de 2 segundos.

Paso 3: El Triunfo (The Recovery).
A los dos segundos exactos, el Watchdog asesina al STM32. La máquina reinicia, y gracias a tu código del Día 335, no muestra el logo de bienvenida. Lee la memoria SRAM de inmediato, detecta que estaba a mitad de una venta, recupera los 10 litros en la pantalla y reabre la válvula al instante. Dices: "El Hardware Watchdog purgó el error, y el Continuous Journaling recuperó el estado. La venta no se perdió, el cliente no lo notó, la gasera está a salvo. Gracias."

💻 Firmware: La Rutina de Inyección de Fallos (Fault Injection)

Este código debe vincularse a un botón de la máquina que normalmente no se usa durante un despacho (por ejemplo, mantener presionado "CANCELAR" y "ARRIBA" simultáneamente). Es exclusivo para pruebas de tesis y debe borrarse del Golden Master antes de la producción real.


/**
 * @file thesis_fault_injection.c
 * @brief Simulación controlada de un colapso catastrófico del software (Deadlock)
 */

#include "stm32f4xx_hal.h"
#include <stdio.h>

// =========================================================================
// FAULT INJECTION (SABOTAJE DEL SISTEMA)
// =========================================================================
/**
 * @brief Simula un cuelgue crítico (Ej. EMI corrompe el Program Counter).
 * Deshabilita todas las interrupciones, cortando el oxígeno al procesador.
 * Esto forzará al IWDG (Independent Watchdog) a reiniciar la placa.
 */
void Simulate_Catastrophic_Deadlock(void) {
    
    printf("\r\n[CRASH TEST] Iniciando Inyección de Fallo en 3, 2, 1...\r\n");
    
    // 1. Apagamos la válvula manualmente para evitar un derrame real durante 
    // los 2 segundos que el procesador estará muerto antes del reinicio del WDT.
    // (Por seguridad de hardware, el Watchdog cortará este pin de todas formas,
    // pero apagamos aquí para garantizar estado seguro inmediato).
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); 
    
    // 2. Apagamos la luz de fondo de la pantalla (Backlight) para dar un efecto
    // visual dramático al jurado de que la máquina "murió".
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

    // 3. EL GOLPE LETAL: Deshabilitamos el controlador global de interrupciones (NVIC).
    // A partir de esta línea, el procesador queda sordo. Ni siquiera el SysTick 
    // (HAL_GetTick) funcionará. El procesador es un zombie.
    __disable_irq();
    
    // 4. EL DEADLOCK: Entramos en un bucle infinito del que es imposible salir.
    // La única entidad capaz de sacarnos de aquí es el hardware físico del IWDG, 
    // cuyo reloj RC interno de 32kHz es invulnerable a __disable_irq().
    while(1) {
        // ... Esperando el mordisco del perro guardián ...
        // (Típicamente configurado a 2000 ms en la inicialización)
    }
}

// =========================================================================
// LISTENER DEL BOTÓN DE SABOTAJE (En el Main Loop)
// =========================================================================
void Check_For_Crash_Test_Command(void) {
    // Si el usuario mantiene pulsados los botones Cancelar y Arriba por > 2 seg
    if (HAL_GPIO_ReadPin(GPIOC, BTN_CANCEL) == GPIO_PIN_RESET && 
        HAL_GPIO_ReadPin(GPIOC, BTN_UP) == GPIO_PIN_RESET) {
        
        // Ejecutar el colapso
        Simulate_Catastrophic_Deadlock();
    }
}
        

🚀 Cierre Triunfal: El "Drop The Mic" Académico

Objetivo del día: Validación Visual Irrefutable y Dominio Escénico.

La ingeniería no solo trata de hacer que las cosas funcionen, trata de generar confianza. Un inversor o un jurado académico no siempre entiende los detalles del código fuente que escribiste durante 340 días, pero entienden perfectamente la resiliencia cuando la ven en vivo. Al programar la inyección `__disable_irq()` y ejecutar un bucle infinito provocado a voluntad, estás demostrando un control absoluto sobre la máquina.

Este "Crash Test" es la prueba viviente de tu **Marco Teórico (Día 341)** y de tu **Arquitectura Lógica (Día 343)**. Cuando la máquina recupere el estado de la memoria SRAM y reabra la válvula al instante tras un reinicio físico catastrófico, no habrá pregunta teórica que el jurado pueda hacerte que no hayas respondido ya con hardware puro. Este es el momento de recoger tu título de Ingeniería con Honores.

📝 Resumen del Día