Questo è un argomento importante e non posso dare una risposta semplice ma ...
Puoi avvicinarti un po 'a questa risposta facendo un po' di divisione e conquista, e poiché l'altra risposta cerca di attaccare questo problema da un punto di vista hw proverò da una vista SW di alto livello.
Se scrivi del software in diciamo codice c (un livello molto alto di astrazione), non vedi davvero cosa sta succedendo non capisci davvero tutte le cose dell'amante di cui stai chiedendo.
Ma iniziamo comunque.
Un semplice programma che include solo una variabile.
int main(void)
{
int i=0;
while(1) {
i++;
}
}
Quindi dobbiamo ottenere il codice assembler in modo da poter capire cosa sta succedendo. Questo passaggio può essere fatto su qualunque piattaforma tu usi, ma per semplicità, utilizzo gcc su un pc (ma non importa ...)
gcc -O0 -S main.c -o main.lst
Quindi finiamo con qualcosa del genere:
.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
Quindi provi a capire ogni riga di codice e cosa fa.
E poi inizi a esaminare come vengono implementate tutte le istruzioni ... Ad esempio il subl
subl $16, %esp
A questo punto è diverso su architetture diverse e x86, arm, pic è un po 'diverso ... Ma dal momento che il mio esempio era x86.
E a questo livello quando leggi la copia la maggior parte delle azioni sembrerà che tu stia semplicemente spostando dei numeri, e in un certo senso è quello che sta succedendo. Abbiamo un programma predefinito che passiamo in rassegna, questo programma è archiviato in una sorta di memoria flash che di solito è una specie di logica elettronica che intercetterà un livello logico.
Se vedi una sorta di " Flip-flop " per ogni bit, allora sei un po 'vicino, e quindi abbiamo bisogno di molti di questi. Qui iniziamo a trovare i tuoi e gli zeri.
Quindi, affinché si verifichi qualche azione, aggiungiamo una logica interessante che può trasformare un numero in un altro numero (la CPU stessa).
E poi seguiamo il programma un passo alla volta e per sapere dove siamo abbiamo un contatore di programmi (PC). E sposta i numeri indietro e quarta e memorizzandoli in un'altra memoria che è anche una specie di griglia con infradito.
Ma torniamo di nuovo ad un esempio specifico, per capire un po 'meglio la CPU possiamo dare un'occhiata alla ALU e questa immagine semplificata . Dove puoi vedere che quando spostiamo i dati in questo blocco logico e selezioniamo alcune operazioni con i pin OP, otterremo un nuovo risultato in uscita. Che a nostra volta possiamo tornare in qualche posto nella memoria.
E di maledire il tuo ALU nella tua parte della CPU del tuo MCU è molto più complesso di questo, ma funziona con lo stesso principio di base.
A questo punto possiamo vedere qualche circuito logico che fa il "lavoro" da un lato e un po 'di memoria dall'altro lato. E la memoria ha due parti, una per il programma e una per i dati. Ma come possiamo realmente "spostarci", questi devono essere collegati in qualche modo ...
Ed è qui che colleghiamo quelle parti con un autobus.
Un bus è solo alcuni fili che collegano insieme le diverse parti, quindi la logica di controllo dice alla memoria quali dati inviare su questo bus e quale parte della CPU dovrebbe ascoltare questi dati che sono stati inviati. E questo viene fatto con alcune linee di controllo parallele che abiliteranno / disabiliteranno le diverse parti.
...
Quindi se prendi il tuo mcu preferito e sezionate un programma molto piccolo, e fintanto che non capite cosa sta succedendo, lo sezionate ancora di più fino a quando non avete un simpatico puzzle che può essere usato per creare un "mcu".
E non dimenticare di leggere la scheda tecnica della tua mcu e di esaminare con che tipo di parti è stata realizzata, come che tipo di memoria, alluminio, bus ecc. Ecc.
Spero che questo aiuti un po '???
In bocca al lupo