Ich bin ein Student der Elektronik und Kommunikationstechnik, bevor ich aufs College kam, habe ich mich für Programmierung und Computeranwendungen interessiert. Ich hatte mich darauf konzentriert, Windows-Anwendungen zu entwerfen und ihre Techniken zu lernen, aber jetzt habe ich das Gefühl, dass dies in meinem Bereich nutzlos ist ... Ich muss nicht alles über Informatik und Softwareentwicklung lernen! (Habe ich damit recht?)
Ich kenne VB .Net, C# und C++. Ich habe in meinem Urlaub viel Zeit und möchte daher programmatisch tiefer in den Bereich "Elektronik" einsteigen. Was würdest du also empfehlen zu lernen oder worauf du dich konzentrieren solltest?
Ich möchte diese Sprachen, die beim Programmieren von Mikrocontrollern und anderen integrierten Schaltkreisen verwendet werden. Reicht C++ oder sollte ich auch C beherrschen? Sag mir bitte deine Gedanken.
Ja, es ist mit ziemlicher Sicherheit ein guter Schritt, C so gut wie möglich zu verwenden (C++ bietet Ihnen einen hilfreichen Ausgangspunkt, obwohl es, wie leftaroundabout anmerkt, noch viel zu lernen gibt, insbesondere die Unterschiede zwischen der Codierung für kleine eingebettete Systeme im Vergleich zum Schreiben für etwas wie Windows), da es allgegenwärtig ist.
Die meisten Mikrocontroller unterhalb einer bestimmten Größe (z. B. PIC, AVR, MSP430 usw.) verwenden C (oder Assembler), da es viele hochwertige (kostenlose und $$-Versionen - z. B. viele kommerzielle Compiler basieren auf dem kostenlosen GCC-Compiler) C-Compiler gibt .
Sie erhalten andere Sprachen wie das ausgezeichnete JAL für PIC (Originalautor Wouter Van Ooijen, der hier Mitglied ist), PICBASIC, Ada-Varianten, aber aufgrund seiner Popularität und der Anzahl verfügbarer Compiler würde ich sagen, dass C die Sprache der Wahl ist für die meisten. Dies bedeutet zwar nicht, dass es die beste Sprache ist, aber die Verwendung der beliebtesten Sprache bringt offensichtliche Vorteile mit sich (Dokumentation, Support, Portabilität, Zusammenarbeit usw.)
. Für die komplexeren und größeren 32-Bit-Mikros wie viele ARM-Varianten gibt es auch C++ und andere Compiler verfügbar.
Ich würde direkt hineinspringen und mir ein paar Entwicklungsboards schnappen und mit dem Codieren beginnen. Sie könnten ein Low-End-8-Bit-Mikro wie das PIC16F (viele Starter-Kits auf Microchip Direct) auswählen.
Ein 16-Bit-Mikro der Mittelklasse wie das PIC24 und auch eine Art C / C ++ / eingebetteter Linux-ARM - der STM32F4 ARM Cortex M4 Discovery ist ein sehr billiges Entwicklungsboard, das sich lohnen könnte.
Auf der Seite der programmierbaren Logik und der Hardwarebeschreibungssprache (HDL - die großen beiden sind Verilog und VHDL) kann es sich auch lohnen, ein FPGA- oder CPLD-Entwicklungsboard von Diglent oder ähnlichem zu erwerben.
Wenn Sie nicht auf ein Entwicklungsboard warten möchten, können Sie MPLAB oder MPLABX herunterladen und den hervorragenden Simulator verwenden, um sich an der PIC-Entwicklung zu versuchen. Dasselbe gilt auch für andere Tools, zum Beispiel können Sie Xilinx ISE Webpack kostenlos herunterladen und HDLs und programmierbares Logikdesign ausprobieren.
Lernen Sie C und besorgen Sie sich ein billiges Mikrocontroller-Entwicklungsboard, wie ein MSP430 oder ARM Cortex, und schreiben und laden Sie zumindest ein paar C-Programme.
Ich habe einen Abschluss in Informatik und einen Hintergrund in Softwareentwicklung, hauptsächlich C++-Programmierung für Spiele und jetzt iOS-Spiele und -Apps, aber mein letzter Job war ein halbprofessioneller EE-Gig, der mit einer Reihe von Firmware-Programmierungen für ein ARM Cortex M3-System begann , und endete damit, dass ich lernte, wie man ein grundlegendes Schaltungsdesign und Platinenlayout durchführt, und ein paar einfache Platinen entwarf. Also musste ich mich im Grunde als jemand, der für beide Seiten verantwortlich war, mit dem Problem auseinandersetzen, die beste Programmiersprache für die Überbrückung des Hardware-/Software-Designs zu verwenden.
C ist absolut die Sprache, die Sie kennen müssen. Es ist einfach für Leute, die in C++ programmieren und sich eigentlich nie auf den Funktionsumfang von C beschränken müssen, zu sagen, "es ist dasselbe", aber das ist es nicht. Insbesondere die Art und Weise, wie sich C++ entwickelt und Features gesammelt hat, und die Art und Weise, wie Mainstream-C++-Programmierer diese Features verwenden, ist wirklich eine ganz andere Sache, an einer einigermaßen großen C-Anwendung zu arbeiten als an einer C++-Anwendung. Ihr Firmware-SDK wird aus einer Reihe von C-Bibliotheken bestehen, alles andere, was auf eine MCU passt, ist eine C-Bibliothek, jedes Betriebssystem, das auf einer MCU sinnvoll ist, wird in C geschrieben usw. usw.
Da jedoch viele der MCU-Toolchains GCC als Compiler verwenden, steht Ihnen mit ziemlicher Sicherheit ein C++-Compiler zur Verfügung, wenn Sie eine anständige MCU-Familie verwenden. Aber Sie müssen sehr vorsichtig mit den Funktionen sein, die Sie verwenden, insbesondere mit Dingen aus der Standardbibliothek, da es sehr einfach ist, eine Binärdatei zu erhalten, die viel zu groß ist, um auf Ihr Gerät zu passen. Ich denke, es gibt gute Argumente für die Verwendung von C++ auf eingebetteten Geräten, C++ hat einige nette Funktionen, die Müll oder keine Größen- oder Geschwindigkeitseinbußen haben, Sie müssen nur wissen, was Sie tun, und so Code schreiben weiter am C-Stil-Ende des Spektrums als am STL-Ende des Spektrums in Bezug auf die clevere Verwendung von Funktionen.
Achten Sie nicht zu sehr auf Leute, die sagen, dass Sie Lua oder Python auf einer MCU mit dem richtigen eingebetteten Interpreter verwenden können, bla, bla. Das stimmt, ich habe es gemacht und es macht Spaß, aber im Moment ist es eher für Spielzeugprojekte und Sachen, die bei Hack a Day auftauchen. Ich denke, wir werden mehr davon sehen, da Moores Gesetz unerbittlich auf selbst die kleinsten Prozessoren angewendet wird, das ist etwas, das mit Spielen passiert ist, wo früher viel Assembler war, dann haben sie mit C und C++ länger durchgehalten als alle anderen, und jetzt ist alles so schnell, und die Produktivität der Entwickler ist so wichtig, dass viel Entwicklung mit eingebetteten höheren Sprachen oder direkt in einer höheren Sprache erfolgt. Trotzdem wird es einige Jahre dauern, bis Unternehmen Firmware-Programmierer mit Python- und Lua-Hintergrund einstellen.
Verbringen Sie auch nicht zu viel Zeit mit dem Zusammenbau. Es ist nicht schlecht, mit den Konzepten vertraut zu sein, aber es ist unwahrscheinlich, dass Sie viel oder gar keine Assembler-Programmierung durchführen werden. Es gibt so eine konventionelle Weisheit bei Spielen und eingebettet darin, dass es "gut zu wissen" ist, dass Assembler oft von Leuten wiederholt wird, die nicht wirklich in diesen Bereichen arbeiten. Aber in Wirklichkeit ist es sehr unwahrscheinlich, dass Sie überhaupt jemals eine Assembly schreiben werden, und wenn Sie dies tun, werden es wahrscheinlich nur ein paar Zeilen zur Optimierung oder etwas mit der Hardware sein, für die Sie einfach keine API haben (aber Sie werden es tun nachdem Sie eine geschrieben haben, die ein paar Assemblerzeilen umschließt). Ich habe an mehreren Spielen und diesem Board-/Firmware-Designprojekt gearbeitet, und die Gesamtzahl der Montagezeilen, die ich für kommerzielle Projekte geschrieben habe, liegt wahrscheinlich im niedrigen Zehnerbereich. Es'
asm()
) enthalten sein werden, die schön in Ihren C-Code eingebettet sind. Dies ist in jeder Hinsicht eine Gewinnkombination. Hohes Niveau, aber kompakt mit gelegentlichen Einbrüchen in der Montage, wenn beispielsweise das Timing genau richtig sein muss. Die avr-gcc
Toolchain macht dies bereits häufig mit C-Makros, sodass Sie es nie bemerken.Ich stimme allen anderen zu, dass Sie in C sehr kompetent sein müssen.
Ich würde auch empfehlen, mindestens eine Assemblersprache zu lernen. Dadurch werden Sie zu einem viel besseren C-Programmierer. Sie müssen wissen, was unter der Haube vor sich geht, und das gilt in der Embedded-Welt viel mehr als in der PC-Welt.
Wenn Sie den Assembler verstehen, den Ihr C generiert, können Sie optimaleres C in Bezug auf Geschwindigkeit und Kompaktheit schreiben. Schneller Code bedeutet:
Kompakterer Code bedeutet, dass Sie eine billigere MCU mit weniger Speicher verwenden können. Oder haben Sie Platz für weitere Funktionen.
Die andere Sprache, die Sie vielleicht lernen möchten, ist Verilog . Dies ist eine Hardware-Beschreibungssprache, und sie unterscheidet sich wirklich ziemlich von C, nicht nur in der Art, wie sie aussieht, sondern auch in ihrer Funktionalität. Verilog wird den Weg zur Nutzung sehr leistungsfähiger Chips wie PSoC3 und 5 von Cypress ebnen . Es ist ein Mikrocontroller mit analoger und digitaler reprogrammierbarer Hardware, mit dem Sie einige erstaunliche Dinge tun können, die mit jeder anderen MCU sehr schwierig zu machen sind. Sie werden auch in der Lage sein, FPGA -Design zu machen.
Als MSEE, der seit 8 Jahren in der Verteidigungsindustrie arbeitet, kann ich Ihnen sagen, dass es Ihnen nie an Arbeit mangeln wird, wenn Sie verstehen, wie man in LabVIEW (einer grafischen, streng typisierten Datenflusssprache) gut programmiert.
LabVIEW begann als Programmiersprache für Hardware-Ingenieure, das sieht man daran, dass der Code sehr stark an einen Schaltplan erinnert. In den letzten 25 Jahren hat sich LabVIEW jedoch zu einer vollwertigen, funktionsreichen Sprache mit Unterstützung für Objektorientierung und Multithreading entwickelt. Tatsächlich würde ich argumentieren, dass es keine andere Programmiersprache gibt, ob textbasiert oder nicht, die einfacher ist, eine Multithread-Anwendung zu programmieren als LabVIEW; Dies liegt zum großen Teil an seinem Datenflussparadigma. Da die Anzahl der CPU-Kerne weiter zunimmt, wird LabVIEW als Allzwecksprache immer relevanter.
Ein weiterer Vorteil der Kenntnis von LabVIEW besteht darin, dass Sie nur einen Steinwurf von der Programmierung von FPGAs entfernt sind, indem Sie das LabVIEW FPGA-Modul verwenden , das Ihren LabVIEW-Code nimmt und ihn hinter den Kulissen in VHDL konvertiert, bevor er ihn an den Xilinx-Compiler weiterleitet. Sie können Ihre LabVIEW-Kenntnisse auch nutzen, um über das LabVIEW Real-Time Module , das entweder VxWorks oder Phar Lap verwendet , zur Programmierung von Echtzeitcode überzugehen.
Hinweis: Ich bin ein zertifizierter LabVIEW-Entwickler.
Wenn Sie Mikrocontroller auf niedriger Ebene programmieren möchten, sollten Sie mit der Programmierung in Assemblersprache vertraut sein (je mehr unterschiedliche Architekturen, desto besser), und ja, Sie werden C viel häufiger verwenden als C++.
Für allgemeine Ingenieurarbeiten werden häufig mathematisch orientierte Sprachen wie Matlab (auch Scilab und GNU Octave) für Modellierung und Prototyping verwendet.
Außerdem sind viele IDEs für Software und Hardware skriptfähig, typischerweise mit TCL oder LUA, daher wäre eine gewisse Vertrautheit mit Skriptsprachen im Allgemeinen (auch Perl, Python, PHP, Javascript usw.) nützlich.
Für das Hardwaredesign benötigen Sie Verilog- und/oder VHDL-Kenntnisse.
Reicht C++? Vielleicht.
Bitte denken Sie daran, dass C in etwa 90-99 % aller mcu:s da draußen verwendet wird, also ist C ein Muss in Ihrem Lebenslauf.
Aber da Sie ein High-Level-Typ sind, könnten Sie anfangen, mit den Arduinos zu spielen, da sie mit einem herunterskalierten C++ programmiert sind, und das würde eine ungefähre Vorstellung davon geben, was C++ in der MCU-Welt im Moment leisten kann.
Für Mikrocontroller (und ich werde nur Mikrocontroller ansprechen) ist C meines Erachtens eine viel bessere Einstiegssprache als C++. Die Assemblierung wäre der nächste Schritt, fantastisch, um Ihnen zu helfen zu verstehen, wie Ihr C-Compiler Sie vermasselt, Fehler verursacht, Takte stiehlt usw. und die beste Leistung aus Ihrer Plattform herausholt. Dies alles setzt voraus, dass Sie von einem Mikrocontroller sprechen - nicht von einem Arduino, BASIC Stamp oder einer anderen Plattform mit einem verpackten Mikrocontroller.
Schwer zu sagen, was für "Ihr Fachgebiet" nützlich ist -- und darauf hinzuweisen, dass Sie als Student vielleicht noch nicht wirklich wissen, was Ihr Fachgebiet ist!! -- aber ich denke, dass Ihr Sprachsatz ziemlich vernünftig erscheint und Sie ihn immer wieder verwenden werden. Wenn Sie eine strukturierte Sprache gut im Griff haben, ist die nächste zumindest viel einfacher, aber ich denke, Sie werden Ihre Windows-Programmierkenntnisse immer gut in der Tasche haben.
Sie könnten C und die Art von Assembler-Code lernen, der von C-Anweisungen generiert wird, wenn Sie mit Prozessoren arbeiten, aber Sie sollten sich auch beibringen, wie man eine Unix-Befehlszeilen-Shell wie bash und die dazugehörigen Tools wie sed verwendet. ed, awk, vim/vi, find, tar, gzip, ... sowie Python, das Sie auf vielen Plattformen verwenden können und eine gute Möglichkeit sind, "Dinge zu erledigen".
Sie müssen C lernen, wenn Sie ein ernsthafter Embedded-Entwickler werden wollen. Assembler sollten Sie auch kennen, auch wenn Sie es wahrscheinlich sehr selten benutzen werden.
Ich definiere Elektronikingenieur zunächst als jemanden, der am Hardwaredesign von der Firmware über das Platinendesign bis hin zum Chipdesign beteiligt ist. In einigen Fällen werden Sie Firmware erstellen, wie oben erwähnt, benötigen Sie "C". Tiefergehend wird Software einfach zu einem Werkzeug, das Verständnis einiger Konzepte der Informatik in komplementären Sprachen von C/C++ bis hin zu Lisp-ähnlichen Sprachen wird wichtiger sein als Einzelheiten. Sie benötigen Software zur Unterstützung Ihrer Designbemühungen, aber das hat keinen Vorrang vor dem Verständnis der grundlegenden Grenzen dessen, was in einer physischen Implementierung getan werden kann. Digitales Design ist NICHT Verilog/VHDL, selbst wenn das Design in diesen Sprachen ausgedrückt wird. Im vollständig benutzerdefinierten und in-silico-Design sehen Sie Lisp-ähnliche Sprachen und C-funktionale Sprachen.
Chris Stratton