Este es un gran tema y no puedo dar una respuesta simple pero ...
Puede acercarse un poco más a esta respuesta dividiendo y conquistando, y dado que la otra respuesta intenta atacar este problema desde un punto de vista hw, lo intentaré desde una vista SW de alto nivel.
Si escribe algún software en digamos código c (un nivel muy alto de abstracción), realmente no ve lo que está sucediendo, realmente no comprende todas las cosas de amantes que está preguntando.
Pero comencemos 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á sucediendo. Este paso se puede hacer en cualquier plataforma que use, pero para simplificarlo 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 intenta comprender cada línea de código y lo que hace.
Y luego comienzas a ver cómo se implementa cada instrucción ... Por ejemplo, el 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 en este nivel, cuando lees la copia, la mayoría de las acciones parecerán que solo estás moviendo números, y en cierto sentido esto es lo que está sucediendo. Tenemos un programa predefinido que atravesamos, este programa se almacena en algún tipo de memoria flash que generalmente es algún tipo de lógica electrónica que atrapará un nivel lógico.
Si ves algún tipo de " Flip-flop " para cada bit, entonces estás un poco cerca, y entonces necesitamos muchos de esos. Aquí comenzamos a encontrar sus unos y ceros.
Luego, para que se produzca alguna acción, agregamos una lógica genial que puede transformar un número en otro número (la CPU misma).
Y luego seguimos el programa paso a paso, y para saber dónde estamos tenemos un contador de programa (PC). Y mueva los números hacia atrás y cuarto y almacénelos en otra memoria que también es una especie de cuadrícula con flip-flops.
Pero volvamos a un ejemplo específico nuevamente, para comprender un poco mejor la CPU, podemos echar un vistazo a la ALU y a 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 para maldecir su ALU en su CPU, la parte de su MCU es mucho más compleja que esta, pero funciona con el mismo principio básico.
En este punto, podemos ver algún circuito lógico que hace el "trabajo" en un lado, y algo de almacenamiento en el otro lado. Y el almacenamiento tiene dos partes, una para el programa y otra para los datos. Pero, ¿cómo nos "movemos" realmente, entonces esos deben estar conectados de alguna manera ...
Y aquí es donde conectamos esas partes con un autobús.
Un bus son 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 enviados. Y esto se hace con algunas líneas de control paralelas que habilitarán / deshabilitarán las diferentes partes.
...
Entonces, si toma su mcu de elección y disecciona un programa muy pequeño, y siempre que no entienda lo que está sucediendo, lo diseccionará aún más hasta que tenga un pequeño rompecabezas que pueda usarse para crear un "mcu".
Y no se olvide de leer la hoja de datos de su mcu y ver qué tipo de partes se hizo, como qué tipo de memoria, aluminio, buses, etc.
Espero que esto ayude un poco ???
Buena suerte