Jak umieścić zmienną lub tablicę w 8. banku pamięci z użyciem AVR-gcc?

AVR-gcc i zmienna pod wybranym adresem





Poprzedni Następny
Wiadomość
Spis treści
From: tomi <tomj7-usun-spam_at_nospam_gazeta.pl>
Subject: AVR-gcc i zmienna pod wybranym adresem
Date: Tue, 29 Nov 2005 22:29:29 +0100


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.

Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: AVR-gcc i zmienna pod wybranym adresem
Date: Tue, 29 Nov 2005 22:59:18 +0100


tomi wrote:

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

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.

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

Poprzedni Następny
Wiadomość
Spis treści
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: AVR-gcc i zmienna pod wybranym adresem
Date: Tue, 29 Nov 2005 23:03:52 +0100


tomi przemówił ludzkim głosem:
Jak umieścić zmienną lub tablicę pod wskazanym adresem w pamięci w gcc.

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];

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.

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.

Poprzedni Następny
Wiadomość
Spis treści
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: AVR-gcc i zmienna pod wybranym adresem
Date: Tue, 29 Nov 2005 23:10:37 +0100



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

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