@annonomus penguin, конечно, мы можем Хотя код компилируется во флэш-память 1180 байт + 13 байт оперативной памяти для uno на моем компьютере, мы можем улучшить его :), поэтому мы приняли вызов для игры в гольф, а также несколько полезных советов, поскольку мы находимся в бизнесе обучение.
Шаг 1: уменьшить переменные требования. Использование int для светодиодного порта кажется излишним, у нас, конечно, нет 65535 адресуемых портов ввода-вывода на 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 байта flash + 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. Это ОГРОМНО, узнайте, как обращаться с массивами символов, strcpy (), strcmp (). Если все, что у вас есть, это некоторые базовые строковые операции, то использование класса String в основном просто тратит пространство как на флэш-память, так и на RAM.