Fabio Dal Forno
/
STM32_Encoder_Carlone
Esempio per carlo
main.cpp@1:2ca9dd78e30c, 2018-03-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |