AVR-gcc i zmienna pod wybranym adresem

Jak umieścić zmienną lub tablicę pod wskazanym adresem w pamięci w gcc.

Używam bankowania pamięci i chcę zmusić kompilator aby jakieś dane umieścił w np. 8 banku, wybór banku ustawiam za pomocą specialnego rejestru.

Reply to
tomi
Loading thread data ...

Są dwie drogi: albo użyć wskaźnika na zmienną i po odpowiednim jego zainicjowaniu dostać się do zmiennej (w podobny sposób są używane rejestry I/O):

char *abc = (char *) 0x123;

*abc = 0;

albo - rozwiązanie lepsze - wcisnąć zmienną do niestandardowej sekcji (poczytaj w dokumentacji kompilatora o __attribute__) i w pliku dla linkera umieścić tą sekcję w żądanym miejscu pamięci. Pliku linkera nie musisz dostarczać jednak całego. Jeżeli korzystasz z domyślnego to wystarczy zdefiniować adres początku sekcji w opcjach wywołania linkera.

Reply to
Adam Dybkowski

tomi przemówił ludzkim głosem:

Możesz zdefionować sobie sekcje pod konkretnym adresem i umieszczać zmienne w odpowiednich sekcjach. Jeśli używasz standardowego makefile'a z winavr to w pliku makefile dodajesz:

LDFLAGS += -Wl,--section-start=.tab1=0x808000 \ -Wl,--section-start=.tab2=0x809000

A w źródełkach deklarujesz w jakiej sekcji ma być zmienna:

char Tab1[100] __attribute__ ((section(".tab1"))); char Tab2[100] __attribute__ ((section(".tab1")));

Żeby tyle nie klepać, to możesz sobie podefiniować odpowiednie makra

#define PAGE1 __attribute__ ((section(".tab1"))) #define PAGE2 __attribute__ ((section(".tab2")))

i deklarować zmienne tak:

PAGE1 char Tab3[100];

Wydaje mi się, że wystarczy zadeklarować sekcje pod adresami 0x81aaaa,

0x82aaaa, 0x83aaaa (aaaa - dwubajtowy adres bankowanej pamięci). Adres i tak zostanie obcięty do dwóch bajtów, więc wszystkie strony wylądują pod jednym i tym samym adresem. Będziesz musiał tylko pamiętać o ręcznym przełączaniu banków.
Reply to
Zbych

Poprawka, adres 0x810000 jest już zajęty przez sekcję eeprom, więc wypadałoby go ominąć.

Reply to
Zbych

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.