Eingebettete Entwicklung – den nächsten Schritt machen

Ich fange damit an, Ihnen zu sagen, was ich weiß. Dann werde ich Ihnen sagen, dass ich in dieses magische Land gelangen möchte, in dem ich alles über die Entwicklung eingebetteter Systeme weiß. Dann werde ich Sie fragen, was meine nächsten Schritte sein sollten, um dorthin zu gelangen. Diese Antwort ist ziemlich informativ, aber ich versuche, etwas detaillierter zu werden:

Was ich weiß

Mal sehen, ich bin fair mit C und C++. Natürlich möchte ich mit diesen Sprachen besser werden, aber ich denke, dass ich mich derzeit am besten verbessern kann, wenn ich sie einfach weiter verwende und ständig versuche, meinen Code zu verbessern, während ich ihn schreibe. Ich glaube nicht, dass es sehr vorteilhaft wäre, irgendwelche Lernübungen nur noch dem Erlernen von C zu widmen.

Ich bin ziemlich bequem mit dem Entwerfen einfacher Schaltungen. Ich sehe einen Chip mit einem Open-Collector-Ausgang und weiß, dass ich einen Pull-up usw. brauche. Ich bin ziemlich zuversichtlich, dass ich mit einem IC und seinem Datenblatt entweder herausfinden kann, wie ich damit verbunden werde, oder zumindest die richtigen Fragen stellen kann Finden Sie heraus, wie Sie es verbinden.

Ich bin sehr gut in Mathe und logischem Denken. Es gibt nur wenige Algorithmen/Designkonzepte, die mich aus der Fassung bringen. Das ist definitiv mein stärkster Bereich.

Was ich getan habe

Bis jetzt habe ich meine ganze Erfahrung mit 8-Bit-Mikrocontrollern gemacht. Mein College-Kurs verwendete ein Motorola HC08, ein Intel 8051 und ein Zilog EZ8. Mein Professor hatte für alle drei ein kleines Entwicklungsboard mit einem 7-Seg-Display und einigem anderen Zeug gebaut. Wir haben sie in Assembler programmiert, also bin ich mit Assembler einigermaßen vertraut, und ich habe einen grundlegenden Computerarchitekturkurs belegt, damit ich eine gute Vorstellung von der Hardware habe. Wir haben jedoch in einer Windows-Umgebung gearbeitet und alle 3 MCUs hatten bereits ihre eigene IDE und Toolkette eingerichtet, sodass ich nie wirklich gelernt habe, wie mein Code von der Assemblierung bis zur Ausführung auf der MCU verlief.

Mein nächster Schritt war das selbstständige Lernen. Ich habe mich mit der Arduino-Umgebung sehr vertraut gemacht, indem ich mit Sensoren/Speichern/Displays interagiert habe, die beide vorgefertigte Bibliotheken hatten und einige, die dies nicht hatten. Als nächstes baute ich mein eigenes Arduino-Board mit einem ICSP darauf und Verbindungen zu einer anderen MCU, damit ich den Bootloader auf nackte ATmega328s flashen konnte. Aber auch hier waren die IDE und die Toolkette bereits eingerichtet, und ich habe nie verstanden, wie ich von C/Arduino zu Code kam, der tatsächlich auf der MCU ausgeführt wird.

Was ich wissen will

Aus der zuvor verlinkten Antwort denke ich, dass die interessantesten / vorteilhaftesten Dinge für mich die Aufzählung über das Erlernen der Tools (Compiler und Linker) und das Erlernen verschiedener Arten von Softwarearchitekturen (von Interrupt-basierten Regelkreisen zu Schedulern und RTOS) wären. . Das ist meine Meinung darüber, was am nützlichsten wäre ... aber da ich es noch nicht weiß, ist es schwer zu sagen, ob das richtig ist oder nicht. Sie können also gerne andere Aufzählungspunkte aus dieser Antwort vorschlagen, wenn Sie der Meinung sind, dass sie besser wären und Bitte begründen Sie, warum Sie das denken.


Ausgehend von meinem derzeitigen Wissen als Ausgangspunkt und der obigen Beschreibung dessen, was ich wissen möchte, als Ziel, suche ich nach ganz konkreten Vorschlägen, wohin ich als nächstes gehen soll. Ich suche konkrete Projektvorschläge, Webseiten/Blogeinträge zum Nachlesen, Kapitel in Büchern etc.

Gibt es außerdem weitere Lücken in meiner Wissensdatenbank, die ich Ihrer Meinung nach füllen sollte, bevor ich zu den oben genannten Themen übergehe?

Dies ist eine sehr offene und subjektive Frage, aber sie ist gut durchdacht und hat zu großartigen Antworten geführt. Solche Fragen sollten CW sein.
@Kevin Vermeer Ah ok, wie mache ich das für zukünftige Referenzen?
@JGord, du musst für die Aufmerksamkeit des Moderators markieren. Nur Moderatoren können CW machen.

Antworten (9)

Aus der zuvor verlinkten Antwort denke ich, dass die interessantesten / vorteilhaftesten Dinge für mich die Aufzählung über das Erlernen der Tools (Compiler und Linker) und das Erlernen verschiedener Arten von Softwarearchitekturen (von Interrupt-basierten Regelkreisen zu Schedulern und RTOS) wären.

Das Portieren eines kleinen Betriebssystems auf ein neues Gerät kann Ihnen helfen, Scheduler und RTOSs zu verstehen. FreeRTOS ist beliebt und gut dokumentiert. eCos ist eine andere.

Das Schreiben eines Bootloaders ist eine gute Möglichkeit, sich mit einem Linker vertraut zu machen, da Sie Speicher und Flash in Regionen aufteilen möchten.

Ein weiterer Tipp ist, eine völlig neue Architektur oder einen neuen Chip auszuwählen und sich ein Entwicklungsboard zu bauen. Sich dazu zu zwingen, ganz von vorne anzufangen und alles im Datenblatt nachzuschlagen, ist eine gute Art zu lernen.

Entdecken Sie Protothreads . Versuchen Sie, dieselben Programme sowohl im Thread- als auch im Zustandsmaschinenstil zu schreiben. Sobald Sie mit Protothreads fertig sind, schreiben Sie einen echten Thread-Scheduler.

Hey Joby, danke für deine Antwort, aber das war eigentlich die Art von Antwort, die ich vermeiden wollte. Ich google nach Dingen wie "wie man RTOS lernt" und es gibt einfach keine nützlichen Links. Haben Sie gute Leitfäden oder Lernressourcen für die von Ihnen erwähnten Dinge?
Wenn er wirklich versucht, dieses Zeug zu lernen, wird ein RTOS die Dinge am Anfang nur verdecken. Ich habe über 100 Mikrocontroller-Projekte durchgeführt und noch keins gefunden, bei dem ein RTOS eine gute Antwort gewesen wäre. Ich habe ein paar Mal einen einfachen kooperativen Round-Robin-Taskplaner verwendet, aber das ist viel weniger als das, was die meisten Leute für ein RTOS halten. Meine Taskplaner für die PIC 18- und dsPIC-Familien sind kostenlos auf meiner Website verfügbar.
@Olin könntest du das näher erläutern? Meinst du, ich sollte anfangen, Threading und Scheduling zu lernen, bevor ich zu einem RTOS wechsele?
@Olin Für kleine Systeme bevorzuge ich kooperatives Multitasking mit abgefragten Aufgaben. Es ist deterministisch und leichtgewichtig, ideal für eingeschränkte Systeme. Preemptives Multitasking mit Threads ist zwar sehr leistungsfähig, kann aber Debug-Albträume verursachen – mit Race Conditions und nicht wiederholbaren Fehlern. Geben Sie mir jeden Tag eine Zustandsmaschine.
@JGord Der beste Weg zur Verbesserung ist das Tun. Ich schlage einige Aktivitäten vor, um Ihre Fähigkeiten zu verbessern, keinen Studienführer. Ich scheine oft erst nach der ersten Umsetzung die interessanten Fragen aufzudecken.
@JGord: Nein, ich sage, dass ein vollständiges RTOS für Mikrocontroller ungeeignet ist, wobei das meiste, was Sie wirklich brauchen, ein kooperativer Task-Swapper ist. RTOS ist etwas für "große" eingebettete Systeme, was Mikrocontroller nicht sind. Es gibt viele Embedded-PCs und dergleichen, bei denen RTOS oder andere Betriebssysteme sinnvoll sind, aber ich habe noch keinen gefunden, bei dem es für einen Mikrocontroller sinnvoll wäre.
@ Joby: OK, das ging aus deiner Antwort nicht hervor. Es klang, als würden Sie einige RTOSs für diesen Fall befürworten.
Informationen zu RTOS finden Sie in Jean Labrosses Buch zu seinem RTOS:MicroC OS II Real Time Kernel . Er hat ein wunderbares Kapitel, das über RTOS-Mechanismen im Allgemeinen spricht. Mit seinem Buch erhältst du die Rechte, sein RTOS zu verwenden.

Das MicroC OS II-Buch ist wahrscheinlich etwas, in das Sie investieren sollten. Sie sollten auch Projekte erstellen, um die verschiedenen Schnittstellen i2c, spi, mdio usw. zu lernen. Insbesondere, wie man jede einzelne bitbangt. Von Zeit zu Zeit unterstützt die Hardware den Bus (müssen Sie das von Anbieter zu Anbieter lernen), aber oft können Sie aus verschiedenen Gründen keine i2c/spi-Hardware verwenden und müssen etwas bangen.

Das avr/arduino ist in Ordnung, Sie sollten ARM, Daumen und Daumen2 und das msp430 und einige ältere (Nicht-Mips-) Bilder lernen. Schauen Sie sich den Bootloader-Code für das Arduino an und finden Sie heraus, wie Sie ein Loader-Programm erstellen, den Flash darauf löschen und die Platine / den Chip übernehmen. Holen Sie sich ein LPC-basiertes Armmikro, schauen Sie sich das Programmierprotokoll für die serielle Schnittstelle an. Holen Sie sich ein sam7s oder etwas mit einem arm7, das ein traditionelles jtag hat, holen Sie sich einen Olimex Wiggler oder jtag-tiny (ich empfehle letzteres). Machen Sie sich mit openocd vertraut. ARMs swd ist schmerzhafter als normales jtag, wird sich aber auf diesem Markt durchsetzen (für Cortex-m-basierte Produkte). Kurz gesagt, lernen Sie die verschiedenen Möglichkeiten kennen, die Anbieter für die Schaltungsprogrammierung anbieten. Sie werden von Zeit zu Zeit Bretter mauern und möchten sich damit wohlfühlen, sie zu entmauern. Schreiben Sie in diesem Sinne Code, um Intel-Hex-, SREC- und Elf-Dateien zu analysieren.

Sie haben Werkzeuge erwähnt. Sie können nichts falsch machen, wenn Sie gcc und binutils lernen, lernen Sie, wie man Cross-Compiling durchführt, zumindest für die unterstützten Plattformen (normalerweise zum Beispiel mit --target=msp430 --prefix=/something). Unterstützte Plattformen für die Mainline gcc und binutils sind ein bewegliches Ziel, also werden avrgcc und mspgcc und dergleichen im Grunde genommen für Sie erledigt. Sie müssen lernen, Linker-Skripte zu schreiben, wie Sie Ihren C-Code schreiben, damit beispielsweise feste Tabellen im Rom und nicht im RAM angezeigt werden. Verschaffen Sie sich auch ein Gefühl für das Zerlegen der Binärdateien. Sie müssen sicherstellen, dass sich die Tabellen an der richtigen Stelle befinden, sicherstellen, dass der Code dort ist, wo Sie ihn vermuten, dass die Vektortabellen und der Boot-/Startcode dort sind, wo der Prozessor ihn benötigt Stiefel. Es schadet auch nicht herauszufinden, was die Compiler-Optimierungen tun und wie C-Code aussieht, wenn er in Assembler-/Maschinencode kompiliert wird. Beschränken Sie sich nach Möglichkeit nicht auf gcc/gnu. llvm ist ein starker Spieler, es hat das Potenzial, gcc als besseres Werkzeug zu überholen. Möglicherweise haben Sie sdcc bereits verwendet. Probieren Sie die Eval-Versionen von Kiel, Iar usw. aus. Sie werden schnell feststellen, dass es in den C/C++-Standards viele Grauzonen gibt und jeder Compiler diese unterschiedlich interpretiert, auch dramatische Unterschiede in der Qualität des Codes, der von derselben Höhe erzeugt wird Ebene Quelle. Wenn Sie bei diesem Beruf bleiben, wird es Zeiten geben, in denen Sie gezwungen sind, einen nicht so großartigen Compiler zu verwenden und seine Warzen und Schwächen zu umgehen. Im Desktop-Geschäft kommt man oft damit durch, den Einsatz von nicht standardkonformen Tools zu verweigern. In der Welt der Mikrocontroller bekommt man manchmal, was man bekommt, und das war's. Manchmal gibt es Anbieter, die die C-Sprache modifizieren/erweitern, um sie an ihre Hardwarefunktionen anzupassen oder angeblich Ihr Leben einfacher zu machen (man denke da an rabbit semi und xmos). (XMOS ist aus vielen Gründen eine sehr attraktive Plattform, ich halte sie für fortgeschritten, aber nach Ihrer Erfahrung sind Sie wahrscheinlich bereit, die Tools sind ein kostenloser Download, ein wirklich guter Simulator, wichtig zu lernen, wie Sie .vcd/waveforms Ihrer Codeausführung).

chibios ist ein weiterer zu betrachten.

Das Erstellen erfolgreicher Bootloader ist eine wichtige Fähigkeit. Der Bootloader, oder zumindest der Anfangsteil davon, will felsenfest sein, man will kein Produkt liefern, das leicht gemauert werden kann. Ein einfacher Start mit einer Möglichkeit, den Anwendungsteil des Flashs neu zu laden, ohne den Einstiegsteil des Bootloaders zu gefährden, ist der Schlüssel.

Die stellaris-Evaluierungsboards sind mit Peripheriegeräten vollgestopft, obwohl sie Bibliotheken bereitstellen, die es wert sind, erlernt zu werden, vor allem, da sich unterscheiden, wie sie Ihnen sagen, dass es funktioniert, und wie es tatsächlich funktioniert, und Sie müssen ihren Code und andere Ressourcen untersuchen, um dies herauszufinden.

Als avr-Fan empfehle ich, wenn Sie noch da draußen sind, sich einen avr-Butterfly zuzulegen. Lernen Sie ein wenig serielle Programmierung, löten Sie einen Stecker an und programmieren Sie ihn neu. Ein paar Peripheriegeräte sind da, um das Programmieren zu lernen.

vielleicht holst du dir ein ehemals dallas semi, jetzt maxim denke ich, ein draht gerät. Wie ihre Temperatursensoren. Noch schmerzhafter als i2c und mdio mit ihrem bidirektionalen Datenbus ist diese Sache mit einem Draht ein Draht (und Masse). Power, Master zu Dependent und Dependent zu Master alles auf einem Draht.

Als ich dort war, wo Sie jetzt sind, fand ich es lustig, Infrarot-Fernbedienungsprotokolle zu dekodieren. Die IR-Empfängermodule sind leicht zu bekommen, Radio Shack hatte tatsächlich ein gutes. Im Grunde das Gegenteil von Bit-Banging, möchten Sie die Zeit zwischen Zustandsänderungen messen, indem Sie dieses Timing verwenden, um das Protokoll zu erkennen und / oder zu decodieren. Ein universeller Empfänger ist nicht erforderlich, ein Protokoll nach dem anderen ist in Ordnung. Ebenso können Sie dann Bitbang-Befehle an eine IR-LED senden, insbesondere wenn Sie die Trägerfrequenz bitbangen.

Es ist wahrscheinlich auch eine gute Idee, über Spi mit einer SD-Karte zu sprechen. Lernen Sie auf jeden Fall, wie man i2c- und/oder Spi-Flash-Teile löscht und programmiert, Sie werden diese oft für Seriennummern und Mac-Adressen und dergleichen finden.

Ich empfehle, auch die grundlegenden Ethernet-Protokolle zu lernen. In der Lage sein, arp- und udp-Pakete (von Grund auf neu) (und auch icmp/ping) zu analysieren und zu erstellen. Es ist ziemlich einfach, einen UDP-Stack zu erstellen, wenn Sie ein wenig schummeln und nicht den tatsächlichen Arp-Regeln folgen. Wenn Ihnen jemand etwas sendet, senden Sie die Antwort an den sendenden Mac / IP zurück. Oder gehen Sie vielleicht so weit, die Arp-Pakete zu beobachten, damit andere Leute sie kaufen, und verfolgen Sie die Mac/IP-Adressen um Sie herum. tcp erfordert viel mehr Arbeit, ist machbar, aber es ist besser, zuerst nur darüber zu lesen, als zu versuchen, es zu implementieren.

Viel Glück und vor allem viel Spaß.

Wenn Sie meine Frage gestatten, wie alt waren Sie, "als Sie dort waren, wo ich jetzt bin?"
Ich würde Anfang/Mitte 20 sagen, als ich an einem Punkt war, an dem ich mich für das Ausprobieren von Mikrocontrollern interessierte und einen Job hatte und es mir leisten konnte. Zu der Zeit war das Bild das einzige und es kostete ungefähr 150 US-Dollar für das billigste Setup aller Art, und das war nur ein ZIF-Sockel-Programmierer für ein Durchgangslochteil, benutzte ein Radio-Shack-Protoboard und musste nur Oszillatoren usw. kaufen um anzufangen. Das Volumen von Boards unter 50 $ und das Vorhandensein des Internets haben das Spiel völlig verändert. Ich wäre 15 oder so geworden, wenn das, was heute verfügbar war, damals verfügbar gewesen wäre.
Sie mussten das Teil von Ihrem Board entfernen, es in den Programmierer stecken, es neu programmieren und dann das Teil wieder in Ihr Board stecken. Nichts davon in Schaltungssachen.
Ja, das ist eigentlich die Welt, in der ich ziemlich viel gearbeitet habe, aber für viel, viel billiger. Meistens verwende ich das Arduino als Programmiermittel, nehme es dann heraus und stecke es in ein beliebiges Ziel. Ich bin froh, dass Sie über 20 waren, als Sie anfingen, denn ich habe mich nicht mit diesen Dingen beschäftigt, bis ich aufs College kam und erkannte, dass es auf dem Desktop ein Universum außerhalb von Java gibt. Das war aber meine Schuld, du hast Recht, dass es viel einfacher ist, heute früh loszulegen.
Als Teenager waren der vic20 und der IBM-PC zwar brandneu und kosteten ein Vermögen, aber mit etwas gut platzierter Inspiration kauften meine Leute (einen, na ja, dann beide), falls eines der Kinder etwas davon lernen sollte und Ich habe damals das Äquivalent dazu gemacht, bin die grundlegenden Handbücher durchgegangen und habe Programme geschrieben, um jeden Befehl zu lernen. Später lernte ich dos mit Assembler, dann C und schließlich, nachdem ich einen richtigen Job und etwas Geld und andere Ingenieure hatte, die mir von diesen Mikrocontrollern erzählten, ging ich DANN diesen Weg.
Für mich, IMO, war der atmel avr butterfly das Arduino des Tages, ein voll funktionsfähiges 20-Dollar-Board mit dem Mikrocontroller, der vor Ort programmierbar ist (fügen Sie drei Drähte und einen 9-poligen Dsub-Anschluss hinzu). Es hatte auch ein Display und andere Dinge und Ersatz-E / A. dann kam das dallas tini heraus (ich habe java verschrottet und einen udp-stack in 8051-assembler geschrieben). ezusb, auch 8051, öffnete die usb-welt. und diese Sub-50-Dollar-Boards gingen weiter ... Ich nehme an, das msp430 Launchpad und die St Value Line Discovery werden mit Verlust verkauft, um das Produkt auf den Markt zu bringen.
Eine völlig andere Welt heute, und leider sind zu viele Programmierer sehr weit entfernt von dem, was wirklich in den Compilern und Prozessoren und Bussen und Protokollen usw. vor sich geht (wegen sehr hoher Sprachen). Bei so vielen leicht zugänglichen Informationen, Hardware und Simulatoren wird es nicht verwendet. Ich freue mich, jemanden mit Interesse zu sehen, bitte machen Sie weiter so.

Das ist eine große Frage. Leider gibt es keine Möglichkeit, die Entwicklung eingebetteter Mikrocontroller zu lernen, genau wie bei fast allem anderen. Ich gehe davon aus, dass Sie, da Sie hier fragen, nicht nur ein bestimmtes Projekt erledigen wollen, sondern wirklich verstehen wollen, was vor sich geht, damit Sie jedes Projekt später selbst erledigen können. Das ist ein guter Anfang.

Es gibt keinen Ersatz dafür, ein paar Projekte in Assembler zu machen, um die Dinge wirklich zu verstehen. Ein Teil der Aufgabe von Hochsprachen besteht darin, einen Teil der Komplexität zu verbergen, aber das verdeckt auch Dinge, die Sie verstehen möchten. Arduino ist noch eine weitere Schicht darüber. Es mag für jemanden, der nicht wissen möchte, wie die Dinge funktionieren, in Ordnung sein, um etwas zu erledigen, aber es ist wirklich schlecht, wenn das Ziel darin besteht, die Details zu lernen. Also lass das Arduino los, vergiss, dass du einen Compiler hast, krempele deine Ärmel hoch und mach dich bereit, wirklich einzutauchen.

Der erste Anlaufpunkt für jeden Mikrocontroller ist sein Datenblatt. Die verschiedenen Mikrocontroller-Linien haben unterschiedliche Details, aber die Konzepte sind die gleichen. Wählen Sie eines aus und bleiben Sie dabei, bis Sie ein paar Projekte durchgeführt haben und sich damit wohl fühlen. Die TI MSP430, Atmel und Microchip PICs sind alles Mainstream-Mikrocontroller-Linien. Ich bin ein PIC-Typ, also werde ich darüber sprechen. Es ist nicht falsch, mit einem der anderen zu gehen, aber ich denke, es gibt eine zugänglichere Community-Unterstützung für PICs da draußen, und die PIC-Linie ist sehr breit, so dass es einfacher sein wird, von Anfang an sowohl zu größeren als auch zu kleineren Micros zu gehen.

Wenn Sie mit der PIC-Leitung beginnen, empfehle ich den 18F2520. Es ist ein recht fähiger Mikrocontroller, kommt in einem einfach umzuschraubenden 28-Pin-Gehäuse, hat eine anständige Menge an Programmspeicher und RAM und einen anständigen Satz gängiger Peripheriegeräte. Holen Sie sich eine kleine Handvoll und verwenden Sie sie zu Beginn auch für kleine Projekte, die mit etwas weniger hätten erledigt werden können. Es geht darum, es gut kennenzulernen. Schließlich möchten Sie etwas tun, das mehr erfordert, als der PIC leisten kann. Hoffentlich sind Sie bis dahin ziemlich gut in den grundlegenden Dingen und können leicht ein anderes Modell ersetzen. Tatsächlich sind alle 18F-PICs gleich, abgesehen von der Anzahl der Pins, dem Programmspeicher, dem RAM und dem Peripheriemix. Nach ein paar Projekten mit dem 18F2520 werden Sie kein Problem damit haben, direkt in jeden PIC 18 einzusteigen.

Wenn Sie dies beruflich tun, werden Sie schließlich auf Anforderungen stoßen, die etwas Kleineres oder Billigeres vorschreiben. Dann sehen Sie sich die 16F- oder möglicherweise sogar 12F- oder 10F-Familien an. Die Dinge werden weitgehend vertraut aussehen, aber einige Dinge werden etwas schwieriger sein. Dies sollte kein Problem sein, wenn Sie mit einem soliden Verständnis eines 18F beginnen. Heutzutage sind die 16F- und niedrigere Familien wirklich nur für die Massenproduktion oder vielleicht, wenn physischer Raum und manchmal Leistung sehr wichtig sind. Sie haben im Vergleich zu einem 18F für einen Bastler kaum einen Vorteil.

Wenn Sie nach oben gehen, können Sie sich die Familien 24, 30 und 33 ansehen. Diese sind im Grunde alle gleich, mit Ausnahme einiger kleinerer Probleme, wie z. B. mit welcher Spannung sie laufen, Höchstgeschwindigkeit und ob sie die DSP-Mathematik-ALU haben oder nicht. Sie sind in Assembler komplizierter zu programmieren, aber auch seltsamerweise einfacher. Es gibt mehr Anweisungen zu beachten, aber es ist daher auch einfacher, viele Dinge zu tun. Dies ist auch ein guter Punkt, um zu C zurückzukehren, wenn Sie dorthin möchten. Der C-Compiler für diese Teile ist eigentlich ziemlich gut, im Gegensatz zu den C-Compilern für PIC 18 und darunter. Es ist auch einfacher, C und Assembler im selben Projekt für diese Teile zu mischen. Vergessen Sie dabei jedoch nicht Assembler ganz. Es ist immer noch nützlich zu wissen, wann Sie einen Bootloader schreiben, sich mit Multitasking befassen müssen, das unnatürliche Aktionen auf dem Stack ausführt,

Eine nette Sache an der Microchip-Reihe ist, dass ein einziger Programmierer/Debugger über die gesamte Charge hinweg arbeitet. Wenn Sie es ernst meinen, dies professionell zu tun, holen Sie sich das Real Ice. Um ein wenig Geld zu sparen, können Sie den ICD3 erwerben, der nur ein leicht abgespeckter Real Ice ist. Das einzige, was es nicht ist, ist ein ICE (dummes Marketing schlägt wieder zu), aber es ist ein guter In-Circuit-Debugger. MPLAB, ihr IDE-Debugger und -Simulator, funktioniert auch über die gesamte Produktlinie hinweg.

Nochmals, für Profis oder diejenigen, die es werden wollen, besuchen Sie die jährliche Microchip Masters-Konferenz. Ja, es ist im Sommer in Arizona, aber Sie sind dort, um zu lernen, also vergessen Sie die 115 Grad F im Schatten. (Eigentlich erkunde ich Arizona gerne im Sommer, also fahre ich eine Woche früher mit meinem kleinen Zelt los und holpere durch das Hinterland. Es ist erstaunlich, wie wenige Menschen draußen in den riesigen Nationalforsten sind, die nicht weit von Phoenix entfernt sind.) Masters auch ein guter Ort, um Entwicklungstools zu finden. Sie verkaufen sie normalerweise für etwa 45 % Rabatt bei Masters. (Ich bin ein Platin-Level-Designpartner von Microchip, also bekomme ich sie ständig um 45 % reduziert, weshalb ich nicht den genauen Masters-Rabatt habe).

Wenn Sie mit der Erforschung von Mikrocontrollern beginnen, indem Sie PIC-Projekte durchführen, besuchen Sie meine Website, auf der ich näher darauf eingehe, wie ich PIC-Projekte normalerweise strukturiere, und Ihnen eine Reihe kostenloser Tools gebe, mit denen Sie einige ausgefallene Dinge tun können. Wenn Sie gutes Softwaredesign und Sauberkeit verstehen, werden Sie sich bei MPASM ärgern. Führen Sie ein oder zwei Projekte durch, um zu verstehen, was es tut und was nicht, und schauen Sie sich dann meine Wrapper und andere Tools an, mit denen Sie viel mehr tun können, während Sie sich an gute Softwaredesign-Praktiken halten. Assembler muss kein Durcheinander sein, nur weil es das meiste ist. Wenn Sie wirklich daran interessiert sind, könnten Sie bei dem Kurs vorbeischauen, den ich diesen Sommer bei Masters zu diesem Thema unterrichte.

Hey Olin, zuerst einmal danke, dass du so viel Zeit in diese Antwort investiert hast. Zweitens habe ich die Atmel-Linie bereits als meine bevorzugte Waffe ausgewählt, da ich 4 oder 5 Projekte damit durchgeführt habe ... Entschuldigung = (. Ich bin mir nicht sicher, wie viel Zeit ich noch verbringen werde Ich werde mir Ihre Website ansehen und denke, Ihre Vorschläge werden sich als hilfreich erweisen, auch wenn ich im Moment nicht auf die PIC-Linie gehe.
Es ist sehr einfach, die Arduino-Sandbox aufzugeben und Anwendungen für die Hardware in asm oder C oder wofür Sie einen Compiler finden können, zu schreiben. Viele andere gute Plattformen, das msp430 Launchpad, stm32 Value Line Discovery, sam7s.

Hier ist eine andere Idee. Implementieren Sie Ihr eigenes Tasking-System im Hintergrund, mit dem Sie sowohl zeitgesteuerte Aufgaben erstellen als auch Aufgaben anfordern können, die nur ausgeführt werden, wenn keine zeitgesteuerten Aufgaben ausgeführt werden. Es ist kein echtes RTOS, sondern verhält sich eher wie ein kooperativer Scheduler. Konvertieren Sie ein früheres Projekt, um das neue Aufgabensystem zu verwenden.

Diese Art von System funktionierte wirklich gut mit Produkten, die wir früher auf einem 8051 verwendeten. Es wurde ursprünglich in Assembler geschrieben, aber später konvertierten wir es nach C, um es bei der Portierung auf andere Architekturen zu unterstützen. Es war wirklich glatt, wo der Herzschlag dieses Systems auf einem 5-ms-Tick lag und die zeitgesteuerten Aufgaben in 5-ms-Schritten liefen. Wir hatten eine Datei, in der wir alle unsere Aufgaben (Funktionszeiger) mit ihren Zeitwerten und denen, die auf Abruf waren, benannt haben. Diese Datei wurde dann entweder in Assembly oder C konvertiert, je nachdem, wie wir sie implementiert und in den Code kompiliert haben.

Wenn es ziemlich gut funktioniert, können Sie Ihr eigenes einfaches RTOS für etwas kräftigeres schreiben.

Klingt ziemlich interessant! Irgendwelche Vorschläge für Lernressourcen zu Aufgabenplanern usw.?
Kapitel 15, Real Time Kernels of „The Firmware Handbook“, von Jean Labrosse, Hrsg. Jack Ganssle, ist ein guter Ausgangspunkt, und der Rest des Buchs wird ebenfalls empfohlen.

Um Ihre Frage "Was ich wissen möchte" direkt anzusprechen:

Ich habe festgestellt, dass es für mich beim Erlernen des Build-Prozesses äußerst vorteilhaft für mich war, den Compiler direkt über die Befehlszeile aufzurufen, sich mit seinen Optionen vertraut zu machen und dann Ihre eigenen Makefiles zu schreiben, um den Build-Prozess zu lernen - was nach etwas klingt, das Sie wollen lernen. Dies trennt im Wesentlichen die Toolkette von der IDE und ermöglicht es Ihnen, mehr über die Toolkette als über die IDE zu lernen. Dies ist eine laufende Sache, die ich versuche, auch zu verbessern.

Mir ist aufgefallen, dass Sie in der Vergangenheit Arduino verwendet haben, was großartig ist, denn jetzt kann ich empfehlen, von nun an avr-gcc als Ihren Compiler zu verwenden. Probieren Sie es aus, es ist auf allen Plattformen verfügbar (Linux, WinAVR für Windows, Mac) und die Dokumentation zur avr-gcc-Toolkette und avrdude (Programmierer) ist großartig, und es sollte viele Beispiel-Makefiles für Sie geben lernen von. Ein beträchtlicher Teil dieser Informationen ist auch auf andere Hardware übertragbar, zum Beispiel arm-gcc.

Perfekt, das könnte tatsächlich das erste sein, was ich versuche. Und noch perfekter, weil ARM mit ziemlicher Sicherheit die zweite Architektur sein wird, die ich lerne, sobald ich mich mit AVRs vollkommen wohl fühle

Eine Sache, die Sie nicht erwähnt haben, ist die Kommunikation.

Es scheint, dass ein Loch , das Sie stopfen könnten , darin besteht, die verschiedenen Standard-Kommunikationsprotokolle zu lernen, die in der Industrie verwendet werden - Dinge wie:

usw.

Ah, ja Kommunikation +1 Ich werde diese Links auf jeden Fall durchlesen. Haben Sie irgendwelche Projektvorschläge, die mich dazu zwingen würden, das anzuwenden, was ich nur durch das Lesen "lerne"?
Die Verbindung mit jedem Gerät, das diesen Bus zur Verfügung hat, ist oft ein gutes Projekt. Vielleicht schreiben Sie eine Art Treiber. Es gibt viele Chips für Busse wie I2C, SPI, 1wire usw. Die in der Antwort erwähnten sind eher Device-to-Device-Busse. Ich könnte MIDI einwerfen, was interessant sein könnte.

Die Frage lautet also: "Wie lernt man, wenn jede Toolchain eine Blackbox ist?"

Ich schlage vor, ein handelsübliches, sehr altes Experimentier- und Debugging-Board mit einer gängigen CPU zu finden. So etwas wie eine 2 Fuß breite Vorrichtung mit CPU, LEDs, Schaltern und der Schaltfläche "Einen einzigen Schritt ausführen". Erstellen Sie manuell ein Langschleifenprogramm mit 5-10 Anweisungen unter Verwendung von Maschinencode-Binäranweisungen aus dem Datenblatt. Legen Sie es auf einen steckbaren riesigen ROM-Chip. ROM einlegen, einschalten/zurücksetzen und Schritt für Schritt debuggen.

Wie gut verstehen Sie die Register, den Betrieb und dergleichen auf einem 8-Bit-Mikro? Es könnte eine gute Idee sein, eine kleine Montage zu machen. Dies hat den Vorteil, dass Sie genau lernen, was vor sich geht. Dies kann helfen, seltsame Fehler mit höheren Sprachen zu lösen.

AVRs haben nette einfache Assembler und Register. Es ist eine gute Plattform, um Ihr Futter nass zu machen. Es gibt auch einige gute Tutorials für diese Plattform.

Dies gibt Ihnen die Quintessenz dessen, was das Mikro tut. Dann wird der nächste Schritt, wie der Compiler und Linker C/Arduino in Maschinencode umwandeln, leichter zu verstehen sein.

Ich habe bereits 3 verschiedene Assemblersprachen verwendet. Ich denke, ich bin an dieser Front in Ordnung. Vielen Dank für den Input und ich stimme definitiv zu, dass das Erlernen von Assembler dabei geholfen hat, C besser zu schreiben (oder zumindest zu verstehen, was ich schreibe).

Realtime Mantra enthält mehrere Artikel über die Entwicklung eingebetteter Software.