AVR GCC dedós kérdés

 ( Uhum2004 | 2009. június 3., szerda - 13:47 )

Sziasztok,
tudom, hogy láma kérdés, de talán más is volt kezdő...
Soros port adóbufferének kiürülését figyelném, közben van egy kis saját változó adminisztráció is, ezért inkább hívogatom az alábbit:

void WaitForTxReady (void)

{
loop_until_bit_is_set(UCSRA,UDRE);
// egyéb saját kód
}

A compiler kioptimalizálja a hívásokat, mert a bitfigyelés nem volatile. Már próbálgattam egy csomó verziót, mit és hogyan tegyek volatile-lá, a regisztert, a bitet vagy mit? Mindig kioptimalizálja a fordító. A Google találatok közül két oldalnyit megnéztem, de senkinél sem volatile, mert nem ilyen nyúlfarknyi hívásba van ágyazva a bitfigyelés. Ott az összetettebb kód miatt nincs kioptimalizálási ingere.
Mi a helyes szintaktika, hogy végre beforduljon?
Köszi előre is,
István

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

-O0 erre a fajlra?
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Szerintem nem a volatile a megoldas. Volatile -nek akkor kell megadni, ha interrupt rutinon belul hasznalod a valtozot, es meg kell tartsa az erteket ket megszakitaskeres kozott. Erre azert van szukseg, mert a fordito ugy latja, hogy az interrupt rutin sosem fog meghivasra kerulni (hiszen nincs a kodban explicit meghivva az interrupt rutin).

Szerintem az optimalizaciot ugy ahogy van kapcsold ki, mert jol labon tudod loni magad vele.

Biztos egyebkent, hogy az a gond, hogy kioptimalizalodik valami? Mellesleg lecserelhetned egy while-ra a loopot, ahol feltetelnek az UCSRA regisztert maszkolod egy hexa ertekkel, majd az egeszet negalod.
Valahogy igy:

void USART_TX(unsigned char data)
{
while (!(UCSRA&(1 << UDRE)))
{
// var var var var
}
UDR = data;
}