@annonomus pengueni, emin olabiliriz Kod bilgisayarımdaki bir uno için 1180 bayt flash + 13 bayt RAM içine derlese de, biz onu geliştirebiliriz :) bu yüzden golf meydan kabul ve aynı zamanda birkaç yararlı ipuçları öğrenme.
Adım 1: Değişken gereksinimlerini azaltın. Bir led port için int kullanmak biraz aşırıya kaçmış gibi görünüyor, kesinlikle arduino'da 65535 adresli IO portumuz yok :) Bu yüzden sadece eğlenmek için bir bayta değiştiriyoruz. Daha sonra #define olarak değiştireceğiz, ancak çok büyük değişken türleri kullanmanın etkisini göstereceğiz.
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
}
1172 bayt + 13 bayt RAM'e derler. Bu, tamsayı yerine bayt için daha az işlem yapılması nedeniyle 8 bayt flaş tasarrufu sağlar. Ben 12 bayt koç beklenir, ama tamam. O kadar değil, ama kaydedilen her bayt iyidir.
2.Adım: Değişken yerine, mantıklı olduğunda tanımlar olarak değiştirin. Örneğin, led bayt gerekli değildir, pim kendiliğinden lehimlenmez.
#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
}
1142 bytesflash + 11 bayt ram olarak derler. Zaten 38 bayt kaydedildi. Bunun nedeni, int değerini getirmek için gereken daha az kayıt işlemidir. Ayrıca RAM'den 2 bayt kurtardık. (hala baytın neden daha az 1 bayt koç içine derlenmediğini merak ediyorum .....)
3.Adım: Kodu optimize edin. 2 gecikme görüyorum. 1 gecikme olarak değiştirirseniz yer tasarrufu sağlar mıyım, ama LED piminin değerini bulmalı ve değiştirmeliyim. Bunu digitalRead () ile yapabiliriz, ancak yerden tasarruf sağlar mı?
#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
}
1134 bayt + 11 bayt koç olarak derlenir. Yaşasın! 8 bayt daha. Bu, toplam 46 bayt ve 2 daha az kod satırı yapar.
Ayrıca azalan kod boyutu hakkında başka bir genel ipucu. String sınıfını kullanmayın. BÜYÜK, char dizileri, strcpy (), strcmp () ile nasıl başa çıkacağınızı öğrenin. Tüm sahip olduğunuz bazı temel dize işlemleri ise, String sınıfının kullanımı çoğunlukla hem flash hem de RAM üzerinde alan harcar.