Salve a tutti; sono un laureando in ingegneria aeronautica e come tesi sto sviluppando un autopilota da implementare su scheda ArduinoMega2560 . Stiamo valutando la possibilità di convertire il programma dell'autopilota in dati fixed-point ( il programma dell'autopilota è fatto in Simulink ) per vedere se si hanno benefici dal punto di vista della velocità di esecuzione del programma stesso.
La mia cultura nel campo dell'informatica è abbastanza limitata, ma l'idea che mi sono fatto andando a consultare un po ovunque è che il microcontrollore ATmega2560 della Atmel è sprovvisto di una floating point unit (FPU) quindi non si "appoggia" ad un hardware dedicato ( la floating point unit appunto ) per eseguire i calcoli in virgola mobile. Possono essere tuttavia eseguiti programmi in virgola mobile in quanto è presente un emulatore floatin point unit.
Da quello che ho capito è che se si ha un emulatore FPU i calcoli in virgola mobile vengono eseguiti in tempi molto più lunghi di quelli in virgola fissa. Di qui sono arrivato alla conclusione che se si vogliono sfruttare al massimo le capacità "real time" di Arduino è sempre conveniente caricare un programma in virgola fissa (a parte la perdita di precisione che si ha rispetto ad un programma in dati floating point...ma questo è un altro problema) . Dato il mio scarso background in informatica vi volevo chiedere se le conclusioni alle quali sono pervenuto sono giuste in generale, o se mi sfugge qualcosa...... GRAZIE!!
Si, il ATmega2560 (come del resto il ATmega328P di Arduino UNO) non hanno una FPU, ma tutte le operazioni in virgola mobile vengono svolte via software (... con l'uso di una libreria).
Non solo quindi la lentezza, ma anche la precisione di dette operazioni lascia piuttosto a desiderare, essendo tutte fatte, indipendentemente dal tipo di dato (float o double) sempre a 32 bit da cui :
"Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. "
Sicuramente se riuscite a lavorare utilizzando solo numero interi ... avrete il massimo della velocità ![]()
Guglielmo
Grazie mille!! ....proprio quello che intuivo. ![]()