keil有什么方法可以看到存储数据区域的所有数据吗

keil中data,xdata,code指的是什么,存放在哪里,大小是否符合单片机参数规格

大多数单片机学习者入门时在编译过程中会遇到这样一个问题:“编写的程序大小超出了单片机规定的范围”,洳何解决呢

以Keil为例,首先我们在编译结束后会得到如下提示(单位为字节Byte):

  • 这些数据存放在单片机的哪里呢?

  1. 打开单片机芯片手册:(以STC12C5A系列为例)
  2. 根据具体型号找到对应的Flash、RAM、ROM大小
  3. 存储固化程序【存放指令代码和固定数值程序运行后不可改动】
    程序运行中数据的隨机存取【掉电丢失数据】
    存储编写的程序和永久保存的数据
  • 2.对应单片机和keil编译后的大小,看是否满足要求
  1. 以我们最开始Keil中显示的数据为唎data=103.2KB保存在片内ram,小于128字节(片内RAM最大256字节其中128字节是做寄存器用,用户不可使用)符合要求!

keil中data,xdata,code指的是什么,存放在哪里,大小是否符匼单片相关教程

}

从上图可以看出当执行mov r3 #0x0010时因为指令需要先加载进内存中,内存中发生如下变化

1.当板子上电之后第一步加载进内存的是中断向量表,但不是说0x这块内存空间不可以使用叻

2.指令在内存中也是以十六进制的方式存在的

对于mov r0 #0x0010这样一条指令来说如果是小于255的立即数,那么这个立即数只占一个字节这里也可以驗证了

内存中是以字节为单位存放数据的,从第一行的00到第二行的17一共是17(十六进制)个字节

换算为十进制是23个字节,其中一条指令占嘚是4个字节也就是 10 30 A0 E3其中10是立即数,后面的就是指令的机器码

如果换成其他的立即数比如0xf000

一条指令的后12位(bit11~0),是指令中立即数占用的位数,其中这个12位又分为2部分前7~0位是数值部分,后11~8位是前7~0位要进行移位操作的移位数也就是说如果一个立即数小于0xFF(255)那么直接用湔7~0位表示即可,此时不用移位11~8位的rotate_Imm等于0,如果前八位immed_8的数值大小了255那么就看这个数是否能有immed_8中的某个数移位rotate_imm位形成的

所以此时内存中第一个字节发生变化,后面的第二个字节8-11位也会相应发生变化

所以第一位变成0f,第二位变成3A

}

data:直接访问内部数据存储器(128字節片内RAM)访问速度最快。

bdata:可位寻址内部数据存储器(16字节片内RAM)允许位于字节混合访问。

idata:间接访问内部数据存储器(256字节片内RAM)允许访问全部内部地址。

pdata:分页访问外部数据存储器(256字节片外RAM)用"MOVX @Ri"指令访问。


存储模式决定了默认的存储器类型此存储器类型将应鼡于函数参数局部变量和定义时未包含存储器类型的变量你可以在命令行用SMALLCOMPACT和LARGE参数定义存储模式定义变量时使用存储器类型显式定义将屏蔽默认存储器类型


所有变量都默认在8051的内部数据存储器中这和用data显式定义变量起到相同的作用在此模式下变量访问是非常快速的然而所囿数据对象包括堆栈都必须放在内部RAM中堆栈空间面临溢出因为堆栈所占用多少空间依赖于各个子程序的调用嵌套深度在典型应用中如果具囿代码分段功能的BL51连接/定位器被配置成覆盖内部数据存储器中的变量时此SMALL模式是最好的选择。


此模式中所有变量都默认在8051的外部数据存储器的一页中地址的高字节往往通过Port 2输出其值必须由你在启动代码中设置编译器不会为你设置这和用pdata显式定义变量起到相同的作用此模式最哆只能提供256字节的变量这种限制来自于间接寻址所使用的R0,R1MOVX @R0/R1这种模式不如SMALL模式高效所以变量的访问不够快不过它比LARGE模式要快


在大模式下所囿的变量都默认在外部存储器中xdata这和用xdata显式定义变量起到相同的作用数据指针DPTR用来寻址通过DPTR进行存储器的访问的效率很低特别是在对一个夶于一个字节的变量进行操作时尤为明显此数据访问类型比SMALL和COMPACT模式需要更多的代码

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信