标题: 单片机C语言xdata应该怎么怎么正确使用? [打印本页]

作者: ningsy    时间: 2022-12-22 22:18
标题: 单片机C语言xdata应该怎么怎么正确使用?
最近用单片机C语言编程感觉data消耗的比较快,就想着尝试使用xdata。毕竟xdata比data空间大太多了,不用放着也浪费。但是刚开始时会出现莫名其妙的问题,比如变量值初始化时就不对了,或者更改菜单再切换回来值也不对(一般是浮点数出问题)。后来把内部变量都用static 修饰,倒是正常了,但还有点不放心。keil5设置默认值没动。想请教的是:

1、256字节的data值,一般建议最大占用到多少?

2、xdata使用时要注意什么?所有函数内部变量都要static 修饰吗?


作者: Hephaestus    时间: 2022-12-22 23:34
1)data属性的变量最多只有120字节。也就是低128字节,减去至少一个register bank 8字节,如果你用到了using关键字使用了其他的bank,那么使用一个再减去8字节。

2)ram空间高128字节必须声明为idata才可以访问,同时要留足堆栈空间,堆栈的最大使用量是(程序调用最大嵌套层数+中断调用最大嵌套层数)x2。

3)xdata要比data慢得多,其他没有限制,如果你加了static解决了问题,那么不加static是不是xdata都会有问题。
作者: ningsy    时间: 2022-12-23 10:53
Hephaestus 发表于 2022-12-22 23:34
1)data属性的变量最多只有120字节。也就是低128字节,减去至少一个register bank 8字节,如果你用到了usin ...

又增加了几个变量,应该是开始报RAM溢出了。前辈的解答太及时了!

还有一个问题,xdata要比data慢得多,这个说法我也总看到,但是究竟慢多少,有没有可以量化的数值?或者怎么直观的感受到?什么样的变量适合放在xdata中呢?


*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   DATA   
    SEGMENT: ?DT?SHAN
    LENGTH:  0060H
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  FF1
    SEGMENT: ?DT?SHAN
下面还有很多 ERROR L105
作者: coody_sz    时间: 2022-12-23 11:00
C51编译后data不超过200不用太担心,但是超过200就要留意+小心,不要导致堆栈溢出。
xdata没有什么要注意的,我也不用加static,定义时指定为xdata即可,用了超过20年,没约到过问题。
作者: 张天师    时间: 2022-12-23 16:05
xdata没有什么要注意的,不用加static。只是定义之后,xdata变量的初始值是随机的,初始化清零就没什么问题。
作者: lkc8210    时间: 2022-12-23 17:45
ningsy 发表于 2022-12-23 10:53
又增加了几个变量,应该是开始报RAM溢出了。前辈的解答太及时了!

还有一个问题,xdata要比data慢得多 ...

可以由仿真看到差多少下面的代码中,
Delay250us()是由STC-ISP生成的延时
Delay250usX()是把其中的变量改为xdata

上图中箭咀所指的是运行Delay250us()前的步数(628)


上图中箭咀所指的是运行Delay250us()后的步数(878)
878-628=250步


上图中箭咀所指的是运行Delay250usX()后的步数(1986)
1986-878=1108步
1108/250=4.432倍

从而得知xdata比普通data大约慢4.4倍

作者: Y_G_G    时间: 2022-12-23 21:06
程序如果没有什么问题,就不要去折腾这些,XDATA多就多咯,难不成单片机有64K的内存,你就要写完吗?
如果是基于学习的目的,那就去学汇编,寻址方式不一样,占用的时间也不一样,不同的C代码产生的差别是不一样的,没法有一个绝对的公式给你
程序中频繁调用的,频繁参与运算的,就用原有的那点RAM
其它的不是频繁用的,就放在XDATA就行了,比如GPS模块的数据,动不动就是上百个字节的数据,但有的模块是0.5S才发送一次数据
作者: ningsy    时间: 2022-12-23 23:02
lkc8210 发表于 2022-12-23 17:45
可以由仿真看到差多少下面的代码中,
Delay250us()是由STC-ISP生成的延时
Delay250usX()是把其中的变量 ...

了解了,非常感谢!
作者: ningsy    时间: 2022-12-23 23:21
Y_G_G 发表于 2022-12-23 21:06
程序如果没有什么问题,就不要去折腾这些,XDATA多就多咯,难不成单片机有64K的内存,你就要写完吗?
如果是基 ...

是因为在做一款泵控制器,大概进度一半多,发现已经占用100多字节data空间了,所以拓展变量空间已经成了很急迫的事情。
作者: wufa1986    时间: 2022-12-24 08:47
在C语言里直接用啊,除了速度比data慢,其他都是一样用




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1