欢迎来到天天文库
浏览记录
ID:20863342
大小:35.00 KB
页数:4页
时间:2018-10-17
《keil c51中变量使用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、引言8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,KeilC51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍KeilC51中变量的使用方法。1CPU存储结构与变量的关系变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储
2、器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量存储在寄存器中,对于使用特别频繁且数量不多的变量可以选用这种存储模式,以获得更高的工作效率。相比之下,51内核单片机的存储结构则显得有些怪异,它的存储空间有3个:程序存储器空间(64KB含片内、片外)、片外数据存储器空间(64KB)、片内数据存储器及特殊功能寄存器空间。它没有真正意义上的寄存器,它的寄存器其实是片内数据存储器(如R0~R7)和特殊功能寄存器(如A、B等)中的一部分。因此,在KeilC51中使用变量就和标准C有很大
3、不同。2KeilC51变量分析KeilC51支持标准C原有的大多数变量类型,但为这些变量新增了多种存储类型,也新增了一些标准C没有的变量。2.1KeilC51新增的变量存储类型KeilC51中定义变量的格式如下:[存储种类]数据类型[存储类型]变量名表;其中,[存储类型]是标准C中没有的,[存储类型]共有6种,分别介绍如下:①data。将变量存储在片内可直接寻址的数据存储器中。使用这种存储模式,目标代码中对变量的访问速度最快。②bdata。将变量存储在片内可位寻址的数据存储器中。在目标代码中变量可以方便地进行位处理,在不
4、进行位处理时与data相同。③idata。将变量存储在片内间接寻址的数据存储器中。在52内核中,当片内直接寻址数据存储器不够用时,可以使用128字节间接寻址数据存储器,访问速度一般较data要慢一些,但具有最大的片内数据存储器空间;在51内核中因无单独的间接寻址数据存储器区,idata与data无区别。④xdata。将变量存储在片外数据存储器中。目标代码中只能使用“MOVXA,@DPTR”和“MOVX@DPTR,A”指令访问变量,访问速度最慢,但存储空间最大(64KB)。⑤pdata。将变量存储在片外数据存储器中的第一页
5、(00H~FFH)中。目标代码中可以使用“MOVXA,@Ri”和“MOVX@Ri,A”指令访问变量,访问速度与xdata相同,存储空间为256字节。⑥code。将变量存储在程序存储器中。目标代码中只能使用MOVC指令访问变量,因变量存储在程序存储器中,具有非易失性且为只读。2.2KeilC51新增的指针变量存储类型KeilC51中的指针变量形式如下:数据类型[数据存储类型]*[指针存储类型]标识符;其中,[数据存储类型]和[指针存储类型]都是标准C中没有的。[数据存储类型]定义数据(即寻址对象)存储的空间,[指针存储类型
6、]定义指针自身存储的空间。若不使用[数据存储类型],则指针为一般指针,占用3个字节;若使用[数据存储类型]则指针为基于存储器的指针,占用1~2个字节。2.3KeilC51新增的变量类型bit:位变量。存储在片内数据存储器的可位寻址字节(20H~2FH)的某个位上,这个变量在实时控制中具有很高的实用价值。sfr:特殊功能寄存器变量。存储在片内特殊功能寄存器中,用来对特殊功能寄存器进行读写操作。sbit:特殊功能寄存器位变量。存储在片内特殊功能寄存器的可位寻址字节(地址可以被8整除者)的某个位上,用来对特殊功能寄存器的可位寻
7、址位进行读写操作。sbitl6:16位特殊功能寄存器变量。存储在片内特殊功能寄存器的连续2个字节的低地址上,这个变量类型很少使用。以上这些KeilC51中新增的变量类型,不支持数组和指针操作。(本文转自电子工程世界:http://news.eeworld.com.cn/mcu/2011/0721/article_4672_1.html)3KeilC51中使用变量存储模式的必要性在KeilC51中,变量的存储模式是一个可选项,如果不使用这个选项,则KeilC51在编译时自动进行优选分配。但这种处理方法有以下缺点:①系统不知
8、道各种变量的使用频度,有可能对使用频度高的变量使用了访问速度慢的片外存储方式,而对使用频高的变量使用了片内存储方式,使得程序的运行效率降低;②在使用指针寻址时,由于不知道寻址对象的存储方式,只好使用一般指针,在KeilC51中一般指针要多占用1~2个字节,并且使用时还要对存储方式进行判断,增加了寻址操作时间。如果能够
此文档下载收益归作者所有