Hello, Pedro,
Thursday, April 3, 2003, 10:19:28 PM you wrote:
PZN> On Thu, Mar 27, 2003 at 11:10:04AM -0500, D.Pageau wrote:
>> do
>> {
>> IFG1 &= ~OFIFG; // Clear OSCFault flag
>> for (i = 0xFF; i > 0; i--); // Time for flag to set
>> }
>> while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
PZN> Hi Pageau,
PZN> The optimizer will detect this as "useless" loop and remove it.
PZN> Instead of:
PZN> for (i = 0xFF; i > 0; i--);
PZN> try:
PZN> for (i = 0xFF; i > 0; i--) __asm__ __volatile__("; loop");
PZN> See also:
PZN> http://mspgcc.sourceforge.net/doc_appendixE.html
By the way, I have discovered that this is true only for "-O1"
optimisation. When I use such delay function:
#define DELAY(X) ({unsigned int _i = (X); \
do __asm__ __volatile__ ("; loop"); \
while(--_i);})
and if "-O2" option used, compiler all the same
remove the loop completely. :( If I try to use:
#define DELAY(X) ({unsigned int _i = (X); \
do __asm__ __volatile__ ("nop"); \
while(--_i);})
instead, the compiler generates so much "nop"
instructions how much is indicated by the counter value.
Regards,
Victor.