Im Allgemeinen bedeutet der Wechsel von 8- auf 16- auf 32-Bit-Mikrocontroller, dass Sie weniger Ressourcen, insbesondere Speicher, und weniger Registerbreite für arithmetische und logische Operationen benötigen. Die 8-, 16- und 32-Bit-Moniker beziehen sich im Allgemeinen sowohl auf die Größe der internen und externen Datenbusse als auch auf die Größe der internen Register, die für arithmetische und logische Operationen verwendet werden (früher nur ein oder zwei sogenannte Akkumulatoren) , jetzt gibt es normalerweise Registerbanken von 16 oder 32).
E / A-Port Portgrößen folgen im Allgemeinen auch der Datenbusgröße, sodass ein 8-Bit-Mikro 8-Bit-Ports, ein 16-Bit-Mikro 16-Bit-Ports usw. hat.
Trotz eines 8-Bit-Datenbusses verfügen viele 8-Bit-Mikrocontroller über einen 16-Bit-Adressbus und können 2 ^ 16- oder 64-KByte-Speicher adressieren (was nicht bedeutet, dass sie irgendwo in der Nähe davon implementiert sind). Einige 8-Bit-Mikros, wie die Low-End-PICs, verfügen jedoch möglicherweise nur über einen sehr begrenzten RAM-Speicher (z. B. 96 Byte auf einem PIC16).
Um dieses begrenzte Adressierungsschema zu umgehen, verwenden einige 8-Bit-Mikros Paging, wobei der Inhalt eines Seitenregisters eine von mehreren zu verwendenden Speicherbänken bestimmt. Normalerweise ist ein gemeinsamer RAM verfügbar, unabhängig davon, auf was für ein Seitenregister eingestellt ist.
16-Bit-Mikrocontroller sind im Allgemeinen auf 64 KB Speicher beschränkt, können jedoch auch Paging-Techniken verwenden, um dies zu umgehen. 32-Bit-Mikrocontroller unterliegen natürlich keinen derartigen Einschränkungen und können bis zu 4 GB Arbeitsspeicher adressieren.
Zusammen mit den verschiedenen Speichergrößen ergibt sich die Stapelgröße. In den unteren Mikros kann dies in einem speziellen Speicherbereich implementiert werden und sehr klein sein (viele PIC16s haben einen 8-Level-Deep-Call-Stack). In den 16-Bit- und 32-Bit-Mikros befindet sich der Stapel normalerweise im allgemeinen RAM und ist nur durch die Größe des RAM begrenzt.
Es gibt auch große Unterschiede in der Größe des Speichers - sowohl des Programms als auch des Arbeitsspeichers -, der auf den verschiedenen Geräten implementiert ist. 8-Bit-Mikros haben möglicherweise nur ein paar hundert Bytes RAM und ein paar tausend Bytes Programmspeicher (oder viel weniger - der PIC10F320 hat beispielsweise nur 256 14-Bit-Flash-Wörter und 64 Bytes RAM). 16-Bit-Mikros verfügen möglicherweise über einige tausend Byte RAM und Zehntausende Byte Programmspeicher. 32-Bit-Mikros haben häufig mehr als 64 KB RAM und möglicherweise 1/2 MB oder mehr Programmspeicher (der PIC32MZ2048 verfügt über 2 MB Flash und 512 KB RAM; der für Grafiken optimierte PIC32MZ2064DAH176 verfügt über 2 MB Flash und satte 32 MB On-Chip-RAM).
Wenn Sie in Assemblersprache programmieren, sind die Beschränkungen der Registergröße sehr offensichtlich. Beispielsweise ist das Hinzufügen von zwei 32-Bit-Zahlen bei einem 8-Bit-Mikrocontroller eine mühsame Aufgabe, bei einem 32-Bit-Mikrocontroller jedoch eine triviale. Wenn Sie in C programmieren, ist dies weitgehend transparent, aber der zugrunde liegende kompilierte Code ist für den 8-Bitter-Code natürlich viel größer.
Ich sagte weitgehend transparent, weil die Größe der verschiedenen C-Datentypen von einer Größe Mikro zur anderen unterschiedlich sein kann; Beispielsweise kann ein Compiler, der auf ein 8- oder 16-Bit-Mikro abzielt, mit "int" eine 16-Bit-Variable mit Vorzeichen bezeichnen, und auf einem 32-Bit-Mikro wäre dies eine 32-Bit-Variable. Viele Programme verwenden daher #defines, um explizit die gewünschte Größe anzugeben, z. B. "UINT16" für eine vorzeichenlose 16-Bit-Variable.
Wenn Sie in C programmieren, ist der größte Einfluss die Größe Ihrer Variablen. Wenn Sie beispielsweise wissen, dass eine Variable immer kleiner als 256 ist (oder bei Vorzeichen im Bereich von -128 bis 127 liegt), sollten Sie ein 8-Bit-Zeichen (vorzeichenloses Zeichen oder Zeichen) auf einem 8-Bit-Mikro (z. B. PIC16) verwenden ), da die Verwendung einer größeren Größe sehr ineffizient ist. Ebenso die 16-Bit-Variablen auf einem 16-Bit-Mikro (zB PIC24). Wenn Sie ein 32-Bit-Mikro (PIC32) verwenden, spielt dies keine Rolle, da der MIPS-Befehlssatz Byte-, Wort- und Doppelwortbefehle enthält. Bei einigen 32-Bit-Mikros ist die Bearbeitung einer 8-Bit-Variablen aufgrund der Maskierung jedoch möglicherweise weniger effizient als bei einer 32-Bit-Variablen, wenn ihnen solche Anweisungen fehlen.
Wie das Forummitglied vsz ausführte, ist diese Variable auf Systemen, auf denen Sie eine Variable haben, die größer als die Standardregistergröße ist (z. B. eine 16-Bit-Variable auf einem 8-Bit-Mikro), zwischen zwei Threads oder zwischen dem Basisthread geteilt und ein Interrupt-Handler, muss man jede Operation (einschließlich nur Lesen) an der Variablen atomic ausführen , das heißt, es scheint, als würde sie als eine Anweisung ausgeführt. Dies wird als kritischer Abschnitt bezeichnet. Die Standardmethode, um dies zu verringern, besteht darin, den kritischen Abschnitt mit einem Deaktivierungs- / Aktivierungs-Interrupt-Paar zu umgeben.
Beim Übergang von 32-Bit-Systemen zu 16-Bit- oder 16-Bit- zu 8-Bit-Operationen müssen daher alle Operationen auf Variablen dieses Typs, die jetzt größer als die Standardregistergröße sind (aber noch nicht vorhanden waren), als kritisch eingestuft werden Sektion.
Ein weiterer Hauptunterschied von einem PIC-Prozessor zum anderen ist der Umgang mit Peripheriegeräten. Dies hat weniger mit der Wortgröße als vielmehr mit der Art und Anzahl der Ressourcen zu tun, die auf jedem Chip zugewiesen sind. Im Allgemeinen hat Microchip versucht, die Programmierung des gleichen Peripheriegeräts, das auf verschiedenen Chips verwendet wird, so ähnlich wie möglich zu gestalten (z. B. timer0), es wird jedoch immer Unterschiede geben. Durch die Verwendung ihrer Peripheriebibliotheken werden diese Unterschiede weitgehend ausgeblendet. Ein letzter Unterschied ist die Behandlung von Interrupts. Auch hier gibt es Hilfe aus den Microchip-Bibliotheken.