找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4227|回复: 9
打印 上一主题 下一主题
收起左侧

单片机C语言xdata应该怎么怎么正确使用?

[复制链接]
跳转到指定楼层
楼主
最近用单片机C语言编程感觉data消耗的比较快,就想着尝试使用xdata。毕竟xdata比data空间大太多了,不用放着也浪费。但是刚开始时会出现莫名其妙的问题,比如变量值初始化时就不对了,或者更改菜单再切换回来值也不对(一般是浮点数出问题)。后来把内部变量都用static 修饰,倒是正常了,但还有点不放心。keil5设置默认值没动。想请教的是:

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

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 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都会有问题。
回复

使用道具 举报

板凳
ID:1044091 发表于 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
回复

使用道具 举报

地板
ID:1034262 发表于 2022-12-23 11:00 | 只看该作者
C51编译后data不超过200不用太担心,但是超过200就要留意+小心,不要导致堆栈溢出。
xdata没有什么要注意的,我也不用加static,定义时指定为xdata即可,用了超过20年,没约到过问题。
回复

使用道具 举报

5#
ID:814525 发表于 2022-12-23 16:05 | 只看该作者
xdata没有什么要注意的,不用加static。只是定义之后,xdata变量的初始值是随机的,初始化清零就没什么问题。
回复

使用道具 举报

6#
ID:161164 发表于 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倍

评分

参与人数 1黑币 +5 收起 理由
angmall + 5 赞一个!

查看全部评分

回复

使用道具 举报

7#
ID:401564 发表于 2022-12-23 21:06 | 只看该作者
程序如果没有什么问题,就不要去折腾这些,XDATA多就多咯,难不成单片机有64K的内存,你就要写完吗?
如果是基于学习的目的,那就去学汇编,寻址方式不一样,占用的时间也不一样,不同的C代码产生的差别是不一样的,没法有一个绝对的公式给你
程序中频繁调用的,频繁参与运算的,就用原有的那点RAM
其它的不是频繁用的,就放在XDATA就行了,比如GPS模块的数据,动不动就是上百个字节的数据,但有的模块是0.5S才发送一次数据
回复

使用道具 举报

8#
ID:1044091 发表于 2022-12-23 23:02 来自触屏版 | 只看该作者
lkc8210 发表于 2022-12-23 17:45
可以由仿真看到差多少下面的代码中,
Delay250us()是由STC-ISP生成的延时
Delay250usX()是把其中的变量 ...

了解了,非常感谢!
回复

使用道具 举报

9#
ID:1044091 发表于 2022-12-23 23:21 来自触屏版 | 只看该作者
Y_G_G 发表于 2022-12-23 21:06
程序如果没有什么问题,就不要去折腾这些,XDATA多就多咯,难不成单片机有64K的内存,你就要写完吗?
如果是基 ...

是因为在做一款泵控制器,大概进度一半多,发现已经占用100多字节data空间了,所以拓展变量空间已经成了很急迫的事情。
回复

使用道具 举报

10#
ID:879348 发表于 2022-12-24 08:47 | 只看该作者
在C语言里直接用啊,除了速度比data慢,其他都是一样用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表