Newsgroup: it.hobby.elettronica.digitale
Titolo: sprintf (luminary + gcc)

Visto che la toolchain funziona e mi piace, ho iniziato a sviluppare una
applicazione semplice: due ingressi analogici da campionare con calma,
due uscite pwm, e sul display qualche informazione di stato e l'echo dei
valori sugli adc. 
Primo mattone per stare comodo: la sprintf e un driverino per potere
scrivere sul display usandolo come una console; quindi, scrittura di una
stringa alla locazione x;y con eventuale a capo automatico ed eventuale
scroll dello schermo. Oltre a questo, voglio definire un'area che verrà
utilizzata solo per il testo e un'area utilizzata per la grafica (forme
d'onda, meter, ecc...).
Ho fatto una prova con la sprintf e questo è il risultato:
http://i38.tinypic.com/346ajcz.gif
Intanto dice che delle aree di memoria si sovrappongono, ma lì ho
trovato sl forum luminary che basta aggiungere la sezione mancante nello
script del linker, prendendola da un generico link-file dentro ai tool
codesourcery. Mhhh, scricchiolante, ma ci può stare. Tutte le volte che
manca una sezione la aggiungerò a mano.
Il problema è che mancano le funzioni di accesso all'IO (è chiaro,
dipendono dall'hardware), ma vorrei bypassarle con degli stub, visto che
non userò la printf, la getch, ecc...
Nel forum luminary ho trovato qualche supercazzola che ho provato a
sperimentare (aggiungere delle librerie, sì ma quali, ce ne sono
tantissime) senza alcun risultato.
Come si può fare? 

 
http://i38.tinypic.com/346ajcz.gif
Ho trovato un modo per fare passare dalla finestra quello che non passa
dalla porta: nelle driverlib c'è una interessante serie di librerie
accessorie sotto alla cartella ./utils. Una di queste contiene una
versione alleggerita della sprintf(), chiamata usprintf(). Manca il
supporto per i float, ma per il resto funziona a dovere. 
Una caratteristica interessante è che non riesce a fare il parsing della
stringa di formattazione restituisce una stringa con la scritta "ERROR" ed
il qualificatore di formato che non ha riconosciuto :-)

 il qualificatore di formato che non ha riconosciuto :-)
Dopo 30 anni qualcuno finalmente l'ha fatto!

 Dopo 30 anni qualcuno finalmente l'ha fatto!
Si, però cave canem: se gli passo un buffer più piccolo di cinque 
caratteri più terminatore voglio vedere come fa ad accorgersene. E voglio 
vedere anche le bestemmie che volano quando lo stack va a donnine :-)
A proposito di stack e di furbate di questo genere: sempre nelle 
driverlib per leggere indietro il risultato dell'ad converter c'è una 
simpatica funzione alla quale si passa il puntatore ad un'area di memoria 
allocata e lei la riempie con i campioni acquisiti. Il numero di campioni 
è programmato in fase di init come sequenza (metodo imho abbastanza 
carino per gestire gli adc), quindi uno alloca la quantità di spazio 
necessaria e passa il puntatore alla funzione.
Solo che questa funzione *ogni tanto* decide di copiare dentro al buffer 
non solo i campioni che gli erano stati richiesti, ma tutto il contenuto 
del sequencer, in maniera abbastanza casuale, anche se probabilmente 
legata alla presenza del debugger. Ovviamente lo stack si disintegra se 
il buffer era stato allocato come variabile automatica, e tanti saluti! 
Mi ci sono voluti due giorni per capirlo :-P
A proposito di questo, sarebbe carino capire come si fa a disabilitare e 
riabilitare in modo automatico gli interrupt quando il debugger si 
intromette sulla esecuzione normale della cpu (inserimento di un 
breakpoint, esecuzione passo passo, ecc...). Qualcuno ne sa qualcosa?

 Mi ci sono voluti due giorni per capirlo :-P
Azz. In due giorni ti saresti potuto riscrivere il tutto.
Grazie per la segnalazione, anche se temo che le ferie che avevo allocato a
studiarmi e giocherellare con Luminary verranno impiegate per estensimetri
e fluorimetri...