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.
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ąć.
Have something to add? Share your thoughts — no account required.
Ask the community — no account required