2013-05-16 17 views
15

Przedtem pytałem o numer similar question, ale zdaję sobie sprawę, że nie potrafię stworzyć głów ani makrologii makrologii i templatury. Jestem programistą C (raczej niż C++).Arduino F(): co to właściwie robi

Co właściwie robi F()? Kiedy wypycha postacie do pgmem? Kiedy wyciąga postacie z pgmem? Czy buforuje je? Jak radzi sobie z sytuacjami z niską pamięcią?

+1

W poprzednim pytaniu, pytam, gdzie znaleźć wdrożenie. Po przeczytaniu źródła rozumiem, że go nie rozumiem. Oryginalne pytanie ma pełną odpowiedź, więc je akceptuję. – iter

Odpowiedz

23

Nie ma żadnych szablonów, tylko funkcja przeciążania. F() makro robi dwie rzeczy:

  • wykorzystuje PSTR aby upewnić się, że ciągiem znaków są przechowywane w pamięci Flash (przestrzeni kodu zamiast przestrzeni danych). Jednakże, PSTR("some string") nie można wydrukować, ponieważ otrzyma zwykły char *, który reprezentuje adres bazowy ciągu przechowywanego we Flashu. Dereferencja, która wskazywałaby dostęp do niektórych losowych znaków z tego samego adresu w danych. Dlatego też F() ...

  • rzuca wynik PSTR() na __FlashStringHelper*. Funkcje takie jak print i println są przeciążone, więc po otrzymaniu argumentu __FlashStringHelper* poprawnie usuwają zaznaczenia znaków w pamięci Flash.

+0

Dziękuję. To teraz ma dla mnie dużo więcej sensu. Dziękuję Ci. – iter

+0

Oto kolejna pomocna odpowiedź: http://forum.arduino.cc/index.php?topic=91314.msg685761#msg685761 – Ben