Wie werde ich ein Embedded Software Entwickler?

22

Ich möchte einige Tipps für diejenigen, die ein guter Embedded-Software-Entwickler werden oder sich in diesem Bereich verbessern möchten.

Was muss ich über Hardware und Software lernen?

Welche Bücher werden am meisten empfohlen? Blogs?

Wie könnte ich am Ende vom Anfänger zum exzellenten Profi werden?

Daniel Grillo
quelle

Antworten:

39

Alle Antworten waren bisher gut, aber ich werfe meine zwei Cent ein.

Hier ist eine Wiederholung einiger Tipps mit ein paar Extras:

  • Lernen Sie C: Die grundlegende Sprache der Hardware, die noch tragbar ist (zu einem gewissen Grad). Lernen Sie es nicht nur, sondern werden Sie ein Experte für all seine Funktionen wie Flüchtigkeit und warum es für das Schreiben von Gerätetreibern wichtig ist.
  • Beginnen Sie mit einem guten Entwicklungskit wie Arduino, lernen Sie jedoch, wie bereits erwähnt, andere Architekturen, sobald Sie ein gutes Gefühl dafür haben. Glücklicherweise gibt es einige Arduino-kompatible Boards, die mit anderen Prozessoren gebaut wurden. Auf diese Weise können Sie dasselbe Design auf einer anderen UC umschreiben, ohne Ihr gesamtes Design zu verschlechtern und gleichzeitig ein Gefühl für etwas Neues zu bekommen.
  • Fühlen Sie sich in der Lernphase frei, das Rad für Gerätetreiber oder andere Codeteile neu zu erfinden. Plumpsen Sie nicht einfach den Treibercode einer anderen Person hinein. Es ist wertvoll, das Rad neu zu erfinden, wenn Sie lernen.
  • Fordern Sie sich heraus, Ihren Code in Bezug auf Geschwindigkeit und Speichernutzung effizienter umzuschreiben.
  • Machen Sie sich mit verschiedenen Arten von Embedded Systems-Software-Architekturen vertraut. Beginnen Sie mit der grundlegenden Interrupt-gesteuerten / Hintergrundschleifen-Verarbeitung und wechseln Sie zu Hintergrund-Schedulern und dann zu Echtzeit-Betriebssystemen.
  • Holen Sie sich eine gute Quellcodeverwaltung! Ich persönlich bevorzuge Mercurial .
  • Melden Sie sich sogar für einige kostenlose Hosting-Sites für die Quellcodeverwaltung wie Sourceforge.net oder Bitbucket.org an, um Ihr Projekt zu hosten, selbst wenn Sie der einzige sind, der daran arbeitet. Sie sichern Ihren Code, sodass Sie sich nicht um den gelegentlichen Absturz der Festplatte sorgen müssen, der alles zerstört! Die Verwendung eines verteilten VCS ist praktisch, da Sie Änderungen an Ihrer Festplatte einchecken und dann auf die Host-Site hochladen können, wenn Sie bereit sind.
  • Lernen Sie Ihre Werkzeuge für jeden Chip, an dem Sie arbeiten! Es ist wichtig zu wissen, wie der Compiler Assemblierungen erstellt. Sie müssen ein Gefühl dafür bekommen, wie effizient der Code ist, da Sie ihn möglicherweise in der Assembly neu schreiben müssen. Es ist auch wichtig zu wissen, wie die Linker-Datei verwendet und die Ausgabe der Speicherzuordnung interpretiert wird! Wie sonst werden Sie wissen, ob diese Routine, die Sie gerade geschrieben haben, die Ursache dafür ist, dass Sie zu viel ROM / Flash aufgenommen haben!
  • Lerne neue Techniken und experimentiere mit ihnen in deinen Designs!
  • Nehmen Sie beim Debuggen nichts an. Überprüfen Sie es!
  • Erfahren Sie, wie Sie defensiv programmieren, um Fehler abzufangen und Annahmen zu überprüfen (z. B. mithilfe von assert).
  • Integrieren Sie in Ihren Code Debugging-Informationen, mit denen Sie beispielsweise den Speicherverbrauch ausgeben oder den Code mit Zeitgebern profilieren oder Ersatzstifte an der uC verwenden können, um die Interrupt-Latenz auf einem O-Oszilloskop umzuschalten und zu messen.

Hier sind einige Bücher:

Hier sind einige Websites:

  • Eingebettete Gurus
  • Ganssle Group Jack Ganssle hat einige wunderbare historische Geschichten zu erzählen. Lesen Sie die Artikel. In einigen Dingen wird er jedoch ein wenig predigen.
  • Embedded.com Gute Informationen zu den neuesten Techniken und Tipps von Ganssle, Barr und anderen Branchenexperten.
Jay Atkinson
quelle
1
@Adam: Ich liebe dieses Buch! Pragmatischer Programmierer! Ich kann nicht glauben, dass ich es vergessen habe!
Jay Atkinson
1
+1 für Mercurial. Ich mag es, obwohl ich das Gefühl habe, dass git-Kenntnisse wertvoller wären. Das Kennenlernen der Grundlagen von SVN ist ziemlich wichtig, wenn Sie Beiträge leisten oder Beiträge aus anderen Projekten übernehmen möchten, da viele von ihnen diese verwenden.
Tyblu
17
  • Denken Sie daran: "Es gibt keine Silberkugel" . Gehen Sie nicht in die Falle, wenn Sie glauben, dass es ein Werkzeug, eine Methode, eine Sprache oder ein System gibt, mit dem sich alle Probleme lösen lassen
  • Werden Sie Experte in C
    • Lernen Sie, ohne malloc () und POSIX auszukommen
  • Lass dich nicht auf eine Architektur ein, es ist einfach, aus Versehen ein PIC-, AVR- oder ARM-Fan zu werden
  • Erstellen, debuggen und zum Laufen bringen. Übung macht den Meister
  • Erlernen Sie mindestens ein Quellcodeverwaltungssystem (SVN / git / etc) und verwenden Sie es
  • Seien Sie immer bereit, Ihre Annahmen zu testen. Der Fehler liegt normalerweise in der Sache, von der Sie annehmen, dass sie funktioniert
  • Verlassen Sie sich nicht zu sehr auf Debugger, sie sind auf jedem System anders und von unterschiedlicher Zuverlässigkeit
  • Denken Sie sparsam. Denken Sie bei der Problemlösung an den Code-Footprint, den RAM-Footprint und die Hardwarekosten

Für Bücher würde ich empfehlen, durch die Geschichte zu graben. Die meisten der heutigen eingebetteten Softwaretechniken stammen aus der jüngsten Vergangenheit.

Übe wie immer täglich.

Toby Jaffey
quelle
5
Von all den Dingen, die ich gelernt habe, ist die Versionskontrolle (ich verwende derzeit Subversion) das Wertvollste für meine Produktivität. Als ich hier anfing, hatten wir einen Source-Safe von Microsoft, also habe ich eine schlechte und dann eine gute Lösung verwendet.
Kortuk
Ich kann mir mein Leben ohne ein Quellcodeverwaltungssystem nicht vorstellen. Ich benutze derzeit auch SVN. Ich weiß nicht, wie es funktioniert hat, bevor ich SVN kenne.
Daniel Grillo
1
+1 für "Der Fehler liegt normalerweise in der Sache, von der Sie annehmen, dass sie funktioniert"
JustJeff
"Lerne ohne Malloc auszukommen" - Warum? Um das Risiko einer Stapel- / Heap-Kollision zu minimieren?
Rzetterberg
@rzetterberg Viele eingebettete Systeme verzichten auf die dynamische Speicherzuweisung, da dies zu Heap-Fragmentierung und Indeterminismus führen kann
Toby Jaffey,
8

Die anderen Antworten sind großartig, aber der größte Unterschied zwischen einem Hobbyisten und einem Profi sollte eine Einstellung zur Qualität sein. Lassen Sie Ihr Projekt also vollständig laufen und hören Sie nicht auf, wenn Sie zu 80% mit einem Projekt fertig sind. Nehmen Sie es den ganzen Weg, beweisen Sie, dass es funktioniert, und dokumentieren Sie es richtig.

Stellen Sie sicher, dass Ihr Code lesbar und wartbar ist.

Und vergiss nicht, auch ein bisschen Spaß zu haben :)

Johan
quelle
7

Abgesehen von der offensichtlichen Tatsache, dass Sie C lernen und mit einigen Entwicklerplatinen beginnen, möchten Sie lernen, Mikrocontroller-Datenblätter zu lesen .
Hersteller fügen Mikrocontrollern immer mehr Funktionen hinzu, die daher immer komplexer werden. Das Datenblatt bietet nicht nur elektrische Eigenschaften (die für den Elektroniker interessanter sind als für den Softwareentwickler), sondern auch eine detaillierte Beschreibung von Registern, Speicherbelegungen usw.
Beim ersten Lesen sieht ein Datenblatt möglicherweise entmutigend aus, versteht sie jedoch nicht kann in der Debugging-Phase zu stärkeren Kopfschmerzen führen.

stevenvh
quelle
3

'Embedded' ist eine Art geladener Begriff.

In mancher Hinsicht kann jedes System, das für die Ausführung einer einzelnen Anwendung vorgesehen ist, als eingebettetes System bezeichnet werden, sofern bestimmte Hardwarekomponenten gesteuert werden müssen. Sie können einen 400-MHz-PPC604 mit 2 GB RAM, auf dem eine Java-Anwendung über Linux ausgeführt wird, als eingebettetes System bezeichnen, wenn er einen Prozess über lokale E / A-Module steuert. Auf der anderen Seite wäre ein Arduino, auf dem nur eine minimale Netzwerkanwendung ausgeführt wird, kein eingebettetes System. Aber wahrscheinlich lässt "eingebettet" die meisten Leute an Flash-basierte Controller mit nur ein paar hundert Bytes RAM, keinem nennenswerten Betriebssystem und einer Vielzahl von On-Chip-Peripheriegeräten denken.

Davon abgesehen sind die beiden größten Hürden, denen sich nicht-eingebettete Programmierer beim Lernen von eingebetteten Systemen gegenübersehen, wahrscheinlich E / A-Register und Interrupts.

Interrupts sind für nicht eingebettete Programmierer unter Umständen das einfachere Konzept, da die Hauptprobleme bei der parallelen und ereignisgesteuerten Programmierung häufig in Mainstream-Anwendungen auftreten. Was Interrupts zu einem Schmerz macht, ist die Erkenntnis, dass ein System extrem empfindlich auf die Qualität seiner Interrupt-Behandlung reagiert und dass es kompliziert ist, mit Hardware umzugehen, um den Interrupt-Zustand zu beseitigen und sich auf den nächsten einzurichten. Mit einer GUI beendet ein Deadlock nur die Anwendung. Bei einem Interrupt-Handler führt ein Deadlock dazu, dass Ihr gesamtes System gesperrt wird.

E / A-Geräte scheinen der Bereich zu sein, der die meisten Schwierigkeiten verursacht. Für die Uneingeweihten kann es eine Überraschung sein, dass das Lesen dieses Registers hier Auswirkungen auf dieses Register dort hat . Schreiben von Einsen, um Bits zu löschen. Statusbits, die sich beim Lesen eines Datenregisters usw. von selbst löschen. Es gibt so viele Möglichkeiten mit E / A-Hardware, dass es keine allgemeine Regel für den Umgang damit gibt, außer zu lernen, wie man Gerätedatenblätter findet und interpretiert. Wenn Sie einen Gerätetreiber für eine serielle Schnittstelle schreiben, lernen Sie viel über die I / O-Programmierung auf niedriger Ebene.

Es gibt wirklich keinen Ersatz für das Erlernen dieser Dinge, als die Ärmel hochzukrempeln und ein direktes C und / oder eine Assemblersprache auf dem bloßen Metall zu programmieren. Sogar das oben erwähnte Java-basierte eingebettete System benötigt irgendwann einen Gerätetreiber für die E / A, und dies bedeutet letztendlich, dass man sich mit einigem C befasst. Erfahrung ist der beste Lehrer. Suchen Sie sich einen Mikrocontroller aus, seien es MSP430, TMS320, AVR, ARM, PIC, 68HC11, oder was auch immer, finden Sie ein Evaluierungskit und bauen Sie einige Systeme.

JustJeff
quelle
3

$50tO$aber du musst für den pro mini löten. Ich bin kein Fan der PIC-Familie, aber vielleicht möchten Sie etwas als Geschichtsstunde mitbringen. Dasselbe gilt für den 8051. Beide Familien sind immer noch beliebt und in Gebrauch, nur nicht sehr effizient und wurden von anderen Architekturen übergangen. Lernen Sie unbedingt ARM und Daumen, vielleicht MIPS (das ist ein Bild 32, nicht zu verwechseln mit der älteren Original-PIC-Architektur). Das ARMmite Pro ist ein gutes Einstiegs-ARM-Board, auch wenn es das Stellaris sein mag.

Was Sie hier lernen möchten, ist Assembler für verschiedene Plattformen. C. C und Assembler Interaktion. Verschiedene Tools GCC und Nicht-GCC. Wie man ein Datenblatt / eine Programmierreferenz liest (und erkennt, dass sie alle einige Fehler aufweisen oder irreführend sein können, vertraut ihnen niemals, die Hardware gewinnt über Dokumente) und wie man ein Schema liest oder verwendet. Dies sind normalerweise keine komplizierten Schaltpläne. Einige der Platinen eignen sich gut für die Anbindung an Projekte, dh sie haben keine störenden Abfälle auf der Platine, sondern nur direkten Zugriff auf die E / A-Pins. Aber das ist nicht das Beste zum Lernen. So etwas wie ein StellarisDas Board, das für Projekte schmerzhaft ist, hat viele lustige Dinge an Bord, um eingebettet zu lernen und zu lernen, Treiber auszuleihen / zu verwenden oder eigene aus Datenblättern zu schreiben. Der Atmel AVR Butterfly ist auch eine gute Karte, wenn er noch verfügbar ist. Möglicherweise müssen Sie ihn an Ihren eigenen seriellen Anschluss anlöten, um ihn zu programmieren, oder nur einige Drähte in den Löchern einklemmen. Was es Ihnen gibt, ist ein paar Peripheriegeräte, die Sie programmieren lernen können.

Selbst wenn Sie am Ende eingebettete Arbeit erledigen, bei der Anwendungen mit SDK- oder API-Aufrufen unter Linux oder einem RTOS geschrieben werden (ohne die Hardware zu berühren oder Datenblätter zu lesen), sind Sie mit den oben genannten Kenntnissen dem Rest immer noch einen Schritt voraus.

Daniel Grillo
quelle
3

Dieser Artikel (automatisch vom Portugiesischen ins Englische übersetzt) ​​bietet einen guten Überblick über die Entwicklung einer Karriere als Entwickler von eingebetteter Software. Hinweis: Das Original ist hier .

Zunächst werden die Wissensbereiche umrissen, die Sie entwickeln müssen:

  1. Wissen: Sie müssen die Theorie der eingebetteten Systeme kennen. Dies bedeutet Hard- und Software. Es ist unmöglich, ein kompetenter Entwickler von eingebetteter Software zu sein, ohne die funktionierende Hardware-Architektur kennenzulernen.

  2. Geschicklichkeit: Sie müssen Erfahrung in der Umgebung sammeln. Benötigt Übung. Sie können alle PIC-Assembler-Mnemoniken dekorieren, aber es nützt nichts, wenn Sie mit diesem Wissen keine LED ansteuern können.

  3. Haltung: Vor allem brauchen Sie Einstellungen, die Sie in diesem Bereich wachsen lassen. Es ist eine sehr dynamische mit häufigen Änderungen und Entwicklungen. Sie müssen immer motiviert sein (a) Autodidakt sein, Spaß am Lernen haben, "optimieren" und verstehen, wie die Dinge funktionieren. Ohne solche Einstellungen wirst du bald bescheid geben. Denn in diesem Bereich muss man sehr, sehr ausdauernd sein.

Es gibt dann die folgenden Tipps zur Beherrschung dieser Bereiche (und entwickelt sie mit weiterem Text, dies sind nur die Überschriften):

  1. Was du brauchst, um Hardware zu lernen (zumindest)
  2. Was Sie brauchen, um die Software zu lernen (zumindest)
  3. Darüber hinaus studieren Betriebssysteme
  4. Du brauchst eine Ausbildung
  5. Hören Sie nicht auf, lernen Sie weiter und entwickeln Sie Ihr Netzwerk weiter!
Kevin Vermeer
quelle
1
Danke für den Link! Die Google-Übersetzung scheint darauf hinzudeuten, dass sie perfekt zu dieser Frage passt. Wir möchten jedoch, dass (1) der Text auf Englisch ist (wir sind eine englischsprachige Community , obwohl viele von uns mindestens zweisprachig sind) - Automatische Übersetzung nur, wenn Sie (2) die Antwort enthalten müssen eine Zusammenfassung des Artikels für den Fall, dass der Link nicht mehr funktioniert. Ich habe Ihren Beitrag bearbeitet, um diese Richtlinien einzuhalten, und Ihnen dafür eine positive Bewertung gegeben!
Kevin Vermeer
2

Überlegen Sie zweimal, bevor Sie ein Embedded-Software-Ingenieur werden. Ich hatte Phasen in meiner Karriere. Ich habe in den ersten 5 Jahren Software entwickelt, bin dann zu Vertrieb / Marketing gewechselt, habe das 15 Jahre lang gemacht, habe ein Geschäft über 100 Millionen Dollar geführt und bin jetzt wieder zu Software zurückgekehrt.

Wenn ich nach 15 Jahren wieder zu Software zurückkehre, erinnere ich mich, warum ich überhaupt gegangen bin. Es ist schwer. Es erfordert Konzentration, mehrere Hundert Zeilen Code, die sich berühren, und Sie müssen alles im Gedächtnis behalten. Eingebettet ist besonders schwer.

Sie müssen sich auch selbst verstehen. Wenn Sie im Allgemeinen ein kluger, akribischer und geduldiger Typ sind, würden Sie einen großartigen Ingenieur abgeben. Wenn Sie eine davon vermissen, sind Sie bestenfalls durchschnittlich. Denk darüber nach. Wenn Sie sehr klug und nicht geduldig sind, ist das nicht viel wert, denn egal wie klug Sie sind, gutes Engineering erfordert Geduld und Liebe zum Detail.

Sie müssen sich auch wohl fühlen, wenn Sie die Code-Stunden gleichzeitig betrachten, ohne zu sprechen. Ich beobachte, dass Menschen mit guten sozialen Fähigkeiten dies unerträglich finden.

Wenn das alles klappt, dann lese all diese tollen Bücher, mache die Übungen und du wirst einen tollen Ingenieur machen. Viel Glück

Frank
quelle
1

Alle anderen sagen großartige Dinge. Ich gebe Ihnen also einen allgemeinen Rat: Lesen, lesen, lesen, lesen, lesen, lesen!

Lesen Sie jeden Artikel auf http://embeddedgurus.com. Wenn Sie etwas nicht verstehen, recherchieren Sie es. Wenn Sie in der Erklärung dieser Dinge etwas finden, das Sie nicht verstehen, lesen Sie etwas mehr. Ich bin kurz davor, in eine Embedded-Software-Position einzusteigen, und meine Erfahrung besteht aus einer Handvoll professioneller Projekte in den letzten Jahren und vielem Lesen. Erfahrung lässt Sie Dinge ausprobieren, aber Lesen lässt Sie wissen, ob die Dinge, die Sie ausprobiert haben, vielleicht besser waren, als Sie könnten. Es führt Sie in Konzepte ein, mit denen Sie unter allen Umständen arbeiten können.

Gerade gelesen!

AngryEE
quelle
0

Werden Sie Experte für C Understand Timer und serielle Kommunikation. Sie sollten sich damit die Hände schmutzig machen. Verstehen Sie RF-Protokolle und passen Sie sie an Ihre Anforderungen an. Probieren Sie Code-Kombinationen beim Debuggen nicht einfach blind aus. Code macht genau das, was Sie ihm sagen. Lesen Sie die Bedienungsanleitung und das Datenblatt und nehmen Sie dann eine Änderung vor, wenn etwas nicht funktioniert. Der einzige Weg, Experte zu werden, ist zu üben. Erstellen Sie weiterhin Anwendungen. Bald wird es zur zweiten Natur.

Dominic Pritham
quelle