欢迎来到天天文库
浏览记录
ID:10021643
大小:167.50 KB
页数:19页
时间:2018-05-21
《keil c使用经验小结》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、KeilC使用经验小结秦建勋2005/7/29目录引言1语言扩展1数据存储器区域1存储器模型2指针3函数3参数传递3自动变量分配8C51的陷阱9运算溢出9编译与链接控制10编译时控制10定制文件10Startup.A5110INIT.A5110L51_BANK.A5111链接时控制11代码或常数的绝对定位11和_at_关键字的比较11Overlay12如何控制overlay15overlay相关的其它问题15可重入函数16µVisionIDE使用简介16简单的代码习惯17头文件(.h文件)习惯1
2、7C模块的习惯18CVS的使用18引言2004年6月以来开始接触KeilC,原因是MUSE项目控制器采用了目前8位微控制器领域最经典、使用最广泛的8051MCU。从一年多来的使用实践看,我们的8051IP还是比较可靠的,那么以后可能有更多的产品需要用到该IP,因此看起来还是需要在相当长一段时间需要与KeilC打交道。本文就简单小结我对KeilC的一些理解以及使用过程中的一些经验、教训,试图起到抛砖引玉的作用,为大家总结KeilC使用经验提供一个讨论的起点。语言扩展所谓语言扩展是指相对标准C(如A
3、NSIC严格说来,主要是针对ANSIC,因为KeilC显然不支持C++,一些语言特性,如“//”注释是C99标准引入的)进行的针对8051硬件平台进行的扩展,这样的C编译器才是真正为8051量身订做的:资源的使用是紧凑的、编译出来的代码是高效的,另外,Keil公司好象也出了针对ARM的C编译器,所以,从命名来说,看起来C51更准确些,实际上µVision也是这么做的。数据存储器区域8051的数据存储器分为片内和片外存储器两大类,片内RAM分为直接访问和间接访问两部分,片外RAM由可有页寻址和普通
4、区域两部分,总是让人混淆,下面我结合C51的数据存储器区域给一个图示解释18FF007F80FF只能间接访问,idata直接访问:data间接访问:idataSFRs,只能直接访问,sfrFFFF00FF0000pdata,movx@Rnxdatamovx@DPTR片内数据存储器片外数据存储器,DMbdataRegisterbanks1F2F图18051数据存储器对应的C51存储器模型我们可以看到,data作为可存放数据的空间只有128字节,还要排除掉32字节的寄存器组和16字节的可位寻址空间,
5、实际只有80字节的变量可分配空间,所以有时候会出现链接时报告片内数据只使用100字节却数据空间溢出的情况(使用small存储器编译模型),原因就在于程序引入的附加data型的数据量已经超过了80字节,此时,把data型变量改为idata就可以通过链接,只要变量总量不超过片内的256字节(还应该考虑运行时堆栈大小J)。存储器模型C51的存储器模型用于确定:函数参数、自动变量以及不带显式存储器类型说明变量声明的缺省存储器类型,有如下几种模型:小模型(smallmodel),在该模型下,所有变量缺省都
6、驻留在8051片内存储器中(如同声明为data类型),变量的访问效率非常高。然而,所有对象,包括堆栈(运行时的最大堆栈容量)必须都放在片内RAM中,一般来说在程序规模小且使用overlay技术(后面会讲到)、没有声明可重入函数并多次嵌套调用情况下是最佳的。紧凑模型(compactmodel),该模型下,所有变量,缺省驻留在外部DM的一个page之内,(通过MOVX@Ri指令访问,见图说明),紧凑模型的效率逊于小模型、优于打模型。这里自然产生一个问题问题,当紧凑模型下使用的变量超过一个页大小(25
7、6字节)怎么办?多余的部分,KeilC手册说,使用P2的设置以使用另外的page,但实际情况是我们的8051只支持0页,我向徐国柱核实过,这体现在MOVX@Ri的时候,16为DM地址总线的高8位(我们的8051与经典的不一样,经典的由于考虑到封装的要求,使用P0和P2,P0还是地址、数据复用,我们的8051和DM都是集成在片内的,没有封装带来的限制)始终为0,可否搞一个sfr来产生MOVX@Ri指令执行时候的高8位地址,复位地址为0。我们现在的程序规模就采用了这种模式。大模型(largemode
8、l),该模型下,所有变量缺省情况下都驻留在DM中,就象使用xdata存储器类型修饰符声明一样(通过MOVX@DPTR指令访问,18寻址采用DPTR),这种方式速度慢,产生的代码也最多,而且对于需要频繁运算的变量,效率更低。指针通用指针以标准C指针的方式声明,如:char*s;/*stringptr*/int*numptr;/*intptr*/long*state;/*Texas*/通用指针总是以三字节进行存储,第一个字节是存储器类型,第二字节是指针代表的地址的高字节,第三字节是地址的低字节。通用
此文档下载收益归作者所有