Jakie są konsekwencje korzystania z PROGMEM?

12

Przy dużej ilości zmiennych tekstowych uważam za konieczne przechowywanie ich w pamięci Flash za pomocą PROGMEM . Jakie są pozytywne i negatywne konsekwencje przechowywania dużych zmiennych we Flashu (przy użyciu PROGMEM) vs SRAM vs EEPROM na Arduino?


źródło

Odpowiedzi:

10

Oto szybkie porównanie FLASH, EEPROM i SRAM na AtMega328, mikrokontrolerze w wielu obecnych płytach Arduino (z wyłączeniem Due, Leonardo, starszych Arduinos i niektórych innych kompatybilnych płyt).

  • FLASH: 10 000 cykli zapisu / kasowania. Dostęp jest szybki, ale wolniejszy niż SRAM. Dostęp do kodu za pośrednictwem PROGMEM.
  • EEPROM: 100 000 cykli zapisu / kasowania. Dostęp jest powolny, w milisekundach. Stosunkowo złożona procedura dostępu.
  • SRAM: Nieograniczone cykle zapisu / kasowania. Dostęp jest bardzo szybki, 2 cykle zegara. Bezpośredni dostęp za pomocą kodu.

Zatem kluczową hipotetyczną negatywną konsekwencją użycia PROGMEM jest limit 10 000 cykli zapisu . Kluczową negatywną konsekwencją korzystania z EEPROM jest złożoność kodu do odczytu / zapisu / kopiowania danych. SRAM ma bardzo ograniczoną pojemność .

Anindo Ghosh
źródło
Skąd czerpiesz informacje o dostępie do pamięci EEPROM? Z odrobiną patrząc o , wygląda EEPROM czyta wziąć coś podobnego ~ 5 cykli zegarowych. Pisanie jest powolne, ale nie czytanie.
Connor Wolf
OP chce przechowywać wiele rzeczy.
Anindo Ghosh
Tak, ale czy to pisze raz, czyta wiele, czy odwrotnie? „Zmienne tekstowe” to prawdopodobnie coś, co jest określone w czasie kompilacji, wypalane na urządzeniu i nigdy potem nie zmieniane (np. Tekst menu lub sommat).
Connor Wolf
Czytam sklep w pytaniu jako „sklep w czasie kompilacji / przesyłania”. Jeśli zmienna ma być używana do odczytu / zapisu w czasie wykonywania, zdecydowanie nie powinna być przechowywana we FLASH. Czy nie ma dodatkowych ograniczeń, że FLASH nie może być modyfikowany bez uprzedniego usunięcia całej strony?
microtherion
... zmienne tekstowe nie są stałymi łańcuchowymi.
Anindo Ghosh
2

Podstawową implikacją jest to, że nie można modyfikować informacji przechowywanych w PROGMEM. Weźmiesz także (bardzo małe) działanie, ponieważ ciąg musi być kopiowany 1 bajt na raz.

Zużycie FLASH nie jest (pierwotne) problemem, ponieważ aby wprowadzić zmiany w programie, musisz przeprogramować FLASH.

Wraz z wprowadzeniem IDE 1.x dołączono makro F (). Ułatwia to utrzymywanie ciągów w PROGMEM.

Na przykład zamiast używać: Serial.print („Hello World!”);

Możesz teraz użyć:

Serial.print (F („Hello World!”);

Zauważ, że F () nie jest funkcją, jest tylko makrem, więc jej użycie jest nieco ograniczone.

Baldengineer
źródło
1

PROGMEM najlepiej nadaje się do niezmiennych danych. Jeśli zamierzasz szybko zmieniać zmienne, po prostu zapisałbym je w SRAM. Z drugiej strony, jeśli chcesz mieć niezmienne zmienne tekstowe (np. Rzeczy do wyświetlenia), które nie będą pobierane zbyt często, PROGMEM to świetny pomysł.

Jeśli chodzi o EEPROM - spróbuj zapisać to dla trwałych rzeczy. IIRC pobieranie danych z EEPROM przez SRAM / PROGMEM jest wolniejsze. Zwykle (i inne) kopiuję dane z EEPROM do SRAM (nawet oficjalny przykład to robi) przed ich użyciem.

Manishearth
źródło