DÍA 008 DE 365

Fase 1: Fundamentos de C y Lógica de Software

📖 Teoría Explícita: El Modificador `static` y el Mapa de SRAM

1. Variables Locales (El Stack)

Cuando creas una variable estándar dentro de una función (ej. uint32_t volumen = 0;), esta variable nace y muere con la función. El microcontrolador la almacena temporalmente en una zona de la memoria RAM llamada Stack (Pila). En el momento en que la función termina con un return, esa dirección de memoria se libera y se sobrescribe. No sirve para acumular datos.

2. Variables Globales (El Peligro del `.BSS` / `.DATA`)

Si la declaras fuera de cualquier función, vive para siempre en una sección estática de la memoria. Conservará los litros acumulados. Sin embargo, su "alcance" (Scope) es público. Significa que cualquier otra función en cualquier otro archivo podría modificarla accidentalmente, causando una catástrofe en la facturación.

3. La Solución: Variables `static` Locales

Al agregar la palabra static antes de una variable local (ej. static uint32_t volumen = 0;), cambias su anatomía a bajo nivel. Físicamente, el compilador la saca del efímero Stack y la guarda en la sección permanente de la memoria (igual que una global). Mantiene su valor de por vida. Pero lógicamente, sigue estando encapsulada dentro de la función. Ninguna otra parte del código sabe siquiera que existe.

COMPORTAMIENTO DE MEMORIA SRAM: LOCAL VS GLOBAL VS STATIC SRAM MAP STACK (Memoria Temporal) Variables Locales HEAP (PROHIBIDO) .DATA / .BSS (Memoria Permanente) Globales & Statics uint32_t vol_local = 0; Se destruye y vuelve a 0 en cada llamada a la función. uint32_t vol_global = 0; (Fuera de la función) Persiste, pero cualquier archivo puede alterarla (Riesgo). static uint32_t vol_seguro = 0; Persiste en RAM, pero su alcance (Scope) es PRIVADO.

⚙️ Ejercicios Prácticos: Código C Estricto

Ejercicio 1: El Totalizador Seguro. Vamos a crear una función metrológica que reciba los nuevos pulsos leídos desde la interrupción del flujómetro, los sume a la cuenta histórica, y devuelva el total. Al usar static, eliminamos por completo la necesidad de variables globales.


#include <stdint.h>

// --- Configuración Metrológica ---
// Constante que define que 1 pulso = 15 mL (Aritmética en Punto Fijo)
#define ML_POR_PULSO 15

/**
 * @brief  Totalizador protegido de volumen de Gas LP.
 * @param  nuevos_pulsos: Cantidad de pulsos recién detectados por el hardware.
 * @param  reiniciar_contador: Si es true (1), formatea el contador a cero (Fin de venta).
 * @return El volumen actual acumulado en mililitros exactos.
 */
uint32_t Gestionar_Volumen_Despacho(uint16_t nuevos_pulsos, uint8_t reiniciar_contador) {
    
    // VARIABLE PROTEGIDA (El tesoro del despachador)
    // El modificador 'static' asegura que al salir de la función, 'volumen_acumulado'
    // NO se borre. Sin embargo, nadie fuera de estas llaves { } puede alterar su valor.
    static uint32_t volumen_acumulado = 0;
    
    // 1. Comando de reinicio forzado (Ej. Inicio de un nuevo despacho para un cliente)
    if (reiniciar_contador == 1) {
        volumen_acumulado = 0;
        return 0;
    }
    
    // 2. Acumulación segura
    // Multiplicamos los pulsos por nuestra constante en enteros puros.
    // Esto evita desastres de latencia o truncamientos matemáticos.
    uint32_t volumen_ingresante = (uint32_t)nuevos_pulsos * ML_POR_PULSO;
    volumen_acumulado += volumen_ingresante;
    
    // 3. Retornar una COPIA del valor actual.
    // La pantalla HMI o el módulo ESP32 pueden leer este número, 
    // pero nunca alterarlo directamente en memoria.
    return volumen_acumulado;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Hito Logrado: Protección arquitectónica de datos metrológicos contra corrupción de memoria.

Al migrar arquitecturas desde familias simples (como el Freescale MC9S08) hacia procesadores más avanzados (NXP Kinetis o STM32 ARM Cortex-M), el control de la memoria cambia drásticamente. Al usar static en lugar de variables globales, aseguras que los datos de facturación de tu despachador sean invulnerables a problemas de "Código Espagueti" o a interferencias de programadores junior que toquen la base de código. Tienes un "Módulo Negro" de facturación: solo entran pulsos y solo salen mililitros validados.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. Si llamamos a la función Gestionar_Volumen_Despacho(2, 0) tres veces consecutivas, ¿cuál será el valor devuelto en la tercera llamada?
Respuesta: Asumiendo ML_POR_PULSO = 15, cada llamada ingresa 30 mL (2 pulsos).
Llamada 1: Suma 30 mL, retorna 30.
Llamada 2: Como es static, recuerda el 30 anterior, suma 30, retorna 60.
Llamada 3: Recuerda el 60, suma 30, retorna 90. Si la variable no fuera `static`, siempre habría retornado 30.