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][AVR-GCC] Tablica pod wskazanym adr. w pamięci programu

Aro_ 23 Lut 2011 11:32 3940 18
REKLAMA
  • #1 9191207
    Aro_
    Poziom 15  
    Witam,
    Jak zmusić linker aby zadeklarował tablicę wartości pod określonym adresem w pamięci programu?
    Jak ustawię __attribute__ ((section (" .tab"))) gdzie .tab to sekcja w pamięci flash, to pluje się że ares wykracza poza obszar pamięci SRAM. Zapisanie tablicy jako prog_uint8_t też nic nie daje :cry:
  • REKLAMA
  • Pomocny post
    #3 9191755
    tmf
    VIP Zasłużony dla elektroda
    PROGMEM tu nic nie da, bo dla linkera ten atrybut już nie istnieje, dla niego jest adres z odpowiednim prefixem określającym lokalizację. Po określeniu sekcji należy jej adres początkowy przekazać poprzez parametr -Wl,--section-start=, lub po prostu zdefiniować nową sekcję w AVR Studio.
    Napisz co się pluje, że adres wykracza poza SRAM i jak dokładnie wygląda ten komunikat. Bo ani gcc, ani linker nie powinny na to narzekać, bo przecież nie wiedzą jak wygląda mapa pamięci procesora. To określa skrypt linkera i parametr section-start.
  • #4 9191992
    mirekk36
    Poziom 42  
    A mogę tylko tak z ciekawości zapytać po co ci umieszczanie tablicy pod konkretnym adresem w pamięci programu ?

    Może dałoby się inaczej obejść ten problem gdyby wiadomo było o co chodzi.
  • REKLAMA
  • #5 9193010
    Aro_
    Poziom 15  
    Oj, trochę źle przeczytałem komunikat, był wpis, że nadpisuję pamięć programu. Zaraz też szybko doszedłem, że w nocie katalogowej był podany adres word a nie byte i zamiast zaadresować 0x7000 miałem 0x3800. Stąd ten komunikat. Teraz już wszystko działa. Dzięki za pomoc:)
    mirekk36, zależy mi na szybkości wykonywania programu generującego szum różowy, który skacze po tablicy 256 bajtów. Jak ustawię tablicę pod adresem xxx00, to będę wykonywał działanie tylko na jednym rejestrze adresowym. Jeszcze lepiej byłoby umieścić tablicę w pamięci ram, ale trochę mi jej szkoda.
  • #6 9223966
    Aro_
    Poziom 15  
    Pojawił się nowy problem... Sekcje w pamięci programu działają bez problemu, natomiast jest kłopot ze zmiennymi w pamięci ram. Na zwykłe AVR to wystarczyło dodać adres 0x800000 i działało. Na Xmega jednak nie chce:/ Kompiluje się ładnie, ale przy próbie zaprogramowania:
    avrdude: ERROR: address 0x802010 out of range at line 1204 of SMC.hex

    Przy innych wartościach jest to samo. Kompilacja wygląda tak:
    Linking: SMC.elf
    avr-gcc -mmcu=atxmega32a4 -I. -gdwarf-2 -DF_CPU=32000000UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MD -MP -MF .dep/SMC.elf.d main.o clksys_driver.o DAC.o Keyboard.o graphic.o lcd132x64.o Generator.o Analizator.o Oscyloskop.o ADC.o Wobuloskop.o Ustawienia.o --output SMC.elf -Wl,-section-start=.ramtab=802000
    Creating load file for Flash: SMC.hex
    avr-objcopy -O ihex -R .eeprom SMC.elf SMC.hex
    Creating load file for EEPROM: SMC.eep
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
    	--change-section-lma .eeprom=0 -O ihex SMC.elf SMC.eep
    Creating Extended Listing: SMC.lss
    avr-objdump -h -S SMC.elf > SMC.lss
    avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 never used
    Creating Symbol Table: SMC.sym
    avr-nm -n SMC.elf > SMC.sym
    Size after:
    SMC.elf  :
    section            size      addr
    .ramtab            1024   8396800
    .text             18932         0
    .data                28   8396800
    .tab                256   8396828
    .bss               2331   8397084
    .stab              1764         0
    .stabstr             84         0
    .debug_aranges      384         0
    .debug_pubnames    1514         0
    .debug_info       33188         0
    .debug_abbrev      5230         0
    .debug_line       12285         0
    .debug_frame       1152         0
    .debug_str         4820         0
    .debug_loc         6655         0
    .debug_ranges       296         0
    Total             89943
    -------- end --------
    
    Nie mam już pomysłu.
  • REKLAMA
  • #7 9224781
    kubus_puchatek
    Poziom 18  
    Do tematu dodam pytanie.
    jak ładnie wskazać linkerowi z poziomu programu gdzie ma wylądować konkretny blok w pamięci programu...........?
    bo używane przez ciebie rozwiązanie wymaga wymuszenie wpisu w makefile. Wolałbym aby to wszystko znalazło się samoistnie bez konieczności wychodzenia poza kod....
    patrzyłem jak to jest robione z wektorami tym nie mniej nie udało mi się z niewiadomych powodów umieścić kodu w sposób podobny jak to się dzieje z wektorem przerwania.
  • #8 9224949
    tadzik85
    Poziom 38  
    To zdaje się jedyny sposób. Ale umieścić możesz tak tylko dane poza wykorzystanym obszarem.
  • #9 9226046
    Aro_
    Poziom 15  
    Sukces! Umieściłem tablice w sekcji .data i znajdują się teraz na początku pamięci ram. Dodatkowo nie są nadpisywane przez inne zmienne.
  • #10 9226060
    tadzik85
    Poziom 38  
    To powiedz co zrobiłes?
  • #11 9227732
    Aro_
    Poziom 15  
    No to napisałem:) Po prostu wstawiłem __attribute__ ((section (" .data"))). To wszystko. Nie tworzyłem żadnych dodatkowych sekcji.
  • #12 9228022
    tadzik85
    Poziom 38  
    więc tak naprawdę niczego nie zrobiłeś a inker sam wstawił ta tablicę w tym miejscu
  • REKLAMA
  • #13 9228126
    Aro_
    Poziom 15  
    Hmm, no nie do końca, bo bez podania tego atrybutu, adres tablicy już nie zaczyna się na początku pamięci ram.
  • #14 9228169
    tadzik85
    Poziom 38  
    bo pewnie to tablica nieinicjowana i lądowała w .bss
  • #15 9228174
    Aro_
    Poziom 15  
    Tak, zgadza się.
  • #16 9228221
    tadzik85
    Poziom 38  
    więc każda zmienna inicjowana może wskoczyć ci przed twoją tablicę. ale skoro nie przeszkadza ci to ze tablica jest na początku. przesuń sekcje data o rozmiar tablicy w górę. stwórz sekcję od adresu byłej sekcji dana i umieść tam tablicę, tu będziesz miał pełna gwarancje ze inne zmienne ci nie namieszają.
  • #17 9228284
    Aro_
    Poziom 15  
    W zasadzie jest to bezpieczniejsze rozwiązanie, tylko wymaga większej ingerencji w pliki linkera.
    Myślę jednak, że jak pierwszym zadeklarowanym elementem będzie ta tablica, to zostanie umieszczona na początku przestrzeni adresowej. Linker nie może "żonglować" zmiennymi i posłusznie umieści zmienne w kolejności deklarowania. Ważne jest tylko dopilnowanie, aby deklaracja tej tablicy była w pliku, który jest linkowany jako pierwszy.
  • Pomocny post
    #18 9228295
    tadzik85
    Poziom 38  
    Żonglować może ale robi to rzadko bo nie jest to konieczne. Ale dobrze jest się zabezpieczyć.
  • Pomocny post
    #19 9230008
    tmf
    VIP Zasłużony dla elektroda
    Linker nie tylko może żonglować zmiennymi, ale wręcz musi to robić. Dopiero na etapie linkowania zmienna uzyskuje konkretny adres, wcześniej to tylko symbol. Twoje rozwiązane jest ryzykowne, ryzyko to jest zależne od tego jak jest skonstruowany makefile.
    tadzik85 słusznie pisze, żeby przeusnąć data. Nie trrzeba w tym celu ingerować w skrypty linkera, można ją przesunąć tak jak to już pokazałem na początku wątku.
REKLAMA