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.