您好,欢迎访问三七文档
精编WORD文档下载可编缉打印下载文档,远离加班熬夜iData篇一:idata-xdata,data区别在51系列中data,idata,xdata,pdata的区别在51系列中data,idata,xdata,pdata的区别data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:moxACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。startup.a51的作用和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsignedchardataxxx=100;,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或精编WORD文档下载可编缉打印下载文档,远离加班熬夜清零动作。有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量,但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。,为什么还要去改?可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。浅谈C51内存优化(dataidataxdata)对51单片机内存的认识,很多人有误解,最常见的是以下两种①超过变量128后必须使用compact模式编译实际的情况是只要内存占用量不超过256.0就可以用small模式编译②128以上的某些地址为特殊寄存器使用,不能给程序用与PC机不同,51单片机不使用线性编址,特殊寄存器与RAM使用重复的重复的地址。但访问时采用不同的指令,所以并不会占用RAM空间。由于内存比较小,一般要进行内存优化,尽量提高内存的使用效率。以KeilC编译器为例,small模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低128个字节,但这128个字节也不是全为我们的程序所精编WORD文档下载可编缉打印下载文档,远离加班熬夜用,寄存器R0-R7必须映射到低RAM,要占去8个字节,如果使用寄存组切换,占用的更多。所以可以使用data区最大为120字节,超出120个字节则必须用idata显式的指定为间接寻址,另外堆栈至少要占用一个字节,所以极限情况下可以定义的变量可占247个字节。当然,实际应用中堆栈为一个字节肯定是不够用的,但如果嵌套调用层数不深,有十几个字节也够有了。为了验上面的观点,写了个例子#defineLEN120dataUCHARtt1[LEN];idataUCHARtt2[127];voidmain(){UCHARi,j;for(i=0;i<LEN;++i){j=i;tt1[j]=0x55;}}可以计算R0-7(8)+tt1(120)+tt2(127)+SP(1)总共256个字节精编WORD文档下载可编缉打印下载文档,远离加班熬夜keil编译的结果如下:ProgramSize:data=256.0xdata=0code=30creatinghexfilefrom.\Debug\Test....\Debug\Test-0Error(s),0Warning(s).(测试环境为XP+KeilC7.5)这段代码已经达到了内存分配的极限,再定义任何全局变量或将数组加大,编译都会报错107这里要引出一个问题:为什么变量i、j不计算在内?这是因为i、j是局部变量,编译器会试着将其优化到寄存器Rx或栈。问题也就在这了,如果局部变量过多或定义了局部数组,编译器无法将其优化,就必须使用RAM空间,虽然全局变量的分配经过精心计算没有超出使用范围,仍会产生内存溢出的错误!而编译器是否能成功的优化变量是根据代码来的上面的代码中,循环是臃肿的,变量j完全不必要,那么将代码改成UCHARi;UCHARj;for(i=0;i<LEN;++i){tt1[i]=0x55;}精编WORD文档下载可编缉打印下载文档,远离加班熬夜再编译看看,出错了吧!因为编译器不知道该如何使用j,所以没能优化,j须占RAM空间,RAM就溢出了。(智能一点的编译器会自动将这个无用的变量去掉,但这个不在讨论之列了)另外,对idata的定义的变量最好放在data变量之后对于这一种定义ucharc1;idataucharc2;ucharc3;变量c2肯定会以间接寻址,但它有可能落在data区域,就浪费了一个可直接寻址的空间变量优化一般要注意几点:①让尽可能多的变量使用直接寻址,提高速度假如有两个单字节的变量,一个长119的字符型数组因为总长超过120字节,不可能都定义在data区按这条原则,定义的方式如下:dataUCHARtab[119];dataUCAHRc1;idataUCHaRc2;但也不是绝的,如果c1,c2需要以极高的频率访问,而tab访问不那么频繁则应该让访问量大的变量使用直接寻址:精编WORD文档下载可编缉打印下载文档,远离加班熬夜dataUCAHRc1;dataUCHaRc2;idataUCHARtab[119];这个是要根据具体项目需求来确定的②提高内存的重复利用率就是尽可能的利用局部变量,局部变量还有个好处是访问速度比较快由前面的例子可以看出,局部变量i,j是没有单独占用内存的子程序中使用内存数目不大的变量尽量定义为局部变量③对于指针数组的定义,尽可能指明存储类型尽量使用无符号类型变量一般指针需要一个字节额外的字节指明存储类型8051系列本身不支持符号数,需要外加库来处理符号数,一是大大降低程序运行效率,二是需要额外的内存④避免出现内存空洞可以通过查看编译器输出符号表文件(.M51)查看对前面的代码,M51文件中关于内存一节如下:*******DATAMEMORY*******REG0000H0008HABSOLUTEREGBANK0DATA0008H0078HUNIT?DT?TESTIDATA0080H007FHUNIT?ID?TESTIDATA00FFH0001HUNIT?STACK精编WORD文档下载可编缉打印下载文档,远离加班熬夜第一行显示寄存器组0从地址0000H开始,占用0008H个字节第二行显示DATA区变量从0008H开始,占用0078H个字节第三行显示IDATA区变量从0080H开始,占用007F个字节第四行显示堆栈从00FFH开始,占0001H个字节由于前面代码中变量定义比较简单,且连续用完了所有空间,所以这里显示比较简单变量定义较多时,这里会有很多行如果全局变量与局部变量分配不合理,就有可能出现类似下面的行0010H0012H***GAP***该行表示从0010H开始连续0012H个字节未充分利用或根本未用到出现这种情况最常见的原因是局变量太多、多个子程序中的局部变量数目差异太大、使用了寄存器切换但未充分利用51系列中data,idata,xdata,pdata的区别data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C精编WORD文档下载可编缉打印下载文档,远离加班熬夜中的指针方式访问的。汇编中的语句为:moxACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。startup.a51的作用和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsignedchardataxxx=100;,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。篇二:关于keil中data,idata,xdata,pdata,code的问题关于keil中data,idata,xdata,pdata,code的问题从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据精编WORD文档下载可编缉打印下载文档,远离加班熬夜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中的指针方式访问的。汇编中的语句为:moxACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。单片机C语言unsignedcharcodetable[]code是什么作用?code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面精编WORD文档下载可编缉打印下载文档,远离加班熬夜的寻址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个变量
本文标题:iData
链接地址:https://www.777doc.com/doc-8031221 .html