2013-07-31 10 views
5

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?

+0

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. –

+0

@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

risposta

8

__func__, __FUNCTION__ e __PRETTY_FUNCTION__ non sono stringhe letterali, come __FILE__, ma vengono creati come statici variabili array di caratteri locali alla funzione li utilizza da. Pertanto, la macro PSTR() avrà esito negativo poiché non è possibile utilizzare una variabile di matrice per inizializzare un'altra variabile di matrice come quella.

__func__ è descritto in C11, § 6.4.2.2 ¶ 1:

The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";
appeared, where function-name is the name of the lexically-enclosing function.

According to the GCC manual, __FUNCTION__ e __PRETTY_FUNCTION__ sono solo sinonimi di __func__ in C (__PRETTY_FUNCTION__ è più dettagliato per C++).

+0

C'è un modo per ottenere __func__ nella memoria del programma? Di default la definizione lo pone nella RAM. Ovviamente le persone non vogliono sprecare RAM su dati di debug statici. –

+0

La domanda era su avr-gcc, che implica la piattaforma AVR. È un'architettura di Harvard con due spazi di memoria. La memoria del programma è la memoria flash del dispositivo, normalmente di sola lettura. Dato che i dispositivi hanno solo RAM limitata (16k è circa il limite, in genere 2-4k) non si vuole riempirlo con le stringhe di debug. –

+0

@ Moo: Grazie, per i chiarimenti. Sembra che dovrai dichiarare le tue variabili caso per caso se hai questo requisito, oppure devi modificare il compilatore per estenderlo per permetterti di specificare il target di memoria per la variabile '__func__'. – jxh

Problemi correlati