Pytanie:
Kiedy stosować PROGMEM?
Praveen Singh Yadav
2018-05-10 14:29:56 UTC
view on stackexchange narkive permalink

Uważam, że PROGMEM służy do przechowywania dużych danych (np. ciągów znaków), które się nie zmieniają. Więc uwalnia SRAM.

w Ardunio Reference jest mowa o tym.

„Korzystanie z PROGMEM jest również procedurą dwuetapową. Po wprowadzeniu danych do pamięci Flash, wymaga specjalnych metod (funkcji), również zdefiniowanych w bibliotece pgmspace.h, aby wczytać dane z pamięci programu z powrotem do SRAM, więc możemy z nim zrobić coś pożytecznego. "

Jeśli będę musiał załadować dane do SRAM przed użyciem, to jak jest to wydajne niż bezpośrednie przejście do SRAM poprzez normalne zdefiniowanie opłacalności

... ponieważ nie * pozostaje * w SRAM ...
Trzy odpowiedzi:
Majenko
2018-05-10 14:42:57 UTC
view on stackexchange narkive permalink

Załóżmy, że we Flashu masz ciąg 1000 znaków i chcesz wydrukować go na Serial. Tak, musisz załadować go do pamięci RAM, aby przekazać te dane do miejsca drukowania. Ale czy musisz umieścić wszystko w pamięci RAM naraz? Nie. Potrzebujesz tylko jednej postaci na raz. Zamiast więc pobierać 1000 znaków i przydzielać 1000 bajtów pamięci RAM i kopiować cały shebang do pamięci RAM, a następnie drukować, wystarczy przydzielić 1 bajt pamięci RAM * i skopiować każdy znak po kolei i wydrukować.

Ponieważ możesz odczytać tylko jeden znak na raz z pamięci flash, i tak nie ma żadnej korzyści w czytaniu całości.


* Właściwie, z powodu optymalizacji kompilatora, prawdopodobnie nigdy nie dotyka to pamięci RAM i po prostu pozostaje w rejestr CPU.

Juraj
2018-05-10 15:12:24 UTC
view on stackexchange narkive permalink

Jeśli masz w swoim kodzie stały łańcuch c (tablicę znaków) bez makra F lub progmem, to ciąg jest kopiowany do pamięci RAM na początku i tam pozostaje.

Jeśli w funkcji używasz makro F lub utworzysz bufor znaków o pewnym rozmiarze i skopiujesz łańcuch progmem do bufora, po powrocie funkcji zmienne są usuwane ze stosu, a pamięć jest zwalniana.

W przypadku dużej tablicy, jeśli umieścisz ją w programie progmem, a następnie w kodzie, gdy chcesz wyszukać wartość w tej tablicy, musisz skopiować do pamięci RAM tylko jeden element tablicy na raz, a nie cała tablica.

Julian Goldsmith
2018-05-10 20:48:08 UTC
view on stackexchange narkive permalink

Jak powiedział Majenko, nie musisz od razu umieszczać wszystkiego, co masz z pamięci flash w pamięci RAM. W razie potrzeby możesz przenosić elementy do pamięci SRAM i ponownie używać pamięci, gdy skończysz.

Jednak nie jesteś ograniczony do przenoszenia jednego bajtu na raz. Istnieją funkcje zdefiniowane w avr / pgmspace.h , które mogą obsługiwać przenoszenie danych.

Na przykład możesz zrobić coś takiego:

  const struct mystruct_s my_value PROGMEM = {value = 1234}; // ... struct mystruct_s working_copy; memcpy_P (&working_copy, &my_value, sizeof (struct mystruct_s)); int fooue = working_c ;  


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...