En général, passer de microcontrôleurs de 8 à 16 à 32 bits signifie que vous aurez moins de contraintes sur les ressources, en particulier la mémoire, et la largeur des registres utilisés pour effectuer des opérations arithmétiques et logiques. Les monikers 8, 16 et 32 bits se réfèrent généralement à la fois à la taille des bus de données internes et externes ainsi qu'à la taille du ou des registres internes utilisés pour les opérations arithmétiques et logiques (autrefois appelés un ou deux appelés accumulateurs). , il existe désormais généralement des banques de 16 ou 32 registres).
La taille des ports des ports d'E / S suivra généralement la taille du bus de données, donc un micro 8 bits aura des ports 8 bits, un 16 bits aura des ports 16 bits, etc.
En dépit d'avoir un bus de données 8 bits, de nombreux microcontrôleurs 8 bits ont un bus d'adresse 16 bits et peuvent adresser 2 ^ 16 ou 64 Ko octets de mémoire (cela ne signifie pas qu'ils ont n'importe où près de celui implémenté). Mais certains micros 8 bits, comme les PIC bas de gamme, peuvent ne disposer que d'un espace RAM très limité (par exemple 96 octets sur un PIC16).
Pour contourner leur schéma d'adressage limité, certains micros 8 bits utilisent la pagination, où le contenu d'un registre de page détermine l'une des nombreuses banques de mémoire à utiliser. Il y aura généralement de la RAM commune disponible, quel que soit le registre de pages.
Le microcontrôleur 16 bits est généralement limité à 64 Ko de mémoire, mais peut également utiliser des techniques de pagination pour contourner ce problème. Les microcontrôleurs 32 bits n'ont bien sûr pas de telles restrictions et peuvent traiter jusqu'à 4 Go de mémoire.
Avec les différentes tailles de mémoire est la taille de la pile. Dans les micros d'extrémité inférieure, cela peut être implémenté dans une zone de mémoire spéciale et être très petit (de nombreux PIC16 ont une pile d'appels profonds à 8 niveaux). Dans les micros 16 bits et 32 bits, la pile sera généralement en RAM et ne sera limitée que par la taille de la RAM.
Il existe également de grandes différences dans la quantité de mémoire - à la fois programme et RAM - implémentée sur les différents appareils. Les micros 8 bits peuvent n'avoir que quelques centaines d'octets de RAM et quelques milliers d'octets de mémoire de programme (ou bien moins - par exemple, le PIC10F320 n'a que 256 mots de 14 bits de flash et 64 octets de RAM). Les micros 16 bits peuvent avoir quelques milliers d'octets de RAM et des dizaines de milliers d'octets de mémoire de programme. Les micros 32 bits ont souvent plus de 64 Ko d'octets de RAM et peut-être 1/2 Mo ou plus de mémoire de programme (le PIC32MZ2048 a 2 Mo de flash et 512 Ko de RAM; le PIC32MZ2064DAH176 nouvellement publié, optimisé pour les graphiques, a 2 Mo de flash et un énorme 32 Mo de RAM sur puce).
Si vous programmez en langage assembleur, les limitations de taille de registre seront très évidentes, par exemple, l'ajout de deux nombres 32 bits est une corvée sur un microcontrôleur 8 bits mais trivial sur un microcontrôleur 32 bits. Si vous programmez en C, ce sera largement transparent, mais bien sûr le code compilé sous-jacent sera beaucoup plus grand pour le 8-bitter.
J'ai dit largement transparent, car la taille des différents types de données C peut être différente d'une taille micro à l'autre; par exemple, un compilateur qui cible un micro 8 ou 16 bits peut utiliser "int" pour signifier une variable signée 16 bits, et sur un micro 32 bits ce serait une variable 32 bits. Ainsi, de nombreux programmes utilisent #defines pour indiquer explicitement la taille souhaitée, comme "UINT16" pour une variable 16 bits non signée.
Si vous programmez en C, le plus grand impact sera la taille de vos variables. Par exemple, si vous savez qu'une variable sera toujours inférieure à 256 (ou comprise entre -128 et 127 si elle est signée), vous devez utiliser un 8 bits (caractère non signé ou caractère) sur un micro 8 bits (par exemple PIC16 ), car l'utilisation d'une taille plus grande sera très inefficace. De même pour les variables 16 bits sur un micro 16 bits (par exemple PIC24). Si vous utilisez un micro 32 bits (PIC32), cela ne fait aucune différence puisque le jeu d'instructions MIPS a des instructions d'octet, de mot et de double mot. Cependant, sur certains micros 32 bits, s'ils manquent de telles instructions, la manipulation d'une variable 8 bits peut être moins efficace qu'une variable 32 bits en raison du masquage.
Comme l'a souligné le membre du forum vsz, sur les systèmes où vous avez une variable qui est plus grande que la taille de registre par défaut (par exemple une variable 16 bits sur un micro 8 bits), et cette variable est partagée entre deux threads ou entre le thread de base et un gestionnaire d'interruption, on doit faire n'importe quelle opération (y compris juste la lecture) sur la variable atomique , c'est-à-dire la faire apparaître comme une seule instruction. C'est ce qu'on appelle une section critique. La manière standard d'atténuer ce problème consiste à entourer la section critique d'une paire d'interruption de désactivation / activation.
Donc, passer des systèmes 32 bits à 16 bits, ou 16 bits à 8 bits, toutes les opérations sur les variables de ce type qui sont maintenant plus grandes que la taille de registre par défaut (mais qui ne l'étaient pas auparavant) doivent être considérées comme critiques section.
Une autre différence majeure, passant d'un processeur PIC à un autre, est la gestion des périphériques. Cela a moins à voir avec la taille des mots qu'avec le type et le nombre de ressources allouées sur chaque puce. En général, Microchip a essayé de rendre la programmation du même périphérique utilisé sur différentes puces aussi similaire que possible (par exemple timer0), mais il y aura toujours des différences. L'utilisation de leurs bibliothèques périphériques masquera ces différences dans une large mesure. Une dernière différence est la gestion des interruptions. Encore une fois, il y a de l'aide ici des bibliothèques Microchip.