This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

help! why?

my codes:

unsigned int i=0;
void Timer(void) interrupt 1
    {
    i++;
    }

void Main (void)
    {
    while (1) printf ("i=%d\n", i);

    }

I had thought that I will get below on serial window

"
i=0;
i=1;
i=2;
i=3;
...
"


but I got

"
i=0
i=-9472
i=-28416
i=29184
i=10240
i=-8960
i=-27904
i=29696
i=10752
i=-8192
i=-27392
i=30464
i=11264
i=-7680
......
"


these values are disorderly and unsystematic, why? You had better try it on your own keilc.

Parents Reply Children
  • when using an int in an ISR and main you will ocasionally get false readings

    This is true because an int is a 16-bit value which takes 2 bytes. On the 8051, everything is handled as a byte. So, 2 reads are required to get the value of an int.

    What Erik is saying is that IF an interrupt happens between the 2 instructions that read the int you may actually get the MSB before the interrupt and the LSB after the interrupt. IF the interrupt causes the int to overflow (0x02FF ->0x0300) the value you get will either be 0x0200 or 0x03FF depending on the order in which the bytes are read.

    The following demonstrates how to disable interrupts, read the value, and re-enable interrupts:

    while (1)
      {
      int i_copy;
    
      EA = 0; i_copy = i; EA = 1;
      printf ("i=%d\n", i_copy);
      }


    Jon

  • To be completely correct, you should also declare i as "volatile", as it might be updated by something (the ISR) without the knowledge of the code generator / optimizer. The volatile declaration will force the compiler to actually read i, rather than using a previous and possibly stale value.