Richtig, wir haben derzeit 8-Bit-, 16-Bit- und 32-Bit-Mikrocontroller auf dieser Welt. Alle von ihnen werden oft verwendet. Wie unterschiedlich ist es, 8-Bit- und 16-Bit-Mikrocontroller zu programmieren? Ich meine, erfordert es eine andere Technik oder Fertigkeit? Nehmen wir zum Beispiel Mikrochip. Welche neuen Dinge muss eine Person lernen, wenn sie von 8-Bit-Mikrocontrollern zu 32-Bit-Mikrocontrollern wechseln möchte?
microcontroller
programming
quantum231
quelle
quelle
Antworten:
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.
quelle
Ein gemeinsamer Unterschied zwischen 8-Bit- und 32-Bit-Mikrocontrollern besteht darin, dass 8-Bit-Mikrocontroller häufig über einen Speicher- und E / A-Speicherbereich verfügen, auf den unabhängig vom Ausführungskontext in einem einzigen Befehl zugegriffen werden kann, während 32-Bit-Mikrocontroller häufig zugreifen erfordern eine Mehrfachbefehlssequenz. Beispielsweise kann bei einem typischen 8-Bit-Mikrocontroller (HC05, 8051, PIC-18F usw.) der Zustand eines Portbits unter Verwendung eines einzelnen Befehls geändert werden. Auf einem typischen ARM (32-Bit) wäre, wenn der Registerinhalt anfangs unbekannt wäre, eine Befehlssequenz mit vier Befehlen erforderlich:
In den meisten Projekten verbringt der Controller die meiste Zeit mit anderen Aufgaben als dem Setzen oder Löschen einzelner E / A-Bits. Daher spielt es oft keine Rolle, dass Vorgänge wie das Löschen eines Port-Pins mehr Anweisungen erfordern. Andererseits wird es Zeiten geben, in denen Code viele Port-Manipulationen ausführen muss, und die Fähigkeit, solche Dinge mit einer einzigen Anweisung auszuführen, kann sich als sehr wertvoll erweisen.
Auf der anderen Seite sind 32-Bit-Controller ausnahmslos so konzipiert, dass sie effizient auf viele Arten von Datenstrukturen zugreifen können, die im Speicher gespeichert werden können. Im Vergleich dazu greifen viele 8-Bit-Controller sehr ineffizient auf Datenstrukturen zu, die nicht statisch zugeordnet sind. Ein 32-Bit-Controller kann in einem Befehl einen Array-Zugriff ausführen, der ein halbes Dutzend oder mehr Befehle in einem typischen 8-Bit-Controller erfordern würde.
quelle
region_base[offset]
) von C oder C ++ auf die Bitband-Regionen zugreifenDer größte praktische Unterschied ist der Umfang der Dokumentation, um wirklich den gesamten Chip vollständig zu verstehen. Es gibt 8-Bit-Mikrocontroller mit fast 1000 Seiten Dokumentation. Vergleichen Sie das mit ungefähr 200-300 Seiten für eine 8-Bit-CPU aus den 1980er Jahren und den beliebten Peripherie-Chips, mit denen sie verwendet werden würde. Für ein peripheres 32-Bit-Gerät müssen Sie 2000 bis 10.000 Seiten Dokumentation durchgehen, um das Teil zu verstehen. Die Teile mit moderner 3D-Grafik stehen auf 20.000 Seiten Dokumentation.
Nach meiner Erfahrung dauert es ungefähr zehnmal so lange, bis alles bekannt ist, was über einen bestimmten modernen 32-Bit-Controller bekannt ist, wie es für einen modernen 8-Bit-Teil der Fall wäre. Mit "alles" meine ich, dass Sie wissen, wie Sie alle Peripheriegeräte verwenden, auch auf unkonventionelle Weise, und die Maschinensprache, den Assembler, den die Plattform verwendet, sowie andere Tools, die ABI (s) usw. kennen.
Es ist überhaupt nicht unvorstellbar, dass viele, viele Entwürfe mit teilweisem Verständnis ausgeführt werden. Manchmal ist es belanglos, manchmal nicht. Das Wechseln der Plattform muss mit dem Bewusstsein erfolgen, dass die Produktivität kurz- und mittelfristig einen Preis hat, den Sie für wahrgenommene Produktivitätssteigerungen durch eine leistungsfähigere Architektur zahlen. Tun Sie Ihre Due Diligence.
quelle
Ich persönlich würde mir nicht allzu viele Gedanken darüber machen, ein Upgrade (8-Bit-> 32-Bit) der gleichen Familie durchzuführen, und Sie erhöhen die technischen Daten auf ganzer Linie. Im Allgemeinen tue ich mit den Datentypen nichts, was nicht der Norm entspricht, da es schwierig sein kann, sie auf dem Laufenden zu halten.
Das Herabstufen eines Gerätecodes ist eine andere Geschichte.
quelle
int
32 Bits sein, oder sogar 64 für diese Angelegenheit, aber ich bin mir nicht bewusst von bestehenden 8-Bit - Compiler , die tatsächlich tun definierenint
, dass sie größer als 16 Bit oder fördern 16-Bit-Werte für alles Größere.32-Bit-MCUs verbrauchen für eine viel mehr Strom. Und benötigen mehr Support-Schaltungen.
Man geht nicht wirklich von 8-Bit zu 32-Bit über ... Sie werden weiterhin beide verwenden, oft zusammen. Unter dem Strich sollten Sie alles verwenden (und lernen), was für den Job angemessen ist. Lerne ARM, weil es jetzt die eingebettete Welt erschüttert und es auch weiterhin tun wird. Lernen Sie auch AVR oder PIC, weil sie großartige Board-Controller sind.
Sie werden wahrscheinlich sowieso so viel Stress beim Umstieg von AVRs auf ARMs haben wie bei ARM auf x86. Die Größe des Busses macht eigentlich keinen großen Unterschied. Die gesamte erweiterte Hardware funktioniert jedoch. Der Übergang von Standard-Interrupts zu einem vektorisierten Interrupt-Array mit 6 Prioritätsstufen ist viel schwieriger, als herauszufinden, wie man bis zu vier Milliarden zählt.
quelle