Ich habe mehr als 20 Jahre Erfahrung mit eingebetteten Systemen, hauptsächlich 8 und 16 Mikrometer. Die kurze Antwort auf Ihre Frage ist die gleiche wie bei jeder anderen Softwareentwicklung - optimieren Sie erst, wenn Sie wissen, dass Sie optimieren müssen, und optimieren Sie dann erst, wenn Sie wissen, was Sie optimieren müssen. Schreiben Sie Ihren Code so, dass er zuerst zuverlässig, lesbar und wartbar ist. Vorzeitige Optimierung ist in eingebetteten Systemen ein ebenso großes oder sogar größeres Problem
Wenn Sie "ohne Verschwendung von Ressourcen" programmieren, betrachten Sie Ihre Zeit als Ressource? Wenn nicht, wer bezahlt Sie für Ihre Zeit und wenn niemand, haben Sie etwas Besseres damit zu tun. Die Entscheidung, die ein Entwickler eines eingebetteten Systems treffen muss, hängt von den Kosten für Hardware und der Entwicklungszeit ab. Wenn Sie 100 Einheiten ausliefern, verwenden Sie ein größeres Mikro. Bei 100.000 Einheiten entspricht eine Einsparung von 1,00 USD pro Einheit der Entwicklung von 1 Mannjahr (ohne Berücksichtigung der Markteinführungszeit, Opportunitätskosten usw.) bei 1 Million Einheiten ROI erhalten, weil man von der Ressourcennutzung besessen ist, aber vorsichtig sein, weil viele eingebettete Projekte nie die Marke von 1 Million erreichten, weil sie eine Million verkaufen wollten (hohe Anfangsinvestition bei niedrigen Produktionskosten) und pleite gingen, bevor sie dort ankamen.
Das heißt, Dinge, die Sie bei (kleinen) eingebetteten Systemen berücksichtigen und beachten müssen, da diese auf unerwartete Weise nicht mehr funktionieren, sondern nur langsamer werden.
a) Stapel - Sie haben normalerweise nur eine kleine Stapelgröße und häufig begrenzte Stapelrahmengrößen. Sie müssen sich jederzeit darüber im Klaren sein, wie stark Ihr Stack ausgelastet ist. Seien Sie gewarnt, Stapelprobleme verursachen einige der heimtückischsten Mängel.
b) Heap - Auch hier sollten Sie bei kleinen Heap-Größen auf eine ungerechtfertigte Speicherzuweisung achten. Fragmentierung wird zum Thema. In diesen beiden Fällen müssen Sie wissen, was Sie tun, wenn das System leer ist. Auf einem großen System tritt dies nicht auf, da das Betriebssystem Paging unterstützt. dh wenn malloc NULL zurückgibt, prüfst du es und was tust du? Jede Malve braucht einen Scheck und Handler, Code aufblähen ?. Als Leitfaden - verwenden Sie es nicht, wenn es eine Alternative gibt. Die meisten kleinen Systeme verwenden aus diesen Gründen keinen dynamischen Speicher.
c) Hardware-Interrupts - Sie müssen wissen, wie Sie mit diesen sicher und rechtzeitig umgehen können. Sie müssen auch wissen, wie Sie sicheren Wiedereintrittscode erstellen. Beispielsweise sind C-Standardbibliotheken im Allgemeinen nicht wiedereintrittsfähig und sollten daher nicht in Interrupt-Handlern verwendet werden.
d) Montage - fast immer vorzeitige Optimierung. Es wird höchstens eine kleine Menge (inline) benötigt, um etwas zu erreichen, was C einfach nicht kann. Schreiben Sie als Übung eine kleine Methode in Handarbeit (von Grund auf neu). Machen Sie dasselbe in C. Messen Sie die Leistung. Ich wette, das C wird schneller, ich weiß, dass es besser lesbar, wartbar und erweiterbar sein wird. Nun zu Teil 2 der Übung: Schreiben Sie ein nützliches Programm in Assembly und C.
Schauen Sie sich als weitere Übung an, wie viel vom Linux-Kernel Assembler ist. Lesen Sie dann den folgenden Abschnitt über den Linux-Kernel.
Es lohnt sich zu wissen, wie man es macht, es lohnt sich vielleicht sogar, die Sprachen für ein oder zwei gängige Mikros zu beherrschen.
e) "register unsigned int variable_name", "register" war und ist ein Hinweis auf den Compiler und keine Anweisung. In den frühen 70er Jahren (vor 40 Jahren) ergab dies Sinn. Im Jahr 2012 ist es eine Verschwendung von Tastenanschlägen, da die Compiler so schlau sind und die Mikrobefehle so komplex sind.
Zurück zu Ihrem Linux-Kommentar - das Problem, das Sie hier haben, ist, dass es sich nicht nur um 1 Million Einheiten handelt, sondern um Hunderte von Millionen, mit einer Lebenszeit von Ewigkeit. Der Zeit- und Kostenaufwand für das Engineering, um es so optimal wie möglich zu gestalten, lohnt sich. Obwohl dies ein gutes Beispiel für die beste technische Praxis ist, wäre es für die meisten Entwickler eingebetteter Systeme kommerzieller Selbstmord, so umständlich zu sein, wie es der Linux-Kern erfordert.