@annonomus Pinguin, sicher können wir Obwohl der Code in 1180 Bytes Flash + 13 Bytes RAM für ein Uno auf meinem Computer kompiliert wird, können wir es verbessern :) Also Golf Herausforderung angenommen und auch ein paar nützliche Tipps, da wir im Geschäft von sind Lernen.
Schritt 1: Verringern Sie die variablen Anforderungen. Die Verwendung eines int für einen LED-Port scheint etwas übertrieben, wir haben sicherlich keine 65535 adressierbaren E / A-Ports auf dem Arduino :) Also ändern wir es nur zum Spaß in ein Byte. Wir werden es später auf #define umstellen, aber um die Auswirkungen der Verwendung zu großer Variablentypen zu zeigen.
byte led = 13;
int val;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Kompiliert in 1172 Bytes + 13 Bytes RAM. Dies spart 8 Byte Flash, da weniger Operationen für das Byte anstelle einer Ganzzahl erforderlich sind. Ich würde 12 Bytes RAM erwarten, aber okay. Nicht so viel, aber jedes gespeicherte Byte ist gut.
Schritt 2: Ändern Sie die Variable in definiert, wann es sinnvoll ist. Zum Beispiel wird das LED-Byte nicht benötigt, der Pin löst sich nicht von selbst.
#define LED 13
int val;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Kompiliert in 1142 Bytesflash + 11 Bytes RAM. Bereits 38 Bytes gespeichert. Dies ist auf weniger Registeroperationen zurückzuführen, die zum Abrufen des int-Werts erforderlich sind. Außerdem haben wir 2 Bytes aus dem RAM gespeichert. (Ich frage mich immer noch, warum das Byte nicht zu 1 Byte RAM weniger kompiliert wurde .....)
Schritt 3: Code optimieren. Ich sehe 2 Verzögerungen. Ich frage mich, ob ich es auf 1 Verzögerung ändere, um Platz zu sparen, aber ich muss den Wert des LED-Pins herausfinden und ihn umschalten (umkehren). Wir können das mit digitalRead () machen, aber wird es Platz sparen?
#define LED 13
int val;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(LED, !digitalRead(LED)); // toggle the led based on read value
delay(1000); // wait for a second and spare yourself the other delay
}
Kompiliert in 1134 Bytes + 11 Bytes RAM. Yay! weitere 8 Bytes. Das ergibt insgesamt 46 Bytes und 2 Codezeilen weniger.
Auch ein weiterer allgemeiner Tipp zum Verringern der Codegröße. Verwenden Sie nicht die String-Klasse. Es ist RIESIG, lernen Sie, wie man mit char-Arrays umgeht, strcpy (), strcmp (). Wenn Sie nur einige grundlegende Zeichenfolgenoperationen haben, verschwendet die Verwendung der Zeichenfolgenklasse meist nur Speicherplatz auf Flash und RAM.