Esp8266 и millis()

// ############################################################################
//  Таймер потока 01
uint8_t avrTthread01(uint16_t span) {
  static uint32_t future = 0;
  if (millis() < future) return 0;
  future += span;
  return 1;
}
// ############################################################################
//  Таймер потока 02
uint8_t avrTthread02(uint16_t span) {
  static uint32_t future = 0;
  if (millis() < future) return 0;
  future += span;
  return 1;
}
// ############################################################################
//  Таймер потока 03
uint8_t avrTthread03(uint16_t span) {
  static uint32_t future = 0;
  if (millis() < future) return 0;
  future += span;
  return 1;
}


// ############################################################################
//  SETUP
void setup() {

  Serial.begin(115200);

}


// ############################################################################
//  LOOP
void loop() {

  // вызывается раз в 0.5сек
  if (avrTthread01(500)) {
    Serial.print(F("thread 500 "));
    Serial.println();
  }

  // вызывается раз в 0.2сек
  if (avrTthread02(200)) {
    Serial.print(F("thread 200 "));
    Serial.println();
  }

  // вызывается раз в 0.1сек
  if (avrTthread03(100)) {
    Serial.print(F("thread 100 "));
    Serial.println();
  }

}

На выходе:

21:43:37.428 -> thread 100 
21:43:37.570 -> thread 200 
21:43:37.570 -> thread 100 // t100 = 142ms (???)
21:43:37.570 -> thread 500 
21:43:37.665 -> thread 100 // t100 = 95ms
21:43:37.762 -> thread 200 // t200 = 192ms
21:43:37.762 -> thread 100 // t100 = 97ms
21:43:37.857 -> thread 100  // t100 = 95ms 
21:43:37.951 -> thread 200  // t200 = 189ms
21:43:37.951 -> thread 100  // t100 = 94ms
21:43:38.047 -> thread 500  // t500 = 477ms

А должно быть по другому?

Добавьте

в конце каждого вызова, а не только к последнему - и запустите снова.

Объясни, почему должно быть именно так?..

Когда это я так задолжал?

Сделайте то, что я попросил выше

О, вижу уже сделали… (на будущее - не надо править старые посты, пишите в новых)

Простите, если не понял. Отбивка после каждого вызова вставлена, листинг приведён, вывод тоже. Что я делаю не правильно?

по-моему тут все ОК.
С учетом того, что тайминг в Сериал мониторе известен своей приблизительностью, ошибка 5% вполне себе нормальный результат.

А то что тайминг кривой - можете убедится вот тут:

Три сообщения, каждое из которых печатается больше 1 мс - а время стоит как вкопанное

Так, более-менее понятно. А почему только в минус?

не могу знать, товарищ майор

Вот так получше будет)))

Спойлер

Спойлер
void loop() {

  // вызывается раз в 0.5сек
  if (avrTthread01(500)) {
    Serial.print(F("thread 500 "));
    Serial.print(millis());
    Serial.println();
  }

  // вызывается раз в 0.2сек
  if (avrTthread02(200)) {
    Serial.print(F("thread 200 "));
     Serial.print(millis());
    Serial.println();
  }

  // вызывается раз в 0.1сек
  if (avrTthread03(100)) {
    Serial.print(F("thread 100 "));
     Serial.print(millis());
    Serial.println();
  }

}

P.S. Это я на Нано запустил, а ESP8266 не знаю , что покажет…

Подозреваю что примерно то же самое.
ТС просто выбрал неверный инструмент для контроля времени

1 лайк

@MMM мне уже объяснил, что человек, у которого одни часы, знает точное время. У которого их несколько – ни в чём не уверенное существо.