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

在微控制器的C代码中增加一个int只会移动LSB,c,microcontroller,8051,C,Microcontroller,8051,我想知道是否有人能帮我解决硅实验室C8051F040的一个奇怪问题 问题是我使用了一个无符号int变量作为计数器,这意味着我自然需要做一些类似变量+的事情 我的问题是,当变量被分配到嵌入式内存中时,增量是可以的 但是,当它被分配到外部内存(不是真正的外部内存,但不是嵌入到内核中)时,LSB增量为OK,但MSB始终在FF中,直到发生溢出,这将其设置为00,并且在新的增量之后,它再次变为FF,直到LSB发生新的溢出 我用variable++作为指令生成了一个main(),同样的问题也发生了 我试图沿

我想知道是否有人能帮我解决硅实验室C8051F040的一个奇怪问题

问题是我使用了一个
无符号int
变量作为计数器,这意味着我自然需要做一些类似
变量+
的事情

我的问题是,当变量被分配到嵌入式内存中时,增量是可以的

但是,当它被分配到外部内存(不是真正的外部内存,但不是嵌入到内核中)时,LSB增量为OK,但MSB始终在FF中,直到发生溢出,这将其设置为00,并且在新的增量之后,它再次变为FF,直到LSB发生新的溢出

我用
variable++
作为指令生成了一个
main()
,同样的问题也发生了

我试图沿着外部存储器的不同部分移动变量,同样的情况也发生了。我阅读了编译器生成的ASM代码,指令看起来还可以

我真的不知道该怎么办。。。我还“玩”了大量的堆栈和堆内存而没有运气

__xdata int variable;

void main()
{
  variable = 0;
  while (1)
  {
    variable++;
  }
}
我在调试器中看到的是,变量从0x0000开始,在第一次初始化后,值到达0xFF01,然后是0xFF02、0xFF03等。直到0xFFFF,当下一次迭代将值设置为0x0000,然后再次从0xFF01开始

如果在扩展数据内存中声明变量时使用了扩展数据内存,那么就没有问题了。我现在不能复制ASM代码,因为我不在实验室,但我必须说这是正确的,我确信

我想我有一个与内存分配有关的内存问题,是吗


谢谢

我试图用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:   } 

最好提供一些代码、日志文件等,以便人们能更好地提供帮助。您能分享一些关于这个问题的进一步信息吗?特别是在计数器分配的精确位置,C和生成的汇编代码看起来如何?此外,您如何知道计数器没有包装,也就是说它会影响代码的语义、调试器视图或其他内容?哦,如果涉及到外部内存总线,那么可能会有很多陷阱。因此,请尽可能分享原理图和零件号、等待状态/宽度/多路复用和MCU中的其他接口设置、时钟频率等。问题可能是一些不必要的屏蔽、总线数据线问题、协议错误。。。这个场景非常广泛,无法给出答案…:-)如果您只是将一个常量值赋给
unsigned int
计数器,会发生什么情况?是否正确获取了MSB、LSB的值?这是定制硬件还是现成的开发工具包?