Este es un gran tema y no puedo dar una respuesta simple pero ...
Puedes acercarte un poco más a esta respuesta si divides y conquistas,
y dado que la otra respuesta intenta atacar este problema desde un punto de vista de hw
Lo intentaré desde una vista de SW de alto nivel.
Si escribe algún software en el código C (un nivel muy alto de abstracción), digamos
realmente no ves lo que está sucediendo, realmente no entiendes todas las cosas de los amantes que estás preguntando.
Pero empecemos por allí de todos modos.
Un programa simple que solo incluye una variable.
int main(void)
{
int i=0;
while(1) {
i++;
}
}
Luego necesitamos obtener el código del ensamblador para que podamos entender lo que está pasando.
Este paso se puede hacer en cualquier plataforma que uses,
pero para mantenerlo simple, uso gcc en una PC (pero no importa ...)
gcc -O0 -S main.c -o main.lst
Luego terminamos con algo como esto:
.file "main.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp)
.L2:
addl $1, -4(%ebp)
jmp .L2
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Luego tratas de entender cada línea de código y lo que hace.
Y luego empiezas a ver cómo se implementa cada instrucción ...
Por ejemplo la subl
subl $16, %esp
En este punto es diferente en diferentes arquitecturas y x86, arm, pic es algo diferente ...
Pero como mi ejemplo fue x86.
Y a este nivel, cuando lea la copia, la mayoría de las acciones parecerá que solo está moviendo números y, en cierto sentido, esto es lo que está sucediendo.
Tenemos un programa predefinido por el que pasamos, este programa se almacena en un tipo de memoria flash que suele ser un tipo de lógica electrónica que atrapará un nivel lógico.
Si ves algún tipo de " Flip-flop " para cada bit, entonces eres un poco cerca, y luego necesitamos muchos de esos. Aquí empezamos a encontrar tus ceros y unos.
Luego, para que ocurra alguna acción, agregamos una lógica genial que puede transformar un número en otro (la propia CPU).
Y luego seguimos el programa paso a paso y, para saber dónde estamos, tenemos un contador de programas (PC). Y mueva los números hacia atrás y cuarto y guárdelos en otra memoria que también sea una especie de cuadrícula con flip-flops.
Pero volvamos de nuevo a un ejemplo específico,
Para entender un poco mejor la CPU podemos echar un vistazo a la ALU y esta imagen simplificada .
Donde puede ver que cuando movemos datos a este bloque lógico y seleccionamos alguna operación con los pines OP, obtendremos un nuevo resultado en la salida.
Que a su vez podemos regresar a algún lugar en la memoria.
Y, por supuesto, su ALU en la parte de la CPU de su MCU es mucho más compleja que esta, pero funciona con el mismo principio básico.
En este punto, podemos ver un poco de circuito lógico que hace el "trabajo" en un lado y algo de almacenamiento en el otro. Y el almacenamiento tiene dos partes, una para el programa y otra para los datos.
Pero, ¿cómo realmente "nos movemos" entonces, esos deben estar conectados de alguna manera ...
Y aquí es donde conectamos esas partes con un bus.
Un bus es solo algunos cables que conectan las diferentes partes, y luego la lógica de control le dice a la memoria qué datos enviar a este bus y qué parte de la CPU debe escuchar estos datos que se enviaron. Y esto se hace con algunas líneas de control paralelas que habilitarán / deshabilitarán las diferentes partes.
...
Así que si toma su mcu de elección y analiza un programa muy pequeño,
y mientras no entiendas lo que está sucediendo, lo diseccionarás aún más hasta que tengas un bonito y pequeño rompecabezas que se puede usar para crear un "mcu".
Y no se olvide de leer la hoja de datos de su mcu y ver con qué tipo de piezas se fabricaron, como qué tipo de memoria, alu, buses, etc. etc.
Espero que esto ayude un poco ???
Buena suerte