W dokumentacji Arduino cytuję:
http://playground.arduino.cc/Learning/Memory Uwaga: Pamięć Flash (PROGMEM) można wypełnić tylko w czasie nagrywania programu. Nie można zmienić> wartości we flashu po uruchomieniu programu.
I na opisie PROGMEM:
http://arduino.cc/en/Reference/PROGMEM Przechowuj dane w pamięci flash (programowej) zamiast SRAM. Na tablicy Arduino znajduje się opis różnych rodzajów pamięci.
Słowo kluczowe PROGMEM jest modyfikatorem zmiennej, należy go używać tylko z typami danych zdefiniowanymi w pgmspace.h. Mówi kompilatorowi „umieść tę informację w pamięci flash”, zamiast w SRAM, gdzie normalnie by to poszło.
Czy możemy, czy nie możemy? Czy to nie to samo?
progmem
memory-usage
zzarbi
źródło
źródło
Odpowiedzi:
Krótka odpowiedź brzmi nie: dane PROGMEM są tylko do odczytu.
Ograniczenia pamięci Flash
Pierwszą rzeczą do zrozumienia jest to, że pamięć Flash (tam, gdzie mieszka przestrzeń programowa) została zaprojektowana do długotrwałego przechowywania danych. Odczytywanie z niego jest bardzo szybkie i precyzyjne. Jednak ogólnie rzecz biorąc, nie można go modyfikować bajt po bajcie (np. Zmieniając określoną zmienną). Zwykle musisz go usunąć i ponownie napisać w dużych blokach. To sprawia, że jest to całkowicie niepraktyczne w przypadku manipulacji w czasie wykonywania, ponieważ trzeba będzie przechowywać wiele zbędnych informacji gdzie indziej podczas wykonywania cyklu kasowania i zapisu.
Co właściwie robi PROGMEM
Wszelkie dosłowne dane określone w kodzie (takie jak ciągi i liczby) zawsze znajdują się na początku w przestrzeni programu (tj. We Flashu). Jednak gdy szkic rzeczywiście chce korzystać z tych danych w czasie wykonywania, zwykle musi przeznaczyć dla niego miejsce w SRAM i skopiować je. Oznacza to, że otrzymujesz dwie kopie: stały oryginał we Flashu i tymczasową kopię w SRAM.
Kiedy używasz modyfikatora PROGMEM, mówisz mu, aby nie tworzył drugiej kopii w SRAM. Zamiast tego szkic po prostu uzyska dostęp do oryginału we Flashu. Jest to bardzo przydatne, jeśli musisz tylko odczytać dane, ponieważ pozwala to uniknąć operacji alokacji i kopiowania.
Jednak skopiowanie go do SRAM jest niezbędne, jeśli chcesz zmodyfikować dane. Oprócz wspomnianych wyżej ograniczeń Flash, jest to również kwestia bezpieczeństwa kodu.
Jeśli jesteś w stanie zmodyfikować dane przechowywane w przestrzeni programu, logicznie wynika, że możesz również zmodyfikować kod przechowywany w przestrzeni programu. Oznaczałoby to, że prosty błąd (lub teoretycznie złośliwy atak) może spowodować częściowe lub całkowite przepisanie szkicu w czasie wykonywania. Może to mieć bardzo nieprzewidywalne skutki, od zwykłego zaprzestania pracy, po uszkodzenie / zniszczenie podłączonego sprzętu.
Więcej informacji Więcej informacji na
temat niskopoziomowych elementów programu PROGMEM można znaleźć tutaj:
Starsza wersja tego samego samouczka PROGMEM jest dostępna tutaj:
źródło