Programmierung Unterschiede zwischen einem Mikrocontroller und einem Mikroprozessor?

Daher sehe ich oft Bücher / Tutorials und Referenzen beim Programmieren in Assembler für einen Mikroprozessor ... dann sehe ich, dass einige es als Mikrocontroller bezeichnen.

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

Welches ist es? und ist die Programmierung (im Grunde) gleich? (im Zusammenbau)

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

Antworten (6)

Das sind eigentlich zwei Fragen in einer...

Erstens, was ist der Unterschied zwischen einem Mikrocontroller und einem Mikroprozessor?

Ein Mikroprozessor ist eine reine CPU, die einem Satz 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-up-BIOS-ROM, das das Betriebssystem zunächst von der Festplatte in den RAM-Speicher liest und es dann von dort aus weiter ausführt.

Der Mikrocontroller ist so etwas wie eine All-in-One-CPU + Speicher mit einigen externen Ports zur Kommunikation mit der Außenwelt. Es ist eigenständig und verwendet keinen externen Speicher, um sein 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 dasselbe?

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', kompiliert sie nicht wirklich etwas, sie konvertiert sie lediglich in eine Folge von Bytes, die die Befehle und Plugs in einigen relativen Speicherorten darstellen. Dies ist sowohl Mikroprozessoren als auch Mikrocontrollern gemeinsam.

Unterschiedliche CPU-Typen verstehen jedoch einen unterschiedlichen Satz von CPU-Anweisungen. Wenn Sie beispielsweise ein Assemblerprogramm 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 völliger Unsinn.

Obwohl die Assemblierung bei allen Mikroprozessoren und Mikrocontrollern auf ähnliche Weise 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 im Fall eines Mikrocontrollers normalerweise dem Datenblatt entnehmen können.

Nun, was ich meinte, war ja, ASM wird für jeden anders sein ... aber sind die Befehle / usw. im Allgemeinen die gleichen (oder werden auf die gleiche Weise ausgeführt) zwischen einem MC und einem MP ... Ich meine, ein MC hat einen MP also würde ich davon ausgehen .. (abzüglich der erinnerung)
@Sauron: Nein, nicht wirklich ... während einige Befehle zwischen Geräten ähnlich sein können, wie add, mov, sub usw., sind sie wahrscheinlich unterschiedlich implementiert und werden nicht zwischen Geräten portiert.
Hervorragende Antwort, die mir wahrscheinlich zu Beginn meines Mikroprozessor-Kurses hätte helfen können.
Nun, was ich meinte, war ...... Wie da ein Mikrocontroller eine CPU enthält ... die Montageanleitung richtet sich eher an die eigentliche CPU als an die Komponenten um sie herum.
@ Sauron: Ja, das ist richtig.

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 das alles externe Geräte. Anstelle der I/Os hatten die Mikroprozessoren den Adress- und Datenbus auf ihre Pins gebracht.
Die Art und Weise, wie Sie Code schreiben, ist für beide gleich.

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

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

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

Beispiele für Microcontroller-Familien mit Harvard-Architektur sind: AVRs, Intel 8051, PICs (außer PIC32, siehe unten) und ARM Cortex-M3. Eine bemerkenswerte Ausnahme sind 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 mehrere RAM-Typen geben, von denen jeder seinen eigenen Adressraum hat. Beispielsweise verfügt der 8051 über externe Daten (xdata), die getrennt von den ersten 256 Bytes des RAM adressiert werden, obwohl beide auf demselben Chip implementiert sind. Man muss also Qualifizierer für Variablendeklarationen wie verwendenunsigned int xdata foo;

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

Diese nicht standardmäßigen Zugriffsmethoden auf Code und RAM sind in der Regel der Hauptunterschied (neben Peripheriegeräten) beim Portieren von C-Code von einer Chipfamilie auf eine andere.

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, die es ermöglicht, Code im RAM auszuführen. Der Parallax-Propeller nutzt tatsächlich seine Fähigkeit, Code zu modifizieren, um Subroutinenrückgaben auszuführen, da er keinen Hardware-Stack hat.

Ein Mikrocontroller ist im Allgemeinen eine Ein-Chip-Lösung zur Bereitstellung von Rechen- und Peripheriefunktionen.

Ein Mikroprozessor liefert die Rechenfunktionen, aber nicht die peripheren Funktionen.

Peripheriefunktionen können so einfach sein wie ein paar einfache I/O-Bits; oder könnte ausgefeilte Zähler und Timer, Videoanzeige, Ethernet, Motorsteuerung, Audio- und Video-Codec usw. umfassen.

Für eine bestimmte Architektur (z. B. die x86-basierten CPUs und MCUs) ist die "rechnerische" Codierung identisch. Wie Sie auf Peripheriefunktionen zugreifen, ist jedoch unterschiedlich, und daher müssen Sie sehr unterschiedliche hardwarespezifische Codierungen vornehmen, je nachdem, wie die Peripheriefunktionen auf Ihrer Zielhardware implementiert sind.

Mikroprozessoren werden typischerweise in Computern verwendet, die so konstruiert sind, dass sie Programme mit willkürlichem, noch zu bestimmendem Zweck ausführen. Solche Computer enthalten im Allgemeinen einen vom Hersteller gelieferten Code, mit dem erwartet wird, dass der vom Benutzer gelieferte Code mit ihm interagiert. Im Gegensatz dazu werden Mikrocontroller typischerweise in Maschinen verwendet, die nur für den Zweck gebaut sind, ein einzelnes Programm auszuführen. Oft liefert jemand, der Code für einen Mikrocontroller schreibt, jede einzelne Anweisung, die die Maschine ausführt.

Einige Mikrocontroller verwenden die gleichen Befehlssätze wie gängige Mikroprozessoren. Der 68000-Befehlssatz, der in den ursprünglichen Macintosh-, Amiga- und Atari-ST-Linien von Personal Computern verwendet wurde, wurde auch in einigen Mikrocontrollern verwendet. Obwohl der von einem Macintosh und einer 68HC340-basierten Steuerplatine verwendete Befehlssatz derselbe ist, kann die Programmierung für die beiden Plattformen sehr unterschiedlich sein. Wenn auf dem Macintosh ein vom Benutzer bereitgestelltes Programm gestartet wird, ist ein Großteil des Systems bereits "eingerichtet". Code, der einen Speicherblock benötigt, kann ein Register mit der benötigten Menge laden und einen "A-Trap"-Befehl ausführen. Das Macintosh-Betriebssystem gibt dann einen Zeiger auf einen Speicher zurück, der zuvor keinem anderen Zweck zugewiesen wurde, und markiert diesen Speicherbereich, damit er Es wird nicht erneut zugeteilt, bis es mitgeteilt wird, dass der ursprüngliche Empfänger es nicht mehr benötigt. Im Gegensatz dazu besteht auf einem Board mit einem 68HC340 und 128 KB RAM keine Notwendigkeit oder Möglichkeit, nach RAM zu "fragen". Wenn das Programm startet, "bekommt" es 128 KB, die 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 um Mikroprozessoren geht, wird die Mikroprozessorprogrammierung in den meisten Diskussionen im Kontext eines Allzweckcomputers behandelt.

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

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

Willkommen bei EE.SE, Mike. Verwenden Sie <enter> x 2 für den Absatzumbruch. Ich habe es für dich repariert.