Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

nojmi 14 Sie 2009 15:43 2417 6
  • #1 14 Sie 2009 15:43
    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.

    0 6
  • Pomocny post
    #2 14 Sie 2009 17:24
    zumek
    Poziom 39  

    Przykład:
    a)Utwórz własną sekcję.

    Code:
    unsigned int value[128] __attribute__ ((section("moja_sekcja"))) = {1,2,3,4,5,6,7,8,9};


    b)Dodaj opcję linkerowi.
    Code:

    -Wl,-section-start=moja_sekcja=0x0800


    0x800 to przykładowy adres pamięci ;)

    1
  • #3 15 Sie 2009 00:29
    nojmi
    Poziom 20  

    Przykład się sprawdził ale mam teraz problem z odczytem tablicy. Dla:

    Code:

    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 :(

    0
  • Pomocny post
    #4 15 Sie 2009 10:00
    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!!

    0
  • Pomocny post
    #5 15 Sie 2009 10:38
    BoskiDialer
    Poziom 34  

    nojmi napisał:
    Code:

    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.

    0
  • Pomocny post
    #6 15 Sie 2009 21:30
    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

    0
  • #7 15 Sie 2009 23:13
    nojmi
    Poziom 20  

    Dla mnie wszystko jasne i uruchomione. Wielkie dzięki:D

    0