关于keil单片机编程中的data,idata,xdata,pdata,code数据类型

从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。

在51系列中data,idata,xdata,pdata的区别:
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。
单片机C语言unsigned char code table[] code 是什么作用?
code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVX(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM的意思。
程序可以简单的分为code(程序)区,和data (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code区也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是运行速度要慢很多,主要读flash比读ram要费时间),因此一般的做法是要将程序放到flash里面,然后load到 ram里面运行的;DATA区就没有什么选择了,肯定要放在RAM里面,放到rom里面改动不了。

bdata如何使用它呢?
若程序需要8个或者更多的bit变量,如果你想一次性给8个变量赋值的话就不方便了,(举个例子说说它的方便之处,想更深入的了解请在应用中自己琢磨)又不可以定义bit数组,只有一个方法
char bdata MODE;
sbit MODE_7 = MODE^7;
sbit MODE_6 = MODE^6;
sbit MODE_5 = MODE^5;
sbit MODE_4 = MODE^4;
sbit MODE_3 = MODE^3;
sbit MODE_2 = MODE^2;
sbit MODE_1 = MODE^1;
sbit MODE_0 = MODE^0;
8个bit变量MODE_n 就定义好了
这是定义语句,Keilc 的特殊数据类型。记住一定要是sbit
不能 bit MODE_0 = MODE^0;
赋值语句要是这么些C语言就视为异或运算 
//------------------------------------------------------------------------------------------------------------------ 
空间名称 地址范围 说明
DATA D:00H~7FH 片内RAM直接寻址区
BDATA D:20H~2FH 片内RAM位寻址区
IDATA I:00H~FFH 片内RAM间接寻址区
XDATA X:0000H~FFFFH 64KB常规片外RAM数据区
HDATA X:0000H~FFFFFFH 16MB扩展片外RAM数据区
CODE C:0000H~FFFFH 64K常规片内外ROM代码区
HCONST(ECODE) C:0000H~FFFFFFH 16MB扩展片外ROM常数区(对Dallas390可用作代码区)
BANK0~BANK31 B0:0000H~FFFFH
:
:
B31:0000H~FFFFH 分组代码区,最大可扩展32X64KB ROM
//----------------------------------------------------------------------------------------------------------------------------------------- 
keil生成的文件: 
.plg:编译器编译结果
.hex和.bin:可执行文件
.map和.lst:链接文件
.o:目标文件
.crf、.lnp、.d和.axf:调试文件
.opt:保存工程配置信息
.bak:工程备份文件
M51文件,startup文件。

注:本文收集自网络

时间: 2024-10-16 09:02:07

关于keil单片机编程中的data,idata,xdata,pdata,code数据类型的相关文章

C51中的关键字data,idata,xdata,pdata,bdata

写在最前面的话:官方网站的解答是最可信的.英语不错的必看.http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm 下面转载几篇中文的,仅供参考. data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小. idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同.idata是用类似C中的指针方式 访问的.汇编中的语句为

51单片机的idata,xdata,pdata,data的详解

data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小.  bit :是指0x20-0x2f的可位寻址区 idata:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同.  idata是用类似C中的指针方式访问的.  汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好) xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用

DATA/IDATA/XDATA 区别

转载自:http://jingyan.baidu.com/article/c843ea0b80c56e77931e4a2a.html DATA: 固定指前面0x00-0x7F的128个RAM,可以用ACC直接读写的,速度最快,生成的代码也最小. 2 IDATA: 固定指前面0x00-0xFF的256个RAM,其中前128和DATA的128完全相同,只是因为访问的方式不同.IDATA是用类似C中的指针方式 访问的.汇编中的语句为:MOX ACC,@Rx. 3 XDATA:外部扩展RAM,一般指外部

C语言编程中的指针

单片机编程中,涉及指针的地方很多,需要多看多练习多总结.#include <string.h>#include <stdio.h>#include <stdlib.h>int main(void){unsigned int pInt32;//指向32位无符号整数的指针unsigned int UINT32_1;//32位的无符号整数unsigned int Array1_UINT32[]={1,9,0,1};//存储4个32位无符号整数的数组unsigned short

解析Java的JNI编程中的对象引用与内存泄漏问题

JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互--在 Java 程序中调用 native code:在 native code 中嵌入 Java 虚拟机调用 Java 的代码.JNI 编程在软件开发中运用广泛,其优势可以归结为以下几点: 利用 native code 的平台相关性,在平台相关的编程中彰显优势. 对 native code 的代码重用.native code 底层操作,更

【KEIL&#183;单片机&#183;扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。

接触了两年多时间的单片机编程本人对关于单片机程序内存如何耗费的问题一直懵懵懂懂,直到在近日看到某篇有关于MDK MAP文件介绍的帖子后才有种醍醐灌顶的感觉,这里我将分享在此之上的观点与见解以供大家讨论学习. 大家都知道ARM单片机的内部存储空间极其匮乏无论是从Flash还是RAM上,每每给单片机机编程都有一种惜字如金的感觉,工程师们一般会在容量有限的情况下规范其编程习惯简化代码避免冗余,那么首先我们如何知道的程序下载到单片机上到底占用了多少Flash程序运行又会使用多少RAM? 首先上一张图:

单片机与单片机编程

单片机就是片上计算机,广义的计算机可以理解为CPU+内存,那么单片机就是把CPU和内存封装在一块的芯片.它不同于我们习惯上认识的计算机,由于不带外设和封装性,它已经高度电子元器件化. 电子元器件,通俗的讲就是电路板上密密麻麻带有管脚的各种原件,电子原件通过贴片或直插的方式固定在电路板上.原件的正方向通常是使标记在上或左上的一个方位,在正方向的情况下,划出U形,按照先后顺序,从1开始为管脚编号. 单片机的管脚是其强大功能的本质,通过把预先写好的程序烧到单片机中运行,就可以随性所欲地控制单片机管脚的

PHP 编程中 10 个最常见的错误,你犯过几个?

错误1:foreach循环后留下悬挂指针 在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法: $arr = array(1,2,3,4); foreach($arr as&$value){    $value = $value *2; } // $arr is now array(2, 4, 6, 8) 这里有个问题很多人会迷糊. 错误1:foreach循环后留下悬挂指针 在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好

理解并发编程中的重要概念:指令重排序和指令乱序执行

看过了很多介绍指令重排序的文章,可惜由于自己硬件和计算机理论知识缺乏,很难理解深层次的奥秘和实现原理.不过也有很多帖子,讲的浅显易懂,使用的例子很形象.大牛就是能用简单的解释和通俗的比喻,给我们讲明白很高深的东西.这里做个摘抄和总结,和大家分享下,希望大家能够对指令重排序有个形象的认识,不至于在并发编程中犯一些简单的错误.如果理解有错误,希望看到的大神指正. 从源码变成可以被机器(或虚拟机)识别的程序,至少要经过编译期和运行期.重排序分为两类:编译期重排序和运行期重排序(乱序执行),分别对应编译