我想知道是否有人可以帮我解决我在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代码,因为我不在实验室,但我必须说这是正确的,我很确定。
我认为我遇到了与内存分配有关的内存问题,可能是吗?
由于
答案 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: }