[AVRgcc] Jak Wymusic umieszczenie zmiennej w rejestrach

Nov 12, 2008 10 Replies

Witam. Jak wymusiæ na kompilatorze aby umie¶ci³ zmienn± typu unsigned int w rejestrach? Dok³adnie: Zmienna typu unsigned int ma by¶ wspoldzielona pomiedzy dwoma przerwaniami ISR (od timera0 i od przerwania zew INT0). W programie g³ownym nie jest ta zmienna nigdzie u¿ywana, tylko w w/w przerwaniach.



Czy mo¿na wymusiæ na kompilatorze aby umiescil ja w rejestrach? deklaracja przed funkcj± main: register unsigned int x; konczy sie bledem.



Witam,

Dnia 12.11.08 (środa), 'roxy' napisał(a):

np. volatile register unsigned char zmienna asm("r30");

U¿ytkownik "Dykus" snipped-for-privacy@spam.wp.pl> napisa³ w wiadomo¶ci news:17s8bdb04823m$.r7ucnxszzxvk$. snipped-for-privacy@40tude.net...

Ale mi jest potrzebny int a nie char

Witam,

Dnia 12.11.08 (środa), 'roxy' napisał(a):

volatile register unsigned int zmienna asm("r30");

Teraz lepiej?

In the darkest hour on Wed, 12 Nov 2008 20:47:16 +0100, Dykus snipped-for-privacy@spam.wp.pl> screamed:

To tak jakby zapisać: unsigned char zmienna = 65000; Rozmiar się nie zgodzi. Trzebaby zrobić cztery takie deklaracje i zmienną czytać nie z nich, a z komórek pamięci, w ktorych się znajdują. Dało się tak zrobić w '51. Czy da się w AVR - nie miałem nigdy takiej potrzeby i nie sprawdzałem.

Użytkownik Artur M. Piwko napisał:

Czemu nagle z int ma się zrobić char ? Będzie to wyglądało normalnie jako unsigned int zmienna = 65000; Kompilator załaduje wartość początkową do rejestrów R30:R31

Pozdrawiam Grzegorz

Witam,

Dnia 12.11.08 (środa), 'Artur M. Piwko' napisał(a):

A ja miałem - kompilator oprócz R30 zabierze sobie także kolejny rejestr, w tym wypadku R31 i będzie korzystał z obu dla przechowania zmiennej typu unsigned int. Niewykluczone, że istnieje jakiś inny zapis. Dokumentacja do AVR-GCC istnieje, tylko czytać... :)

Ok. Dziekuje za pomoc i prosze o jescze :-).

A jakich rejestrow moge bezpiecznie uzywaæ? Potrzebuje dwie zmienne typu int czyli czterech rejestrow.

Czy zawsze musze je odkladac na stos przed wejsciem w funkcje obsl. przewan jezeli nigdy nie bede ich uzywal w funkcji main? Czy mam pewnosc ze kompilator nie uzyje tych rejestrow do wlasnych obliczen celow?

roxy pisze:

Co do rejestrów, to napiszę Ci tak:

- rejestry R0 do R15 są ogólnego przeznaczenia, ale procek nie potrafi robić na nich operacji ZE STAŁĄ!! Czyli nie może wprost załadować stałej, musi przez inny rejestr, nie może porównać ze stałą, dodać ani odjąć itp..

- rejestry R16 - R31 są rejestrami ogólnego przeznaczenia bez w/w ograniczeń

Ale:

- rejestry R0 oraz R1 są w niektórych procach wykorzystywane jako ustalone "na sztywno" operandy - więc raczej nie należy ich używać, bo kompilator być może będzie MUSIAŁ ich użyć.

- rejestry R26 i R27 tworzą rejestr X, R28:R29 = Y, a R30:R31 = Z. Wszystkie służą do adresowania pamięci (operacje na tablicach itp.) i mogą być stosowane zamiennie, ale rejestr Z jako JEDYNY może adresować pamięć programu!! Więc jego bym nie używał ;)...

To tak z punktu widzenia architektury ;)...

Pozdrawiam Konop

U¿ytkownik "roxy" snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news:gfffrb$hke$ snipped-for-privacy@news.onet.pl...

Fragment dokumentacji z

formatting link
który powinien rozwiac wszystkie w±tpliwo¶ci

How to permanently bind a variable to a register? This can be done with

register unsigned char counter asm("r3");

Typically, it should be safe to use r2 through r7 that way.

Registers r8 through r15 can be used for argument passing by the compiler in case many or long arguments are being passed to callees. If this is not the case throughout the entire application, these registers could be used for register variables as well.

Extreme care should be taken that the entire application is compiled with a consistent set of register-allocated variables, including possibly used library functions.

Cztery zmienne int to 8 rejestrow. Zapomnij. Co ci szkodzi trzymac to w pamieci?

Jesli nie beda wykorzystywane do niczego poza przerwaniami to nie. Ale piszac obsluge przerwania w C nie masz zadnej kontroli nad tym co jest odkladane na stosie. Kompilator robi to automatycznie na podstawie tego jakie rejestry sa uzywane w procedurze obslugi przerwania. Nawet nie jestem pewien czy jest na tyle bystry, ze nie odlozy tych twoich specjalnych rejestrow na stosie rowniez. A jak zaczniesz sie bawic w naked to rownie dobrze mozesz cala procedure napisac w asemblerze. A wlasciwie to nawet musisz.

Nie, szczegolnie jesli wykorzystujesz prekompilowane biblioteki. Musialbys je rekompilowac z globalnie zarejestrowanym wykorzystanym przez ciebie rejestrem. Napisz moze co takiego tworzysz, pewnie da sie to zrobic prosciej i bez nadmiernych kombinacji.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required