Wenn Sie wirklich kleine Codeausschnitte haben, die in Ihrem Mikrocontroller-Programm mehrmals wiederholt werden, ist es besser, eine Methode zu schreiben? Ich meine besser in Bezug auf Leistung und Speichernutzung. Ich weiß, dass bei der Programmierung für den PC die Codewiederholung ein großes Problem ist, aber was ist mit Mikrocontrollern?
Im folgenden Beispiel (Arduino Nano mit Adafruit 2,8 "Cap Touch Display) sollte das Snippet aussehen, wenn die Zurück-Taste auf mehreren Bildschirmen gedrückt wird. Ich habe in der Arduino IDE überprüft, wie viel Speicherplatz jede Version benötigt:
Version 1, 15114 Bytes für komplettes Programm:
void battScreen(TS_Point p){
// some other code
// ....
if ((p.x > backBox.posx) && (p.x < backBox.posx + backBox.sidex)){
if((p.y > backBox.posy) && (p.y < backBox.posy + backBox.sidey)){
screen = MAIN1;
showMainScreen();
}
}
}
void alarmScreen(TS_Point p){
// some other code
//...
if ((p.x > backBox.posx) && (p.x < backBox.posx + backBox.sidex)){
if((p.y > backBox.posy) && (p.y < backBox.posy + backBox.sidey)){
screen = MAIN1;
showMainScreen();
}
}
}
void pumpScreen(TS_Point p){
// some other code
// ...
if ((p.x > backBox.posx) && (p.x < backBox.posx + backBox.sidex)){
if((p.y > backBox.posy) && (p.y < backBox.posy + backBox.sidey)){
screen = MAIN1;
showMainScreen();
}
}
}
Version 2, 15234 Bytes für komplettes Programm:
void checkBack(TS_Point p){
if ((p.x > backBox.posx) && (p.x < backBox.posx + backBox.sidex)){
if((p.y > backBox.posy) && (p.y < backBox.posy + backBox.sidey)){
screen = MAIN1;
showMainScreen();
}
}
}
void battScreen(TS_Point p){
// some other code
// ...
checkBack(p);
}
void alarmScreen(TS_Point p){
// some other code
// ...
checkBack(p);
}
void pumpScreen(TS_Point p){
// some other code
// ...
checkBack(p);
}
Wie Sie sehen können, benötigt Version 2 mit der zusätzlichen Methode 120 Byte mehr Speicherplatz. Gibt es eine Faustregel, wenn es sinnvoll ist, eine neue Methode zu erstellen, anstatt Code zu kopieren?
Antworten:
Es hängt davon ab, ob
Ein Aufruf zur Funktion beinhaltet einige Dinge
Wie Sie sehen können, ziemlich viele Dinge. Die fett gedruckten Punkte werden auch ausgeführt, wenn Sie keine Funktion verwenden.
Bitte beachten Sie, dass Sie, wenn diese Funktionen "Methoden" sind, auch einen "versteckten" Parameter haben (das Objekt, auf das Sie die Methode anwenden).
Warum also Funktionen verwenden? Nun, Sie müssen diesen Code nur einmal statt mehrmals in Flash schreiben.
Was ist das beste? Das hängt von Ihrer Bewerbung ab.
Sie sind nicht in einem der vorherigen Fälle? Mach was du willst
byte sum(byte a, byte b) { return a + b; }
; In diesem Fall nimmt die Funktion auch mehr Platz ein, da der Aufruffunktionsbefehl mit der Bytesumme kompatibel istBitte beachten Sie, dass in der Regel mehr Lesbarkeit wichtiger ist als Leistungen. Daher sollte möglicherweise die Verwendung von Funktionen empfohlen werden. Ich meine, in Ihrem Fall würde ich sie wahrscheinlich verwenden, es sei denn, es gibt ein Problem
Was tun, wenn Sie keine Funktion verwenden möchten? Nun, es gibt andere Techniken:
Nur eine Bemerkung: Normalerweise können intelligente Compiler selbst für Nicht-Inline-Funktionen erraten, welche Option (Inline oder Funktion) die beste ist. So können Sie dem Compiler in 90% der Fälle auch vertrauen
quelle
__attribute__((always_inline))
.Der Grund, warum ich eher zur zweiten Methode tendiere, ist, dass es in der zweiten Version weniger Möglichkeiten für Fehler gibt.
Wenn die Speichergröße ein Hauptanliegen ist und Sie wissen, dass das Wiederholen des Codes weniger Speicherplatz erfordert, würde ich ihn als Makro definieren und das Beste aus beiden Welten herausholen.
Sie könnten den Code jedoch verbessern. In dem Moment, in dem Sie Kopien der Variablen an Funktionen übergeben, benötigt das Übergeben von const-Referenzen möglicherweise weniger Platz.
void checkBack(const TS_Point& p){
quelle
void checkBack(const TS_Point& p)
Tat reduziert die Größe um 80 Bytes. Danke für das!const type& variable
nur reduziert Größe mit denTS_Point
Variablen, nicht mitint
,uint16_t
oder anderen normalen Typen, wo es der Größe zunimmt. Ich weiß, das ist nicht die Frage, aber kennen Sie den Grund dafür?