← Fundamentos de Sistemas Embebidos
Clase 02
M.C. José Mauricio Matamoros de María y Campos · 31 ago 2026 · Tema 2 — Organización, arquitectura y plataformas · arquitecturas RISC vs. CISC recorriendo PIC, AVR, ESP32, RP2040/Cortex-M e Intel x86; memoria caché y el cuello de botella CPU–RAM.
En corto
- RISC: memoria de programa y de datos separadas (Harvard), catálogo ~1000 instrucciones, todas simples y de ancho fijo, casi todo es load/store a través de un registro. Verboso, pero el pipeline lo compensa.
- CISC (Intel x86, heredero del 8086 / IA-32): instrucciones complejas de ancho variable, millones de combinaciones, operan directo sobre memoria.
- Direccionamiento por potencias de 2: bus de datos de 8 bits → 2⁸ = 256 bytes de RAM; bus de programa de 14 bits → 2¹⁴ = 16 K.
- En µC con pila chica (PIC: 8 niveles, fuera de la RAM) no se usa recursión → stack overflow.
- Caché = "almacenamiento en proxy": copiar lo más usado a un medio más rápido y cercano. En multinúcleo es obligatorio tener ≥ 2 niveles (L1+L2 por núcleo, L3 global) para evitar colisiones sobre la RAM lenta.
- Elegir Cortex-M por costo e infraestructura: M0 barato sin FPU · M3 multiplica · M4/M7 FPU nativa · M7 además DSP/vectores.
- Intel moderno = CISC por fuera, RISC por dentro: un predecodificador parte cada instrucción CISC en micro-operaciones RISC.
🎯 Para el examen (lo que el profesor marcó explícito)
- Dominar de memoria las potencias de 2 para calcular direccionamiento: 2⁸=256, 2¹⁰=1024, 2¹¹=2048, 2¹²=4096, 2¹³=8192, 2¹⁴=16384 (16 K).
- No recursión en microcontroladores con pila pequeña (PIC = 8 niveles físicos, independientes de la RAM) → desbordamiento de pila inmediato.
- Saber elegir la familia Cortex-M según costo e infraestructura interna: M0 (~1 USD, sin FPU, flotantes por software) · M3 (hardware de multiplicación, divide por inverso multiplicativo) · M4 (FPU nativa, multiplica y divide flotante por hardware) · M7 (FPU + unidad vectorial / DSP).
- Caché como "almacenamiento en proxy" y la regla de mínimo dos niveles en procesadores multinúcleo para mitigar colisiones de acceso a la RAM.
- Práctica de mañana: la versión enfocada a Windows exige Raspberry Pi 3; no funciona en la Raspberry Pi 4.
RISC vs. CISC — el eje de la clase
| RISC (ARM, PIC, AVR…) | CISC (Intel x86) |
| Memoria | Programa y datos separados (Harvard) | Unificada; instrucciones operan directo sobre memoria |
| Catálogo | ~1000 instrucciones, ancho fijo | Millones de combinaciones de mnemónicos, ancho variable |
| Estilo | Casi todo load/store pasando por un registro/acumulador | Instrucciones complejas que hacen varias cosas a la vez |
| Costo | Muy verboso (más instrucciones por operación)… | Código más compacto… |
| …pero el pipeline vuelve ese costo irrelevante en rendimiento | …a cambio de un decodificador mucho más caro |
"La pata donde cojean" las RISC: todo trabajo aritmético pasa por un registro, lo que obliga a accesos constantes a memoria. El pipeline es lo que las hace competitivas.
Todos los Intel de escritorio están basados, por herencia, en la arquitectura del 8086 (80x86 / IA-32).
PIC — arquitectura RISC de 8 bits
AVR — el microcontrolador de Arduino
- También RISC: memoria de programa separada de la SRAM de datos.
- Diferencia clave con el PIC: 32 registros de propósito general en vez de un único acumulador W.
- Flujo para operar en la ALU: mover el dato de la SRAM a uno de los 32 registros → alimentar la ALU → el resultado vuelve a un registro o a la SRAM. Trabaja sobre registros, no sobre memoria directa. Direcciona hasta 8 K de RAM.
ESP32 — sistema integrado con red
- Núcleo RISC rodeado de mucho hardware dedicado: bloque de RF (WiFi), reloj de tiempo real, sensores, aceleración por hardware y criptografía. Todo ese "fierro" es lo que hace cómodo programar comunicaciones.
- La ROM no es memoria de programa: trae conectores JTAG para depuración externa y una memoria caché.
- Particularidad que rompe el Harvard estricto: datos e instrucciones van revueltos en una RAM común (SRAM / PSRAM). Se resuelve con una interfaz que lee de esa RAM unificada y separa el flujo: instrucciones → cola de instrucciones, datos → cola de datos, antes de entrar al núcleo.
- El decodificador SHA por hardware encripta el flujo de la RAM sin cargar la CPU → permite guardar llaves complejas (p. ej. claves de AWS de 256 bits) en memoria externa de forma segura.
- ISA: Xtensa / RISC-V.
Memoria caché y latencia de acceso
- Definición formal: caché = "almacenamiento en proxy" — copiar lo más frecuente a un medio más rápido y cercano.
- Disco vs. RAM: un HDD electromecánico ronda 100 MB/s; una DDR, 500 MB/s (5×). El disco arrastra retardo mecánico: posicionar la aguja en la pista, esperar el giro del plato, leer la tabla de contenidos, y repetir si el archivo está fragmentado. Copiar la tabla de contenidos y los archivos frecuentes a la DDR evita el giro físico.
- Caché "inteligente": reconoce el sistema operativo y los programas activos; mantiene una tabla reservada de los archivos y librerías más usados y los precarga a RAM al arrancar. En Linux: el kernel y los binarios básicos de
bash quedan en caché.
- Cuello de botella CPU–RAM: CPU a 4.2 GHz (overclock) con DDR4 a 2.6 GHz. Si cada instrucción tuviera que ir a la RAM, la CPU nunca correría a 4.2. Solución: caché interna a la velocidad del núcleo; se toca la RAM lenta una sola vez para traer un bloque grande (p. ej. 8 MB). Como un programa típico pesa ~500 KB, cabe entero en caché y el núcleo ejecuta a máxima velocidad.
- Multinúcleo: obligatorio un mínimo de dos niveles — L1 y L2 por núcleo, L3 global. La L1 se parte en L1-D (datos) y L1-I (instrucciones). Sin esto, los núcleos colisionan al acceder a la misma memoria.
RP2040 — Raspberry Pi Pico
- Periféricos: GPIO de propósito general, oscilador, conector de debugger, conector a memoria flash externa, periféricos programables (PIO) y regulador de voltaje interno.
- Dos procesadores + SRAM; la ROM es solo un periférico más.
- Colisión de acceso: con dos núcleos, ambos no pueden tocar la misma memoria a la vez → se diseñan bloques de memoria independientes por los que los núcleos se turnan.
- Núcleo: ARM Cortex-M0+ (RISC — Advanced RISC Machine). Tiene caché de instrucciones, pero sigue mezclando datos en la misma memoria interna.
- Bloques internos del Cortex-M0+: controlador de interrupciones (NVIC), controlador para despertar del modo sleep, MPU (unidad de protección de memoria), conmutador de bus (crossbar), GPIO rápido, verificador de datos, unidad de breakpoints, tabla de traducción, puerto JTAG y controlador de DMA.
- La "M" de Cortex = pensada para sistemas embebidos (microcontrolador). La familia Cortex-A son procesadores de aplicación de alto rendimiento, con conjuntos de instrucciones multimedia y un compilador distinto.
Familia Cortex-M — cómo elegir (criterio de ingeniería)
| Núcleo | Punto flotante | Cuándo |
| Cortex-M0 | Sin FPU. Cada operación con decimales se aproxima por software inyectando ~30 instrucciones enteras en el pipeline. | El más barato (~1 USD). Sirve si casi no hay matemáticas de flotante. |
| Cortex-M3 | Soporta flotantes pero no optimizados; tiene hardware de multiplicación → divide calculando el inverso multiplicativo del divisor y multiplicando. | Punto intermedio. |
| Cortex-M4 | FPU nativa: multiplica y divide flotante por hardware en un paso. | Óptimo cuando la aplicación usa mucho punto flotante. |
| Cortex-M7 | FPU + unidad vectorial (DSP). | Overkill salvo que se necesiten algoritmos avanzados de procesamiento de señales. |
Si el sistema necesita red, el ESP32 es buena opción por su cripto SHA por hardware. El desafío que lanzó el profesor: programar en C un cociente de flotantes usando solo variables enteras, con corrimientos de bits y manipulación de la mantisa.
Compilación y micro-instrucciones
El compilador traduce el código de alto nivel a ensamblador de la arquitectura (ARMv6-M para Cortex-M0/M0+). Después, el decodificador de hardware descompone cada instrucción de ensamblador en micro-operaciones internas del núcleo (cargas, almacenamientos, operaciones de acumulador). Un int de C en RISC se traduce en varias instrucciones básicas de load y store.
Intel: CISC por fuera, RISC por dentro
- Retrocompatibilidad: un Core i9 ejecuta de forma nativa código escrito para un 8086 de finales de los 70, sin recompilar. Intel garantizó esa compatibilidad de 16 y 32 bits.
- Itanium (IA-64): rompía la compatibilidad y obligaba a recompilar todo el software → fracaso que casi lleva a Intel a la quiebra.
- El estándar de 64 bits que sí triunfó es x86-64 / "Intel 64", diseñado originalmente por AMD y retrocompatible con IA-32.
- Cambiar radicalmente el conjunto de instrucciones (Mac Intel → Apple Silicon RISC) obliga a recompilar los sistemas operativos completos, o a usar una capa de traducción / emulación (Rosetta).
- Servidores de alto rendimiento: UNIX sobre RISC (Solaris / SPARC) o servidores Intel gobernados por Linux.
Microarquitectura interna de un Intel moderno:
- Un decodificador con predictor de saltos toma las instrucciones y las lleva a la caché L1-I (32 KB, 8 vías).
- El predecodificador jala 16 bytes por ciclo.
- Descompone las instrucciones CISC complejas en micro-operaciones RISC elementales (micro-fusion). Hay decodificadores simples y uno completo, dimensionados sabiendo que el 60–75 % del código son cargas y descargas repetitivas.
- Las µops entran a una cola y pasan a un planificador / reordenador de hardware (ejecución fuera de orden).
- Renombrado de registros: hay muchos más registros físicos que los 8 nominales de x86. El procesador renombra los nominales a físicos libres y puede correr dos programas independientes de 32 bits en paralelo por hardware, sin hilos del SO ni semáforos.
Puertos de ejecución: Coffee Lake (2017) tenía 8 puertos (0–7) → un Intel de 4 núcleos paraleliza hasta 32 µops por ciclo. Golden Cove (2021) sube a 12 puertos (P0–P11), con cola de reordenamiento de 512 entradas: 2 puertos de store, 2 de load y 5 de cómputo pesado (3 de ellos vectoriales).
Caché multinivel en multinúcleo: regla obligatoria de ≥ 2 niveles — L1 y L2 a nivel núcleo, L3 global —, con la L1 dividida en datos (D) e instrucciones (I).
Práctica de laboratorio (sesión siguiente)
- Cada quien elige la arquitectura de microcontrolador que prefiera de las vistas en clase.
- Restricción: la práctica de sistemas operativos enfocada a Windows exige una Raspberry Pi 3. No funciona en la Raspberry Pi 4.