首页 > 其他分享 >关于51单片机C语言中的data,idata,xdata,pdata,code

关于51单片机C语言中的data,idata,xdata,pdata,code

时间:2022-10-18 15:36:58浏览次数:83  
标签:code idata RAM 51 flash MODE sbit data

转自:​​http://www.baobaoshequ.com/article/4584​

从数据存储类型来说,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语言就视为异或运算。


Flash相对单片机里的RAM属于外部存取器,虽其结构位置装在单片机中,其实xdata是放在相对RAM的外面,而flash正是相对RAM外面。


inta变量定义在内部RAM,xdatainta定义在外部RAM或flash,uchar codea定义在flash。


uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //共阴的数码管段选,P2口要取的数值


若定义 uchar aa[5],aa[5]中的内容是存放在数据存储区(RAM)中的,在程序运行工程中各个数组元素的值可以被修改,掉电后aa[5]中的数据无法保存。


若定义 uchar code bb[5]中的内容是存放在程序存储区(如flash)中的,只有在烧写程序时,才能改变bb[5]中的各元素的值,在程序运行工程中无法修改,并且掉电后bb[5]中的数据不消失。

标签:code,idata,RAM,51,flash,MODE,sbit,data
From: https://blog.51cto.com/u_12746973/5766725

相关文章

  • [报错] VSCODE无法识别相对路径
    报错背景:在使用VSCODE进行代码运行时,明明是正确的相对路径,文件却无法被打开;报错为:无法找到对应文件;解决方法:打开VSCODE-->setting-->execute-->勾选Executeinfil......
  • 【题解】CF1151C Problem for Nazar(二分答案)
    【题解】CF1151CProblemforNazar距离CSP剩下10天了,据说考前写题解可以增加RP所以我来写一篇题解+水点贡献分看题解区没有用二分答案来解决这道题的,我来提供一个......
  • CodeForces 709C Letters Cyclic Shift
    C.LettersCyclicShifttimelimitpertestmemorylimitpertestinputoutputsconsistingoflowercaseEnglishletters.Youhavetopickexactlyonenon-emptysubs......
  • Codeforces Round #722 C
    C.Parsa'sHumongousTree显然可以证明我们的每一个节点肯定是会取到边界值才是最优解比如我们当前其他节点确定我们中间节点v不确定我们让av从lv开始av++如果旁边......
  • LeetCode 169. Majority Element
    ​​题目​​题意:找出数组里重复最多的元素,重复最多是指数量大于n/2的,题解:题目说一定存在答案,不用额外的内存空间,怎么做呢?其实很简单,重复最多的元素的数量大于剩下所有元素......
  • LeetCode 168. Excel Sheet Column Title
    ​​题目​​classSolution{public:stringconvertToTitle(intn){stringans="";while(n){i......
  • Code Forces 652A Gabriel and Caterpillar
    A.GabrielandCaterpillartimelimitpertestmemorylimitpertestinputoutput9-thgradestudentGabrielnoticedacaterpillaronatreewhenwalkingaround......
  • LeetCode 171. Excel Sheet Column Number
    ​​题目​​classSolution{public:inttitleToNumber(strings){intans=0;for(inti=0;i<s.length();i++){ans*=26;......
  • LeetCode 167. Two Sum II - Input array is sorted(双指针)
    ​​题目​​题意:找出数组里两个数字之和为指定数字的两个下标。题解:双指针classSolution{public:vector<int>twoSum(vector<int>&numbers,inttarget){......
  • Code Forces 652C Foe Pairs
    C.FoePairstimelimitpertestmemorylimitpertestinputoutputp oflength n.Alsoyouaregiven m foepairs (ai, bi)(1 ≤ ai, bi ≤ n, ai ≠......