@ pingwin pingwinowy, na pewno możemy Chociaż kod kompiluje się w 1180 bajtów flash + 13 bajtów RAM dla Uno na moim komputerze, możemy to poprawić :) więc wyzwanie golfa zaakceptowane i kilka przydatnych wskazówek, ponieważ jesteśmy w branży uczenie się.
Krok 1: zmniejsz wymagania zmienne. Używanie int dla portu ledowego wydaje się nieco przesadne, z pewnością nie mamy 65535 adresowalnych portów IO na arduino :) Więc zmieniamy go na bajt tylko dla zabawy. Później zmienimy to na #define, ale aby pokazać wpływ używania zbyt dużych typów zmiennych.
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
}
Kompiluje do 1172 bajtów + 13 bajtów RAM. Oszczędza to 8 bajtów pamięci flash z powodu mniejszej liczby wymaganych operacji dla bajtu zamiast liczby całkowitej. Spodziewałbym się 12 bajtów pamięci RAM, ale dobrze. Nie tak bardzo, ale każdy zapisany bajt jest dobry.
Krok 2: zmień zmienną na definiuje, kiedy ma to sens. Na przykład bajt led nie jest potrzebny, szpilka sama się nie wylutuje.
#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
}
Kompiluje do 1142 bajtów flash + 11 bajtów pamięci RAM. Zapisano już 38 bajtów. Wynika to z mniejszej liczby operacji rejestru wymaganych do pobrania wartości int. Zapisaliśmy również 2 bajty z pamięci RAM. (wciąż zastanawiam się, dlaczego bajt nie skompilował się w 1 mniej bajtu pamięci RAM .....)
Krok 3: zoptymalizuj kod. Widzę 2 opóźnienia. Zastanawiam się, czy zmienię to na 1 opóźnienie, by zaoszczędzić miejsce, ale muszę obliczyć wartość kołka LED i przełączyć go (odwrócić). Możemy to zrobić za pomocą digitalRead (), ale czy pozwoli to zaoszczędzić miejsce?
#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
}
Kompiluje do 1134 bajtów + 11 bajtów ram. Tak! kolejne 8 bajtów. To daje w sumie 46 bajtów i 2 mniej wierszy kodu.
Kolejna ogólna wskazówka dotycząca zmniejszania rozmiaru kodu. Nie używaj klasy String. Jest OGROMNY, dowiedz się, jak radzić sobie z tablicami znaków, strcpy (), strcmp (). Jeśli masz tylko kilka podstawowych operacji na łańcuchach, użycie klasy String powoduje głównie marnowanie miejsca zarówno na pamięć flash, jak i pamięć RAM.