Keil C51中变量的使用



《Keil C51中变量的使用》由会员分享,可在线阅读,更多相关《Keil C51中变量的使用(4页珍藏版)》请在装配图网上搜索。
1、8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51 内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性, Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。 下面详细介绍Keil C51中变量的使用方法。 1 CPU 存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器, 外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定 义的变量是放
2、在存储器中的,使用register可以强制变量存储在寄存器中,对于使用特别频 繁且数量不多的变量可以选用这种存储模式,以获得更高的工作效率。 相比之下, 51 内核单片机的存储结构则显得有些怪异,它的存储空间有3个:程序存 储器空间(64 KB含片内、片外)、片外数据存储器空间(64KB)、片内数据存储器及特殊功能 寄存器空间。它没有真正意义上的寄存器,它的寄存器其实是片内数据存储器(如R0〜R7) 和特殊功能寄存器(如A、B等)中的一部分。因此,在Keil C51中使用变量就和标准C有很 大不同。 2 Keil C51 变量分析 Keil C51 支持标准 C 原有的大多数变量类型,但
3、为这些变量新增了多种存储类型,也 新增了一些标准C没有的变量。 2.1 Keil C51 新增的变量存储类型 Keil C51 中定义变量的格式如下: [存储种类]数据类型[存储类型]变量名表; 其中,[存储类型]是标准C中没有的,[存储类型]共有6种,分别介绍如下: ① data。将变量存储在片内可直接寻址的数据存储器中。使用这种存储模式,目标代码 中对变量的访问速度最快。 ② bdata。将变量存储在片内可位寻址的数据存储器中。在目标代码中变量可以方便地 进行位处理,在不进行位处理时与data相同。 ③ idata。将变量存储在片内间接寻址的数据存储器中。在52内核中,当片内
4、直接寻址 数据存储器不够用时,可以使用128字节间接寻址数据存储器,访问速度一般较data要慢 一些,但具有最大的片内数据存储器空间;在51内核中因无单独的间接寻址数据存储器区, idata 与 data 无区别。 ④ xdata。将变量存储在片外数据存储器中。目标代码中只能使用“MOVX A,@DPTR” 和“MOVX@DPTR, A”指令访问变量,访问速度最慢,但存储空间最大(64KB)。 ⑤ pdata。将变量存储在片外数据存储器中的第一页(00H〜FFH)中。目标代码中可以使 用“MOVX A,@Ri”和“MOVX@Ri,A”指令访问变量,访问速度与xdata相同,存储 空间为 2
5、56字节。 ⑥ code。将变量存储在程序存储器中。目标代码中只能使用MOVC指令访问变量,因 变量存储在程序存储器中,具有非易失性且为只读。 2.2 Keil C51 新增的指针变量存储类型 Keil C51 中的指针变量形式如下: 数据类型[数据存储类型]*[指针存储类型]标识符; 其中, [数据存储类型]和[指针存储类型]都是标准 C 中没有的。 [数据存储类型]定义数 据(即寻址对象)存储的空间,[指针存储类型]定义指针自身存储的空间。若不使用[数据存储 类型],则指针为一般指针,占用3 个字节;若使用[数据存储类型]则指针为基于存储器的指 针,占用1〜2个字节。 2. 3
6、 Keil C51新增的变量类型 bit:位变量。存储在片内数据存储器的可位寻址字节(20 H〜2FH)的某个位上,这个变 量在实时控制中具有很高的实用价值。 sfr:特殊功能寄存器变量。存储在片内特殊功能寄存器中,用来对特殊功能寄存器进 行读写操作。 sbit:特殊功能寄存器位变量。存储在片内特殊功能寄存器的可位寻址字节地址可以被 8 整除者)的某个位上,用来对特殊功能寄存器的可位寻址位进行读写操作。 sbitl6: 16位特殊功能寄存器变量。存储在片内特殊功能寄存器的连续2个字节的低地 址上,这个变量类型很少使用。 以上这些Keil C51中新增的变量类型,不支持数组和指针操作。
7、 (本文转自电子工程世界: 4672 1.html 3 Keil C51中使用变量存储模式的必要性 在Keil C51中,变量的存储模式是一个可选项,如果不使用这个选项,则Keil C51在 编译时自动进行优选分配。但这种处理方法有以下缺点: ① 系统不知道各种变量的使用频度,有可能对使用频度高的变量使用了访问速度慢的片 外存储方式,而对使用频高的变量使用了片内存储方式,使得程序的运行效率降低; ② 在使用指针寻址时,由于不知道寻址对象的存储方式,只好使用一般指针,在Keil C51 中一般指针要多占用 1〜2个字节,并且使用时还要对存储方式进行判断,增加了寻址操作 时间。 如果能
8、够在定义变量的同时定义其存储类型,可以高效地使用51内核单片机的存储空 间,获得高质量的目标代码。 4 Keil C51 变量的使用方法 4. 1 全局变量和静态局部变量 全局变量一般会在多个函数中被使用,并在整个程序运行期间内有效,静态局部变量虽 然只在一个函数中使用,但也是在整个程序运行期间有效。对于这些变量,应尽量选择data 型,这样在目标代码中就可以用直接寻址指令访问,获得最高的访问速度,提高程序的工作 效率。例如一个保存人数的全局变量n_g,在多个函数中都被经常用到,可以这样定义: unsigned int data n_g;// 对 n_g 赋值时使用“MOV XXH,
9、……”指令 4. 2 数组(包括全局和局部) 定义数组一般用idata存储类型,在目标代码中使用“MOV@Ri”指令进行间接寻址。 如果因数组元素过多而在编译时报错,可以改用pdata和xdata存储类型。 数组定义为 data 存储类型意义不大,因为既然使用数组,就是希望能够根据某一自变 量访问数组元素。如定义X[100], —般都是为了能够使用X[i](i是一个变量)来访问,这样 在目标代码中就必须使用问接寻址,所以数组没有必要使用data存储类型,即便使用了 data 存储类型,在目标代码中也仍然要用间接寻址指令。数组定义成idata存储类型,在使用52 内核且片内数据存储器不够时
10、,会使用只能间接寻址的片内数据存储空间。这样,既不能降 低处理速度,又扩大了可使用的存储空间。 4. 3 供查表用的数据 这类数据的特点是需要始终保持不变,且使用时只读,因此应定义为code型。例如一 个字形表: 全局或局部code型变量在存储时无区别。 4.4 非静态局部变量 非静态局部变量仅在某一函数内使用,退出该函数时变量也被释放。 若系统使用small存储模式,对于这些变量可以不加存储说明,由编译软件自行按最优 原则决定,因为仅在函数内使用的非静态局部变量,有可能使用工作寄存器R0〜R7,这样 会更快速和更节省存储空间。例如: unsigned char i,j; //系
11、统尽可能会用RO〜R7存储i和j 若系统使用了 compact或large存储模式,则应将这些变量定义为data存储模式,以防 系统自行决定时被定义为pdagta或xdata模式而降低工作效率。 4.5 指针 如前所述,定义指针变量时有2个存储类型:数据存储类型,说明被寻址对象的存储类 型;指针存储类型,说明指针自身的存储类型。当数据存储类型为xdata时,指针自身占用 2个字节;当数据存储类型为pdata以及idata等片内存储类型时,指针自身占用1个字节; 若不说明数据存储类型,指针自身就要占用3个字节。因此,在KeilC51中使用指针时,应 尽量定义数据存储类型,但要特别注意指针中
12、的数据存储类型与被寻址对象的存储类型必须 一致。指针都是频繁使用的,它要不断被设置、修改和使用,因此它自身的存储类型应选择 data型。例如定义一个数组时就同时定义其存储类型,以后用指针对其寻址时就将数组的存 储类型添加到指针的数据类型中。方法如下: (本文转自电子工程世界: 4. 6二义性变量 在标准C中如果要使用一个二义性变量,只能用枚举类型。如: 以上程序在Keil C51中使用时,变量t虽然仅有0和1两种状态,但在目标代码中仍占 用一个字节。此处理方法既浪费存储资源,又延长了处理时间,这对于8086内核算不上多 大问题,但在资源有限、运行速度不高的51内核中就不能不考虑了。在K
13、eil C51中可使用 以下方法: 这两种方式效果是完全相同的,但在目标代码中变量t仅占用1位(即1 / 8字节),而且 因为51内核单片机指令系统中有位处理指令,生成的目标代码占用内存少、运行速度快。 4. 7 特殊功能寄存器变量(包括位变量) 特殊功能寄存器中,累加器A、寄存器B、堆栈指针SP和数据指针DPTR是归系统使 用的,在C51中不提供给用户。其他的特殊功能寄存器都可以用sfr定义成变量,其中地址 可以被8整除者的各位,还可以用bsfr定义成位变量。访问这些变量,就可以对特殊功能 寄存器及其可以位寻址的各位进行读写,达到操作单片机内部各硬件的目的。对于标准的 51 内核单片机,
14、头文件 reg51. h、 reg52. h 或其他头文件中已对这些特殊功能寄存器变量 作了定义,用户可以用#include将此头文件包含进来,然后就可以使用了。现在很多51内 核兼容型单片机扩展了更多的特殊功能寄存器,这些就需要用户自行定义,具体方法可参考 器件的使用说明。 4. 8 外部数据存储器变量 若设置成 pdata 和 xdata 存储类型,将把变量存储在片外数据存储器中。这两种存储类 型的访问速度最慢,非迫不得已不要使用。在使用这两种存储类型时,注意尽量只用它保存 原始数据或最终结果,尽量减少对其访问的次数,需要频繁访问的中间结果不要用它。 4.9 用外部数据存储器地址扩展的其他硬件 在单片机外部扩展的其他硬件,一般都借用外部数据存储器地址,表现为外部数据存储 器单元形式。对于这些硬件,可以用指针进行读写操作。例如: 结语 Keil C51中的变量增加了存储类型,在使用时而显得比标准C稍微复杂。在Keil C51 中,变量的存储类型不同,访问变量所需要的时间也不同,由于 C51 内核单片机资源少、 速度慢,变量存储类型对系统工作速度的影响不可忽视。在了解变量与单片机存储结构关系 的基础上,根据程序对变量的使用要求,合理地选择变量的存储类型,可以在相同的硬件上 获得更高的工作效率。 (本文转自电子工程世界:
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度党员教育全员培训计划范文
- 宣传部常务副部长学习2025年政府工作报告心得体会文稿
- 2025年开展深入贯彻中央八项规定精神学习教育工作讨论会上的发言供参考
- 关于2024年度干部选拔任用工作情况的报告文稿
- 在理论中心组深入贯彻中央八项规定精神学习教育交流研讨会的发言例文
- 领导干部深入贯彻中央八项规定精神学习教育的交流发言文稿
- 市委书记在党委理论学习中心组基层减负专题研讨发言材料
- 研讨发言材料:领导干部需要掌握的最根本的本领是理论素养
- 常务副市长在2025年全市诚信建设工作推进会上的讲话发言材料
- 在 2025 年社区 “邻里和谐共建年” 活动动员大会上的讲话发言材料
- 在2025年市法治政府建设工作推进会上的讲话发言材料
- 在2025年全区依法行政工作推进会上的讲话发言材料
- 在2025年区文化和旅游资源普查工作推进会上的讲话发言材料2篇
- 校党委书记在2025年春学期干部教师大会上的讲话发言材料
- 县关于全省基层党建工作巡查调研反馈意见的整改工作方案