Skocz do zawartości

Jak korzystać z progmem?


_LM_

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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.