Fabio Dal Forno
/
STM32_Encoder_Carlone
Esempio per carlo
main.cpp
- Committer:
- fdalforno
- Date:
- 2018-03-28
- Revision:
- 1:2ca9dd78e30c
- Parent:
- 0:d388a00e3820
File content as of revision 1:2ca9dd78e30c:
#include "mbed.h" #include <stdlib.h> /* Abilitando il */ Ticker sonar_tick; float distanza_misurata = 0; //Qui va messa la routine per misurare la distanza con il sonar void sonar_measure() { //distanza_misurata = qui va messo il codice di misura } int main(){ /* Con questo codice fai in modo che ogni due secondi venga chiamata la funzione di misura della distanza. C'è un problema di fondo immagina che il processore stia usando una periferica lenta come ad esempio la seriale per scrivere a terminale. Ora immagina che questa funzione di scrittura ci metta più di due secondi per scrivere a terminale il risultato sarà che ad un certo punto la scrittura video verrà interrotta verrà eseguita la funzione di misura che magari vuole stampare a video qualcosa con risultati impredibili Altro problema immagina che la funzione di misura impiegi più di due secondi ad essere eseguita il risultato sarà che parte la funzione prima di essere finita verrà interrotta per far partire ancora la stessa funzione con il risultato di andare a bloccare il processore */ sonar_tick.attach(&sonar_measure, 2.0); /* Fatto il preambolo le strade sono le seguenti da valutare caso per caso 1) bloccare il ticker con il risultato che il robot potrebbe andare a schiantarsi funzione detach con attach per riparetire 2) sospendere gli interrupt vedi sopra con le funzioni __disable_irq(); __enable_irq(); 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 4) usi il DMA ma questo non è accessibile direttamente da mbed Morale della favola la 3 è la soluzione più fattbile ed elegante ;) */ //Qui ho tutte le mie cosette while(1) { wait(0.2); } }