Я написал некоторый код для проекта Arduino Wake Up Light, и я смотрю на оптимизацию кодирования, и придумал несколько различных способов проверки того, как часто нужно обновлять экран или свет. То есть я хочу запускать код только в том случае, если определенный интервал был пройден после предыдущего запуска. В чем основное различие между этими вариантами, и всегда ли один из них лучше использовать? Почему?
Т.е. следует ли использовать глобальную переменную вместо нескольких локальных переменных или просто вызывать функцию несколько раз?
Мой текущий код выглядит так, сокращенно, чтобы показать интересные биты для этогоcase:
const int updateIntervalLight = 1000;
const int updateIntervalScreen = 1000;
unsigned long currentMillis = 0;
unsigned long previousMillisScreen = 0;
unsigned long previousMillisLight = 0;
void loop() {
clockDisplay();
wakeupLoop();
}
void wakeupLoop() {
currentMillis = millis();
if (currentMillis - previousMillisLight >= updateIntervalLight) {
previousMillisLight = currentMillis;
// Update wakeup light brigthness
}
}
void clockDisplay() {
currentMillis = millis();
if (currentMillis - previousMillisScreen >= updateIntervalScreen) {
previousMillisScreen = currentMillis;
// Display clock time here
}
}
Теперь я сделал альтернативную настройку для currentMillis, объявив его локально каждый раз, а не один раз глобально. WakeupLoop (), показанный ниже в качестве примера:
void clockDisplay() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillisScreen >= updateIntervalScreen) {
previousMillisScreen = currentMillis;
// Display clock time here
}
}
Третий вариант, который я придумал, заключается в вызове millis () каждый раз. Риск при этом может заключаться в том, что функция millis (), используемая в условии, может немного отличаться от той, которая использовалась для настройки предыдущегоMillisScreen.
void clockDisplay() {
if (millis() - previousMillisScreen >= updateIntervalScreen) {
previousMillisScreen = millis();
// Display clock time here
}
}