Programmierunterschiede zwischen einem Mikrocontroller und einem Mikroprozessor?

9

Daher sehe ich oft Bücher / Tutorials und Referenzen, wenn ich in der Montage auf einen Mikroprozessor programmiere. Dann wird es von einigen als Mikrocontroller bezeichnet.

Zum Beispiel das Atmel ATtiny2313 ... ich habe einige Tutorials gesehen, manche nennen es einen Mikroprozessor, manche nennen es einen Mikrocontroller?

Welches ist es? und programmiert man sie (im Grunde) gleich? (in Montage)


quelle
1
@Kellenjb: Es wäre, wenn nicht nach den Programmierunterschieden gefragt würde. Ich denke, das ist anders genug, um nicht zu schließen.
BG100
1
@ BG100 Die akzeptierte Antwort erklärte nur wirklich den Unterschied, keinen Programmierunterschied.
Kortuk

Antworten:

14

Das sind wirklich zwei Fragen in einer ...

Was ist der Unterschied zwischen einem Mikrocontroller und einem Mikroprozessor?

Der Mikroprozessor ist eine reine CPU, die einer Reihe von Anweisungen folgt, die von einem externen Speicherbus gelesen werden. Es steuert externe Peripheriegeräte (wie Bildschirm, Tastatur, Maus, Festplatte usw.) über einen externen Kommunikationsbus. Wenn Sie einen Mikroprozessor programmieren, befindet sich Ihr Programm außerhalb des Geräts. In einem Computer ist dieser Speicher zunächst das Boot-BIOS-ROM, das das Betriebssystem zunächst von der Festplatte in den RAM-Speicher liest und von dort aus weiter ausführt.

Der Mikrocontroller ähnelt einem All-in-One-CPU + -Speicher mit einigen externen Ports für die Kommunikation mit der Außenwelt. Es ist in sich geschlossen und verwendet keinen externen Speicher, um das Programm zu speichern (obwohl es bei Bedarf Arbeitsdaten lesen und in den externen Speicher schreiben kann).

Zweitens ist die Programmierung eines Mikrocontrollers und eines Mikroprozessors gleich?

In gewisser Weise ja und in gewisser Weise nein.

Assemblersprache ist ein weit gefasster Begriff, der eine Reihe von Anweisungen beschreibt, die die CPU direkt verstehen kann. Wenn Sie die Assemblersprache "kompilieren", wird nichts wirklich kompiliert, sondern nur in eine Folge von Bytes konvertiert, die die Befehle und Stecker an einigen relativen Speicherorten darstellen. Dies ist sowohl für Mikroprozessoren als auch für Mikrocontroller gleich.

Unterschiedliche CPU-Typen verstehen jedoch unterschiedliche CPU-Anweisungen. Wenn Sie beispielsweise ein Assembler-Programm schreiben, das mit einem pic 16F877-Mikrocontroller funktioniert, ist dies für einen Mikroprozessor oder einen anderen Mikrocontroller außerhalb der 16Fxxx-Familie von pic-Mikrocontrollern ein völliger Unsinn.

Obwohl die Assemblierung für alle Mikroprozessoren und Mikrocontroller ähnlich funktioniert, ist die tatsächliche Liste der Anweisungen, die Sie schreiben, sehr unterschiedlich. Um in Assemblersprache schreiben zu können, müssen Sie über fundierte Kenntnisse der Gerätearchitektur verfügen, die Sie normalerweise bei einem Mikrocontroller aus dem Datenblatt abrufen können.

BG100
quelle
Nun, ich meinte, ja, ASM wird für jeden unterschiedlich sein ..... aber sind die Befehle / etc zwischen einem MC und einem MP im Allgemeinen gleich (oder werden auf die gleiche Weise ausgeführt) ... Ich meine, ein MC hat einen MP also würde ich so annehmen .. (minus der Speicher)
@Sauron: Nein, nicht wirklich. Während einige Befehle zwischen Geräten ähnlich sind, wie z. B. add, mov, sub usw., sind sie wahrscheinlich unterschiedlich implementiert und werden nicht zwischen Geräten portiert.
BG100
1
Hervorragende Antwort und eine, die mir wahrscheinlich hätte helfen können, als ich meinen Mikroprozessorkurs begann.
Pfyon
Nun, was ich meinte war ...... Da ein Mikrocontroller eine CPU enthält ... richten sich die Montageanweisungen eher an die eigentliche CPU als an die Komponenten um ihn herum.
@ Sauron: Ja, das ist richtig.
BG100
10

Der Unterschied besteht darin, dass der Mikrocontroller On-Chip-Speicher wie Flash-EEPROM und RAM sowie Peripheriegeräte wie parallele und serielle E / A enthält. Bei den ersten Mikroprozessoren waren dies alles externe Geräte. Anstelle der E / A-Mikroprozessoren wurde der Adress- und Datenbus an ihre Pins gebracht.
Die Art und Weise, wie Sie Code für beide schreiben, ist dieselbe.

Um diesen Punkt zu veranschaulichen: Es gibt Architekturen (z. B. ARM), bei denen dieselbe CPU als Mikrocontroller (mit sämtlichem Code und Datenspeicher auf dem Chip), als Mikroprozessor (alle Codes und Datenspeicher extern) oder als Hybrid (einige) verfügbar ist Speicher auf dem Chip, aber für die meisten Anwendungen werden Sie externen Speicher hinzufügen). Die CPU ist dieselbe, daher ist die Programmierung (im Sinne von CPU-Anweisungen) dieselbe.

stevenvh
quelle
Oh ok das macht mehr Sinn, aber der ASM für jeden ist im Grunde der gleiche?
Sie meinen, wenn ich lerne, für die Cortex M-Serie zu codieren, kann ich dann auch für die Cortex A-Serie codieren?
0xakhil
Grundsätzlich ja zu beiden Fragen, die asm-Anweisungen sind die gleichen (obwohl es geringfügige Abweichungen geben kann, genau wie verschiedene ARM-Versionen spezifische Anweisungen hinzufügen können). Aber wenn Sie Dinge außerhalb der CPU verwenden (Cache, Interrupt-Controller, Peripheriegeräte usw.), gibt es große Unterschiede.
Wouter van Ooijen
8

Obwohl dies tendenziell eine Grauzone ist, besteht ein weiterer gemeinsamer Unterschied zwischen Mikrocontrollern und Mikroprozessoren darin, dass Mikrocontroller häufig die Harvard-Architektur (separater Adressraum für Code und Daten) verwenden, während Mikroprozessoren fast alle die Von Neumann-Architektur (kombinierter Adressraum für Code und Daten) verwenden. .

Beispiele für Mikrontrollerfamilien, die die Harvard-Architektur verwenden, sind: AVRs, Intel 8051, PICs (außer PIC32, siehe unten) und ARM Cortex-M3. Eine bemerkenswerte Ausnahme bilden Freescale-Prozessoren wie der HCS08, die die Von Neumann-Architektur verwenden, ebenso wie der Parallax Propeller.

Dies wirkt sich auf verschiedene Weise auf die Programmierung aus (die unten gezeigten Beispiele verwenden C):

Es kann verschiedene Arten von RAM geben, von denen jeder seinen eigenen Adressraum hat. Beispielsweise verfügt der 8051 über externe Daten (xdata), die getrennt von den ersten 256 Byte RAM adressiert werden, obwohl beide auf demselben Chip implementiert sind. Man muss also Qualifikationsmerkmale für Variablendeklarationen wie verwendenunsigned int xdata foo;

Wenn Konstanten im Codespeicher deklariert sind, müssen sie möglicherweise in den Arbeitsspeicher kopiert werden, bevor auf sie zugegriffen werden kann. Oder es muss eine Möglichkeit geben, auf den Codespeicher zuzugreifen, als wären es Daten - z. B. das Code-Qualifikationsmerkmal für 8051s oder die PSV-Funktion (Program Space Visiblity) von PIC.

Diese nicht standardmäßigen Möglichkeiten für den Zugriff auf Code und RAM sind (neben den Peripheriegeräten) der Hauptunterschied beim Portieren von C-Code von einer Chipfamilie zu einer anderen.

Sie können in einer strengen Harvard-Architektur keinen Code aus dem RAM ausführen, daher kann es keinen selbstmodifizierenden Code geben (es sei denn, Sie zählen das erneute Flashen des Programmspeichers im laufenden Betrieb). Der PIC32 verfügt jedoch über eine modifizierte Harvard-Architektur, mit der Code im RAM ausgeführt werden kann. Der Parallax Propeller nutzt tatsächlich seine Fähigkeit, Code zu ändern, um Subroutinenrückgaben durchzuführen, da er keinen Hardware-Stack hat.

tcrosley
quelle
1

Ein Mikrocontroller ist im Allgemeinen eine Einzelchip-Lösung, um Berechnungs- und Peripheriefunktionen bereitzustellen.

Ein Mikroprozessor stellt die Berechnungsfunktionen bereit, nicht jedoch die Peripheriefunktionen.

Peripheriefunktionen können so einfach sein wie ein paar Bits einfacher E / A. oder kann hochentwickelte Zähler und Zeitgeber, Videoanzeige, Ethernet, Motorsteuerung, Audio- und Videocodec usw. umfassen.

Für eine gegebene Architektur (z. B. die x86-basierten CPUs und MCUs) ist die "rechnerische" Codierung identisch. Die Art und Weise, wie Sie auf Peripheriefunktionen zugreifen, ist jedoch unterschiedlich, sodass Sie je nach Implementierung der Peripheriefunktionalität auf Ihrer Zielhardware sehr unterschiedliche hardwarespezifische Codierungen vornehmen müssen.

Spielzeugbauer
quelle
1

Mikroprozessoren werden typischerweise in Computern verwendet, die so konstruiert sind, dass sie Programme mit einem beliebigen, noch zu bestimmenden Zweck ausführen. Solche Computer enthalten im Allgemeinen vom Hersteller bereitgestellten Code, mit dem der vom Benutzer bereitgestellte Code voraussichtlich interagieren wird. Im Gegensatz dazu werden Mikrocontroller normalerweise in Maschinen verwendet, die ausschließlich zum Ausführen eines einzelnen Programms gebaut wurden. Oft liefert jemand, der Code für einen Mikrocontroller schreibt, jeden einzelnen Befehl, den die Maschine ausführt.

Einige Mikrocontroller verwenden dieselben Befehlssätze wie gängige Mikroprozessoren. Der 68000-Befehlssatz, der in den ursprünglichen Macintosh-, Amiga- und Atari ST-Zeilen von PCs verwendet wird, wurde auch in einigen Mikrocontrollern verwendet. Obwohl der von einem Macintosh und einer 68HC340-basierten Steuerkarte verwendete Befehlssatz derselbe ist, kann die Programmierung für die beiden Plattformen sehr unterschiedlich sein. Auf dem Macintosh ist ein Großteil des Systems bereits "eingerichtet", wenn ein vom Benutzer bereitgestelltes Programm gestartet wird. Code, der einen Speicherblock benötigt, kann ein Register mit der erforderlichen Menge laden und einen "A-Trap" -Anweis ausführen. Das Macintosh-Betriebssystem gibt dann einen Zeiger auf einen Speicher zurück, der zuvor nicht für einen anderen Zweck zugewiesen wurde, und markiert diesen Speicherbereich, damit er gewinnt. ' t wird erneut zugewiesen, bis der ursprüngliche Empfänger angewiesen wird, es nicht mehr zu benötigen. Im Gegensatz dazu besteht auf einer Karte mit 68HC340 und 128 KB RAM keine Notwendigkeit oder Fähigkeit, nach RAM zu "fragen". Wenn das Programm startet, "bekommt" es 128K, das es verwenden kann, wie es will; nichts anderes wird es verwenden, aber auf der anderen Seite muss das Programm des Benutzers verfolgen, welche Bereiche es für welche Zwecke verwendet, da nichts anderes dies verfolgen wird.

Während hier wirklich zwischen einem Mikrocomputer und einem Mikrocontroller unterschieden wird und es sich um Mikroprozessoren handelt, wird dies in den meisten Diskussionen zur Mikroprozessorprogrammierung im Kontext eines Allzweckcomputers diskutiert.

Superkatze
quelle
0

Mikroprozessor: Ein digitales Hardwaremodul, das Anweisungen ausführt. Das Modul kann eine vollständig integrierte Schaltung sein.

Mikrocontroller: Ein komplettes Modul, das neben anderen Modulen einen Mikroprozessor mit internem Speicher enthält.

Mike
quelle
Willkommen bei EE.SE, Mike. Verwenden Sie <enter> x 2 für Absatzumbrüche. Ich habe es für dich repariert.
Transistor