Конструкция
next_time = millis() + 2;
while (next_time > millis()) {}
использовалась вместо запуска по таймеру, в какой то момент стал заметен рассинхрон, создал скетч специально для проверки, запускался на Ардуино Нано с ATmega328P.
Примерно тоже самое но с micros() работает с лагом максимум 12 мкс.
Подскажите пожалуйста как победить лаг в "while (next_time > millis()) {}" кроме как использовать таймер или перейти на micros()?
next_time = millis() + 2;
while (next_time > millis()) {}
использовалась вместо запуска по таймеру, в какой то момент стал заметен рассинхрон, создал скетч специально для проверки, запускался на Ардуино Нано с ATmega328P.
скетч проверки:
void setup() {
Serial.begin(115200);
Serial.println("start");
}
void loop() {
uint32_t next_time = 0;
uint32_t time_1 = 0;
uint32_t time_2 = 0;
next_time = millis() + 10;
while (next_time > millis()) {}
time_1 = micros();
time_2 = millis();
Serial.print(" d_time = ");
Serial.print(time_2 - next_time);
Serial.print(" m_time = ");
Serial.println(time_1 - next_time * 1000);
}
результат, m_time - задержка от установленного времени до времени выхода из этой паузы в микросекундах:
start
d_time = 0 m_time = 272
d_time = 0 m_time = 512
d_time = 0 m_time = 752
d_time = 0 m_time = 992
d_time = 0 m_time = 208
d_time = 0 m_time = 448
d_time = 0 m_time = 684
d_time = 0 m_time = 928
d_time = 0 m_time = 144
d_time = 0 m_time = 384
d_time = 0 m_time = 620
d_time = 0 m_time = 864
d_time = 0 m_time = 80
d_time = 0 m_time = 320
d_time = 0 m_time = 560
d_time = 0 m_time = 800
d_time = 0 m_time = 16
d_time = 0 m_time = 256
d_time = 0 m_time = 496
d_time = 0 m_time = 736
d_time = 0 m_time = 976
d_time = 0 m_time = 192
d_time = 0 m_time = 432
d_time = 0 m_time = 672
d_time = 0 m_time = 912
d_time = 0 m_time = 128
d_time = 0 m_time = 368
d_time = 0 m_time = 608
d_time = 0 m_time = 848
d_time = 0 m_time = 64
d_time = 0 m_time = 304
d_time = 0 m_time = 544
d_time = 0 m_time = 784
d_time = 1 m_time = 1024
d_time = 0 m_time = 264
d_time = 0 m_time = 504
с micros() с лаг максимум 12 мкс:
void setup() {
Serial.begin(115200);
Serial.println("start");
}
void loop() {
uint32_t next_time = 0;
uint32_t time_1 = 0;
next_time = micros() + 200;
while (next_time > micros()) {}
time_1 = micros();
Serial.print(" m_time = ");
Serial.println(time_1 - next_time);
}
start
m_time = 4
m_time = 4
m_time = 0
m_time = 0
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 4
m_time = 0
m_time = 4
m_time = 4
m_time = 4