当前位置: 代码迷 >> 综合 >> data、idata、pdata、xdata、code
  详细解决方案

data、idata、pdata、xdata、code

热度:34   发布时间:2023-12-13 03:23:47.0

ROM

ROM或者Flash,叫程序存储区,写的程序是存在这里面的,上电后从这里面执行。程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64K,所以很少有外扩。片外Flash或者片外的Rom了,Flash或者Rom不管是片内还是片外的,只能用来定义常量,是用code来修饰。也就是说,用code来修饰的东西,在程序运行过程中,不能修改。

RAM

  • 内部RAM的低128位(00-7F),对应C语言就是data,比如我定义一个变量,data unsigned char Var = 0;那么,这个 Var变量就是放在内部的低128位Ram中。
  • 内部RAM的高128位(80-FF),对应C语言就是idata,比如我定义一个变量,idata unsigned char Var = 0;,那么,这个 Var变量就是放在内部的高128位Ram中。
    • idata 的范围是0x00 ~ 0xFF 可以看出idata是包含data的,区别只是寻址方式不同!,同时0x80~0xFF,这块片内RAM通常用于中断和函数调用的堆栈,一般不区使用。
    • 内部RAM的0x20~0x2F是一块可位寻址区,对应于C语言的bdata
  • 特殊功能寄存器(SFR)(80-FF),对应C语言就是Sfr比如我定义一个变量,Sfr unsigned char Var = 0x90;, 那么,这个 Var变量就是放在内部的特殊功能寄存器中,这是对Var操作,相当于操作一个特殊的寄存器,但是小心,不能随便定义Sfr变量,很危险!!!
  • 外部RAM 64K(0000-FFFF), 外部的RAM可以扩展到65536个。
    • 但是前256个算是一页,这一页比较特殊,是用 pdata来修饰的,当然,也可以用xdata来修饰。除了第一页的256个以外的其他65280个空间,只能用xdata来修饰
    • 回过头来讨论pdata和xdata,这两个都能修饰外部Ram的第一页,但是,Pdata只能修饰第一页,即最前面的256个外部Ram,那么,这最前面的256个到底用Pdata还是Xdata好的呢?
      • 答案是Pdata,因为Xdata修饰的变量,用的是DPTR(DPTRH和DPTRL)寻址,Pdata用的是R0和R1.DPTR因为是16位的,所以可以覆盖整个的64K外部Ram,R0和R1是8位,所以只能寻址最前面的256个,也就是外部Ram的第一页,但是,用R0寻址,比DPTR快一倍,代码也小的很多。

那么问题来了,好多地址是重复的!比如,我向80H地址写一个数值,单片机怎么知道读的是内部的高128位RAM?还是SFR?还是外部64K的RAM呢?

答案:是用指令,如果是直接寻址,那么访问的就是SFR。如果是R0或者R1间接寻址,就是内部高128位RAM,如果是DPTR或者是R0,R1间接寻址,且配合的是MovX指令,那么就是访问外部64KRAM中的第80H个地址

概括一下来说,51的内存由以下组成:

  • 程序存储器(包括片内Flash或Rom,也包括片外Flash或Rom,C语言用Code定义)
  • 内部低128位Ram,C语言用data定义
  • 内部高128位Ram,C语言用idata定义
  • 内部SFR,C语言用Sfr定义
  • 外部65536个Ram(通常,很多单片机厂家不会给你扩展那么多的,一般来说扩展256个字节或者1024个字节就差不多了,最近宏晶的出了个扩展4096字节的。这65536字节的Ram,前256个可以用Pdata修饰,也可以用Xdata修饰,超过256个之后的,只能用Xdata修饰)

以上所说的只是针对51内核的单片机,其他内核的,像ARM之类的,不是这种结构的。

片外存储区是可以是外扩的Flash,也可以说是外扩的RAM。

程序或者常量存储在片外存储区 - Flash中!
变量存储在片外存储区 - 外扩RAM;

片内存储区,指的是内部的Ram,包括高128位(idata)和低128位(data)。

片内存储器,可能是EEPROM吧。

注意:
RAM就是存储变量的,但是有很多类型的RAM,比如SRAM,DRAM,FRAM(铁电随机存取存储器),MRAM(磁性随机存取存储器),本质还是RAM,区域的划分还是我们上面所言!


牛刀小试

STC89C52RC
(512 RAM,8K ROM)

STC89C52RC系列单片机有512B的RAM,据上面所讲,我们也就知道。256片内,256片外,也即是:256常规RAM(idata),256拓展RAM(xdata)。


IAP15F2K60S2
(2K RAM,60K ROM)

常规的256字节RAM <idata> 和内部扩展的1792字节XRAM <xdata>


上面说到了bdata也就是位寻址,来总结一下MCS-51里面的相关位寻址的知识。
位地址空间总共有224位,由2部分构成:
内部数据存储器20H~2FH单元(16个单元 每个单元有8位 可以按位操作 共计128个位地址。地址编号:00H~7FH)

还有一部分在特殊寄存器块中 共有12个特殊寄存器可以进行位操作
分别是 ACC、B 、 PSW 、 P0、 P1 、P2 、P3 、IP 、 IE 、TCON 、 T2COIN 、 SCON (其为地址在80H~FFH之间)。

  相关解决方案