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
- 1673 megtekintés
Hozzászólások
-O0 erre a fajlra?
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
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;
}
- A hozzászóláshoz be kell jelentkezni