RTV forum PL | NewsGroups PL

Jak wymusić umieszczenie zmiennej unsigned int w rejestrach w AVR GCC?

[AVRgcc] Jak Wymusic umieszczenie zmiennej w rejestrach

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wymusić umieszczenie zmiennej unsigned int w rejestrach w AVR GCC?

roxy
Guest

Wed Nov 12, 2008 7:41 pm   



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.

Dykus
Guest

Wed Nov 12, 2008 8:11 pm   



Witam,

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

Quote:
Czy można wymusić na kompilatorze aby umiescil ja w rejestrach?

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


--
Pozdrawiam,
Dykus.

roxy
Guest

Wed Nov 12, 2008 8:23 pm   



Użytkownik "Dykus" <dykus.grupy@spam.wp.pl> napisał w wiadomości
news:17s8bdb04823m$.r7ucnxszzxvk$.dlg@40tude.net...
Quote:
Witam,

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

Czy można wymusić na kompilatorze aby umiescil ja w rejestrach?

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


--
Pozdrawiam,
Dykus.

Ale mi jest potrzebny int a nie char

Dykus
Guest

Wed Nov 12, 2008 8:47 pm   



Witam,

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

Quote:
Ale mi jest potrzebny int a nie char

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

Teraz lepiej?


--
Pozdrawiam,
Dykus.

Grzegorz Kurczyk
Guest

Wed Nov 12, 2008 9:39 pm   



Użytkownik Artur M. Piwko napisał:
Quote:
In the darkest hour on Wed, 12 Nov 2008 20:47:16 +0100,
Dykus <dykus.grupy@spam.wp.pl> screamed:
Ale mi jest potrzebny int a nie char
volatile register unsigned int zmienna asm("r30");

Teraz lepiej?


To tak jakby zapisać: unsigned char zmienna = 65000;

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

Dykus
Guest

Wed Nov 12, 2008 9:42 pm   



Witam,

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

Quote:
To tak jakby zapisać: unsigned char zmienna = 65000;
Czy da się w AVR - nie miałem nigdy takiej potrzeby i nie sprawdzałem.

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ć... :)


--
Pozdrawiam,
Dykus.

Artur M. Piwko
Guest

Wed Nov 12, 2008 9:46 pm   



In the darkest hour on Wed, 12 Nov 2008 20:47:16 +0100,
Dykus <dykus.grupy@spam.wp.pl> screamed:
Quote:
Ale mi jest potrzebny int a nie char

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

Teraz lepiej?


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.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:226B ]
[ 20:55:14 user up 11889 days, 8:50, 1 user, load average: 0.24, 0.18, 0.99 ]

Forgive your enemies, but don't forget their names.

roxy
Guest

Wed Nov 12, 2008 9:54 pm   



Ok. Dziekuje za pomoc i prosze o jescze Smile.

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?

Konop
Guest

Wed Nov 12, 2008 10:05 pm   



roxy pisze:
Quote:
Ok. Dziekuje za pomoc i prosze o jescze Smile.

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?


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ł Wink...

To tak z punktu widzenia architektury Wink...

Pozdrawiam
Konop

Robert Zemła
Guest

Wed Nov 12, 2008 10:53 pm   



Użytkownik "roxy" <kicak@o2.pl> napisał w wiadomości
news:gfffrb$hke$1@news.onet.pl...
Quote:
Ok. Dziekuje za pomoc i prosze o jescze Smile.

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?


Fragment dokumentacji z
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_regbind 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.

T.M.F.
Guest

Wed Nov 12, 2008 11:03 pm   



roxy wrote:
Quote:
Ok. Dziekuje za pomoc i prosze o jescze Smile.

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

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

Quote:
Czy zawsze musze je odkladac na stos przed wejsciem w funkcje obsl. przewan
jezeli nigdy nie bede ich uzywal w funkcji main?

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.

Quote:
Czy mam pewnosc ze kompilator nie uzyje tych rejestrow do wlasnych obliczen
celow?

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.


--
Inteligentny dom - http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wymusić umieszczenie zmiennej unsigned int w rejestrach w AVR GCC?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map