@annonomus penguin, pasti kita bisa. Walaupun kode mengkompilasi menjadi 1180 byte flash + 13 byte RAM untuk uno di komputer saya, kami dapat meningkatkannya :) jadi tantangan golf diterima dan juga beberapa tips bermanfaat karena kami berada dalam bisnis belajar.
Langkah 1: kurangi persyaratan variabel. Menggunakan int untuk port yang dipimpin tampaknya sedikit berlebihan, kita tentu saja tidak memiliki 65535 port IO yang dapat dialamatkan pada arduino :) Jadi kita mengubahnya ke byte hanya untuk bersenang-senang. Kami akan mengubahnya ke #define nanti, tetapi untuk menunjukkan dampak penggunaan tipe variabel yang terlalu besar.
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
}
Kompilasi menjadi 1172 byte + 13 byte RAM. Ini menghemat 8 byte flash karena operasi yang dibutuhkan lebih sedikit untuk byte daripada integer. Saya harapkan 12 byte ram, tapi oke. Tidak banyak, tetapi setiap byte yang disimpan baik.
Langkah 2: ubah variabel menjadi definisi ketika itu masuk akal. Misalnya, byte yang dipimpin tidak diperlukan, pin tidak akan lepas sendiri.
#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
}
Kompilasi menjadi 1142 byte byte + ram 11 byte. Sudah 38 byte disimpan. Ini karena lebih sedikit operasi register yang diperlukan untuk mengambil nilai int. Kami juga menyimpan 2 byte dari RAM. (masih bertanya-tanya mengapa byte tidak dikompilasi menjadi 1 byte kurang ram .....)
Langkah 3: optimalkan kode. Saya melihat 2 penundaan. Saya ingin tahu apakah saya mengubahnya ke 1 penundaan akan menghemat ruang, tetapi saya harus mencari tahu nilai pin LED dan beralih (invert) itu. Kita dapat melakukannya dengan digitalRead (), tetapi apakah itu akan menghemat ruang?
#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
}
Kompilasi menjadi 1134 bytes + 11 bytes ram. Yay! 8 byte lainnya. Itu membuat total 46 byte dan 2 baris kode lebih sedikit.
Juga tip umum lain untuk mengurangi kodeisasi. Jangan gunakan kelas String. Ini BESAR, pelajari cara berurusan dengan array char, strcpy (), strcmp (). Jika semua yang Anda miliki adalah beberapa operasi string dasar, penggunaan kelas String sebagian besar hanya membuang ruang pada flash dan RAM.