[codice completo] blink without delay sotto steroidi

diciamo di avere un task da schedulare ogni x microsecondi. e diciamo che purtroppo il nostri timer non si incrementa di microsecondo in microsecondo, ma magari di 4 in 4 (come la micros() di arduino!).

certo, e poi bisogna anche consderare che magari le variabili di tempo di esecuzione vanno in overflow... quanti if, quante condizioni, quanti... o no? o forse possiamo aggirare gli overflow, e non solo, ma anche eseguire quei task che cadono dall'ultima esecuzione?

ecco la mia soluzione, un piccolo esercizio di stile, apparentemente semplice, ma che nasconde uno sforzo per essere compreso a fondo, specialmente nei casi limite

#include <stdio.h>
#include <stdint.h>

int main(int argv, char *args[]){
	uint8_t tempo_attuale = 0;
	uint8_t tempo_ultima_esecuzione = -1;//force overflow, or if first execution is at 0 it get screwed up
	uint8_t periodo_in_esame;
	
	/*le seguenti 3 variabili possono essere messe in una strutture a poi "arrayzzate" per avere più eventi indipendenti*/
	uint8_t tempo_esecuzione = 0;
	uint8_t tempo_passato;
	uint8_t periodo = 10;
	
	/* more difficult! il timer è irregolare */
	uint8_t ganularita_timer = 3;

	for (uint16_t b = 0; b < 200; b++){
		tempo_passato = tempo_attuale-tempo_esecuzione;
		
		periodo_in_esame = tempo_attuale-tempo_ultima_esecuzione;
		
		printf("\nt1=%d, t=%d,tempo_passato=%d", tempo_esecuzione, tempo_attuale,tempo_passato);
		
		if (tempo_passato <= periodo_in_esame){
			tempo_esecuzione += periodo;
			printf(" ESECUZIONE!");
		}

		tempo_ultima_esecuzione = tempo_attuale;
		tempo_attuale+=ganularita_timer;
	}

	return 0;
}

per chi proprio non ci capisse un acca, consiglio di farsi un pò di basi con http://www.leonardomiliani.com/en/2012/come-gestire-loverflow-di-millis/

per chi dimostra di strizzare un pò le meningi sono aperto ad ogni questione.

da una discussione con un amico:

la magia avviene in 2 punti

  1. ad ogni check non calcolo il tempo che MANCA all'esecuzione, ma il tempo che è PASSATO da quando avrei dovuto eseguirla
  2. verifico che il tempo passato da quando avrei dovuto eseguirla è <= del tempo passato dall'ultima esecuzione del check

x iscrizione

karma +1

Bravo lesto, bello stralcio di codice :slight_smile: