Hi

I have the following code segment whose purpose is to toggle an LED every time 
the 
watchdog timer interrupt occurs:

interrupt(WDT_VECTOR) WatchdogHandler(void)
{
  static char st = 0;

  IFG1 &= ~WDTIFG;

  if (st)
  {
    LED1_ON();
  }
  else
  {
    LED1_OFF();
  }

  st = !st;

  IE1 = (IE1 | WDTIE);
}

The problem I am seeing is that the static 'st' variable is not being inverted 
correctly. 
The assembler code produced with -01 is:

  71:watchdog.c    ****         st = !st;
 140                            .stabn 68,0,71,.LM11-WatchdogHandler
 141                    .LM11:
 142 0028 5C42 0000             mov.b   &st.0, r12
 143 002c 4C93                  tst.b   r12
 144 002e 0234                  jge     .Leaq33
 145 0030 7CE3                  inv.b   r12
 146 0032 5C53                  inc.b   r12
 147                    .Leaq33:
 148 0034 7C53                  add.b   #llo(-1), r12
 149 0036 4C11                  rra.b   r12
 150 0038 4C43                  clr.b   r12
 151 003a 4C10                  rrc.b   r12
 152 003c C24C 0000             mov.b   r12, &st.0
 
If I watch the memory location where 'st' is stored (it is 0x200 on my app, I 
checked by 
disassembling the output ELF file) I can see that it gets inverted correctly 
from 0x00 to 
0x80 the first time around the loop but then is always left at 0x80 and never 
inverted 
again to 0x00. If I write the above explicitly ie.
  if (st)
    st = 0;
  else
    st = 1 (or 0x80, whatever as long as it isn't 0x00)
my handler behaves as expected ie. the LED is toggled.

If I build the same code with -O0 (optimisations off) I get this:
 149                            .stabn 68,0,71,.LM11-WatchdogHandler
 150                    .LM11:
 151 0036 C143 0200             mov.b   #llo(0), 2(r1)
 152 003a C293 0000             tst.b   &st.0
 153 003e 0220                  jne     .L5
 154 0040 D143 0200             mov.b   #llo(1), 2(r1)
 155                    .L5:
 156 0044 D241 0200             mov.b   2(r1), &st.0
which is a lot more compact and works correctly !

I am using a MSP430F149 and a fairly (a week or two old) build of the 
MSP430GCC. 
Any comments ? What command line options do people typically use with 
msp430-gcc 
ie. in terms of optimisations, etc. I guess for now I will use -O0

Regards.

Colin

---------------------------------------------------------------------------------
Colin Domoney                                  
Digital Hardware Design Engineer
NCipher, Jupiter House, Station Road, Cambridge, CB1 2JD
e-mail: [email protected]
Telephone: +44-1223-723630

Reply via email to