Go Down

Topic: [codice completo] blink without delay sotto steroidi (Read 787 times) previous topic - next topic

lestofante

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

Code: [Select]
#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;
}
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

lestofante

#1
Jul 25, 2014, 01:23 am Last Edit: Jul 25, 2014, 01:56 am by lesto Reason: 1
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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

ratto93

Se corri veloce come un fulmine, ti schianterai come un tuono.

Go Up