AVR GCC dedós kérdés

Fórumok

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ások

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