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.
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
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
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))
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...
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...
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ì:
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ù.
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
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.
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.
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..