In generale, passare da microcontrollori da 8 a 16 a 32 bit significa che avrai meno restrizioni sulle risorse, in particolare la memoria, e la larghezza dei registri utilizzati per eseguire operazioni aritmetiche e logiche. I moniker a 8, 16 e 32 bit si riferiscono generalmente sia alla dimensione dei bus di dati interni ed esterni, sia alla dimensione dei registri interni utilizzati per le operazioni aritmetiche e logiche (in passato erano solo uno o due chiamati accumulatori , ora di solito ci sono banche di registro di 16 o 32).
Le dimensioni delle porte delle porte I / O generalmente seguiranno anche le dimensioni del bus dati, quindi un micro a 8 bit avrà porte a 8 bit, un 16 bit avrà porte a 16 bit ecc.
Nonostante disponga di un bus dati a 8 bit, molti microcontrollori a 8 bit dispongono di un bus indirizzi a 16 bit e possono indirizzare 2 ^ 16 o 64K byte di memoria (ciò non significa che siano vicini a quelli implementati). Ma alcuni micro a 8 bit, come i PIC di fascia bassa, possono avere solo uno spazio RAM molto limitato (ad esempio 96 byte su un PIC16).
Per aggirare il loro schema di indirizzamento limitato, alcuni micro a 8 bit utilizzano il paging, in cui il contenuto di un registro di pagina determina uno dei numerosi banchi di memoria da utilizzare. Di solito ci sarà un po 'di RAM comune disponibile, indipendentemente da cosa sia impostato il registro delle pagine.
I microcontrollori a 16 bit sono generalmente limitati a 64 KB di memoria, ma possono anche utilizzare tecniche di paging per aggirare il problema. I microcontrollori a 32 bit ovviamente non hanno tali restrizioni e possono indirizzare fino a 4 GB di memoria.
Insieme alle diverse dimensioni della memoria è la dimensione dello stack. Nei micro di fascia più bassa, questo può essere implementato in un'area speciale di memoria ed essere molto piccolo (molti PIC16 hanno uno stack di chiamate profonde a 8 livelli). Nei micro a 16 e 32 bit, lo stack sarà generalmente nella RAM generale e sarà limitato solo dalle dimensioni della RAM.
Ci sono anche grandi differenze nella quantità di memoria - sia programma che RAM - implementata sui vari dispositivi. I micro a 8 bit possono avere solo poche centinaia di byte di RAM e poche migliaia di byte di memoria del programma (o molto meno - ad esempio il PIC10F320 ha solo 256 parole di flash a 14 bit e 64 byte di RAM). I micro a 16 bit possono avere qualche migliaio di byte di RAM e decine di migliaia di byte di memoria del programma. I micro a 32 bit hanno spesso oltre 64 KB di RAM e forse 1/2 MB o più di memoria del programma (il PIC32MZ2048 ha 2 MB di flash e 512 KB di RAM; il PIC32MZ2064DAH176 appena rilasciato, ottimizzato per la grafica ha 2 MB di flash e un enorme 32 MB di RAM su chip).
Se si sta programmando in linguaggio assembly, i limiti delle dimensioni del registro saranno molto evidenti, ad esempio l'aggiunta di due numeri a 32 bit è un lavoro ingrato su un microcontrollore a 8 bit ma banale su uno a 32 bit. Se stai programmando in C, questo sarà in gran parte trasparente, ma ovviamente il codice compilato sottostante sarà molto più grande per l'8-bitter.
Ho detto in gran parte trasparente, perché la dimensione di vari tipi di dati C può essere diversa da una micro dimensione all'altra; per esempio, un compilatore che ha come target un micro a 8 o 16 bit può usare "int" per indicare una variabile con segno a 16 bit, e su un micro a 32 bit questa sarebbe una variabile a 32 bit. Quindi molti programmi usano #define per dire esplicitamente quale sia la dimensione desiderata, come "UINT16" per una variabile a 16 bit senza segno.
Se stai programmando in C, l'impatto maggiore sarà la dimensione delle tue variabili. Ad esempio, se sai che una variabile sarà sempre inferiore a 256 (o nell'intervallo da -128 a 127 se firmato), allora dovresti usare un 8-bit (char o char senza segno) su un micro a 8-bit (es. PIC16 ) poiché l'utilizzo di dimensioni maggiori sarà molto inefficiente. Allo stesso modo si tratta di variabili a 16 bit su un micro a 16 bit (ad esempio PIC24). Se si utilizza un micro a 32 bit (PIC32), allora non fa davvero alcuna differenza poiché il set di istruzioni MIPS ha istruzioni byte, word e double-word. Tuttavia, su alcuni micro a 32 bit, se mancano di tali istruzioni, la manipolazione di una variabile a 8 bit potrebbe essere meno efficiente di una a 32 bit a causa del mascheramento.
Come ha sottolineato il membro del forum vsz, sui sistemi in cui hai una variabile più grande della dimensione del registro predefinita (ad esempio una variabile a 16 bit su un micro a 8 bit) e quella variabile è condivisa tra due thread o tra il thread di base e un gestore di interrupt, è necessario eseguire qualsiasi operazione (inclusa la sola lettura) sulla variabile atomica , ovvero far sembrare che venga eseguita come un'istruzione. Questa è chiamata una sezione critica. Il modo standard per mitigare questo è circondare la sezione critica con una coppia di interrupt di disabilitazione / abilitazione.
Quindi, passando da sistemi a 32 bit a 16 bit o da 16 bit a 8 bit, qualsiasi operazione su variabili di questo tipo che sono ora più grandi della dimensione del registro predefinita (ma non lo erano prima) deve essere considerata critica sezione.
Un'altra differenza principale, che passa da un processore PIC a un altro, è la gestione delle periferiche. Ciò ha meno a che fare con la dimensione delle parole e più con il tipo e il numero di risorse allocate su ciascun chip. In generale, Microchip ha cercato di rendere la programmazione della stessa periferica utilizzata su chip diversi il più simile possibile (ad esempio timer0), ma ci saranno sempre differenze. L'uso delle loro librerie periferiche nasconderà queste differenze in larga misura. Un'ultima differenza è la gestione degli interrupt. Ancora una volta c'è aiuto qui dalle librerie Microchip.