DÍA 009 DE 365

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

📖 Teoría: La Llave de la Memoria SRAM

Toda variable que declaras ocupa un "casillero" físico en la memoria SRAM (por ejemplo, en un ARM Cortex-M, podría ser la dirección 0x20000004). Un puntero es una variable especial cuyo único propósito es almacenar esa dirección hexadecimal.

Para manipular la memoria a bajo nivel, utilizamos dos operadores fundamentales:

⚙️ Procedimiento: Acceso Directo al Hardware

Cuando necesitas enviar el volumen de gas desde tu núcleo metrológico hacia el módulo de transmisión UART, no debes hacer una copia de la variable. El Paso por Referencia inyecta el operador & en la llamada a la función, entregando únicamente las coordenadas. La función receptora utilizará el * para leer el dato en crudo, evitando por completo librerías pesadas o la sobrecarga del Stack.

LECTURA POR DIRECCIÓN (PUNTEROS EN SRAM) VARIABLE ORIGINAL volumen_crudo Valor: 1045 Dir: 0x20000004 PUNTERO (REFERENCIA) uint32_t *ptr_vol Apunta a: 0x20000004 Dir Propia: 0x20000008 *ptr_vol Lectura: uint32_t dato_leido = *ptr_vol; El procesador viaja a la dirección y extrae el 1045 directamente.

💻 Código C: Telemetría por Referencia

Aislar el dato y extraerlo sin el uso de funciones pesadas previene la fragmentación de la memoria RAM, un estándar crítico en microcontroladores con recursos limitados.


#include <stdint.h>

// --- Simulación de la variable encapsulada del Día 8 ---
static uint32_t volumen_acumulado = 1045; // Ej: 1045 mililitros

/**
 * @brief Extrae el volumen de gas mediante el paso por referencia.
 * @param ptr_destino Puntero a la variable donde depositaremos el dato.
 */
void Obtener_Lectura_Volumen(uint32_t *ptr_destino) {
    // Verificamos que el puntero no sea nulo (Hard Fault prevention)
    if (ptr_destino != 0x00) {
        // Usamos el asterisco (*) para depositar el dato en la RAM apuntada
        *ptr_destino = volumen_acumulado; 
    }
}

// =====================================================================
// RUTINA DE TRANSMISIÓN (Simulación de UART/Telemetría)
// =====================================================================
void Rutina_Transmision_UART(void) {
    // Variable local en el Stack para almacenar la lectura temporal
    uint32_t buffer_tx = 0;
    
    // Le pasamos la DIRECCIÓN (&) de nuestro buffer local a la función.
    // La función viajará a esa dirección y escribirá el dato directamente.
    Obtener_Lectura_Volumen(&buffer_tx);
    
    // Aquí, buffer_tx contiene el valor 1045 de forma segura y aislada.
    // Procedemos a enviar el dato por el puerto serial a nuestro ESP32...
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Hito Logrado: Extracción de datos de telemetría mediante punteros seguros.

Dominar los operadores & y * elimina la necesidad de variables globales inseguras o la duplicación ineficiente de memoria. Esta técnica te permite leer los registros de metrología del hardware directamente desde la tarea de telemetría con cero latencia adicional, asegurando que el flujo de gas se reporte al servidor remoto con precisión matemática y sin saturar el Stack.

📝 Resumen del Día