找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18023|回复: 14
收起左侧

单片机data,code,xdata的区别和使用

  [复制链接]
ID:404797 发表于 2019-4-20 22:42 | 显示全部楼层 |阅读模式
      刚学单片机的时候,很多人往往不在意数据是放在哪个段,使用很随意。但是,随着学习的深入,用单片机处理的事务越来越复杂,程序越来越长,有时不能不注意数据放在哪啦,是要好好规划的,如果还不注意或不知道怎么规划内存使用,很可能遇到内存不够的问题,不会解决的话项目还做不下去,所以一些内存基本知识还是有必要掌握,在此本人谈一些简单的认识。
     1、data段,这是基本的数据段,在程序中我们定义的变量,如int x;等语句,这样定义的变量都存放在数据段data中,使用简单,但是有一个缺点,就是数量太少,一般的单片机只有128个字节,超过128个字节,编译程序报错,不编译。如果碰到数据段溢出的情况,可以把变量安排在其它段,如果不知道怎么安排到其他段,有可能程序再也编不下去,工作就此止步。
    2、code段,这是代码段,一般的程序代码放在这个段,当然,如果数据段不够用,也可以将变量放在这段,方法是定义变量时加个code,如:char code x;加这个关键字后,将把变量安排在代码段中存放,由于代码段有64K,一般情况,安排几百字节的内存用于保存变量,不影响程序编写,所以代码段是解决数据段不够的有效方法。
    3、xdata扩展数据段,这种段要有扩展内存才能使用,有些CPU本身内置了这种内存如stc89c52rc等,有这种内存的CPU可以把变量安排在这种段内,方法是加xdata,如char xdata x;这样就把内存定义在扩展数据段中,如果CPU内置扩展内存的就建议把xdata段用起来,以减轻data段的压力。
     以上是本人对三个段的简单认识,不知有没有错误,如有,欢迎在此讨论,以增进对内存的认识。

评分

参与人数 2黑币 +62 收起 理由
YJGG + 12 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:284488 发表于 2019-4-21 11:56 | 显示全部楼层
讚!感谢分享。
回复

使用道具 举报

ID:314000 发表于 2019-4-22 01:10 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:249062 发表于 2019-4-22 12:59 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:433166 发表于 2020-2-12 10:08 | 显示全部楼层
文中有部分BUG:     
code 指定数据是存储在代码区,数据是在编程的时候跟代码一起写入代码存储器,运行过程中不能改变!
code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVC
回复

使用道具 举报

ID:235200 发表于 2020-2-12 16:25 | 显示全部楼层
定义变量前不能加code,因为不能改变,只能是常量才能这样定义,另外还有一个idata区域没有提到
回复

使用道具 举报

ID:691127 发表于 2020-2-18 15:19 | 显示全部楼层
讚!感谢分享。
回复

使用道具 举报

ID:155507 发表于 2020-2-18 21:07 | 显示全部楼层
另外还有个idata, pdata, bdata区域没有提到

     data     --->     可寻址片内ram
     bdata   --->     可位寻址的片内ram
     idata    --->     可寻址片内ram,允许访问全部内部ram
     pdata   --->     分页寻址片外ram (MOVX @R0) (256 BYTE/页)
     xdata   --->     可寻址片外ram (64k 地址范围FFFFH)
     code    --->     程序存储区 (64k 地址范围),对应MOVC @DPTR

回复

使用道具 举报

ID:893480 发表于 2021-9-10 14:33 | 显示全部楼层
angmall 发表于 2020-2-18 21:07
另外还有个idata, pdata, bdata区域没有提到

     data     --->     可寻址片内ram

这些用的好少
回复

使用道具 举报

ID:917199 发表于 2021-9-10 20:19 | 显示全部楼层

而且是教科书式的定义,固然非常正确,对我这菜鸟具体使用却帮助不大
回复

使用道具 举报

ID:624769 发表于 2021-9-11 16:55 | 显示全部楼层
2、code段,这是代码段,一般的程序代码放在这个段,当然,如果数据段不够用,也可以将变量放在这段,方法是定义变量时加个code,如:char code x;加这个关键字后,将把变量安排在代码段中存放,由于代码段有64K,一般情况,安排几百字节的内存用于保存变量,不影响程序编写,所以代码段是解决数据段不够的有效方法。

这个不对,  code 声明的 是 常量  不是 变量。

另外, idata 这么重要的一个,你居然漏了,你用DATA 只能定义 0~0x7f , 后面的 0x80~0xff 不用太浪费了吧? 同时,BDATA 这个也很常用吧,定义一个变量在 位寻址地址,然后 sbit 每一个位,就可以方便的对位操作,需要的时候 可以 字节操作把 整个8位都清零,或者都置1。 另外, Pdata, 用8位指针操作 Xdata, 在 DPTR 比较紧张的程序里,把部分指针操作交给 8位指针,不是好很多么?
回复

使用道具 举报

ID:115923 发表于 2021-9-15 15:42 | 显示全部楼层
data  就是128的RAM,掉电会丢失,
code就是ROM, 掉电不丢失,
xdata 扩展的RAM,  掉电会丢失,
回复

使用道具 举报

ID:875095 发表于 2021-9-15 23:05 | 显示全部楼层
CODE 段,不是变量,只能保存常量;放在这里的数据不能够被改变。
回复

使用道具 举报

ID:875095 发表于 2021-9-15 23:45 | 显示全部楼层
可以直接或者间接寻址的 idata 128byte(00H-7FH); 只能间接寻址的idata 128 byte(80H~FFH); 扩展的xdata 理论最大可以有64K,如果扩展的话。
回复

使用道具 举报

ID:969161 发表于 2021-11-13 17:32 | 显示全部楼层
这个贴子讨论的好,希望能更深入一些。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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