单片机在Keil环境下定义的变量都存储到哪去了?(以STC89C52RC为例)

        相信大家使用Keil软件写程序时都遇到过下面这种情况:

        出现这种情况是由于定义变量大小超出了128字节,那为什么是128字节呢?
        原因是我们在定义变量时有多种修饰方法,以至于变量存储在不同区域:

 1、data存储区:平时我们定义变量类型一般都是 (unsigned)char/(unsigned)int/(unsigned)long 等等,其实这种定义变量方法是默认加了data修饰,即全称应该是 data (unsigned)char/data (unsigned)int/data (unsigned)long,此方法定义的变量是存储到单片机内部RAM低128字节,响应速度快,采用直接寻址方式。
 例:定义变量总字节128,结果正常。

#include <STC89C5xRC.H>

unsigned char a[128]=0;
出现警告是因为没写main()函数

  定义变量总字节超过128,则出现下面情形:

#include <STC89C5xRC.H>

unsigned char a[129]=0;

2、idata存储区:当存在上述图片中现象时说明内部RAM的低128字节已用完,此时我们可以在定义变量类型前(后)加idata进行修饰,如:idata (unsigned)char/(unsigned)char idata 这样定义的变量为内部RAM全256字节,其中包含低128字节,采用间接寻址方式,速度相对较慢。

例:使用idata修饰定义变量总字节256,结果正常

#include <STC89C5xRC.H>

idata unsigned char a[256]=0;

 

  定义变量总字节超过256,则出现下面情形:

#include <STC89C5xRC.H>

idata unsigned char a[257]=0;

 3、xdata存储区:外部扩展RAM(多称为片内扩展RAM),最多可扩展64K空间。而STC89C52RC扩展RAM为256字节。当idata区不够用或所定义的变量访问频率不高时,可采用xdata修饰变量,或者用pdata修饰。pdata存储区就是xdata存储区的前256字节,因xdata区寻址方式为按页寻址,而pdata区刚好可看作是第一页。

例:使用pdata修饰定义变量总字节256,结果正常

#include <STC89C5xRC.H>

pdata unsigned char a[256]=0;

 定义变量总字节超过256,则出现下面情形:

#include <STC89C5xRC.H>

pdata unsigned char a[257]=0;

        由于单片机系列型号不同,片内扩展RAM(xdata区)大小不同,所以就不演示xdata修饰变量到底能存储多少字节了。需要注意的是:在Keil软件上用xdata修饰变量即使超出了你所用单片机型号的片内扩展RAM空间,软件也不会报错,程序仍然可以烧录到单片机,但大概率不能实现你想要实现的现象,所以用xdata修饰变量时,一定注意所用单片机的片内扩展RAM空间多大,以防溢出。

 4、code存储区:即所写代码的存储区域,常被称为Flash程序存储器。单片机型号不同大小不同,常见为4K/8K/12K/16K/32K等。STC89C52RC为8K,而STC89C52RC的idata+xdata(即片内RAM+片内扩展RAM)大小不过512字节,难免会遇到所需变量很多的时候,此时可以在定义变量类型前(后)加code修饰。

        code修饰变量类型需注意两点:

(1)所定义变量一旦初始化后便不能改动,否则报错。如下所示

#include <STC89C5xRC.H>
void main()
{
	code unsigned char  a=1;
	a=2;
}
错误:无法更改左值

 (2)注意自己单片机Flash大小,在Keil软件中使用code修饰变量类型定义变量时,有可能超出Flash大小不报错。以STC89C52RC为例,Flash 8K,即8192字节。

#include <STC89C5xRC.H>

code unsigned char  a[8193]=0;

 可见编译器不报错,但用STC-ISP打开生成的hex文件时会出现下图所示情形:

 为什么编译器不报错呢?原因如下图:

 原来是目标工程最大程序空间为64K,我们不妨验证一下:

#include <STC89C5xRC.H>

code unsigned char  a[65535]=0;

 当超过64K字节时:(这里不定义a[65537]是因为数组元素超过最大维数)

#include <STC89C5xRC.H>

code unsigned char  a[65535]=0;
code unsigned char  b[2]=0;

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可可斯蒂彳亍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值