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