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: