Flash i EEPROM

14

Arkusz danych Atmega16 mówi, że tak

a) 16 kilobajtów wbudowanej w system pamięci programu Flash oraz b) 512 bajtów EEPROM.

Czy mikrokontroler może mieć dwa oddzielne ROM-y, które można programować za pomocą technologii EEPROM i technologii Flash?

Czy moje wnioskowanie (jak podano powyżej) z arkusza danych jest błędne?

Wiem, że nasz program jest przechowywany w pamięci flash, niż dlaczego ktoś będzie potrzebował pamięci EEPROM? Do czego służy, jeśli mamy pamięć flash dla programu?

Może również ktoś wytłumaczyć, co to jest termin „programowalny w systemie”

Co wiem: technologia Flash może pisać program w blokach danych, natomiast pamięć EEPROM może zapisywać dane bajt po bajcie.

Jasser
źródło

Odpowiedzi:

21

W dzisiejszych czasach pamięć Flash służy do przechowywania kodu programu, a pamięć EEPROM (elektrycznie kasowalna pamięć tylko do odczytu) służy do przechowywania trwałych danych. Około 30 lat temu, zanim pojawił się Flash, pamięci EEPROM były używane do przechowywania kodu programu.

Właściwie najpierw pojawiła się ROM (pamięć tylko do odczytu), potem PROM (ROM programowalny, tylko raz), EPROM (PROM Kasowalne za pomocą światła UV), EEPROM, a na koniec Flash. ROMy są nadal używane do bardzo głośnych i tanich aplikacji (np. Mówiące kartki z życzeniami).

Ważna różnica w stosunku do obecnych mikrokontrolerów polega na tym, że generalnie nie można wykonać kodu poza EEPROM, a programy przechowujące dane w pamięci flash są niewygodne. (Dane są przechowywane w pamięci flash, gdy na przykład używasz słowa kluczowego „const” w deklaracji danych lub definiujesz ciąg, ale jest to obsługiwane przez kompilator i konsolidator).

Obszar EEPROM może służyć do przechowywania konfiguracji lub innych danych, które mają być dostępne podczas ponownego uruchamiania, w tym jeśli mikrokontroler stracił moc, a następnie został ponownie włączony. Funkcjonalnie EEPROM można traktować jako bardzo mały dysk twardy lub kartę SD.

Na mikrokontrolerach bez EEPROM możliwe jest przechowywanie trwałych danych w pamięci flash, ale staje się to trudne, ponieważ mikrokontrolery tak naprawdę nie zostały zaprojektowane do tego celu, i musisz znaleźć specjalne miejsce, które nie będzie zakłócać kodu programu, i odłóż to na bok z linkerem. Ponadto, jak wspomniano poniżej, pamięć EEPROM można zwykle aktualizować wiele razy częściej niż pamięć flash.

Jeśli programujesz dane we flashu, nie oznacza to, że możesz uzyskać dostęp do danych jako zmiennych w swoim programie C, ponieważ nie ma sposobu, aby powiedzieć kompilatorowi, gdzie te zmienne są w twoim kodzie (tzn. Nie możesz powiązać stałej zmienna do tego obszaru flasha.) Czytanie ich musi odbywać się za pomocą specjalnego zestawu rejestrów używanych do ich zapisywania. Uwaga: to ograniczenie dotyczy również danych w pamięci EEPROM, więc nie ma w tym zakresie żadnych korzyści.

Aby zaprogramować pamięć flash lub EEPROM, należy najpierw usunąć blok pamięci. Następnie jest programowany. W przypadku flashowania, pisanie zwykle odbywa się jednocześnie po bloku. W przypadku pamięci EEPROM można to zrobić blokami lub bajtem na raz, w zależności od mikrokontrolera.

Zarówno w przypadku pamięci flash, jak i pamięci EEPROM, istnieje możliwość maksymalnej ich aktualizacji przed zużyciem pamięci. Liczba ta jest podana w arkuszu danych jako minimalna gwarantowana wartość. Zwykle jest znacznie wyższa w przypadku EEPROM niż w przypadku pamięci flash. W przypadku pamięci flash widziałem liczby tak niskie, jak 1000. W przypadku pamięci EEPROM widziałem liczby tak wysokie, jak 1 000 000.

Jedną z zalet pamięci EEPROM w porównaniu z pamięcią flash jest to, że można je usunąć wiele razy więcej niż można usunąć pamięć flash.

„In-System Self-programmable” oznacza po prostu, że mikrokontroler może aktualizować własną pamięć flash podczas pracy. Ta funkcja jest zwykle używana do aktualizacji kodu w terenie. Sztuczka polega na tym, że musisz pozostawić trochę kodu w systemie podczas aktualizacji programu głównego, zwanego bootloaderem. Ten schemat jest używany w systemie Arduino do programowania układu.

tcrosley
źródło
Dziękuję za odpowiedź. Więc aby wprowadzić dane do EEPROM, będę potrzebował programatora EEPROM, tak jak w programatorze USBASP, aby zrzucić program do pamięci flash? Mam rację, proszę pana.
Jasser
1
@Jasser Nie, nie potrzebujesz zewnętrznego programisty. Dostęp do pamięci EEPROM uzyskasz z poziomu programu. W ATmega znajdzie się zestaw rejestrów, które pisząc do nich, pozwolą ci zaktualizować pamięć EEPROM. Będziesz także musiał użyć tych rejestrów, aby odczytać pamięć EEPROM, ponieważ nie pojawi się ona na normalnej mapie adresowej. Informacje o tym, jak wymazać, zapisać i odczytać pamięć EEPROM, będą znajdować się w arkuszu danych układu.
tcrosley
Ponieważ możemy pisać lub czytać z pamięci EEPROM wewnątrz mikrokontrolera, mikrokontroler powinien mieć układ do przechowywania danych w pamięci EEPROM i powinien być podobny do programatora EEPROM. To ponownie prowadzi mnie do kolejnego pytania, że ​​skoro pamięć EEPROM może być pobudzona około 100 000 razy, to później możemy nie być w stanie przechowywać danych w pamięci EEPROM przez rejestry. Czy te stwierdzenia są znaczące? @tcrosley
Jasser
1
@Jasser Poprawnie, istnieje limit liczby aktualizacji pamięci EEPROM. Zazwyczaj jest to znacznie więcej (czasami o rząd wielkości więcej) niż liczba aktualizacji lampy błyskowej. Powinienem był o tym wspomnieć w mojej odpowiedzi i zaktualizuję ją. Podana liczba to minimum gwarantowane przez producenta chipów; Raz zrobiłem kilka testów z układem, który został określony na 100 000 zapisów, i przeszedł znacznie ponad 500 000, zanim wykryto jakiekolwiek błędy.
tcrosley
1
@Jasser Tak, konfiguracja danych w pamięci flash jest nieco trudniejsza. Ponadto, jak omówiono w mojej aktualizacji do mojej odpowiedzi, możesz usunąć i przeprogramować pamięć EEPROM wiele razy więcej (zwykle 10x) niż flash.
tcrosley
4

Dodaję więcej informacji do doskonałej odpowiedzi autorstwa @tcrosley.

ATmega16 implementuje architekturę Harvarda , tj. Topologię systemu, w której pamięć danych jest oddzielona od pamięci programu. Cytując odpowiedni akapit z arkusza danych Atmega16 (strona 8):

Aby zmaksymalizować wydajność i równoległość, AVR wykorzystuje architekturę Harvarda - z oddzielnymi pamięcią i magistralami dla programu i danych. Instrukcje w pamięci programu są wykonywane z potokowaniem jednopoziomowym. Podczas wykonywania jednej instrukcji kolejna instrukcja jest pobierana z pamięci programu. Ta koncepcja umożliwia wykonywanie instrukcji w każdym cyklu zegara. Pamięć programu to wbudowana w system pamięć Flash z możliwością przeprogramowania.

Architektura Harvard ma tę zaletę, że nie ma niezgodności magistrali między cyklami pobierania instrukcji a cyklami dostępu do danych, ponieważ dane i instrukcje nie dzielą tej samej magistrali, jak w tradycyjnej architekturze PC.

Dlatego pamięć flash jest używana jako pamięć programu, podczas gdy pamięć danych jest dzielona między SRAM (dla danych przejściowych, takich jak stos wywołań funkcji i sterta - jeśli programujesz na przykład w C) i EEPROM (dla trwałego przechowywania) .

Lorenzo Donati - Codidact.org
źródło