Thomas D. Dean wrote:
From 'info gcc',
...
You can prevent an `asm' instruction from being deleted, moved
significantly, or combined, by writing the keyword `volatile' after the
`asm'.
This only means that they are not reordered with respect to other
"volatile asm" statements. Note the "moved significantly" part: if the
other instruction is not "significant", then it might be moved over it.
Yes, I do agree that the outcome might be somewhat surprising, though.
Changing the code fragment to
...
dtostrf(cos_rad,6,3,&line4[14]);
line3[20] = ' ';
line4[20] = ' ';
asm volatile("sbi 0x1b,4" : :);
atan_rad = atan2(cos_rad,sin_rad);
asm volatile("cbi 0x1b,4" : :);
dtostrf(atan_rad,6,3,&line4[26]);
...
does not alter the result.
The PORTx accessors are already volatile, so this doesn't change much.
The main problem here is probably that the atan2 function is declared to
be __attribute__((const)), which gives teh compiler more leeway to move
it around...
--
Paulo Marques
Software Development Department - Grupo PIE, S.A.
Phone: +351 252 290600, Fax: +351 252 290601
Web: www.grupopie.com
"Power corrupts. Absolute power is kind of neat." John Lehman
_______________________________________________
AVR-GCC-list mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list