Newsgroup: it.comp.programmare
Titolo: "orrore" microcontrollori, calcoli matematici e varie

Ciao NG
Dovrei scrivere una sezione di un software per un
microcontrollore (è un ATMega644 ma il problema è
generale e tanto vale che imparo le tecniche
giuste). Mi hanno fatto vedere come funziona e sono
restato abbastanza di sasso, non ci sono abituato :D
1) Esiste un tutorial approfondito con molti esempi,
sul modo di scrivere bene, in particolare come
ottenere un comportamento pseudo multi-tasking con
il modo di funzionare di quel controllore che è
cooperativo? Vorrei partire col piede giusto,
ecco... :), qualcosa come "tutto quello che solo
tanta esperienza vi insegnerebbe ma intanto trovate
qua". Non solo per questo singolo problema ma in
generale, come si scrive per questi aggeggi ^_^
2) La sezione di mia competenza è enorme rispetto
alle capacità del processore, devo scrivere
veramente al massimo e quasi in stile assembler. Per
farci stare tutto, pensavo di rendere ad aritmetica
intera la maggior parte possibile dei calcoli in
virgola mobile, per compattare e velocizzare. Ho
praticamente bisogno massiccio solo della funzioni
esponenziale e logaritmo. Pensavo a normalizzarle,
tabellarle in formato intero, schiaffare tutto nella
flash e al momento dell'uso richiamare una funzione
che faccia eventuali conversioni e altro,
interpolazioni comprese. Esistono sistemi migliori?
Sicuramente sì perché sarà un problema affrontato
millemila volte, dove trovo qualche info?
3) Alcuni valori potrebbero essermi comodi con uno o
due decimali, in virgola mobile. Conviene scriversi
una funzione che lavori solo con interi, resti delle
divisioni e tutto il necessario per la divisione? E'
efficiente e compatto oppure le librerie sottostanti
sono abbastanza "smart" da rendere superfluo o dannoso
fare così?
4) Mi servono un sacco di flags booleani;
solitamente i compilatori dei microcontrollori hanno
il tipo bool ben implementato a campi di bit o devo
fare le bitmask da me?
grazie!
Apx.

 faccia eventuali conversioni e altro,
Non so aiutarti nello specifico ma che tempi di accesso ha la flash? 
Ricordavo fosse ordini di grandezza più lenta della memoria centrale.

 Ricordavo fosse ordini di grandezza più lenta della memoria centrale.
Se per "flash" intende una EEPROM, no...
Archa cos'è che intendevi?!?

 cos'Ãš che intendevi?!?
Non lo so nemmeno io, mi spiego. Ho visto di
sfuggita un listato di C adatto a quel "coso" e ci
sono delle ulteriori keyword tra cui mi pare di
ricordare una che permette di specificare che il
dato (a questo punto, suppongo, una costante) sia
memorizzato nella flash. Poiché so grossomodo quali
sono i colli di bottiglia di quel che vado a fare,
se il tempo di accesso alla flash è così
astronomicamente peggiore del tempo di accesso alla
RAM ed essendo così critico per me l'esponenziale,
ovviamente terrò i coefficienti nella RAM.
Per il resto, ho le idee totalmente confuse. Ho
trovato nel frattempo un libro J. Pardue "C
programming for microcontrollors" che sto
sfogliando, ma non è troppo incoraggiante. Come mi è
stato detto, anche se mi va di lusso, comunque dovrò
pensare come facevo per l'assembler data la
complessità e lunghezza dell'algoritmo. Molti
calcoli e costanti fisiche li dovrò scalare per
ridurre quante più operazioni possibile a operazioni
tra interi, e così via. E poi chi sa che altro che
ancora non immagino.
Be', sarà comunque interessante imparare cose nuove.
ciao!
Apx.
-- 
Diffida di chi ti da' consigli
e poi ti insulta, imbecille! :)

 fare le bitmask da me?
maschere :-)
Oppure usa le strutture a bit e lascia al compilatore
farsi le seghe sulle mascherature.
Questo dipende dal compilatore che usi: lo IAR e in
media piuttosto efficente, lo gnu un poco meno.
bb.


Che e' sta' memoria centrale ?
Stai sbagliando target : il codice viene eseguito direttamente
dalla flash interna, che è adeguata alla velocita' del processore.
bb

 dalla flash interna, che è adeguata alla velocita' del processore.
Adeguata non è una misura quantitativa, se la memoria flash risponde in 
un tempo superiore ai cicli per eseguire il calcolo non ti conviene 
tenerci i dati.

 dati quando la usi per recuperare "costanti"
Non lo sapevo, allora dovrebbe andare bene.
Perché costanti tra doppi apici?

Andrea D'Amore ha scritto:

probabilmente il termine piu' esatto e' valori costanti
perche' se in
x=4;
4 e' una costante in senso stretto ma x in generale va in ram
invece
const char ciao[]="ciao mondo" ;
la variabile ciao puo' essere allocata nella memoria codice senza usare 
la preziosa RAM ( i dettagli su come ottenere questo funzionamento 
variano da compilatore a compilatore )
tieni conto che in genere e' possibile accedere alla memoria programma 
in lettura per recuperare appunto valori costanti con apposite 
istruzioni ( 
http://it.wikipedia.org/wiki/Architettura_Harvard
 )


I microcontrollori sono progettati per eseguire codice dalla
loro memoria flash, che funziona alla massima velocita'
consentita (Salvo qualche eccezione).
Con l' AVR in questione poi e' escluso usare RAM per
per fare girare codice, che e' ben poca e va usato
per altro.
bb

Grazie delle risposte, ottime come sempre.
Mi sono preso il compilatore dedicato del
controllore e il solo scheletro del programma, tutto
portato ad aritmetica intera, con campi di bit per i
flags e una scrittura un minimo (credo) accorta,
beh: 7% di occupazione della RAM e 3.7% per i dati.
E praticamente c'è solo il loop esterno e alcuni
controlli di base.
So già che sarà una sfida duretta, rispetto a quel
che ci andrebbe dentro :D
ciao!
Apx.