Exemple de code Arduino gérant le rollover de millis et micros

par skywodd | | Langue : C++ | Licence : GPLv3

Description :

Exemple de code Arduino gérant le rollover des fonctions millis() et micros().

Code source :

Voir le code source brut | Télécharger super_millis.ino | Télécharger super_millis.ino.zip

/**
 * Exemple de code gérant le rollover (retour à zéro) de millis() et micros().
 */

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.print("Time (ms): ");
  unsigned long long time_ms = superMillis();
  print_unsigned_long_long(time_ms);

  Serial.print("Time (us): ");
  unsigned long long time_us = superMicros();
  print_unsigned_long_long(time_us);

  delay(1000);
}


void print_unsigned_long_long(unsigned long long value) {
  // Serial.print ne gére pas directement les unsigned long long.
  // Cette fonction permet d'afficher une unsigned long long sur le port série.
  
  unsigned long msb = value >> 32;
  unsigned long lsb = value & 0xFFFFFFFF;
  if (msb) {
    char buf[21];
    sprintf(buf, "%lu%010lu", msb, lsb);
    Serial.println(buf);
  } else {
    Serial.println(lsb);
  }
}


/** 
 * Retourne le nombre de millisecondes depuis le démarrage du programme.
 *
 * @return Le nombre de millisecondes depuis le démarrage du programme sous la forme d'un
 * nombre entier sur 64 bits (unsigned long long).
 */
unsigned long long superMillis() {
  static unsigned long nbRollover = 0;
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();

  if (currentMillis < previousMillis) {
    nbRollover++;
  }
  previousMillis = currentMillis;

  unsigned long long finalMillis = nbRollover;
  finalMillis <<= 32;
  finalMillis +=  currentMillis;
  return finalMillis;
}

/** 
 * Retourne le nombre de microsecondes depuis le démarrage du programme.
 *
 * @return Le nombre de microsecondes depuis le démarrage du programme sous la forme d'un
 * nombre entier sur 64 bits (unsigned long long).
 */
unsigned long long superMicros() {
  static unsigned long nbRollover = 0;
  static unsigned long previousMicros = 0;
  unsigned long currentMicros = micros();

  if (currentMicros < previousMicros) {
    nbRollover++;
  }
  previousMicros = currentMicros;

  unsigned long long finalMicros = nbRollover;
  finalMicros <<= 32;
  finalMicros +=  currentMicros;
  return finalMicros;
}