Esempio per carlo

Dependencies:   mbed

Committer:
fdalforno
Date:
Wed Mar 28 07:59:20 2018 +0000
Revision:
1:2ca9dd78e30c
Parent:
0:d388a00e3820
Gestione misure in differita

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fdalforno 0:d388a00e3820 1 #include "mbed.h"
fdalforno 0:d388a00e3820 2 #include <stdlib.h>
fdalforno 0:d388a00e3820 3
fdalforno 1:2ca9dd78e30c 4 /*
fdalforno 1:2ca9dd78e30c 5 Abilitando il
fdalforno 1:2ca9dd78e30c 6 */
fdalforno 0:d388a00e3820 7
fdalforno 0:d388a00e3820 8
fdalforno 1:2ca9dd78e30c 9 Ticker sonar_tick;
fdalforno 1:2ca9dd78e30c 10 float distanza_misurata = 0;
fdalforno 1:2ca9dd78e30c 11
fdalforno 1:2ca9dd78e30c 12 //Qui va messa la routine per misurare la distanza con il sonar
fdalforno 1:2ca9dd78e30c 13 void sonar_measure() {
fdalforno 1:2ca9dd78e30c 14 //distanza_misurata = qui va messo il codice di misura
fdalforno 0:d388a00e3820 15 }
fdalforno 0:d388a00e3820 16
fdalforno 0:d388a00e3820 17
fdalforno 1:2ca9dd78e30c 18 int main(){
fdalforno 1:2ca9dd78e30c 19
fdalforno 1:2ca9dd78e30c 20 /*
fdalforno 1:2ca9dd78e30c 21 Con questo codice fai in modo che ogni due secondi venga
fdalforno 1:2ca9dd78e30c 22 chiamata la funzione di misura della distanza.
fdalforno 1:2ca9dd78e30c 23 C'è un problema di fondo immagina che il processore stia usando una periferica
fdalforno 1:2ca9dd78e30c 24 lenta come ad esempio la seriale per scrivere a terminale.
fdalforno 1:2ca9dd78e30c 25
fdalforno 1:2ca9dd78e30c 26 Ora immagina che questa funzione di scrittura ci metta più di due secondi per scrivere a terminale
fdalforno 1:2ca9dd78e30c 27 il risultato sarà che ad un certo punto la scrittura video verrà interrotta verrà eseguita la
fdalforno 1:2ca9dd78e30c 28 funzione di misura che magari vuole stampare a video qualcosa con risultati impredibili
fdalforno 1:2ca9dd78e30c 29
fdalforno 1:2ca9dd78e30c 30
fdalforno 1:2ca9dd78e30c 31 Altro problema immagina che la funzione di misura impiegi più di due secondi ad essere eseguita
fdalforno 1:2ca9dd78e30c 32 il risultato sarà che parte la funzione prima di essere finita verrà interrotta per far partire
fdalforno 1:2ca9dd78e30c 33 ancora la stessa funzione con il risultato di andare a bloccare il processore
fdalforno 1:2ca9dd78e30c 34 */
fdalforno 1:2ca9dd78e30c 35 sonar_tick.attach(&sonar_measure, 2.0);
fdalforno 1:2ca9dd78e30c 36
fdalforno 1:2ca9dd78e30c 37
fdalforno 1:2ca9dd78e30c 38
fdalforno 1:2ca9dd78e30c 39 /*
fdalforno 1:2ca9dd78e30c 40 Fatto il preambolo le strade sono le seguenti da valutare caso per caso
fdalforno 1:2ca9dd78e30c 41 1) bloccare il ticker con il risultato che il robot potrebbe andare a schiantarsi funzione detach con attach per riparetire
fdalforno 1:2ca9dd78e30c 42 2) sospendere gli interrupt vedi sopra con le funzioni __disable_irq(); __enable_irq();
fdalforno 1:2ca9dd78e30c 43 3) usare le code in modo da non avere sovrapposizione con le periferiche https://os.mbed.com/docs/v5.8/tutorials/the-eventqueue-api.html
fdalforno 1:2ca9dd78e30c 44 4) usi il DMA ma questo non è accessibile direttamente da mbed
fdalforno 1:2ca9dd78e30c 45
fdalforno 1:2ca9dd78e30c 46
fdalforno 1:2ca9dd78e30c 47 Morale della favola la 3 è la soluzione più fattbile ed elegante ;)
fdalforno 1:2ca9dd78e30c 48
fdalforno 1:2ca9dd78e30c 49 */
fdalforno 1:2ca9dd78e30c 50
fdalforno 1:2ca9dd78e30c 51
fdalforno 1:2ca9dd78e30c 52
fdalforno 1:2ca9dd78e30c 53
fdalforno 1:2ca9dd78e30c 54
fdalforno 1:2ca9dd78e30c 55 //Qui ho tutte le mie cosette
fdalforno 1:2ca9dd78e30c 56 while(1) {
fdalforno 1:2ca9dd78e30c 57 wait(0.2);
fdalforno 0:d388a00e3820 58 }
fdalforno 1:2ca9dd78e30c 59
fdalforno 1:2ca9dd78e30c 60 }