Utilizzando avr-gcc
è possibile memorizzare i dati sulla memoria del programma per risparmiare RAM. Questo è realizzato utilizzando PROGMEM attribute. AVR-libc fornisce anche una macro, PSTR(), che può essere utilizzata con stringhe letterali.PSTR() su __FUNCTION__
Ora sto cercando di utilizzare PSTR()
con __func__
, __FUNCTION__
or __PRETTY_FUNCTION__
.
Il seguente codice funziona come previsto,
display.message(__func__, 2);
display.message(__FUNCTION__, 2);
display.message(__PRETTY_FUNCTION__, 2);
, mentre la compilazione di una qualsiasi di queste linee non riesce,
display.messageP(PSTR(__func__), 2);
display.messageP(PSTR(__FUNCTION__), 2);
display.messageP(PSTR(__PRETTY_FUNCTION__), 2);
, con il seguente errore:
initializer fails to determine size of '__c'
La definizione di PSTR, da WinAVR/AVR/include/AVR, spiega la variabile fa riferimento al messaggio di errore:
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
Questo non è qualcosa di generale per le macro, come __FILE__
compilare e lavorare bene:
display.messageP(PSTR(__FILE__), 2);
Qualche idea su cosa sta causando questo errore e se è possibile utilizzare PSTR() per inserire il nome della funzione nella memoria del programma?
Sembra che quei letterali stringa non possano essere posizionati in quello spazio in quanto richiedono funzioni speciali? per accedervi. In verità, questi nomi dovrebbero essere davvero dannatamente piccoli quindi mi chiedo se ci sia un reale vantaggio nel trasferirli comunque. Dico questo senza alcuna idea della quantità effettiva di RAM che hai. –
@MichaelDorgan avr-libc fornisce funzioni per accedere alla variabile nella memoria del programma; questo è confermato dall'ultima riga di codice sulla domanda, che funziona bene. Sono d'accordo sul fatto che queste stringhe siano piccole, ma sono significative nei sistemi embedded (con solo pochi Kbyte di RAM). – mMontu