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

AVR - Obsługa pamięci PROGMEM powyżej 64KB w ATmega1284p, wersja gcc?

elektronik000 12 Gru 2013 08:17 2070 5
REKLAMA
  • #1 13051745
    elektronik000
    Poziom 19  
    Witam,

    chcę użyć pamięci PROGMEM w procesorze powyżej 64KB flash (128KB - ATmega1284p). W której wersji wprowadzono obsługę __flash? Posiadam wersję gcc-4.8-20131010 Win32 oraz 4.8.1 Linux i w żadnym z tych pakietów nie ma obsługi __flash (brak wpisów w pgmspace.h). Czy __flash rozwiązuje ten problem lokacji (obsługa wskaźników 24 czy 32 bit), czy nadal trzeba się zadowolić GET_FAR_ADDRESS?
  • REKLAMA
  • #2 13051835
    michalko12
    Specjalista - Mikrokontrolery
    Już przerabiałem ten temat, ale na toolchainie w wersji 4.7 wyciągniętym z AVR Studio.
    Generalnie działa to. Jeśli chcesz używać pamięci programu jako danych powyżej 64kB to musisz użyć kwalifikatora __memx. Jest trochę z tym problemów bo standardowe biblioteki nie są przygotowane na te nowości, po prostu trzeba uważać na to co się robi. Też obawiałem się, że na 128kB procesorze będą problemy z wyciąganiem danych z obszaru powyżej 64kB, ale doszedłem do wniosku, że 64k danych we flashu to ja raczej nie przekroczę, a linker i tak umieszcza wszystkie takie dane zaraz za wektorami przerwań więc odpuściłem sobie stosowanie __flash i __memx.

    Miałem kiedyś problem ze stosowanie PROGMEM w bootloaderze w ATmega1284, gdzie bootloader ulokowany jest od 120kB, ale problem ten rozwiązałem przez makro które ustawiało 16 bit w adresie podawanym procedurom odczytu z flash.
  • REKLAMA
  • Pomocny post
    #3 13053361
    tmf
    VIP Zasłużony dla elektroda
    __flash adresuje w obrębie pierwszych 64 kB, __flash1 w obrębie kolejnych 64 kB itd. Operator @ pobiera prawidłowy 24-bitowy adres, stąd nie ma już potrzeby korzystania z makra GET_FAR_ADDRESS. Położenie danych w pamięci można zmieniać ręcznie przesuwając sekcje, lub przez zmianę skryptu linkera. Należy jednak pamiętać, że __flash "zawija" się na granicy 64 kB, stąd trzeba zadbać, aby dane nie przekraczały granic 64kB bloków pamięci. Bez obaw można stosować do adresowania __memx. Wtedy dane umieszcza się w pamięci korzystając z przestrzeni __flash, a dostęp do nich następuje z wykorzystaniem przestrzeni __memx. Wadą tego rozwiązania jest dłuższy kod i wolniejszy dostęp do pamięci wynikający z wykorzystania 24-bitowego wskaźnika.
  • REKLAMA
  • #4 13061079
    elektronik000
    Poziom 19  
    A jeszcze pytanie, czy po zastosowaniu __memx zamiast PROGMEM funkcje typu memcpy_P i inne z _P będą działać?
  • REKLAMA
  • Pomocny post
    #5 13061133
    michalko12
    Specjalista - Mikrokontrolery
    Będą.
  • #6 13073319
    elektronik000
    Poziom 19  
    Dziękuje za pomoc.
REKLAMA