AVR-gcc i zmienna pod wybranym adresem

Nov 29, 2005 3 Replies

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.


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.

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.

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required