logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zainicjalizować i zapisać wielowymiarową tablicę w EEPROM XMega128A4U?

jp_elek 18 Gru 2018 16:38 513 6
REKLAMA
  • #1 17635791
    jp_elek
    Poziom 9  
    Witam;
    Dorywczo, czasem coś próbuję skrobnąć, a tym razem:

    1. Jest jakiś sposób na inicjalizację dużych ( np. Tab[20][32]) w EEPROM
    tak by wszystkie 20-ścia rekordów na początek było takich samych,
    ale jeden rekord zdefiniowany, a 20 razy powtórzony ?
    (próbowałem z #define ( 32 pozycje) a następnie powtórzonych- bez sukcesu)

    2. Mam problem - z zapisem do obszaru mapowanej pamięci EEPROM (0x1000),
    wynik sprawdzenia na XMega128A4U przez PDI z JTAGICE mkII, zamiast
    zapisywać wskazane bajty, zapisuje po kilkadziesiąt ?? Czy to błąd metody,
    AS7, czy kontrolera NVM.

    Dla celu zapytania tak wygląda program :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    a rzeczywiste działanie na poniższym obrazku
    Jak zainicjalizować i zapisać wielowymiarową tablicę w EEPROM XMega128A4U?


    ps. przy włączonym bicie NVM_EEMAPEN stan bufora to oczywiście same 0xff .
  • REKLAMA
  • #2 17642890
    tmf
    VIP Zasłużony dla elektroda
    ad 1. Możesz uzupełnićjeden element tablicy, a następnie powielić jego zawartość odpowiednią ilość razy za pomocą memcpy.
    ad 2. Twoja funkcja nic nie zapisuje do EEPROM, zapisuje jednie do bufora. Jego zawartość można nastpnie przenieść do EEPROM przy pomocy odpowiednich poleceń kontrolera NVM. EEPROM jest zapisywany stronami, podział na strony jest sztywny i nie da się zapisać na raz bajtów leżących na różnych stronach pamięci. Przykłady jak uzyskać dostęp do EEPROM w trybie mapowania, masz np. za free w przykłądach do książki "AVR. Praktyczne projekty".
  • REKLAMA
  • #3 17644191
    jp_elek
    Poziom 9  
    @tmf

    Twoje wyjaśnienia są dla mnie jasne, mój "problem" polega na tym iż zakładam:

    1. Przy ustawionym EEMAPEN , bufor sztywno kopiuje/mapuje zawartość EEPROM.

    2. Przy wyzerowanym EEMAPEN nie działa kopiowanie/mapowanie i można w tym buforze przygotować dane ( przez wielkrotne zapisy z różnych części programu) a nstępnie dopiero tak przygotowany bufor spod 0x1000 zapisać do rzeczywistego EEPROM na 0x0000 ( oczywiście funkcjami np. z biblioteki <avr/eeprom.h>)

    3. Zakładam iż okno podglądu pamięci(memory4 jak na zał. obrazku) pokazuje stan bufora .

    Gdzie tkwi mój błąd rozumowania ?
  • REKLAMA
  • #4 17644416
    tmf
    VIP Zasłużony dla elektroda
    Błąd tkwi wszędzie :)
    Przede wszystkim - bufor zapisu do EEPROM to w zależności od typu XMEGA max 32 bajty. A więc nie jest tak, że masz zmapowane wszystkie konórki EEPROM do bufora. W danej chwili zmapowana jest jedna strona (max 32 bajty). Bufor zawiera informację, które bajty zostały zmodyfikowane i tylko te są zapisywane do EEPROM po wydaniu polecenia zapisu do NVM. AVR-libc tego nie wspiera - dostęp do EEPROM przez te funkcje odbywa się tak, jak to było w winnych AVRach, bajt po bajcie.
    Dlatego jeśli chcesz skorzystać z mapowania, to jeśli chodzi o odczyt nie ma najmniejszego problemu, cały EEPROM jest widziany w przestrzeni adresowej procesora. Natomiast zapis odbywa się przez bufor i wymaga wydania odpowiednich poleceń dla kontrolera NVM. Jak pisałem, ściągnij sobie przykady do moich książek, tam masz zaimplementowane odpowiednie funkcje.
  • #5 17644707
    jp_elek
    Poziom 9  
    @tmf

    Zatem, (tylko przy zapisie) jest bufor a jakoby go nie było...

    1. Jaki wpływ na skuteczność zapisu do bufora ma flaga EEMAPEN ?
    2. Czy też ów bufor należy widzieć jako typ w rodzaju DATA dla USART,
    inny dla odczytu, inny dla zapisu choć obydwa pod tym samym adresem ?

    ps. miłosierdziem to Waszmość nie grzeszysz, rujnując tak piękną teorię (moją) jednym wpisem :cry:
  • Pomocny post
    #6 17644797
    tmf
    VIP Zasłużony dla elektroda
    ad 1. Zapewne żaden.
    ad 2. Dokładnie. Podczas odczytu zwracana jest zawartość EEPROM (skopiowana do bufora lub ostatnio zapisana), podczas zapisu, zapis odbywa się do bufora.
    Pomyśl o tym tak, że masz np. 32 bajtowy bufor, do którego możesz zapisywać. Po uzupełnieniu w nim danych, możesz je skopiować na raz do EEPROM, na dowolną stronę, której adres jest wyliczany modulo długość bufora. Czyli zawartość bufora możesz przenieść na 32 bajtową stronę EEPROM, której numer to adres modulo 32. Każdy bajt w buforze jest mapowany na odpowiadający mu bajt na stronie EEPROM.
    Jest to fajne, bo maksymalnie 32-krotnie przyśpiesza operację zapisu do EEPROM, w stosunku do zapisu bajtowego.
  • REKLAMA
  • #7 17644915
    jp_elek
    Poziom 9  
    No tak:

    Twoje "fajnie", "tylko" przyspiesza zapis, okradając mnie z prawie 1kB SRAM :|
    , moje dawało mi i szybki zapis i "za frajer" pamięć SRAM. A teraz koniec "snu o potędze" :cry:

    WIELKIE DZIĘKI J.P.

    ps. jak tak dalej pójdzie to skończę poniewierką po GPIOR i nieużywanych rejestrach peryferiów…

    ps2. Dla jasności: zachowanie się bufora potwierdza, iż nie da się odczytać niczego co wpisano do bufora. każdy odczyt bufora z ustawioną flagą EEMAPEN to rzeczywista wartość EEPROM jeśli inne funkcje coś tam wpisały- do bufora , to jedynie rzeczywisty zapis EEPROM spowoduje możliwość odczytu/wykorzystania tych zmienionych wartości .Stąd w takim przypadku pozostaje klasyczny bufor w SRAM ( nie stwierdziłem też wpływu flagi mapowania podczas zapisu do bufora, myślę iż ona jedynie włącza mapowanie umożliwiając odczyt, bez włączenia EEMAPEN odczyt zwraca też wartość, ale jej znaczenie jest niejasne - nie potrafię sensownie jej zinterpretować)
REKLAMA