找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1176|回复: 9
收起左侧

关于keil5编译idata数据出错问题

[复制链接]
ID:1079982 发表于 2023-5-26 10:38 | 显示全部楼层 |阅读模式
这是为什么啊,我使用的是stc89c52rc,ram明明512,我也使用了idata将数据存放在高128地址位置,为什么显示data还是超了

51hei截图20230526103829.png
回复

使用道具 举报

ID:1079982 发表于 2023-5-26 12:58 | 显示全部楼层
已解决,我子函数内置了一些数组,导致子函数的数组抢占了data所以空间溢出
回复

使用道具 举报

ID:123289 发表于 2023-5-26 13:59 | 显示全部楼层
你确定直接可访问RAM是512个字节?哪么指令中要用几位表达访问它的地址呢?
回复

使用道具 举报

ID:1079982 发表于 2023-5-26 15:04 | 显示全部楼层
yzwzfyz 发表于 2023-5-26 13:59
你确定直接可访问RAM是512个字节?哪么指令中要用几位表达访问它的地址呢?

主要问题是我子函数的数组溢出,idata可以将数据存放在高位。
回复

使用道具 举报

ID:752974 发表于 2023-5-26 16:20 | 显示全部楼层
楼主没有明白板凳的意思,idata部分是128byte。
回复

使用道具 举报

ID:883242 发表于 2023-5-26 19:17 | 显示全部楼层
munuc_w 发表于 2023-5-26 16:20
楼主没有明白板凳的意思,idata部分是128byte。

错,idata可以访问RAM的全部256byte空间,只是高128byte只能用idata来访问,高128byte的data空间是SFR,不能当成RAM来用。
回复

使用道具 举报

ID:624769 发表于 2023-5-27 14:16 来自手机 | 显示全部楼层
Hephaestus 发表于 2023-5-26 19:17
错,idata可以访问RAM的全部256byte空间,只是高128byte只能用idata来访问,高128byte的data空间是SFR, ...

人家都是错的,你都是对的。
SFR用的是高位data空间么?只是借用了直接访问方式的地址而已!
回复

使用道具 举报

ID:883242 发表于 2023-5-27 14:48 | 显示全部楼层
188610329 发表于 2023-5-27 14:16
人家都是错的,你都是对的。
SFR用的是高位data空间么?只是借用了直接访问方式的地址而已!

c51的基本语法你去查帮助文件。data空间就是直接访问,idata空间是R0/R1/SP间接寻址。
回复

使用道具 举报

ID:123289 发表于 2023-5-27 17:13 | 显示全部楼层
本帖最后由 yzwzfyz 于 2023-5-29 08:19 编辑

1、51系列的RAM分外部分和内部。
外部的用16位地址访问,访问空间是65536,就叫X-RAM吧。对于8位机来说,相应的操作指令至少3个字节(命令码、地址低、地址高),取指至少分3次。这样速度稍慢。
2、51设立了一个内部的可直接快速访问RAM,只用8位地址,就叫I-RAM吧,所以寻址空间只能有256个,访问内部RAM的指令只要两个字节(命令码、地址),这样速度快。
3、单片机需要用到许多寄存器(A,B,SP,……),由于寄存器本身的性质也是RAM,只不过利用率高一些,所以就从内部的256RAM中,切出了一部分,也就是高128个字节,用于给这些特殊寄存器安家,就叫S-RAM吧。
4、这种借用内部RAM的方式,不仅仅发生在高128字节,其中00-07,08-0F,10-17,18-1F,也被借去来表示R0-R7,且可以有四种切换方式。(由PSW切换)
5、这种借用的好处是,不必另制寄存器了,但占用了用户的资源。为了补上高128字节的空间,后期的51,又增加了128个字节的内部RAM(8052及之后的产品),来填补被特殊寄存器占用的地方。
这就发生了一个矛盾:当访问高128字节地址时(80-8F)时,究竟是访问补充的用户RAM呢,还是特殊寄存器呢?
51想了一个招:用直接访问指令与间接访问指令来区分。在选择上,考虑到特殊寄存器使用频率高,就把直接访问指令用于访问特殊寄存器了。
所以:用户在使用RAM时,就出现了高128字节要用间接指令访问!而低128字节间接、直接都可以。
对于用汇编编程的要注意这个,对于用C编程,由编译平台来控制,但程序员必须将变量的存储位置(方式)做个定义,以便编译平台作区分。
6、当你对特殊寄存器非常了解时,也可以将它当作普通RAM看待使用。这里强调非常了解!!用C写程序的人,不要这样做,风险太大。
7、51与其它类型的单片机比,最灵活的就是有位寻址!同理,8位机的指令,可以访问256个位。51对这256个位做了安排。当然是在256+128个字节的内部RAM中选出256个位了。
选出的256个位是:
7.1、80-8F特殊寄存器中,能被8整除的地址(只有16个字节,共计128位)。如P0=80H中的各个位。而PCON=87H是不可以位寻址的。现在知道为什么特殊寄存器中有的位,是不可以定义成BIT的了吧,就是那些不能被8整除的地址寄存器。
在位地址对应上:用128~256对应80H.0[P0.0],80H.1[P0.1],80H.2[P0.2],……88H.x[TCON.x]……90H.x[P1.x]……F8H.7[STC有利用,基本51未用]。
7.2、20-2F这16个字节,计128位。在位地址对应上:用0~127对应20H.0~2FH.7。
8、在用汇编编程时,常用一个指令修改8个位,这是常用的技巧。
9、STC在51系列的发展上下了很大功夫,STC对51做了重大改进:
9.1、在80-FFH空间上,将基本51未用到的利用了起来,在其中增插了许多特殊寄存器,如双DPTR中的第二个DPTR,PWM……,如何定义的,请看STC的手册,长长见识。
9.2、当80-FFH空间被STC用满后,又将XRAM中的一部分用来做特殊寄存器,如PWM-N,乘法器,除法器……如何定义的,需要看STC的手册,去长知识。
9.3、对取指方案作了改进,加入了队列取指方案,使得原来需要12个机器周期取一条令指方案,提升到1-6个周期。但STC可以选择保留了原方案,且设置为默认。这就是有STC系列,有1T/12T选择的原因。
……
回复

使用道具 举报

ID:1079982 发表于 2023-6-3 15:08 | 显示全部楼层
yzwzfyz 发表于 2023-5-27 17:13
1、51系列的RAM分外部分和内部。
外部的用16位地址访问,访问空间是65536,就叫X-RAM吧。对于8位机来说, ...

讲的很详细,谢谢佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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