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?

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ść .


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.