2013-05-16 7 views
15

J'ai déjà demandé un similar question, mais je me rends compte que je ne peux pas faire la tête ou la queue de la macrologie et de la toupie. Je suis un programmeur C (plutôt que C++).Arduino F(): que fait-il réellement

Que fait réellement F()? Quand est-ce que ça place des personnages dans pgmem? Quand sort-il les personnages de pgmem? Est-ce qu'il les met en cache? Comment gère-t-il les situations de faible mémoire?

+1

Dans la question précédente, je demande où trouver la mise en œuvre. Ayant lu la source, je me rends compte que je ne comprends pas. La question initiale a sa réponse complète, alors je l'accepte. – iter

Répondre

23

Il n'y a pas de gabarit impliqué, seulement une surcharge de fonction. La F() macro fait deux choses:

  • utilise PSTR pour faire en sorte que la chaîne littérale est stockée dans la mémoire flash (espace de code plutôt que l'espace de données). Toutefois, PSTR("some string") ne peut pas être imprimé car il recevra un char * simple qui représente une adresse de base de la chaîne stockée dans Flash. Le déréférencement de ce pointeur permet d'accéder à certains caractères aléatoires de la même adresse dans les données. C'est pourquoi F() aussi ...

  • fait le résultat de PSTR() à __FlashStringHelper*. Des fonctions telles que print et println sont surchargées de sorte qu'à la réception d'un argument __FlashStringHelper*, elles déréférencent correctement les caractères dans la mémoire Flash.

+0

Merci. Cela me fait tellement plus de sens maintenant. Je vous remercie. – iter

+0

Voici une autre réponse utile: http://forum.arduino.cc/index.php?topic=91314.msg685761#msg685761 – Ben