velocità di calcolo arduino

Salve a tutti, mi assale un dubbio.

Ho fatto un sistema con accelerometro che deve calcolare la norma delle accelerazioni ogni 50 ms arrivare a 10 secondi fare la media salvare e rincominciare da zero .

Se questa operazione glie la faccio fare per 20 volte ogni 500 ms e poi rincominciare ce la fa, con i tempi che mi servono NO.

  if(cont<200)
{
 
if(time==time_1+t_sample)
  { 
  time_1=time_1+t_sample;
   counter++;

somma_norma+=sqrt(pow(bma180.x,2)+pow(bma180.y,2)+pow(bma180.z,2)); 

  }
 
   }
  
 
if(time==(time_2+t_save)) 
{


counter_1 +=1;
time_2=time_2+t_save;
time_1=time_2;
counter=0;



if (counter_1<num_save)
{
media_norma=somma_norma/200;
write_data();
somma_norma=0;
}

}

con t_save = 10000
t_sample = 50.
e num_save 5040;

il mio dubbio è questo:
Ce la fa a fare quel calcolo ogni 50ms per 10 secondi e poi rincominciare tutto per una giornata?
Se ci mette più di 50 ms per rincominciare il loop (e il mio loop è molto lungo) non rientrerà mai nel primo if

se solo perde una somma della norma, se poi faccio / 200 la media viene falsato
nel secondo caso ho provato a risolvere facendo diviso cont++ ma non funziona lo stesso

dove sbaglio??

Scusa ma potrebbe darsi che il tempo in cui fa il controllo sull if sia leggermente maggiore quindi come dici tu non entra in questo. Per correttezza devi time>=(time_2+t_save) in questo modo entri nella condizione anche se c'è un lieve ritardo

mmm potrebbe essere.

proverò.

quindi il calcolo non è pesante per l'arduino?
accetto altri suggerimenti.

Non so ora quanto sia lungo il tuo software ma se non necessiti che il micro sia preciso al us allora questa è la soluzione. Puoi anche fare in modo che alcuni calcoli non vengano eseguiti se il ciclo ha impiegato troppo a raggiungere la condizione di if, es:
if((time>=time_1+t_sample)&&(time<=time_1+t_sample+100))

si effettivamente così riaggancio sempre l'if speriamo che mo che allungo il loop funzioni.

Grazie si accettano suggerimenti per questo calcolo

se il programma finale, non è troppo grande, e non ti interessa lo spazio residuo in flash, potresti provare a compilare utilizzando l'ottimizzazione del codice per performance...
Infatti per default, l'ide di arduino compila i tuoi sketch, ottimizzando per dimensioni, ma se usi un altro ide, come avr-studio o code::blocks, puoi specificare tu le opzioni di compilazione da utilizzare...

io sul mio blog, ho pubblicato una guida alla installazione di code::blocks per l'uso con arduino, da li deduci anche come impostare le opzioni di compilazione... il tutto a questo link: http://giuseppefatiguso.wordpress.com/2011/05/17/programmare-arduino-con-codeblocks/

Preciso, che possono essere attivate anche più opzioni di compilazione contemporaneamente, ad esempio per dimensione e per performance, ma non saprei quanto vantaggio ne trarresti, in questo caso...

Spero di esserti stato utile...

seppe

ascolta, arduino una norma te la fa in microsecondi, io calcolo quaternioni con seni e coseni e radici quadrate in un centinaio di microsecondi.
PERO' ci sono altre cose tche ti rallentano; una lettura nalogica, per esempio, dura da sola 100 microseconds, oopure se stai usando un nunckuck, la libreria che gira non è ottimizzata e spreca un sacco di tempo, tenendoti bloccato per circa 4millisecondi se non erro...
anche le scritture seriali son lentissime!

comunque la soluzione migliore è come già suggerito:

if(time>=time_1+t_sample)

ma poi nel calcolo devi tenere conto del tempo in più trascorso, credo si possa fare così:

if(time>=time_1+t_sample){
float divisore = time/(time_1+t_sample);
somma_norma+= ( sqrt(pow(bma180.x,2)+pow(bma180.y,2)+pow(bma180.z,2)) ) / divisore;
}

comunque ti consiglio di controllare tutto il loop quanti microsecondi ci mette per eseguirsi, poi cercare al suo interno le parti più lente ed ottimizzarle

confermo che i controlli con gli if sono lenti. non li so quantificare, ma controllare un int o un long ci mette un po', certo sempre intorno a qualche decina di ms . se ho notato bene per i booleani ci mette di più.

grazie a tutti per le risposte, siete stati molto chiari.

flameman:
mah, se usi seni e coseni non calcoli quaternioni ma angoli di eulero
le operazioni in logica quaternionica, forse le migliori per rappresentare rotazioni
si riconducono ad operazioni fra matrici, matrici ben condizionate

azz è vero, non uso seni e coseni, (li uso per poi riportare il quaternione in angoli di eulero), ma comunque un paio di radici quadrate per normalizzare dei valori e varie operazioni aritmetiche, tra l'altro sui float.

non so che tipo di algoritmi lavorino sotto, ma non credo lookup table perché ruberebbero molta ram all'arduino

l'ottimizzazione del codice per velocità è propria di code blocks o di avrgcc?

E' il compilatore che ottimizza il codice. Quindi avr-gcc.

quindi sarebbe possibile introdurlo in arduino come opzione, bisogna passare una stringa diversa a avrgcc giusto?

Ma non lo puoi fare così facilmente.
I parametri passati ai comandi eseguiti da terminale sono inseriti nel codice stesso dell'IDE.
Dovresti aprire i sorgenti, modificare quello che ti serve e poi ricompilare.

il sorgente è disponibile vero?
magari è da pazzi ma potrei provarci..

cmq qualcuno qui sul forum non sta facendo un ide?

in ogni caso aggiungerlo nelle modifiche da introdurre?
essendo una modifica della riga di comando non dovrebbe essere una cosa estrema..

Ciao,

non so se puo' essere utile in questo caso, ma vi e' una libreria per microprocessori Atmel a 8bit che si chiama AVRfix aritmetica a virgola fissa, che, a detta dell'autore, incrementa le prestazioni dei calcoli.

http://avrfix.sourceforge.net/

I file si trovano qui (le spiegazioni nel PDF della tesi che si trova nella cartella Bachelor_s Thesis

La avevo trovata tempo fa per un progetto che dovevo fare, ma ancora non l'ho provata.

Ciao,
Marco.

flameman:

garinus:
quindi sarebbe possibile introdurlo in arduino come opzione, bisogna passare una stringa diversa a avrgcc giusto?

si e' una opzione specifica del compilatore c (avrgcc)
che gli dice esplicitamente di strotolare ogni if un qualcosa di sequenzial

purtroppo non ti so aiutare, non uso alcun ide

scusami ma che io sappia si può fare l'unrolling di cicli, non di strutture di selezione come gli if... Quindi se gli if sono ripetuti molte volte allora ha senso effettuare l'unrolling..