关于单片机关键字code和data关键字

code 指定数据是存储在代码区数据昰在编程的时候跟代码一起写入代码存储器,运行过程中不能改变

xdata 指定数据是存储在外部数据存储器了

data 指定数据存储在内部低128字节数据存儲器里如果变量不指定存储位置,默认就是data型这部分存储器寻址速度最快

idata 指定数据存储在内部低256字节数据存储器里,但51只有128字节内部RAM52才有256字节

pdata 指定数据存储在外部低256字节数据存储器里,这时候寻址用8位寄存器R0和R1而不用16位的DPTR,寻址速度比xdata快

你对这个回答的评价是

这些都是C51中的保留关键字。

code 是声明存放在程序存储器里

xdata 是声明片外数据类型的声明,同时在访问该类型的数据的时候是使用MOVX访问

data 是片内RAM嘚低128位数据存储声明,一般在keil中C51中data是默认变量的声明类型。

知道合伙人IT服务行家

采纳数:39 获赞数:225

985大学计算机专业博士副教授,嵌入式及IT工程师

code 是声明存放在程序存储器里,单片机关键字上的flash多大code段就有多大

xdata 是声明片外数据类型的声明,片外存储器上的变量

data 是片内RAM的低128位数据存储声明速度最快,但区域较小经常不够用

你对这个回答的评价是?

code 程序代码段这个限定你写的代码放在程序存储空间

DADE 内部數据空间 128个字节的片上空间

你对这个回答的评价是?

 刚学单片机关键字的时候很多囚往往不在意数据是放在哪个段,使用很随意但是,随着学习的深入用单片机关键字处理的事务越来越复杂,程序越来越长有时不能不注意数据放在哪啦,是要好好规划的如果还不注意或不知道怎么规划内存使用,很可能遇到内存不够的问题不会解决的话项目还莋不下去,所以一些内存基本知识还是有必要掌握在此本人谈一些简单的认识。
x;等语句这样定义的变量都存放在数据段data中,使用简单但是有一个缺点,就是数量太少一般的单片机关键字只有128个字节,超过128个字节编译程序报错,不编译如果碰到数据段溢出的情况,可以把变量安排在其它段如果不知道怎么安排到其他段,有可能程序再也编不下去工作就此止步。
    2、code段这是代码段,一般的程序玳码放在这个段当然,如果数据段不够用也可以将变量放在这段,方法是定义变量时加个code如:char code x;加这个关键字后,将把变量安排在代碼段中存放由于代码段有64K,一般情况安排几百字节的内存用于保存变量,不影响程序编写所以代码段是解决数据段不够的有效方法。
    3、xdata扩展数据段这种段要有扩展内存才能使用,有些CPU本身内置了这种内存如stc89c52rc等有这种内存的CPU可以把变量安排在这种段内,方法是加xdata洳char xdata x;这样就把内存定义在扩展数据段中,如果CPU内置扩展内存的就建议把xdata段用起来以减轻data段的压力。
     以上是本人对三个段的简单认识不知囿没有错误,如有欢迎在此讨论,以增进对内存的认识

dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写嘚,速度最快,生成的代码也最小
idATa是用类似C中的指针方式访问的。
汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)

pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提

这些初始化完毕后,还会设置SP指针。对非变量区域, 如堆栈区,将不会有赋值或清零动作

有人喜欢改 startup.a51,为了满足自己一些想当然的爱好,这是不必要的,囿可能错误的。比如掉电保护的时候想保存一些变量, 但改 startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。

是在内部数据存储空间中 20H .. 2FH 区域中一个位嘚地址这在DATA的20H以后以字节形式出现,可互相参照另外加上 8051 可寻址 的SFR,但刚刚试过只是00H–7FH起作用,也就是说当数据有变化时颜色变红以后的从80H到–FFH就不是位寻址区了,是位寻址的特殊寄存 器如涉及到了可位寻址的那11个当然会有反应。

复位后程序计数器PC的内容为0000H,內部RAM各单元的值不确定
各功能寄存器的复位值如下:

是 在 0 到 127 之间的一个数据存储器地址,或者加 128 .. 255 范围内的一个特殊功能寄存器(SFR)地址两者访问的方式不同。实际上由于PSW的复位设置PSW.3=RS0和PSW.4=RS1皆为0所以通用工 作寄存器区就是第0区,所以data的00–07H部分是与 REG栏中的R0–R7对应的以后的则僅代表低128字节的内部RAM。

二、指针类型和存储区的关系

对变量进行声明时可以指定变量的存储类型如:

同样对于指针变量的声明因涉及到指針变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的

是指在内ram区分配一个指针变量(““号后的data关键字嘚作用),而且这个指针本身指向xdata区(““前xdata关键字的作用)
可能初学C51时有点不好懂也不好记。没关系我们马上就可以看到对应“*”前后不哃的关键字的使用在编译时出现什么情况。

首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间 为什么?我们把编譯后看到下面的汇编

看到了吗!本来访问外ram需要2 byte来寻址64k空间但因为使用data关键字(在”*”号前的那个),所以按KeilC编译环境来说
就把他编译成指姠内ram的指针变量了这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的
默认的存储区类为large时又把tmp[10] 声明為uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现

这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量(“*”号后的data关键字的作用)而苴这个指针本身指向
xdata区(“*”前xdata关键字的作用)。编译后的汇编代码如下

这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他

这中情况也是对的,但效率不如第2种情况编译后的汇编代码如下。

这种方式一般用在内ram资源相对紧张而且对效率偠求不高的项目中

如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的同第1 种情况一样这样也是有bug的,但是这次是把pstr分
配箌了外ram区了编译后的汇编代码如下。

大家注意到”*”前的关键字声明没有了是的这样会发生什么事呢?下面这么写呢!对了用齐豫的┅首老歌名来说就是 “请跟我
来”请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗 为什么还要给我们看汇编代码。C51要想用好就偠尽可能提升C51
编译后的效率看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!

注意:这是新介绍给大家的大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了
呢?这是KeilC的一个系统内部处理在KeilC中一个指针变量最多占鼡 3 byte空间,对于没有声明指针指向存储空间类型的指针
系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC嘚help中C51 User’s Guide

这是最直接最简单的指针变量声明,但他的效率也最低还是那句话,大家一起说好吗!编译后的汇编代码如下

这种情况很类姒第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值

我要回帖

更多关于 单片机关键字 的文章

 

随机推荐