在微控制器的C代码中增加int只会移动LSB

时间:2015-06-15 15:22:39

标签: c microcontroller 8051

我想知道是否有人可以帮我解决我在Silicon Labs C8051F040上遇到的一个奇怪问题。

问题在于我使用unsigned int变量作为计数器,这意味着我自然需要执行variable++之类的操作。

好吧,我的问题是,当在嵌入式内存中分配变量时,增量就可以了

但是当它被分配到外部存储器(不是真正的外部存储器,但没有嵌入到存储器中)时,LSB增加正常,但MSB始终处于FF状态,直到发生溢出,将其设置为00并且在新的增量,它再次变为FF,直到LSB的新溢出。

我只用main()做了variable++作为指令,同样的问题就发生了。

我试图沿着外部存储器的不同部分移动变量,同样的事情也发生了。我读了编译器生成的ASM代码,说明看起来还不错。

我真的不知道该如何处理...我还“玩”了堆栈和堆内存的数量而没有运气......

__xdata int variable;

void main()
{
  variable = 0;
  while (1)
  {
    variable++;
  }
}

我可以在调试器中看到变量以0x0000开头,在第一次迭代后,值达到0xFF01,然后是0xFF02,0xFF03等,直到0xFFFF,当下一次迭代将值设置为0x0000然后启动再次使用0xFF01。

如果在__xdata内存中声明变量的instate我使用__data内存,则没有问题。我现在无法复制ASM代码,因为我不在实验室,但我必须说这是正确的,我很确定。

我认为我遇到了与内存分配有关的内存问题,可能是吗?

由于

1 个答案:

答案 0 :(得分:0)

我试图用Keil C51复制你的问题,我没有看到你的问题也不足为奇。

我怀疑你错误地使用了调试器,可能是看错了地址还是用错误的类型解释?

您可以比较,这是Keil编译器生成的ASM列表。

     6: void main() 
     7: { 
     8:   variable = 0; 
C:0x0800    E4       CLR      A
C:0x0801    900000   MOV      DPTR,#C_STARTUP(0x0000)
C:0x0804    F0       MOVX     @DPTR,A
C:0x0805    A3       INC      DPTR
C:0x0806    F0       MOVX     @DPTR,A
     9:   while (1) 
    10:   { 
    11:     variable++; 
C:0x0807    900001   MOV      DPTR,#0x0001
C:0x080A    E0       MOVX     A,@DPTR
C:0x080B    04       INC      A
C:0x080C    F0       MOVX     @DPTR,A
C:0x080D    70F8     JNZ      C:0807
C:0x080F    900000   MOV      DPTR,#C_STARTUP(0x0000)
C:0x0812    E0       MOVX     A,@DPTR
C:0x0813    04       INC      A
C:0x0814    F0       MOVX     @DPTR,A
    12:   }