Ich habe eine ordentliche Portion Programmiererfahrung, aber alles in höheren Sprachen. Kürzlich habe ich C abgeholt und das Projekt lief wirklich gut und die Lernerfahrung war es wert.
Nun möchte ich noch einen Schritt weiter gehen und die Assemblersprache lernen, aber idealerweise würde ich gerne auf einer eingebetteten Plattform lernen, da dort einige meiner zukünftigen Projekte liegen. Die Frage ist, welches ist der beste Ausgangspunkt oder "Kit" für einen Anfänger?
Ich bin auf der Suche nach etwas, das relativ einfach zusammenzustellen ist, Dinge aus der "echten Welt" machen kann und generell eine gute Grundlage bietet, auf der man aufbauen kann.
AVR ist nicht der beste Befehlssatz. Ich würde es für einen zweiten oder dritten Befehlssatz speichern. Aber schließlich können Sie dort enden, da das Arduino unglaublich populär ist und gute Unterstützung durch die Gemeinschaft hat (obwohl asm Ausnahme die Regel in dieser Welt ist).
Sie können jetzt ein msp430-Board für $ 4,30 bekommen, im Grunde genommen kostet TI die Kosten, um diese Dinge wegzugeben. msp430 ist eine gute Anleitung zum Lernen.
Der armmite pro ist kein schlechtes, arduinogroßes Board, sondern benutzt einen Arm anstelle von avr. Arm und Daumen sind gute Befehlssätze.
Es gibt Emulatoren für so ziemlich alles, ob oder wenn nicht, einen Emulator zu schreiben ist eine sehr gute Möglichkeit zu lernen, wie die Dinge funktionieren. Normalerweise empfehle ich, einen Disassembler zu schreiben.
Auch ein Befehlssatz mit einem C-Compiler ist gut darin, dass Sie C-Code schreiben, mit der Optimierung spielen und sehen können, welche Art von Assembler ausgegeben wird, und verschiedene Dinge über Assembler lernen. Zuerst lernen Sie einige Tricks für Effizienz und Leistung, später werden Sie in der Lage sein, den Compiler zu übertreffen oder zumindest auf Augenhöhe zu sein. alle erwähnten haben irgendeine Art von C-Compiler, avr und msp haben Möglichkeiten, gcc zu erhalten, arm und thumb werden von den Haupt-Compilern unterstützt. Llvm ist automatisch ein Cross-Compiler, so dass Sie keinen Compiler kompilieren müssen, das msp430-Backend zu llvm ist experimentell, sollte funktionieren oder nah sein, die Arm- und Daumen-Backends sind in Ordnung (-m32 in clang verwenden, um 64 Bit zu vermeiden Ganzzahlen auf einem 64-Bit-Host).
Die stellaris chips früherer luminary micro, jetzt ti (texas instruments) sind gut, nur Daumen / Daumen2. Das mbed ist eigentlich ziemlich gut, außer den blauen LEDs (gib mir Migräne) du musst nicht in eine Sandbox gehen, den USB einstecken, es mountet wie ein Dateisystem, kopiere deine .bin Datei in den Flash, drücke den Reset Knopf und es läuft dein Programm.
sparkfun.com ist dein Freund, Entwickler-Tools, und es gibt eine lange Liste von Microcontroller-basierten Boards von allen Spielern. das msp430 Board erwähnt ich ist etwa $ 5 etwas da, die Armmite Pro, viele Aromen von Arduino, empfehle ich die Lilly Pad, es ist etwa der gleiche Preis wie der Arduino Pro, aber bereits hat den Header auf den kleinen USB-Anschluss angelötet zur seriellen Sache, die Sie auch kaufen möchten. stellaris ist nicht bei sparkfun vertreten, aber viele unter $ 50 Boards sind.
Die msp430 Boards, Armmite Pro, Arduino Boards, Stellaris, Mbed und andere benötigen Strom, der normalerweise über das USB-Kabel oder für einige der FTDi-basierten USB-zu-Serial-Ding
Wenn Sie die Emulator-Route gehen, unterstützt qemu eine Reihe von Befehlssätzen, Arm / Daumen. Es gibt Gameboy und nds Emulatoren da draußen. Ich habe einen auf Github namens Thumbulator geschrieben. die ideen nds-emulator, in quelle form kommt mit arm kernen für arm9 und arm7, ich habe nicht versucht, sie zu extrahieren und verwenden sie jedoch. Wenn du zur alten Schule gehen willst, gibt es Tonnen von 6502 und Z80 Emulatoren da draußen, und einige Compiler glauben es oder nicht, sicherlich Assembler.
Der letzte Assembler, den ich lernen würde, ist x86, ein schrecklicher Befehlssatz und mit den Variationen und dem Mikrocodieren werden Sie den Compiler auf der ganzen Linie nicht übertreffen, ja Ihr Computer in diesem Moment, aber alle x86 Computer sind es nicht wert . Andere Befehlssätze sind wichtiger zu wissen (Arm, Daumen, Daumen2, Avr).
Für eine eingebettete AVR-Plattform können Sie kostenlos WinAVR verwenden, das über einen integrierten Simulator verfügt, so dass Sie auch ohne ASM leicht lernen können echtes Brett. Sie können hier ein ASM-Tutorial finden. Schnellstartanleitung für AVR finden Sie avra 10.01.2011 11:02
Ich bin etwas zu dem 14-Bit-PIC-Befehlssatz (Microchip) für das untere Ende und dem ARM-Befehlssatz für das obere Ende. Beide sind relativ einfach, aber leistungsfähig für das, was sie tun können. Die PIC 18F-Serie hat einen etwas leistungsfähigeren Befehlssatz, aber ästhetisch gefällt mir das nicht so gut.
Nun möchte ich noch einen Schritt weiter gehen und Assembler lernen
Ist das wirklich ein Schritt weiter oder ein Schritt zurück? Wohl ist es ein Weg zu tieferem Verständnis, es ist kaum ein Weg zu mehr Produktivität.
Es gibt keine "Assemblersprache", jede Prozessorarchitektur hat ihren eigenen Befehlssatz, so dass Sie mit einer Assemblersprache nur dieses spezielle Ziel programmieren können (obwohl es Ihnen auch allgemeine Fähigkeiten vermittelt) in Low-Level-Programmierung und zu verstehen, wie der Prozessor funktioniert). Der Code, den Sie generieren, ist auch für eine Architektur spezifisch, so dass Ihr gesamter Aufwand und Ihre Investition in Code viel weniger portabel sind als in einer höheren Programmiersprache. Wenn die von Ihnen gewählte Architektur letztendlich obsolet wird (und es gibt viele davon), werden Ihre Assemblierungsfähigkeiten für diese Architektur weitgehend redundantes Wissen, abgesehen von den allgemeinen Fähigkeiten, die es zur Verfügung stellt (es wird schneller sein, einen neuen Befehlssatz und eine neue Architektur zu lernen). .
Wenn Sie nicht viel Assembler machen und einen bestimmten Befehlssatz beherrschen (und dafür eine starke Berechtigung haben), hat das Lernen von Assembler überhaupt nur einen begrenzten Wert. Es ist nützlich, wenn Sie Start-up-Code implementieren, um einen Prozessor zu initialisieren und die Laufzeitumgebung für Ihren C- oder C ++ - Code einzurichten, der jedoch größtenteils vom Chip- oder Tool-Hersteller zur Verfügung gestellt werden kann und Sie keine vollständige Bereitstellung benötigen ein Architektur- oder Anweisungssatz, um diesen Code zu verwenden oder anzupassen.
Ein oft vorgeschlagenes Argument für die Verwendung von Assembler ist die Leistung, aber im Allgemeinen wird ein optimierender Compiler Code erzeugen, der fast genauso effizient ist wie ein Experten-Assembler und meistens effizienter als ein weniger kompetitiver. Sie sehen, dass der Compiler im Wesentlichen ein Expertensystem ist, soweit es den Zielinstruktionssatz und die Architektur betrifft. Es kennt im Allgemeinen alle verfügbaren Befehle und deren Ausführungszeiten, jedes Register, jeden Adressierungsmodus und versteht die Pipelining-, Caching- und Verzweigungsvorhersagemechanismen usw. Auf einem moderat komplexen Prozessor wird das Compiler-Fachwissen alles andere als übertreffen die meisten dedizierten Vollzeit-Assembler-Programmierer, und auf einfachen Prozessoren gibt es weit weniger zu gewinnen.
Ein Bereich, in dem Assembler nützlich sein kann, ist die Verwendung von Aspekten einiger Prozessoren, die der Compiler oder seine Bibliothek möglicherweise nicht berührt. Es ist zum Beispiel üblich, Assembler auf DSP-Prozessoren zu verwenden, aber selbst dort die Verwendung von optimierten DSP-Bibliotheken (in der Regel selbst in Assembler geschrieben), oder Compiler-Erweiterungen oder Sprach-Idiome, die der Compiler erkennt und optimieren kann, machen dies weitgehend überflüssig DSP-Befehlssatz mit SIMD- und Parallel-Execution-Fähigkeiten ist eine erhebliche Investition.
Das letzte Mal, dass ich einen anderen Assembler als C-Runtime-Startcode brauchte, war die Portierung von Code von einem ARM-Defice auf einen neuen mit einem VFP-Coprozessor; Obwohl die neu kompilierte Bibliothek das VFP verwendet hat, wurde die Funktion sqrt () mit einem Konvergenzalgorithmus und nicht mit der Hardware-Anweisung sqrt implementiert. Eine Funktion, eine oder zwei Fertigungslinien; Ich musste die ARM-Anweisung nicht lernen , um so weit zu kommen.
Die einzigen Assemblie-Sprachen, die ich im Detail gelernt habe, sind Z80 und 8051. Das war lange her, und ich habe alles vergessen, und das Wissen ist jetzt weitgehend veraltet. Die allgemeinen Fähigkeiten, die ich erlernt habe, erlauben mir jedoch, Systeme zu optimieren und das Board-Bring-up wie beschrieben durchzuführen, aber als jemand, der andere Embedded-System-Entwickler rekrutiert, würde ich nicht so sehr auf eine Kandidatur achten.
Ich denke, mit der Assemblersprache braucht man entweder tourist / phrase-book -Ebenenwissen, um einfach durchzukommen, wenn es nötig ist, oder sprechen-wie-ein-native Damit Ihre Fähigkeiten einen echten Wert haben, hat alles dazwischen wenig Wert.
Das heißt, wenn Sie müssen, oder die Notwendigkeit fühlen, empfehle ich als ARM Cortex M3-Gerät. Es ist unwahrscheinlich, dass es in absehbarer Zeit veraltet (Geräte von mehreren Lizenznehmern) und ausreichend komplex und ndern wird, um Ihnen eine gute Grundlage für andere Architekturen zu bieten.
Wichtiger als ein Assembler zu lernen, lerne mindestens zwei. Es gibt eine große Vielfalt an existierenden Architekturen, und das Wissen um mehrere Baugruppen scheint eine gute Möglichkeit zu sein, übermäßig verallgemeinerte Annahmen zu vermeiden.
Viele Montagekurse verwenden MIPS. Der MIPS-Befehlssatz ist einfach und die High-End-PIC-Mikrocontroller (von Microchip) verwenden ihn. MIPS-Prozessoren werden häufig in Heim-Routern gefunden. OpenWRT ist eine Ersatz-Firmware für viele solcher Home-Router, die auf Linux basieren. Ein OpenWRT-kompatibler Router kostet 50 $ und ist eine preiswerte und einfache Möglichkeit, in die Welt der eingebetteten Systeme einzusteigen.
Viele mobile Plattformen, insbesondere Handys, verwenden ARM-Prozessoren (tatsächlich verwenden alle Smartphones und Tablets ein ARM-Derivat, aber ich habe gelesen, dass etwa 15% der billigen, nicht-intelligenten Telefone noch etwas anderes verwenden, normalerweise ein MIPS ). Die ARM-Plattform ist ein bisschen komplex; Es gibt mehrere Befehlssätze (ursprünglicher 26-Bit-ARM, 32-Bit-ARM, Thumb, Thumb-2) und mehrere Aufrufkonventionen (ATPCS, AAPCS ...). ARM-basierte Entwicklungskits können von mehreren Anbietern gekauft werden, z. Gumstix . Es gibt ein paar ARM-basierte Router, auf denen OpenWRT läuft, aber sie sind viel seltener als MIPS-basierte Router.
Die Automobil- und Flugzeugindustrie scheint PowerPC-Prozessoren für ihre Embedded-Systeme ziemlich lieb zu haben. Auch die aktuellen Hauptspielkonsolen verwenden die PowerPC-Architektur (PS3, Xbox 360, Wii). Für eine PowerPC-Entwicklungsplattform empfehle ich den Kauf eines alten Mac, z. auf Ebay oder von einem überholten Computerhändler. Es gibt Zeiger von Low-End-Mac ; Suchen Sie nach einer Maschine mit einem G3 oder G4. Ich kaufte ein G3-basiertes "Clamshell" iBook für 60 $ bei Ebay; Mit NetBSD ist dies eine perfekte PowerPC-basierte Entwicklungsplattform.
Die x86-CPU, wie sie in jedem PC zu finden ist, sollte ebenfalls untersucht werden, und sei es nur, weil sie so weit verbreitet ist. Die Maschine, die Sie verwenden, sei es ein PC oder ein Post-2005-Mac, ist Ihre Entwicklungsplattform, das ist also billig (Sie haben bereits die Hardware). Der Befehlssatz ist "unelegant". Lerne es nicht als deine erste Versammlung, sondern schau es dir für deine zweite oder dritte Stelle an. Jedes zweite Jahr oder so, entwickeln x86-Prozessor eine neue Reihe von zusätzlichen Anweisungen, so dass sie jetzt Hunderte von denen haben, die ziemlich überwältigend sein können; Ich empfehle, mit den Anweisungen für das Original 80386 zu beginnen.
Einige andere Architekturen wurden verwendet und werden immer noch für eingebettete Produkte verwendet, z.B. die 68000, aber sie sind seltener. Beachten Sie, dass ich hier über die "großen" eingebetteten Produkte spreche. Es gibt auch kleinere Systeme mit Architekturen wie AVR, Pre-MIPS PIC, 80C51 ... Es kommt darauf an, ob man, wenn man "Embedded" sagt, "Heimrouter" oder "programmierbarer Toaster" meint.
Wie auch immer, ich empfehle auch QEMU . QEMU ist ein Software-Emulator. Es ist in der Lage, eine voll funktionsfähige virtuelle ARM oder MIPS-basierte Maschine, komplett mit Betriebssystem (zB ein Debian Linux ), auf einem grundlegender PC. Es wird Ihnen bei der Timing-bezogenen Optimierung nicht helfen, aber es macht die Entwicklung und Korrekturprüfung viel einfacher.