Skocz do zawartości

Jak korzystać z progmem?


Pomocna odpowiedź

O ile wydrukowanie stringu z flasch jest dla mnie oczywiste proste i zrozumiałe

Serial.print(F("test"));

to nie bardzo wiem jak tego makra(PGMP) użyć w funkcjach z końcówką _P np jak zapisać wersję tego:

strcmp("Audyt N.  7         ",s)

Tak aby string "Audyt N.  7         " był pobierany bezpośrednio z flasch? np: gdy próbuję zapisać (to jest cały warunek)

if((lineMem == 0) && (0 == strcmp_P("Audyt N.  7         ",s)))

Kompilacja przebiega prawidłowo jednak zajętość RAM nie zmienia się, a chyba powinna być pomniejszona o ilość znaków napisu Audyt..... ?

Link to post
Share on other sites
9 minut temu, _LM_ napisał:

Kompilacja przebiega prawidłowo jednak zajętość RAM nie zmienia się

A niby dlaczego miałaby się zmienić? W końcu nikt nie powiedział kompilatorowi, że "Audyt cośtam" ma siedzieć we flashu a nie w RAM-ie.

Może gdybyś powiedział to by coś zmieniło... np. używając PSTR, czyli coś w stylu:

strcmp_P(PSTR("Audyt N.  7         "),s)

Sprawdź.

Aha, mam nadzieję że to jakaś ATmega a nie np. ESP32, bo tam stałe typu const char * zawsze siedzą we flashu (ogólnie wszelkie tablice const), a funkcje typu pgm_read_cośtam są niepotrzebne.

  • Pomogłeś! 1
Link to post
Share on other sites
8 minut temu, ethanak napisał:

Aha, mam nadzieję że to jakaś ATmega a nie np. ESP32, bo tam stałe typu const char * zawsze siedzą we flashu (ogólnie wszelkie tablice const), a funkcje typu pgm_read_cośtam są niepotrzebne.

No właśnie esp8266, w avr mam to z grubsza opanowane 🙂 

10 minut temu, ethanak napisał:

ESP32, bo tam stałe typu const char * zawsze siedzą we flashu (ogólnie wszelkie tablice const), a funkcje typu pgm_read_cośtam są niepotrzebne.

No i to jest informacja której mi było trzeba. Dzięki!

Link to post
Share on other sites

"Jak korzystać z progmem?"

Nie korzystać. Używać "__flash", odpadnie stosowanie protez w postaci "pgm_read_block" i pisać "normalnie", będzie w przyszłości łatwiej portować kod z Atmega na inne platformy.

  • Lubię! 1
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Rozumiem, zostawiam gdyby ktoś nie wiedział co ten __flash robi w AVR http://avr8bit.cba.pl/?doc=avr_flash_data W kwestii pisania programu pod esp, rozumiem że wszelkie rozwinięcia funkcji z końcówką _P nie są potrzebne. W sumie nie wiem czy to pytanie czy stwierdzenie.

Edytowano przez _LM_
Link to post
Share on other sites
10 minut temu, _LM_ napisał:

wszelkie rozwinięcia funkcji z końcówką _P nie są potrzebne

Tak, nie będzie potrzebne. Przy portowaniu na STM32, czy ESP32 można "wsadowo" usunąć w projekcie wszystkie wpisy "__flash" lub jeśli ma to być wieloplatformowy projekt to wystarczy zdefiniować globalną, pustą etykietę "#define __flash" i resztę załatwi preprocesor.

  • Lubię! 1
Link to post
Share on other sites

W ogóle z tym portowaniem to bym uważał.

W Arduino dla ESP8266 istnieje PROGMEM (o ile pamiętam zdefiniowany jako pusty czy jakoś podobnie) i funkcje pgm_read_<cośtam>. Portowałem swój dość prosty programik z Arduino na ESP8266... no i zonk: program się wywalał na czytaniu bitmap w Adafruit GFX. Po bliższych badaniach okazało się, że:

  • dla ATmegi pgm_read_word to po prostu odczytanie po kolei dwóch bajtów z flasha;
  • dla ESP8266 pgm_read_word wygląda mniej więcej tak:
     
uint16_t pgm_read_word(uint32_t addr) {
	return *((uint16_t *)addr;
}

Niestety - taka funkcja wymaga, aby adres był parzysty, a w Adafruitowych bitmapach nie było to zachowane...

Tak że trzeba liczyć się z dziwnymi błędami, które na ośmiobitowcach nie występują.

No i tak jak pisałem wcześniej: jeśli nie przewidujesz uruchamiania swojego arcydzieła na ATmegach, olewasz flashe, pgmready, progmemy i piszesz zgodnie ze sztuką 🙂

 

 

 

Link to post
Share on other sites

Tego dzieła 😉 akurat nie da rady portować, chyba że powstaną AVRy z wbudowaną obsługą wifi i innymi z tym związanymi ficzerami. A w drugą stronę? W jeśli miałbym jakiś wielki projekt przepisać (heh tak jakbym robił jakieś wielkie projekty) to sądzę że szybciej byłoby użyć choćby takiego esp 01 w trybie AT a dla AVR dopisać te kilka linijek obsługi AT

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.