← Fundamentos de Sistemas Embebidos
Clase 05
M.C. José Mauricio Matamoros de María y Campos · 9 sep 2026 · Tema 2 (continuación) — Mapas de memoria (ESP32, RP2040, ARM Cortex-M v6M), registros y periféricos (AVR/Arduino), bootloader y secuencia de arranque, espacio virtual vs físico, SRAM vs DRAM (arquitectura física, refresco, disipación térmica). Omisión intencional de interrupciones.
En corto
- Registros AVR/Arduino: 32 registros generales (ALU) · 64 registros de periféricos (puertos, timers, ADC) · 416 registros I/O externos (0x60–0xFF) · 8 KB SRAM base.
- Mapas de memoria: ESP32 (tablas hash O(1) en ROM para sin/cos) · RP2040 (intercalado por retrocompatibilidad) · ARM Cortex-M (mapa del núcleo vs. del integrado).
- Bootloader: programa en ROM base que energiza, configura bus SPI, copia Kernel a RAM, cede control.
- Espacio virtual vs físico: Kernel/Usuario en RAM · /sys, /proc, /dev = directorios virtuales del kernel · segfault si se escribe en dirección 0x0 (Kernel).
- SRAM (Caché): 6 transistores/bit, sin refresco, muy rápida, cara, alto calor (escribir '0' = drenar energía).
- DRAM (RAM principal): 1 transistor + capacitancia/bit, refresco cada ~60 ms, 6x más densa, económica, menor calor.
🎯 Para el examen
- SRAM vs DRAM: estructura (transistores/capacitancia), necesidad de refresco, velocidad, densidad, costo, disipación térmica.
- Causa del intercalado en mapas: retrocompatibilidad entre versiones de silicio (RP2040 vs. RP2350).
- Mapa ARM Cortex-M v6M: 1 GB periféricos externos · 0.5 GB periféricos internos · 0.5 GB RAM integrada · 0.5 GB Flash.
- Bootloader: programa grabado en ROM base que inicializa buses, carga kernel desde almacenamiento externo a RAM.
- Segfault: violación de acceso a memoria (escribir en dirección 0x0 protegida por kernel) → proceso terminado por SO.
- Tablas hash en ROM: búsqueda O(1) para funciones trigonométricas precalculadas (ESP32).
- Espacio virtual: /sys, /proc, /dev = estructuras en RAM, no en disco, generadas dinámicamente por kernel.
Registros y Periféricos en AVR / Arduino
Arquitectura de registros en AVR (8-bit, usado en Arduino UNO/Nano):
- 32 registros de propósito general (R0–R31): sobre los que opera la ALU (suma, multiplicación, lógica, desplazamientos). Ancho: 8 bits cada uno.
- 64 registros de periféricos (0x20–0x5F): puertos digitales (PORTB, PORTC, PORTD), timers (TCCR0, OCR0A/B), ADC (ADCL, ADCH, ADMUX, ADCSRA), comparador analógico, SPI, UART.
- 416 registros de entrada/salida externa (0x60–0xFF): acceso a periféricos externos via el bus AVR (dirección de I/O).
- SRAM integrada: 8 KB en Arduino UNO (ATMEGA328P), ampliable hasta 64 KB mediante buses de memoria externa.
Comparativa: Programación a nivel registro vs. bibliotecas:
- Con bibliotecas (digitalWrite, analogRead): sintaxis sencilla pero abstraída, más lenta (funciones compiladas, validaciones).
- Con registros directos (PORTB |= (1 << 5)): control granular, velocidad máxima, conocimiento profundo de la arquitectura, código poco portable.
Mapa de Memoria del ESP32
Características principales:
- Separación de buses: bus de datos (DAB, Data Address Bus) y bus de instrucciones (IAB, Instruction Address Bus) independientes, permitiendo acceso simultáneo (arquitectura Harvard).
- ROM con tablas de dispersión (Hash): para operaciones que requieren funciones matemáticas (seno, coseno, tangente), almacena tablas precalculadas en ROM.
Búsqueda en tablas (Análisis de complejidad):
- Búsqueda lineal: O(N) — recorre elemento por elemento, peor caso al final de la tabla.
- Búsqueda binaria: O(log₂ N) — requiere datos ordenados, realiza saltos dividiendo el rango a la mitad cada iteración.
- Tabla hash (dispersión): O(1) — calcula directamente el índice mediante la función i = g(dato). En ESP32 requiere solo ~3 multiplicaciones enteras rápidas.
Ventaja en sistemas embebidos: búsqueda en tiempo constante O(1) permite evaluar seno/coseno para ángulos arbitrarios sin latencia impredecible.
Mapa de Memoria del RP2040 — Intercalado por Retrocompatibilidad
Problema de compatibilidad: cuando se lanza una segunda versión de un microcontrolador (RP2350) con mayor capacidad de RAM (512 KB vs. 264 KB en RP2040), cambiar las direcciones de memoria físicas rompe todos los programas existentes compilados para la versión anterior.
Solución: Intercalado de bloques de memoria: en lugar de colocar los nuevos bloques de RAM encima de los existentes, se añaden debajo de los periféricos ya asignados, generando traslapes e intercalado en el mapa de direcciones.
Beneficio: los programas antigüos que usan direcciones específicas siguen funcionando, pues los bloques viejos permanecen en sus posiciones originales. Los nuevos bloques se insertan en espacios previamente no utilizados.
Rango reservado/prohibido: ciertas direcciones del mapa están reservadas y no pueden accederse para evitar colisiones con periféricos o memoria del sistema.
Mapa del Núcleo ARM Cortex-M (v6M) — Especificación de Direccionamiento
Distinción entre dos mapas:
- Mapa del núcleo (Cortex-M v6M): especificación arquitectónica que define qué rangos de dirección están reservados para qué funciones (periféricos, RAM, Flash).
- Mapa del integrado (ej. STM32F4, RP2040): implementación física específica del fabricante, que puede variar ligeramente pero respeta la especificación del núcleo.
Distribución de espacios en Cortex-M v6M (rango 0x00000000–0xFFFFFFFF = 4 GB):
- 0x00000000–0x1FFFFFFF (512 MB): código (Flash/ROM) y datos (RAM) integrados. Típicamente Flash en la mitad baja, RAM en la mitad alta.
- 0x20000000–0x3FFFFFFF (512 MB): RAM integrada (SRAM del microcontrolador).
- 0x40000000–0x5FFFFFFF (512 MB): periféricos internos (timers, GPIO, ADC, UART, SPI, I2C, etc.).
- 0x60000000–0x7FFFFFFF (512 MB): periféricos externos (conectados via buses externos).
- 0xE0000000–0xFFFFFFFF (512 MB): componentes del sistema (SysTick, NVIC, Debug).
Secuencia de Arranque (Bootloader)
¿Qué sucede al energizar un procesador embebido?
- CPU comienza a ejecutar instrucciones desde la dirección 0x00000000 (reseteo).
- En esa dirección reside el bootloader, un pequeño programa grabado en una ROM interna no volátil (BootROM).
- El bootloader no encontrará el sistema operativo (Kernel) en RAM, pues la RAM se vuelve inútil al apagar (memoria volátil).
Función del bootloader (Raspberry Pi / ARM Cortex-A como ejemplo):
- Inicializa el procesador: registros de control, interrupciones, caché.
- Configura el periférico del bus SPI (Serial Peripheral Interface) para comunicar con la tarjeta microSD.
- Lee el archivo de kernel (vmlinux o Image) desde la microSD y lo copia a la RAM principal.
- Salta a la dirección de memoria donde comenzará el Kernel y le cede el control de la máquina.
En microcontroladores (Arduino, ESP32): el bootloader es minimal, pues típicamente la aplicación completa reside en Flash interna. El bootloader solo copia el programa de Flash a RAM (si es necesario) y lo ejecuta.
Analogía: al despertar una persona con amnesia severa, necesita que alguien le diga quién es, dónde está y cuáles son sus funciones. El bootloader cumple esa función para el procesador.
Espacio Virtual vs. Espacio Físico — Directorios Virtuales del Kernel
En sistemas Linux embebidos:
- Espacio de usuario: 0x00000000–0x7FFFFFFF (en arquitecturas de 32 bits con MMU). Direcciones lógicas vistas por el programa compilado.
- Espacio del kernel: 0x80000000–0xFFFFFFFF. Protegido, solo accesible en modo kernel (anillo 0). Contiene el kernel de Linux, drivers, caché de disco, estructuras de datos del SO.
Sistemas de archivos virtuales (NO existen en disco físicamente):
- /sys: reflejo del árbol de dispositivos del kernel. Contiene buses PCI, USB, controladores de red, información de térmica del procesador.
- /proc: información de procesos en ejecución (/proc/[PID]/maps, /proc/cpuinfo, /proc/meminfo). Generado dinámicamente en RAM.
- /dev: nodos de dispositivos (block devices como /dev/sda1, character devices como /dev/ttyUSB0) que permiten acceso a hardware.
Segmentation Fault (Segfault):
int *s = NULL;
s = 1; // Intenta escribir en dirección 0x00000000
- El puntero `s` apunta a nulo (dirección 0).
- Al asignarse `1`, la instrucción intenta escribir en la dirección 0x00000000.
- Esa dirección aloja el Kernel del SO en el espacio físico, protegida por la MMU (Memory Management Unit).
- El SO intercepta el acceso, termina el proceso y emite: "Segmentation fault".
Clasificación de Memorias: SRAM vs. DRAM
SRAM (Static RAM — Memoria de Acceso Aleatorio Estática):
- Estructura física: 6 transistores MOSFET por bit (celda SRAM estándar).
- Voltaje de almacenamiento: mantiene el estado lógico mientras hay energía (muy estable).
- Velocidad: extremadamente rápida (limitada solo por la velocidad de conmutación del transistor, ~1–5 ns).
- Refresco: NO requiere refresco periódico (información persistente).
- Densidad: baja (6 transistores por bit ocupan mucho espacio en silicio).
- Costo: muy caro (por unidad de densidad).
- Disipación térmica: ALTA. Escribir un '0' requiere drenar activamente la energía del transistor a tierra (GND), disipando calor como \(P = I^2 R\).
- Aplicación típica: caché del procesador (L1, L2, L3), SRAM integrada en microcontroladores, buffers de dispositivos.
DRAM (Dynamic RAM — Memoria de Acceso Aleatorio Dinámica):
- Estructura física: 1 transistor + 1 capacitancia parásita por bit (DRAM de 1T1C).
- Almacenamiento de carga: el bit se almacena como carga eléctrica en el capacitor (voltaje alto = '1', voltaje bajo = '0').
- Pérdida de carga (Leakage): la carga del capacitor se fuga gradualmente por corrientes de fuga inversa del transistor (~microsegundos a milisegundos).
- Refresco obligatorio: cada ~60 ms, debe inyectarse un pulso de refresco para restaurar la carga en cada celda.
- Velocidad: más lenta que SRAM (~10–50 ns, limitada por latencia del capacitor y procesos de refresco).
- Densidad: ALTA (1 transistor + capacitor ocupa 6 veces menos espacio que 6 transistores SRAM).
- Costo: muy económico (miles de millones de celdas por chip).
- Disipación térmica: BAJA. El refresco consume energía, pero menos que SRAM en operaciones de escritura masivas.
- Aplicación típica: RAM principal de computadoras (DDR, DDR2, DDR3, DDR4, DDR5), DRAM en sistemas embebidos de gama media/alta.
Curva de Respuesta Temporal en DRAM:
- Al aplicar un pulso corto a la base del transistor DRAM, el capacitor se carga rápidamente.
- El voltaje se mantiene en una región lógica utilizable ('1' si está por encima de cierto umbral).
- Pasados ~60 ms, la carga se disipa y el voltaje entra en una zona analógica indeterminada (ya no es lógico '1' ni '0').
- Por ello, circuitos de refresco externos pulsan todas las celdas DRAM cada 60 ms para regenerar la carga.
Comparativa de Temperatura según Tipo y Capacidad de RAM:
- Arduino UNO (8 KB SRAM): disipación imperceptible, temperatura cercana a ambiente.
- RP2040 (264 KB SRAM): temperatura operativa ~50 °C bajo uso normal.
- Procesadores Intel (4 MB+ caché SRAM): calentamiento severo (80–100 °C), requiere disipador y ventilador de CPU.
- Evolución RP2040 → RP2350 (2023): aumento de SRAM integrada de 264 KB a 512 KB, incremento de densidad y temperatura (~60–70 °C esperado).
Contexto — no examen
- (Contexto) Filtros de RH y la palabra "Arduino": el profesor explicó que incluir "Arduino" en CV para puestos de ingeniería en empresas como Bosch o Siemens provoca descarte automático por filtros de Recursos Humanos. Asimismo, criticó el uso de ChatGPT para redactar currículums, pues genera métricas infladas (nivel "Senior" para perfiles "Junior").
- (Contexto) Anécdota: Estudiante de Artes Plásticas e Inteligencia Artificial: relató que mientras trabajaba con el Dr. Savage, un estudiante de maestría proveniente de artes plásticas (sin formación matemática de robótica) impartía talleres donde niños de 12–15 años programaban motores en Arduino sin problemas. Usó este ejemplo para exhortar a los alumnos de 9no semestre a no quejarse de la dificultad de la Práctica 6 (Lectura del ADC).
- (Contexto) Origen histórico de "DEBUG": en memorias antiguas (1960s–1970s) se usaban bulbos incandescentes como elementos de almacenamiento (100–600 W por bit). El calor atraía cucarachas y arañas que se rostizaban sobre los bulbos apagados, volviéndose conductoras y causando cortocircuitos. El personal de mantenimiento debía entrar literalmente con trapo y plumero a "de-bug" (sacar bichos). De ahí el término usado hoy para búsqueda de errores.
- (Contexto) Amnesia del procesador al despertar: el profesor comparó el arranque del procesador con despertarse de una resaca severa sin recordar quién es, dónde está ni cuáles son sus funciones. El bootloader cumple la función de "decirle" al procesador quién es y qué debe hacer.
- (Contexto) Fallo de Copilot (IA) en Windows kernel: relató que Copilot eliminó accidentalmente 2 líneas de código del kernel de Windows encargadas del monitoreo de temperatura de núcleo (presente desde MS-DOS). Esto provocó que la actualización de abril de 2024 ignorara el control térmico, quemando/fundiendo procesadores en miles de máquinas.
Pendiente / próximas clases
- Tema 2 — Sección 3 (Control de Interrupciones): omitida intencionalmente en esta clase para priorizar mapas de memoria. Se abordará en sesiones posteriores.
- Memorias No Volátiles: clasificación de memorias permanentes (Flash/SSD, magnéticas, ópticas). Próxima clase.
- Prácticas evaluables: Práctica 6 (ADC en Arduino) — el profesor enfatizó que alumnos de 9no semestre deben poder resolverla sin excusas. Práctica 8 (Compilación kernel Linux personalizado con boot splash custom en Raspberry Pi).