Jak zmusić AVR-GCC do umieszczenia tablicy charów na konkretnym adresie pamięci?
AVR-GCC - deklaracja zmiennych pod wskazanym adresem
From: "QmX" <kumex_at_nospam_interia.pl>
Subject: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Fri, 30 Jan 2004 07:55:00 +0100
Witam!
Mam pytanie natury "mikroprogramistycznej". :-)
Jak można zmusić kompilator GCC (WinAVR) np. do założenia tablicy "charów" w
pamięci, tak, aby rozpoczynała się od wskazanego adresu?
CodeVisionAVR ma do tego operator _at_nospam_ (np.: char tabl[1000] _at_nospam_0x2000),
ImageCraftAVR też ma jakąś dyrektywę (chyba "abs_address"), a ulubiony
ostatnio przeze mnie AVR-GCC nie posiada takiej możliwości?
Do '51 używam głównie Taskinga (bo mam go legalnie) i ten też posiada
dyrektywę "_at".
Czyżby "porządne" kompilatory nie posiadały takiej opcji? :-)
Proszę o pomoc, bo w dostępnych dokumentacjach AVR-GCC niczego na ten temat
nie znalazłem.
Pozdrawiam,
QmX.
========
Path: news-archive.icm.edu.pl!news.rmf.pl!news.ipartners.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mai
From: Artur Lipowski <LAL_at_nospam_pro.onet.pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Fri, 30 Jan 2004 09:11:19 +0100
QmX wrote:
Jak można zmusić kompilator GCC (WinAVR) np. do założenia tablicy "charów" w
pamięci, tak, aby rozpoczynała się od wskazanego adresu?
...
Jeżeli tego potrzebujesz do obsługi jakiegoś urządzenia (memory mapped
io) to można to zrobić z użycien standardowego C:
volatile char* tabl = (volatile char*)0x2000;
i dalej normalnie używasz tabl jako zwykłej tablicy C.
Jeżeli chcesz wykorzystać zewnętrzną pamięć RAM to jest to opisane w
avr-libc FAQ.
Jezeli robisz bootloader to zainteresuj się atrybutem o nazwie section.
Chodzi o _attribute_ (( attribute-list ))
A jeżeli masz tylko taki i kaprys, żeby mieszać kompilatorowi w pamięci
8-) to nie pomogę, bo nie bardzo widzę w tym sens (przynajmniej na razie).
Pozdrawiam,
--
Artur Lipowski
========
Path: news-archive.icm.edu.pl!news.rmf.pl!poznan.rmf.pl!news.man.poznan.pl!news.task.gda.pl!not-for-mai
From: "QmX" <kumex_at_nospam_interia.pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Fri, 30 Jan 2004 10:42:16 +0100
Użytkownik "Artur Lipowski" <LAL_at_nospam_pro.onet.pl> napisał w wiadomości
news:bvd3j5$r9d$1_at_nospam_news.onet.pl...
Jeżeli tego potrzebujesz do obsługi jakiegoś urządzenia (memory mapped
io) to można to zrobić z użycien standardowego C:
volatile char* tabl = (volatile char*)0x2000;
i dalej normalnie używasz tabl jako zwykłej tablicy C.
No jasne! Że też na to nie wpadłem! :-)
Tyle, że kompilator nie będzie znał rozmiaru tablicy, ale to już pójdzie
programowo.
Ale i tak jestem niepocieszony brakiem dyrektywy "_at" :-(, do której się
już przywiązałem.
Jeżeli chcesz wykorzystać zewnętrzną pamięć RAM to jest to opisane w
avr-libc FAQ.
Z tego opisu wynika, że powinienem skorzystać z mechanizmów dynamicznego
przydziału pamięci, ale w tym przypadku raczej nie ma takiej potrzeby.
Jezeli robisz bootloader to zainteresuj się atrybutem o nazwie section.
Chodzi o _attribute_ (( attribute-list ))
Nie robię bootloadera, ale ethernetowy dekoder MP3.
Obecnie do testów używam ATmega162. W jego zewnętrznej przestrzeni
adresowej jest umieszczona 8-kilowa SRAM (tam będzie FIFO), ale oprócz niej
są jeszcze obszary do komunikacji z modułem Ethernetowym i 8-bitowy
równoległy port dekodera MP3.
Wszystko tak przemiksowane w adresach, że głowa boli (są nawet obszary
zachodzące na siebie, gdzie mam konflikty). Dostałem to jako gotowy układ
bez
oprogramowania zrobiony w oparciu o '51, która okazała się za wolna, więc
tymczasowo zastąpiłem ją megą 162, żeby zrobić próby na tym co mam. Później
przeprojektuję to cudo na megę128.
A jeżeli masz tylko taki i kaprys, żeby mieszać kompilatorowi w pamięci
8-) to nie pomogę, bo nie bardzo widzę w tym sens (przynajmniej na razie).
I masz rację, to jest chyba tylko kaprys, bo byłoby "fajniej", ale sposób
podany przez Ciebie wyżej chyba będzie OK.
Wielkie dzięki!!!
QmX.
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai
From: Artur Lipowski <LAL_at_nospam_pro.onet.pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Fri, 30 Jan 2004 10:56:06 +0100
QmX wrote:
...
Tyle, że kompilator nie będzie znał rozmiaru tablicy, ale to już pójdzie
programowo.
Z tego "znania" rozmiaru tablicy i tak raczej niewielki pożytek (niestety).
Oczywiście zdajesz sobie sprawę, że nikt nie każe Ci używać całej
dodatkowej pamięci jako tablicy znakowej. Ta sama metoda może (powinna)
być użyta do przechowywania tam innych typów, a w tym struktur, które są
nieocenione przy dostępie do pamięci urządzeń (MMIO).
...
Wielkie dzięki!!!
Proszę bardzo.
Pozdrawiam,
--
Artur Lipowski
========
Path: news-archive.icm.edu.pl!news.rmf.pl!news.ipartners.pl!news.nask.pl!news.man.poznan.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: JS <jar0sz_at_nospam_polbox.com.pl_without_pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Fri, 30 Jan 2004 17:42:33 +0000 (UTC)
W artykule <bvcv45$t4e$1_at_nospam_korweta.task.gda.pl>
autorem którego mieni się QmX, napisano:
Witam!
Mam pytanie natury "mikroprogramistycznej". :-)
Jak można zmusić kompilator GCC (WinAVR) np. do założenia tablicy "charów" w
pamięci, tak, aby rozpoczynała się od wskazanego adresu?
Pierwsza możliwość
(doc/gnu/gcc/Variable-Attributes.html#Variable%20Attributes):
struct duart a _attribute_ ((section ("DUART_A"))) = { 0 };
W skrypcie linkera trzeba zdefiniować sekcję j.w. pod właściwym adresem.
Druga możliwość - w kodzie zadeklarować zmienną, np.
extern char lcd[1024];
i nie podawać definicji. W skrypcie linkera umieścić przypisanie
lcd = 0x4000;
Uwaga - trzeba zadbać, by linker miał informację o tym, że zajmujemy
kawałek pamięci (parametery sekcji), bo inaczej może tam coś ulokować.
Jest jeszcze prostsza metoda:
char *lcd = (char*) 0x4000;
lcd[7] = 0x77; /* Dostęp */
Uwaga jak wyżej.
Pozdrawiam
Jarosław Szynal
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsgate.onet.pl!newsgate.p
From: zielpro_at_nospam_poczta.onet.pl (ziel)
Subject: RE: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: 30 Jan 2004 21:35:13 +0100
On Behalf Of JS
Pierwsza możliwość
Druga możliwość - w kodzie zadeklarować zmienną, np.
Jest jeszcze prostsza metoda:
Niby w BASCOM nie ma takich problemów, ale...
jak się dzieli long przez word to wynik wychodzi long.
Niby logiczne, tylko czemu wynik zapisany w word daje
bzdurne liczby?
Pierwsza, druga i prostsza metoda : zapisywać wynik w long.
Nie pisałem o tej przypadłośći autorowi, ale tak ku przestrodze,
żeby inni nie marnowali dwóch dni.
Przy okazji - nie mam czasu na sprawdanie dlaczego wychodzi
bzdura jeśli 125000 dzielę przez 1000. Musi jaki robal tam siedzi.
pzdr
Artur
PS
W sumie w każdym programie należy się _zastanowić_jak_zmniejszyć
wielkość zmiennych. Zawsze to kawałek RAM zostaje, a i kod jest mniejszy.
--
Archiwum grupy: http://niusy.onet.pl/pl.misc.elektronika
========
Path: news-archive.icm.edu.pl!news.rmf.pl!news.ipartners.pl!news.task.gda.pl!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Mon, 2 Feb 2004 08:24:38 +0100
Niby w BASCOM nie ma takich problemów, ale...
jak się dzieli long przez word to wynik wychodzi long.
Niby logiczne, tylko czemu wynik zapisany w word daje
bzdurne liczby?
No właśnie i tu jest przewaga C nad Bascomem.
W C takie sytuacje nie wystąpią jeżeli programista ma trochę oleju w głowie.
Natomiast w Bascomie? nie wiem.
Mister
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Janusz_k" <Janusz_kspam_at_nospam_go2.pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Mon, 2 Feb 2004 14:39:01 +0000 (UTC)
"Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl> napisal(a):
Niby w BASCOM nie ma takich problemów, ale...
jak sie dzieli long przez word to wynik wychodzi long.
Niby logiczne, tylko czemu wynik zapisany w word daje
bzdurne liczby?
No wlaśnie i tu jest przewaga C nad Bascomem.
W C takie sytuacje nie wystąpią jezeli programista ma troche oleju w
glowie. Natomiast w Bascomie? nie wiem.
He he he nie bylbym taki pewien, rzutowanie typów niezle miesza w wynikach
w C.
Pozdr
Janusz
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Mon, 2 Feb 2004 15:53:02 +0100
He he he nie bylbym taki pewien, rzutowanie typów niezle miesza w wynikach
w C.
Jeżeli wiesz co robisz to w czym problem ? Co się może namieszać?
Mister
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsgate.onet.pl!newsgate.p
From: zielpro_at_nospam_poczta.onet.pl (ziel)
Subject: RE: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: 3 Feb 2004 01:48:37 +0100
On Behalf Of Mister
Jeżeli wiesz co robisz to w czym problem ? Co się może namieszać?
A co, jeśli się wie, a i tak można namieszać?
Jak właśnie zauważyłem niejawne konwersje dotarły do bascom'a.
A namieszać się może bardzo dużo, w zależności od kompilatora.
Np. w bascom.
Użycie zmiennej single do wykresów bruździ. Użycie tej samej wartości
po przypisaniu jej do zmiennej word powoduje, że wykres jet prawidłowy.
Ale word= single (123) * word (2) daje bzdurę.
Musi być singel= single*single i w następnym wierszu word = single.
W C jest podobnie, niby konwersje typów są prawidłowe, ale czasami,
zdarzają się sytuacje wyjątkowe. Przypuszczam, że to jest świadome
działanie autora, który musiał wybrać pomiędzy uniwersalnością, a
długością kodu.
W sumie - zawsze wszystko trzeba sprawdzać trzy razy ;-)
pzdr
Artur
--
Archiwum grupy: http://niusy.onet.pl/pl.misc.elektronika
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Piotr Wyderski" <piotr.wyderskiREMOVE_at_nospam_wp.pl>
Subject: Re: AVR-GCC - deklaracja zmiennych pod wskazanym adresem
Date: Mon, 2 Feb 2004 12:38:39 +0100
JS wrote:
Druga możliwość - w kodzie zadeklarować zmienną, np.
extern char lcd[1024];
i nie podawać definicji. W skrypcie linkera umieścić przypisanie
lcd = 0x4000;
Uwaga - trzeba zadbać, by linker miał informację o tym, że zajmujemy
Rowniez zalecam zapoznanie sie z dokumentacja skryptow
linkera, przy odrobinie wprawy mozna w ten sposob zrobic
z ukladem pamieci bajeczne rzeczy. Tylko w takich przypadkach
zamiast extern lepiej uzyc extern "C" albo _attribute_(( _alias_)),
bo kompilator moze robic nieprzyjemne z punktu widzenia czlowieka
rzeczy podczas "manglowania" nazw.
Pozdrawiam
Piotr Wyderski
========
Path: news-archive.icm.edu.pl!news.rmf.pl!wroclaw.rmf.pl!poznan.rmf.pl!news.man.poznan.pl!newsfeed.tpinternet.pl!news.mcnet.pl!news.nask.pl!news.cyf-kr.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsgate.onet.pl!newsgate.p