谷动谷力

 找回密码
 立即注册
查看: 2158|回复: 0
打印 上一主题 下一主题
收起左侧

Keil C51中code、data、bdata、idata、xdata、pdata详解及用法

[复制链接]
跳转到指定楼层
楼主
发表于 2021-10-22 23:03:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
8051 结构提供给用户3 个不同的存储空间,程序存储器ROM,数据存储器RAM(内部RAM和外部RAM)。
随便打开一个8051MCU的datasheet, 现拿N76E003例说:



Keil C51通过以下的关键字定义了不同的存储类型,从而确保用户能够访问到51架构的全部存储空间。

code:访问程序存储器ROM,即我们常说的代码段,用来存放可执行代码,空间可达64K(0x0000~0xffff),该存储空间的代码段是只读的。
定义大量常量数据时可以用 code, 不加在修饰的话RAM里,一般编译不通过,例如:
  1. code unsigned char HS6200_Calibration_Data[41] =
  2. {
  3.     HS6200_BANK0_CONFIG,        0x03,
  4.     HS6200_BANK0_RF_CH,            0x32,
  5.     HS6200_BANK0_RF_SETUP,        0x40,
  6. };
  7. code unsigned char HS6200_Calibration_DCtrl[4] = {1,1,1};

  8. code unsigned char HS6200_Calibration_Analog[31] =
  9. {
  10.     HS6200_BANK1_PLL_CTL0,        0x40,0x01,0x10,0xE5,
  11.     HS6200_BANK1_CAL_CTL,        0x20,0x08,0x50,0x40,0x50,
  12.     HS6200_BANK1_IF_FREQ,        0x00,0x00,0x1F,
  13.     HS6200_BANK1_FDEV,            0x20,
  14.     HS6200_BANK1_DAC_CAL_HI,    0x7F,
  15.     HS6200_BANK1_RF_IVGEN,        0x1F,0x64,0x00,0x81,
  16. };
  17. code unsigned char HS6200_Calibration_ACtrl[8] = {4,5,3,1,1,4};


  18. /*config infor*/
  19. code unsigned char HS6200_Analog_Data[46]=
  20. {

  21.     HS6200_BANK1_PLL_CTL0,        0x40,0x01,0x30,0xE1,   
  22.     HS6200_BANK1_PLL_CTL1,        0x00,0x42,0x10,0x01,
  23.     HS6200_BANK1_CAL_CTL,        0x29,0x89,0x75,0x28,0x50,   
  24.     HS6200_BANK1_RX_CTRL,        0x52,0xC2,0x09,0xAC,   
  25.     HS6200_BANK1_FAGC_CTRL_1,    0x80,0x14,0x08,0x29,   
  26.     HS6200_BANK1_RF_IVGEN,        0x1F,0x64,0x00,0x01   
  27. };
  28. unsigned char HS6200_Analog_Ctrl[10]={4,4,5,4,4,4};


  29. code unsigned char  HS6200_Init_Data[40]=
  30. {
  31.     HS6200_BANK0_CONFIG,        0x0e,
  32.     HS6200_BANK0_RX_PW_P0,        0x0A, //*根据需要配置*//
  33.     HS6200_BANK0_DYNPD,            0x3F,
  34.     HS6200_BANK0_FEATURE,        0x07,
  35.     HS6200_BANK0_SETUP_VALUE,    0x40,0x5A,0x80,0x06,0x00,
  36.     HS6200_BANK0_PRE_GURD,        0x77,
  37.     HS6200_BANK0_EN_AA,            0x3F,   
  38.     HS6200_BANK0_EN_RXADDR,        0x3F,
  39.     HS6200_BANK0_SETUP_AW,        0x03,   
  40.     HS6200_BANK0_SETUP_RETR,    0x0F,  //*根据需要配置*//
  41.     HS6200_BANK0_RF_CH,            0x46,
  42.     HS6200_BANK0_RF_SETUP,        0x47,
  43.     HS6200_BANK0_RX_ADDR_P0,    0x55,0x42,0x9C,0x8F,0xC9,
  44.     HS6200_BANK0_TX_ADDR,        0x55,0x42,0x9C,0x8F,0xC9,
  45. };
  46. code unsigned char HS6200_Init_Ctrl[14]={1,1,1,1,5,1,1,1,1,1,1,1,5,5};
复制代码

刚开始没加code, 编译超RAM空间了。

data:访问可直接寻址的片内存储器,即内部RAM,即我们常说的DATA区或数据段,在整个RAM块中只占前128 字节(0x00~0x7f),因为它采用直接寻址方式,对变量最高速的访问最快,通常我们把使用比较频繁的变量或局部变量存储在DATA 段中,但是次数必须节省,因为它的空间毕竟有限。
代码定义的数据(数组)变量一般不加修饰,就是在RAM(DATA)里。
DATA数据段中分为两个子段,第一个子段包含四组寄存器组,每组寄存器组包含八个寄存器,共32 个寄存器;另外一个子段叫做位寻址段BDATA, 大小16 个字节,共128 位,每一位都可单独寻址。
例: 
  1. sbit LED= P1^2
复制代码

bdata:访问位寻址的片内存储器,即访问内部RAM,在其中从20H开始的16字节(0x20~0x2f)。

xdata:访问外部数据存储器,即外部RAM,大小64K(0x0000~0xffff),16 位地址寻,称作外部数
据区简称XDATA 区,访问XDATA 须采用间接寻址。访问速度尽次于RAM(DATA)

  1. xdata uint32_t arry[16];
复制代码

一般可设置编译自己转大数据到XDATA(XRAM)


idata:访问间接寻址的内部RAM ,256个字节(0x00~0xff),在8051 系列的一些单片机如8052 有附加的128 字节的内部RAM,固定指前面0x00-0xff的256个字节的片内RAM,其中前128字节和data的128字节完全相同,只是因为访问的方式不同。

pdata:访问当前页面内的外部RAM中的XDATA,每一页256字节,按页访问。PDATA 段只有256 个字节,而XDATA段可达65536 个字节(64K嘛),对PDATA 和XDATA 的操作是相似的,但是对PDATA 段寻址比对XDATA 段寻址要快,因为对PDATA 段寻址只需要装入8 位地址,而对XDATA 段寻址需装入16 位地址,所以尽量把外部数据存储在PDATA 段中。

说明不到清楚的地方,请大家指正。欢迎在评论区讨论。
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-4-26 08:30 , Processed in 0.080370 second(s), 38 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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