Czy mogę pisać do pamięci Flash za pomocą PROGMEM?

11

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?

zzarbi
źródło
Podczas gdy możesz pisać w pamięci programu (flash) w czasie wykonywania (chyba że jest zablokowany), proces jest nieco bardziej zaangażowany i nie można go osiągnąć za pomocą dyrektywy PROGMEM, która w zasadzie kontroluje proces alokacji. Jeśli chcesz zobaczyć, jak to zrobić, spójrz na źródło bootloadera.
Chris Stratton
Bloki zapisu strony nie sprawiają, że pisanie na flash jest niepraktyczne. W rzeczywistości było to coś, na co czekało.
Anothercg Gmail,

Odpowiedzi:

9

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:

Peter Bloomfield
źródło