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

[Rozwiązano] AVR dostęp do tablicy tablic w pamięci flash mikrokontrolera

lupin22 19 Lip 2021 11:34 741 9
  • #1 19527352
    lupin22
    Poziom 10  
    Cześć,

    mam następujący problem. Zadeklarowałem sobie tablice w taki sposób:

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


    Próbuję się teraz dostać do elementów tablic array0:

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


    zwracana wartość jest poprawna, ale gdy zamiast stałej 0 użyję zmiennej:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to otrzymuję już losowe wartości,

    Gdzie popełniam błąd? Jak dobrać się do elementu o indeksie arr_counter w tablicy wybieranej zmienną iteraor?
  • Pomocny post
    #2 19527405
    mpier
    Poziom 29  
    Witam,
    próbowałeś podzielić odczyt na dwie części, zamiast upychać w jednej linii? Wyciągnij adres elementu z tablicy (&(arrays[iterator])) i odczytane 2 bajty (pgm_read_word()) potraktuj jako adres docelowej tablicy z uint8_t, z którego odczytasz jeden bajt.

    Pozdrawiam
  • #3 19527436
    lupin22
    Poziom 10  
    mpier napisał:
    podzielić odczyt na dwie części, zamiast upychać w jednej linii?


    Upchnąłem w jednej :wink: Powstało coś takiego:

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


    I rzeczywiście działa.

    Chyba zrozumiałem mój błąd na początku - jeśli była stała to pewnie kompilator podstawiał wyliczony adres. Ale gdy była zmienna, to nie czytał adresu z pamięci FLASH, tylko SRAM i stąd dziwne wyniki.

    Dobrze myślę, że nie obejdzie się bez dwukrotnego odczytu z pamięci FLASH? Najpierw adres z tablicy arrays a potem docelowa wartość.
  • Pomocny post
    #4 19529601
    ex-or
    Poziom 28  
    Makra pgm_read_* to archaizm. Named Address Spaces robią robotę https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    czy tam
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #5 19529618
    mpier
    Poziom 29  
    Tak, to dla gcc. W MPLAB XC8 (AVR) zmienne const trafiają do flash domyślnie, a wskaźnik na const działa z ram i flash. __memx działa chyba podobnie w gcc.
  • #7 19530066
    lupin22
    Poziom 10  
    ex-or napisał:
    Tak czy inaczej, precz z tymi makrami/funkcjami


    Dziękuję, sposób z przestrzenią adresową rzeczywiście działa bez żadnego kombinowania. Czy jest w tym różnica w prędkości dostępu do danych, czy to tylko kwestia ładniejszego zapisu?
  • #8 19530382
    Lazureus
    Poziom 10  
    ex-or napisał:
    Tak czy inaczej, precz z tymi makrami/funkcjami


    Nie skazywałbym tych makr tak od razu na banicję, w końcu "Named Address Spaces" należy do rozszerzeń GNU C. Nie zawsze ma się komfort kompilowania projektu z rozszerzeniami GNU C.
  • Pomocny post
    #9 19531019
    khoam
    Poziom 42  
    Lazureus napisał:
    Nie skazywałbym tych makr tak od razu na banicję, w końcu "Named Address Spaces" należy do rozszerzeń GNU C. Nie zawsze ma się komfort kompilowania projektu z rozszerzeniami GNU C.

    A niestety, kiedy zaczniemy używać g++, kwalifikator __flash przestaje być dostępny. Na szczęście jest constexpr :)

    lupin22 napisał:
    Czy jest w tym różnica w prędkości dostępu do danych, czy to tylko kwestia ładniejszego zapisu?

    To drugie.
  • #10 19531833
    lupin22
    Poziom 10  
    Wykorzystałem możliwość Named Address Spaces. Dziękuję bardzo za pomoc w rozwiązaniu problemu i wskazanie bardziej eleganckiego rozwiązania.
REKLAMA