keil 给数组赋值 另一个变量的值不明改变

编译环境:keil 4
芯片:c8051f120
问题:定义一个结构体数组(200个元素),然后给结构体数组赋初值,当赋值到190左右的时候就会使另外一个全局变量的值改变
struct xxx xdata xxA[200];
for(i=0;i<200;i++)
xxA[i].xx = 0xFF;编译后,xdata = 五位数,不报错

51的内部RAM(包括idata)总共才256个字节,还要保留一部分给堆栈使用,实际可用的也就200出头点,其他的变量和你的结构都在这个范围内,如果结构太大,那当然会侵占到其他变量了。
你可以将这个结构变量定义到外部RAM中,我记得F120有几K的外部RAM的。
单片机资源都是很紧张的,一定要精打细算啊。
你看看最后编译出来的xdata共占用了多少,就是xdata= xxxx
编译当然不会报错,你需要在项目文件中,告诉KEIL你有几K 的XRAM。这个单片机我记得只有8K的外部RAM,也就是8192个字节,到不了五位数啊。所以在实际运行时,外部RAM赋值超过了8K后,又从外部RAM的0地址开始赋值了追问

谢谢你的回答,我不是用的在线调试,用的是仿真调试,在keil中选择的是这个芯片,keil应该知道xdata有多大。另外,xdata超过了界限会从0地址开始赋值吗?

追答

这个项目选择了C8051F120后,在项目的option中target页,需要选择use on-chip XRAM,否则KEIL还真不知道。
如果你没选择这个选项,超过了界限,虽然P2的高3位还在变化,但实际起作用的低13位还是变成了0,也就是实际的0地址开始赋值。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-10
另外一个全局变量是谁?怎么定义的?

项目配置里面要根据实际芯片以及外围配置设置合理的地址限制范围,要不然Keil怎么知道你超界了没有?

xxx结构体的单位大小是多少?
第2个回答  2014-01-06
你有什么东西需要200这么多?不可以放在code里面么?