导言
8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C言语用于51内核单片机的研讨方面,Keil公司做得最为成功。因为51内核单片机的存储结构的特别性,Keil C51中变量的运用与规范C有所不同。正确地运用变量,有利于取得高效的方针代码。下面具体介绍Keil C51中变量的运用办法。
1 CPU存储结构与变量的联系
变量都需求有存储空间,存储空间的不同使得变量运用时的作业功率也不同。
规范C的典型运转环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的拜访速度大大高于存储器的拜访速度。在规范C中,不加特别界说的变量是放在存储器中的,运用register能够强制变量存储在寄存器中,关于运用特别频频且数量不多的变量能够选用这种存储办法,以取得更高的作业功率。
相比之下,51内核单片机的存储结构则显得有些奇怪,它的存储空间有3个:程序存储器空间(64 KB含片内、片外)、片外数据存储器空间(64KB)、片内数据存储器及特别功用寄存器空间。它没有真实含义上的寄存器,它的寄存器其实是片内数据存储器(如R0~R7)和特别功用寄存器(如A、B等)中的一部分。因而,在Keil C51中运用变量就和规范C有很大不同。
2 Keil C51变量剖析
Keil C51支撑规范C原有的大多数变量类型,但为这些变量新增了多种存储类型,也新增了一些规范C没有的变量。
2.1 Keil C51新增的变量存储类型
Keil C51中界说变量的格局如下:
[存储品种]数据类型[存储类型]变量名表;
其间,[存储类型]是规范C中没有的,[存储类型]共有6种,别离介绍如下:
①data。将变量存储在片内可直接寻址的数据存储器中。运用这种存储办法,方针代码中对变量的拜访速度最快。
②bdata。将变量存储在片内可位寻址的数据存储器中。在方针代码中变量能够方便地进行位处理,在不进行位处理时与data相同。
③idata。将变量存储在片内直接寻址的数据存储器中。在52内核中,当片内直接寻址数据存储器不行用时,能够运用128字节直接寻址数据存储器,拜访速度一般较data要慢一些,但具有最大的片内数据存储器空间;在51内核中因无独自的直接寻址数据存储器区,idata与data无差异。
④xdata。将变量存储在片外数据存储器中。方针代码中只能运用“MOVX A,@DPTR”和“MOVX@DPTR,A”指令拜访变量,拜访速度最慢,但存储空间最大(64KB)。
⑤pdata。将变量存储在片外数据存储器中的第一页(00H~FFH)中。方针代码中能够运用“MOVX A,@Ri”和“MOVX@Ri,A”指令拜访变量,拜访速度与xdata相同,存储空间为256字节。
⑥code。将变量存储在程序存储器中。方针代码中只能运用MOVC指令拜访变量,因变量存储在程序存储器中,具有非易失性且为只读。
2.2 Keil C51新增的指针变量存储类型
Keil C51中的指针变量办法如下:
数据类型[数据存储类型]*[指针存储类型]标识符;
其间,[数据存储类型]和[指针存储类型]都是规范C中没有的。[数据存储类型]界说数据(即寻址方针)存储的空间,[指针存储类型]界说指针本身存储的空间。若不运用[数据存储类型],则指针为一般指针,占用3个字节;若运用[数据存储类型]则指针为依据存储器的指针,占用1~2个字节。
2.3 Keil C51新增的变量类型
bit:位变量。存储在片内数据存储器的可位寻址字节(20H~2FH)的某个位上,这个变量在实时操控中具有很高的实用价值。
sfr:特别功用寄存器变量。存储在片内特别功用寄存器中,用来对特别功用寄存器进行读写操作。
sbit:特别功用寄存器位变量。存储在片内特别功用寄存器的可位寻址字节(地址能够被8整除者)的某个位上,用来对特别功用寄存器的可位寻址位进行读写操作。
sbitl6:16位特别功用寄存器变量。存储在片内特别功用寄存器的接连2个字节的低地址上,这个变量类型很少运用。
以上这些Keil C51中新增的变量类型,不支撑数组和指针操作。
3 Keil C51中运用变量存储办法的必要性
在Keil C51中,变量的存储办法是一个可选项,假如不运用这个选项,则Keil C51在编译时主动进行优选分配。但这种处理办法有以下缺陷:
①体系不知道各种变量的运用频度,有或许对运用频度高的变量运用了拜访速度慢的片外存储办法,而对运用频高的变量运用了片内存储办法,使得程序的运转功率下降;
②在运用指针寻址时,因为不知道寻址方针的存储办法,只好运用一般指针,在Keil C51中一般指针要多占用1~2个字节,并且运用时还要对存储办法进行判别,增加了寻址操作时刻。
假如能够在界说变量的一起界说其存储类型,能够高效地运用51内核单片机的存储空间,取得高质量的方针代码。
4 Keil C51变量的运用办法
4.1 大局变量和静态部分变量
大局变量一般会在多个函数中被运用,并在整个程序运转期间内有用,静态部分变量尽管只在一个函数中运用,但也是在整个程序运转期间有用。关于这些变量,应尽量挑选data型,这样在方针代码中就能够用直接寻址指令拜访,取得最高的拜访速度,进步程序的作业功率。例如一个保存人数的大局变量n_g,在多个函数中都被常常用到,能够这样界说:
unsigned int data n_g;//对n_g赋值时运用“MOV XXH,……”指令
4.2 数组(包括大局和部分)
界说数组一般用idata存储类型,在方针代码中运用“MOV@Ri”指令进行直接寻址。假如因数组元素过多而在编译时报错,能够改用pdata和xdata存储类型。
数组界说为data存储类型含义不大,因为已然运用数组,便是期望能够依据某一自变量拜访数组元素。如界说X[100],一般都是为了能够运用X(i是一个变量)来拜访,这样在方针代码中就有必要运用问接寻址,所以数组没有必要运用data存储类型,即使运用了data存储类型,在方针代码中也依然要用直接寻址指令。数组界说成idata存储类型,在运用52内核且片内数据存储器不行时,会运用只能直接寻址的片内数据存储空间。这样,既不能下降处理速度,又扩展了可运用的存储空间。
4.3 供查表用的数据
这类数据的特点是需求始终保持不变,且运用时只读,因而应界说为code型。例如一个字形表:
大局或部分code型变量在存储时无差异。
4.4 非静态部分变量
非静态部分变量仅在某一函数内运用,退出该函数时变量也被开释。
若体系运用small存储办法,关于这些变量能够不加存储阐明,由编译软件自行按最优准则决议,因为仅在函数内运用的非静态部分变量,有或许运用作业寄存器R0~R7,这样会更快速和更节约存储空间。例如:
unsigned char i,j; //体系尽或许会用R0~R7存储i和j
若体系运用了compact或large存储办法,则应将这些变量界说为data存储办法,以防体系自行决议时被界说为pdagta或xdata办法而下降作业功率。
4.5 指针
如前所述,界说指针变量时有2个存储类型:数据存储类型,阐明被寻址方针的存储类型;指针存储类型,阐明指针本身的存储类型。当数据存储类型为xdata时,指针本身占用2个字节;当数据存储类型为pdata以及idata等片内存储类型时,指针本身占用1个字节;若不阐明数据存储类型,指针本身就要占用3个字节。因而,在KeilC51中运用指针时,应尽量界说数据存储类型,但要特别留意指针中的数据存储类型与被寻址方针的存储类型有必要共同。指针都是频频运用的,它要不断被设置、修正和运用,因而它本身的存储类型应挑选data型。例如界说一个数组时就一起界说其存储类型,以后用指针对其寻址时就将数组的存储类型添加到指针的数据类型中。办法如下:
4.6 二义性变量
在规范C中假如要运用一个二义性变量,只能用枚举类型。如:
以上程序在Keil C51中运用时,变量t尽管仅有0和1两种状况,但在方针代码中仍占用一个字节。此处理办法既糟蹋存储资源,又延长了处理时刻,这关于8086内核算不上多大问题,但在资源有限、运转速度不高的51内核中就不能不考虑了。在Keil C51中可运用以下办法:
这两种办法作用是完全相同的,但在方针代码中变量t仅占用1位(即1/8字节),并且因为51内核单片机指令体系中有位处理指令,生成的方针代码占用内存少、运转速度快。
4.7 特别功用寄存器变量(包括位变量)
特别功用寄存器中,累加器A、寄存器B、仓库指针SP和数据指针DPTR是归体系运用的,在C51中不提供应用户。其他的特别功用寄存器都能够用sfr界说成变量,其间地址能够被8整除者的各位,还能够用bsfr界说成位变量。拜访这些变量,就能够对特别功用寄存器及其能够位寻址的各位进行读写,到达操作单片机内部各硬件的意图。关于规范的51内核单片机,头文件reg51.h、reg52.h或其他头文件中已对这些特别功用寄存器变量作了界说,用户能够用#include将此头文件包括进来,然后就能够运用了。现在许多51内核兼容型单片机扩展了更多的特别功用寄存器,这些就需求用户自行界说,具体办法可参阅器材的运用阐明。
4.8 外部数据存储器变量
若设置成pdata和xdata存储类型,将把变量存储在片外数据存储器中。这两种存储类型的拜访速度最慢,非无可奈何不要运用。在运用这两种存储类型时,留意尽量只用它保存原始数据或终究成果,尽量削减对其拜访的次数,需求频频拜访的中心成果不要用它。
4.9 用外部数据存储器地址扩展的其他硬件
在单片机外部扩展的其他硬件,一般都借用外部数据存储器地址,表现为外部数据存储器单元办法。关于这些硬件,能够用指针进行读写操作。例如:
结语
Keil C51中的变量增加了存储类型,在运用时而显得比规范C略微杂乱。在Keil C51中,变量的存储类型不同,拜访变量所需求的时刻也不同,因为C51内核单片机资源少、速度慢,变量存储类型对体系作业速度的影响不行忽视。在了解变量与单片机存储结构联系的基础上,依据程序对变量的运用要求,合理地挑选变量的存储类型,能够在相同的硬件上取得更高的作业功率。