2012-10-25 25 views
7

Sto lavorando allo sviluppo di un sistema embedded (Cortex M3). Per l'invio di alcuni dati dal dispositivo alla porta seriale (da mostrare sullo schermo di un PC), utilizzo alcune funzioni proprie utilizzando il metodo putchar().Qualsiasi funzione invece di sprintf() in C? la dimensione del codice è troppo grande dopo la compilazione

Quando voglio inviare intero o galleggiante, io uso sprintf() al fine di convertirli in stringa di caratteri e di inviarli alla porta seriale.

Ora, il problema è che sto utilizzando Keil uVision IDE ed è una versione limitata con un massimo di 32 KB. Ogni volta che chiamo sprintf() in diverse funzioni, non so perché la dimensione del codice dopo la compilazione sia aumentata troppo. Ho superato i 32 KB ora e mi chiedo di dover cambiare alcune delle mie funzioni e usare qualcos'altro invece di sprintf!

Qualsiasi indizio?

+7

Cerca di evitare 'float's dopo tutto, dato che i componenti della libreria di runtime sono piuttosto grandi e lenti nella maggior parte dei casi. – glglgl

+1

la famiglia printf è molto costosa come la grande quantità di codice necessaria per implementarlo, specialmente in virgola mobile. Un intero solo printf è una piccola quantità più piccola ma ancora costosa. Pensi davvero di aver bisogno di printf() nel codice del tuo microcontroller embedded? È possibile implementare le proprie soluzioni molto più economiche. –

+0

Dai un'occhiata anche alle librerie disponibili dei produttori di compilatori. Spesso ci sarà più sapore delle librerie C std con funzionalità ridotte. Ad esempio, uno sprint che gestisce int e float, ma non notazione scientifica. –

risposta

0

Si può provare itoa() o ftoa() e implementarli come requisito. Voglio dire che quando convertono in caratteri solo all'interno della definizione stessa, utilizzare putchar() per stampare direttamente.

Questo dovrebbe funzionare, credo.

+3

Non esiste una funzione chiamata itoa né una chiamata ftoa nel linguaggio C. – Lundin

+0

@Lundin: può essere scritto come tuo requisito ... o includere questi file ... itoa e ftoa sono in questi file di header o Omkant

+0

non c'è itoa() e ftoi() in C. (non so se esiste davvero in C++) – Django

6

Se si desidera che sia efficiente, il modo migliore è probabilmente quello di codificarlo da soli o trovare un codice già scritto per esso in rete. La conversione da Int a stringa è tuttavia molto semplice, ogni programmatore può scriverlo in meno di 30 minuti. La conversione da virgola mobile a stringa è un po 'più complessa e dipende dal formato in virgola mobile utilizzato.

Per comodità, ecco un semplice algoritmo int a stringa per l'uso in applicazioni con microcontrollori:

void get_dec_str (uint8_t* str, size_t len, uint32_t val) 
{ 
    uint8_t i; 
    for(i=1; i<=len; i++) 
    { 
    str[len-i] = (uint8_t) ((val % 10UL) + '0'); 
    val/=10; 
    } 

    str[i-1] = '\0'; 
} 
+2

Non sono sicuro che sia una funzione estremamente veloce/efficiente se il tuo micro non ha un partitore hardware ... (o modulo :). Anche se non ho un'opzione migliore in cima alla mia testa! –

+3

@MartinThompson Non sono sicuro che si possa fare molto a riguardo, i decimali sono basati su 10, ma i computer preferiscono quelli basati su 2/4/8/16/32. Inoltre preferirei lasciare l'ottimizzazione al compilatore. – Lundin

+1

fair comment re: lasciare l'ottimizzazione al compilatore –

9

Due potenziali offerte (nessuno dei quali io stesso ho usato - i miei fornitori del compilatore di solito forniscono una ridotta printf per l'utilizzo incorporato):

http://eprintf.sourceforge.net/ - [settembre 2017: purtroppo, sembra essere andato via, ma il codice sorgente ancora qui: https://sourceforge.net/projects/eprintf/files/]

http://www.sparetimelabs.com/tinyprintf/index.html - 2 file, circa 1,4 KB di codice. Opzione per abilitare "long" (significa più dimensioni del codice). Supporta gli zeri iniziali e le larghezze del campo. Nessun supporto in virgola mobile.

+1

Poiché la pagina web di 'eprintf' non ha collegamenti al codice effettivo, ecco un collegamento al progetto eprintf di sourceforge: http://sourceforge.net/projects/eprintf/ –

+0

Mentre questo il link può rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/17459102) – StoryTeller

+0

@StoryTeller - in genere sono d'accordo, ma non sono sicuro che un riassunto dei contenuti aiuti se i link spariscono (come vedo uno di loro hanno :(- quando sto solo offrendo link al codice sorgente piuttosto che una vera "risposta". –