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

[AVR Studio i C] Położenie tablicy danych w pamięci flash

nojmi 14 Sie 2009 15:43 2753 6
  • #1 6892954
    nojmi
    Poziom 20  
    Piszę w AVR Studio i zastanawiam się czy istnieje możliwość narzucenia pozycji tablicy danych w pamięci flash? Chodzi mi dokładnie żeby tablica unsigned int value[128]={...}; rozpoczynała się na ściśle określonym adresie. Za sugestie z góry dzięki.
  • #3 6894657
    nojmi
    Poziom 20  
    Przykład się sprawdził ale mam teraz problem z odczytem tablicy. Dla:
    
    unsigned int value[128] __attribute__ ((section("moja_sekcja"))) = {1,2,3,4,5,6,7,8,9};
    unsigned int *adres; 
    
    ...
    
    adres=&(value[0]);
    for (i=0;i<9;i++) {
         data=adres[i];
    }

    uzyskuje jakieś dziwne wartości :(
  • Pomocny post
    #4 6895071
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Czyżbyś zapomniał, że w AVRach odczyt z pamięci FLASH realizowany jest zupełnie inaczej niż odczyt z pamięci RAM? Po co są makra typu pgm_read_byte() itp? Kompilator sam tego nie wymyśli - niestety taka jest cena architektury Harwardzkiej.

    4\/3!!
  • Pomocny post
    #5 6895157
    BoskiDialer
    Poziom 34  
    nojmi napisał:
    
    unsigned int value[128] __attribute__ ((section("moja_sekcja"))) = {1,2,3,4,5,6,7,8,9};

    Tak zadeklarowana zmienna wyląduje w pamięci RAM (brak atrybutu PROGMEM). Dziwne wartości biorą się z tego, że zmienna ta nie znajduje się w sekcji data ani bss (wkońcu została wymuszona inna sekcja), a więc taka zmienna w pamięci ram nie będzie inicjalizowana poprawnie - zmienne z sekcji data są ładowane z pamięci flash w .init3, a zmienne z sekcji bss są tam zerowane. Rozwiązaniem jest dodanie PROGMEM oraz odczyt z wykorzystaniem funkcji o których wspomniał Freddie Chopin.
  • Pomocny post
    #6 6897379
    zumek
    Poziom 39  
    BoskiDialer napisał:

    Tak zadeklarowana zmienna wyląduje w pamięci RAM ...

    Zapomniałeś o atrybutach pamięci :?:
    Cytat:

    -Wl,-section-start=moja_sekcja_ram=0x0800100

    Sekcja z wyżej wytłuszczonym argumentem, znajdzie się w RAM-ie.

    PS
    quod erat demonstrandum :D
    [AVR Studio i C] Położenie tablicy danych w pamięci flash
  • #7 6897799
    nojmi
    Poziom 20  
    Dla mnie wszystko jasne i uruchomione. Wielkie dzięki:D
REKLAMA