@annonomus пінгвін, впевнений, що ми можемо. Хоча код збирається в 1180 байт флеш + 13 байт оперативної пам’яті для уно на моєму комп’ютері, ми можемо вдосконалити його :), тому виклик для гольфу прийнятий, а також кілька корисних порад, оскільки ми працюємо в навчання.
Крок 1: зменшення вимог до змінних. Використання int для led порту здається трохи надмірним, ми, звичайно, не маємо 65535 адресних портів IO на arduino :) Отже, ми змінюємо його на байт тільки для задоволення. Пізніше ми змінимо його на #define, але щоб показати вплив використання занадто великих типів змінних.
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 байти + 13 байт оперативної пам’яті. Це економить 8 байт спалаху за рахунок меншої кількості необхідних операцій для байта замість цілого числа. Я б очікував 12 байт оперативної пам'яті, але добре. Не так багато, але кожен збережений байт - це добре.
Крок 2: змінити змінну на визначає, коли це має сенс. Наприклад, приведений байт не потрібен, штифт не розпаяється сам.
#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 байт-флаш + 11 байт таран. Вже збережено 38 байт. Це пов’язано з меншою кількістю операцій реєстрації, необхідних для отримання значення int. Також ми зберегли 2 байти від оперативної пам'яті. (все ще цікаво, чому байт не компілюється в 1 менший байт оперативної пам'яті .....)
Крок 3: оптимізуйте код. Я бачу 2 затримки. Цікаво, якщо я зміню його на 1 затримку, це заощадить простір, але я повинен з'ясувати значення світлодіодного штифта і перемкнути (інвертувати) його. Ми можемо це зробити з digitalRead (), але чи економить це місце?
#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 байт + 11 байт таран. Так! ще 8 байт. Це загалом складає 46 байт та 2 менших рядки коду.
Також ще одна загальна порада щодо зменшення кодового розміру. Не використовуйте клас String. ВЕЛИЧЕЗНО, дізнайтеся, як боротися з масивами char, strcpy (), strcmp (). Якщо у вас є кілька основних рядкових операцій, використання класу String - це здебільшого просто витрачання місця як на флеш, так і на оперативну пам'ять.