「KeilC51中变量的使用」_第1页
「KeilC51中变量的使用」_第2页
「KeilC51中变量的使用」_第3页
「KeilC51中变量的使用」_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、引言8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Ke il公司做得最为成功。由于5 1内核单片机的存储结构的特殊 性,Keil C 51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍 K e il C51中变量的使用方法。1 CPU存储结构与变量的关系变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。标准C的典型运行环境是808 6 (含I A-32系列)内核,其存储结构是C PU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是

2、放在存储器中的,使用reg ister可以强制变量存储在寄存器中,对于使用特别频 繁且数量不多的变量可以选用这种存储模式,以获得更高的工作效率。相比之下,51内核单片机的存储结构则显得有些怪异,它的存储空间有3个:程序存储器空间(64 KB含片内、片外 卜片外数据存储器空间(64 KB)、片内数据存储器及特殊功能 寄存器空间。它没有真正意义上的寄存器,它的寄存器其实是片内数据存储器(如R0R7)和特殊功能寄存器(如A、B等)中的一部分。因此,在Keil C51中使用变量就和标准 C有很 大不同。2 Ke i l C51变量分析Keil C51支持标准C原有的大多数变量类型,但为这些变量新增了多

3、种存储类型,也新增了一些标准 C没有的变量。2.1 Keil C 51新增的变量存储类型Keil C51中定义变量的格式如下:存储种类数据类型存储类型变量名表;其中,存储类型是标准C中没有的,存储类型共有6种,分别介绍如下:data。将变量存储在片内可直接寻址的数据存储器中。使用这种存储模式,目标代码中对变量的访问速度最快。b da ta。将变量存储在片内可位寻址的数据存储器中。在目标代码中变量可以方便地进行位处理,在不进行位处理时与 data相同。i dat a。将变量存储在片内间接寻址的数据存储器中。在52内核中,当片内直接寻址数据存储器不够用时,可以使用12 8字节间接寻址数据存储器,访

4、问速度一般较data要慢一些,但具有最大的片内数据存储器空间;在51内核中因无单独的间接寻址数据存储器区,i d at a与d at a无区别。x data。将变量存储在片外数据存储器中。目标代码中只能使用“MOVXA,DPTR”和“M OVXDPTR , A”指令访问变量,访问速度最慢,但存储空间最大(64 KB)。pd ata。将变量存储在片外数据存储器中的第一页(00HFFH)中。目标代码中可以使用“MOVX A,Ri”和“ MOVXRi, A”指令访问变量,访问速度与xdata相同,存储空间为2 5 6字节。co d e。将变量存储在程序存储器中。目标代码中只能使用 MOVC指令访问变

5、量,因变量存储在程序存储器中,具有非易失性且为只读。2 . 2 Keil C 5 1新增的指针变量存储类型Keil C51中的指针变量形式如下:数据类型数据存储类型*指针存储类型标识符;其中,数据存储类型和指针存储类型都是标准C中没有的。数据存储类型定义数据(即寻址对象)存储的空间,指针存储类型定义指针自身存储的空间。若不使用数据存储类型,则指针为一般指针,占用3个字节;若使用数据存储类型则指针为基于存储器的指针,占用12个字节。2.3 Keil C 5 1新增的变量类型bi t:位变量。存储在片内数据存储器的可位寻址字节(20H2 FH)的某个位上,这个变量在实时控制中具有很高的实用价值。s

6、 fr:特殊功能寄存器变量。存储在片内特殊功能寄存器中,用来对特殊功能寄存器进行读写操作。s bit:特殊功能寄存器位变量。存储在片内特殊功能寄存器的可位寻址字节(地址可以被8整除者)的某个位上,用来对特殊功能寄存器的可位寻址位进行读写操作。sbi t 1 6: 16位特殊功能寄存器变量。存储在片内特殊功能寄存器的连续2个字节的 低地址上,这个变量类型很少使用。以上这些Keil C 51中新增的变量类型,不支持数组和指针操作。(本文转自电子工程世界:)3 Keil C51中使用变量存储模式的必要性在K e il C 5 1中,变量的存储模式是一个可选项,如果不使用这个选项,则Keil C51在

7、编译时自动进行优选分配。但这种处理方法有以下缺点:系统不知道各种变量的使用频度,有可能对使用频度高的变量使用了访问速度慢的片 外存储方式,而对使用频高的变量使用了片内存储方式,使得程序的运行效率降低;在使用指针寻址时,由于不知道寻址对象的存储方式,只好使用一般指针,在KeilC51中一般指针要多占用 12个字节,并且使用时还要对存储方式进行判断,增加了寻址 操作时间。如果能够在定义变量的同时定义其存储类型,可以高效地使用51内核单片机的存储空间,获得高质量的目标代码。4 Keil C 5 1变量的使用方法4.1 全局变量和静态局部变量全局变量一般会在多个函数中被使用,并在整个程序运行期间内有效

8、,静态局部变量虽然只在一个函数中使用,但也是在整个程序运行期间有效。对于这些变量,应尽量选择data型,这样在目标代码中就可以用直接寻址指令访问,获得最高的访问速度,提高程序的工作效率。例如一个保存人数的全局变量n_g,在多个函数中都被经常用到,可以这样定义:unsig n ed int d a ta n_g;/对 n_g 赋值时使用"MOV XX H,”指令1.1 2数组(包括全局和局部)定义数组一般用idata存储类型,在目标代码中使用 “MO V R i ”指令进行间接寻址。 如果因数组元素过多而在编译时报错,可以改用p d ata和xdata存储类型。数组定义为d ata存储

9、类型意义不大,因为既然使用数组,就是希望能够根据某一自变量 访问数组元素。如定义 X 1 00, 一般都是为了能够使用Xi (i是一个变量)来访问,这样在目标代码中就必须使用问接寻址,所以数组没有必要使用data存储类型,即便使用了data存储类型,在目标代码中也仍然要用间接寻址指令。数组定义成idata存储类型,在使用52内核且片内数据存储器不够时,会使用只能间接寻址的片内数据存储空间。这样,既不能降低处理速度,又扩大了可使用的存储空间。4.3 供查表用的数据这类数据的特点是需要始终保持不变,且使用时只读,因此应定义为 code型。例如一个字形表:全局或局部code型变量在存储时无区别。4.

10、4 非静态局部变量非静态局部变量仅在某一函数内使用,退出该函数时变量也被释放。若系统使用smal l存储模式,对于这些变量可以不加存储说明,由编译软件自行按最优原则决定,因为仅在函数内使用的非静态局部变量,有可能使用工彳寄存器R 0R7,这样会更快速和更节省存储空间。例如:unsigne d char i,j ;系统尽可能会用R 0R7存储i和j若系统使用了 com pact或larg e存储模式,则应将这些变量定义为 d a ta存储模式,以防 系统自行决定时被定义为 pda gta或xdat a模式而降低工作效率。4.5 指针如前所述,定义指针变量时有2个存储类型:数据存储类型,说明被寻址

11、对象的存储类型;指针存储类型,说明指针自身的存储类型。当数据存储类型为xdata时,指针自身占用2个字节;当数据存储类型为 pdat a以及idata等片内存储类型时,指针自身占用 1个字节; 若不说明数据存储类型,指针自身就要占用 3个字节。因此,在 Kei 1 C 5 1中使用指针时, 应尽量定义数据存储类型,但要特别注意指针中的数据存储类型与被寻址对象的存储类型必 须一致。指针都是频繁使用的,它要不断被设置、修改和使用,因此它自身的存储类型应选择data型。例如定义一个数组时就同时定义其存储类型,以后用指针对其寻址时就将数组的存储类型添加到指针的数据类型中。方法如下:(本文转自电子工程世

12、界:)4.6 6二义性变量 在标准C中如果要使用一个二义性变量,只能用枚举类型。如:以上程序在K eil C51中使用时,变量t虽然仅有0和1两种状态,但在目标代码中仍 占用一个字节。此处理方法既浪费存储资源,又延长了处理时间,这对于 8 0 86内核算不上多大问题,但在资源有限、运行速度不高的51内核中就不能不考虑了。在 Keil C5 1中可使用以下方法:这两种方式效果是完全相同的,但在目标代码中变量t仅占用1位(即1/8字节),而且因为51内核单片机指令系统中有位处理指令,生成的目标代码占用内存少、运行速度快。4. 7特殊功能寄存器变量(包括位变量)特殊功能寄存器中,累加器A、寄存器B、堆栈指针SP和数据指针DPT R是归系统 使用的,在C 5 1中不提供给用户。其他的特殊功能寄存器都可以用sfr定义成变量,其中地址可以被8整除者的各位,还可以用b sfr定义成位变量。访问这些变量,就可以对特殊功能 寄存器及其可以位寻址的各位进行读写,达到操作单片机内部各硬件的目的。对于标准的51内核单片机,头文件reg5 1. h、reg52. h或其他头文件中已对这些特殊功能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论