版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章C语言程序设计何宾2023.08类型限定符C251编译器支持两个类型限定符,包括const和volatileconst类型限定符声明了一个在运行时未修改的对象volatile类型限定符声明了一个对象,该对象的值可能会被出现在其中的代码之外的某个对象修改在嵌入式系统中,这通常是硬件类型限定符
--const在ANSIC中,const类型限定符用于定义和访问常数且不能更改的对象用const声明的变量不能在程序中赋值仅用const类型限定符声明的变量保存在与其定义相关联的存储器区域(data、idata、xdata等)中constunsignedshortxdataa[10]={0,1,2,3,4,5,6,7,8,9};需要在ROM中定位的变量必须用code存储器类型声明constunsignedshortcodea[10]={0,1,2,3,4,5,6,7,8,9};类型限定符
--const常数对象通常在定义(在源文件中)时初始化下面的变量定义显示了创建常数对象的不同方法:constinttable[2][2]={0,2,4,8};//table保存在默认的存储器类中constfloatfarpi=3.1415926;//pi保存在HCONST存储器类中printf(“Thisisastring\n”);//字符串保存在HCONST存储器类中类型限定符
--const当使用指向const对象的指针时,可以在指针定义中排除const类型限定符,例如:constunsignedcharmask[]={0x01,0x02,0x04,0x08};constunsignedchar*cp=mask;unsignedchar*p=mask;//与cp效果相同………*p=’a’;//这里没效果,不会导致警告或错误*cp=’a’;//这会导致错误从上面可知,可以将常数对象mask的地址分配给非常数的指针p,然后使用该指针更改常数对象。在这种情况下,编译器会生成代码写入常数对象。该代码的效果未定义,可能或无法按预期工作不能使用const指针来更改它指向的常数对象。如果这样做,将导致编译器错误类型限定符
--constconst的一个有趣的用法是定义一个不可更改的指针例如:chartext[]=”Thisisastring“;char*consttextp=text;…………*textp=’A‘;//这是正常的(它会改变test[0])textp++;//这会导致错误(textp为常数)textp[2]=’B’;//这是正常的(它会改变test[2])类型限定符
--volatile易失性类型限定符用于限制编译器对对象值的假设例如:unsignedcharreg1;//硬件寄存器#1unsignedcharreg2;//硬件寄存器#2
voidfunc(void){while(reg1&0x01)//当设置位0时,重复{reg2=0x00;//轮询位7reg2=0x80;}}类型限定符
--volatile该程序使用两个变量(reg1和reg2)访问硬件寄存器在大多数情况下,编译器将reg1加载到寄存器中,并且不会在循环迭代之间重新读取它(即使硬件寄存器可能正在更改)此外,对reg2的三个赋值可以简单的优化为最终的赋值(前两个赋值不生成代码)。这些影响是由优化器造成的,而不是编译器生成的错误事实上,这些是编译器应该进行的优化类型。然而,在这种情况下,它们肯定是不可取的类型限定符
--volatile因此,引入volatile类型限定符来解决以上的问题。比如:volatileunsignedcharreg1;//硬件寄存器#1volatileunsignedcharreg2;//硬件寄存器#2
voidfunc(void){while(reg1&0x01)//当设置位0时,重复{reg2=0x00;//轮询位7reg2=0x80;}}通过将reg1和reg2定义为volatile,编译器现在知道对这些变量的访问可能不会被优化。生成的代码按需要执行类型限定符
--volatile【例8-3】不同数据类型运算的C语言描述voidmain(){ volatilecharedataa=100,b=-90,c;//edata空间放置字符变量volatileintedatad=10000,e=-5000,f;//edata空间放置字变量//edata空间放置双字变量volatilelongintedatah=20000000,i=-10000000,j; volatilebitebdatax=1,y=1,z,w;//ebdata空间放置位变量c=a+b;//字符变量a和b相加 f=d+e;//字变量d和e相加 j=h+i;//双字变量h和i相加 z=x&y;//位变量x和y逻辑“与”w=x^y;//位变量x和y逻辑“异或”}类型限定符
--volatile该C语言代码对应的反汇编代码1:voidmain()2:{3:volatilecharedataa=100,b=-90,c;0xFF00037464MOVA,#0x640xFF00057AB30008MOVa(0x0008),R110xFF000974A6MOVA,#0xA60xFF000B7AB30009MOVb(0x0009),R114:volatileintedatad=10000,e=-5000,f;0xFF000F7E342710MOVWR6,#0x27100xFF00137A37000BMOVd(0x000B),WR60xFF00177E34EC78MOVWR6,#0xEC780xFF001B7A37000DMOVe(0x000D),WR6类型限定符
--volatile
5:volatilelongintedatah=20000000,i=-10000000,j;0xFF001F7E342D00MOVWR6,#0x2D000xFF00237E240131MOVWR4,#0x01310xFF00277A1F0011MOVh(0x0011),DR40xFF002B7E346980MOVWR6,#0x69800xFF002F7E24FF67MOVWR4,#0xFF670xFF00337A1F0015MOVi(0x0015),DR46:volatilebitebdatax=1,y=1,z,w;0xFF0037A9D020SETBx(0x20.0)0xFF003AA9D120SETBy(0x20.1)类型限定符
--volatile7:c=a+b;0xFF003D7E730009MOVR7,b(0x0009)0xFF00411A27MOVSWR4,R70xFF00437E730008MOVR7,a(0x0008)0xFF00471A37MOVSWR6,R70xFF00492D32ADDWR6,WR40xFF004B7A73000AMOVc(0x000A),R78:f=d+e;0xFF004F7E37000DMOVWR6,e(0x000D)0xFF00532E37000BADDWR6,d(0x000B)0xFF00577A37000FMOVf(0x000F),WR6类型限定符
--volatile9:j=h+i;0xFF005B7E0F0015MOVDR0,i(0x0015)0xFF005F7E1F0011MOVDR4,h(0x0011)0xFF00632F10ADDDR4,DR00xFF00657A1F0019MOVj(0x0019),DR410:z=x&y;0xFF0069A9A120MOVC,y(0x20.1)0xFF006CA98020ANLC,x(0x20.0)0xFF006FA99220MOVz(0x20.2),C类型限定符
--volatile11:w=x^y;0xFF0072A9A120MOVC,y(0x20.1)0xFF0075A9302001JNBx(0x20.0),C:0x007A0xFF0079B3CPLC0xFF007AA99320MOVw(0x20.3),C12:}类型限定符
--volatile【例8-4】浮点数运算的实现(一)voidmain(){volatilefloata=100.0,b=200.0; volatilefloatedatac=a+b;}类型限定符
--volatile该C语言代码对应的反汇编代码1:voidmain()2:{3:volatilefloata=100.0,b=200.0;0xFF01126D33XRLWR6,WR60xFF01147E2442C8MOVWR4,#0x42C80xFF01187A1F0008MOVa(0x0008),DR40xFF011C7E244348MOVWR4,#0x43480xFF01207A1F000CMOVb(0x000C),DR4类型限定符
--volatile4:volatilefloatedatac=a+b;5:0xFF01247E0F000CMOVDR0,b(0x000C)0xFF01287E1F0008MOVDR4,a(0x0008)0xFF012C120009LCALLC?FPADD(C:0x0009)0xFF012F7A1F0010MOVc(0x0010),DR46:}类型限定符
--volatile【例8-5】浮点数运算的实现(二)voidmain(){floata=100.0,b=200.0; volatilefloatedatac=a+b;}类型限定符
--volatile该C语言代码对应的反汇编代码1:voidmain()2:{3:floata=100.0,b=200.0;4:volatilefloatedatac=a+b;0xFF00196D33XRLWR6,WR60xFF001B7E244396MOVWR4,#0x43960xFF001F7A1F0008MOVc(0x0008),DR45:}类型限定符
--volatile【例8-6】数组元素存储和运算的C语言代码voidmain(){constcharcodetable[]={1,2,4,8}; volatilechari=0,sum=0; for(i=0;i<4;i++)sum+=table[i];}类型限定符
--volatile该C语言代码对应的反汇编代码1:voidmain()2:{3:constcharcodetable[]={1,2,4,8};4:volatilechari=0,sum=0;0xFF0003E4CLRA0xFF00047AB30008MOVi(0x0008),R110xFF00087AB30009MOVsum(0x0009),R115:for(i=0;i<4;i++)0xFF000C8021SJMPC:0x002F类型限定符
--volatile
6:sum+=table[i];0xFF000E7E730008MOVR7,i(0x0008)0xFF00121A37MOVSWR6,R70xFF00142E340053ADDWR6,#0x00530xFF00187A7182MOVDPL(0x82),R70xFF001B7A6183MOVDPH(0x83),R60xFF001EE4CLRA0xFF001F93MOVCA,@A+DPTR0xFF00207C7BMOVR7,R110xFF00222E730009ADDR7,sum(0x0009)0xFF00267A730009MOVsum(0x0009),R7类型限定符
--volatile0xFF002A7EB30008MOVR11,i(0x0008)0xFF002E04INCA0xFF002F7AB30008MOVi(0x0008),R110xFF00337E730008MOVR7,i(0x0008)0xFF0037BE7004CMPR7,#0x040xFF003A48D2JSLC:0x000E7:}存储类别C语言支持许多可以应用于程序变量的存储类存储类用于定义变量和函数的范围和生存周期,这些存储类关键字包括:autoregisterstaticextern存储类别
--autoauto存储类是本地变量默认的存储类其格式如下:autodata-typename<[>=value<]>其中data-type为变量的数据类型name是变量的名字value是分配给变量的值需要注意,存储类auto只能在函数定义内使用存储类别
--registerregister存储类定义了应该保存在一个或多个寄存器中而不是RAM中的局部变量其格式如下:registerdata-typename<[>=value<]>;其中data-type为变量的数据类型name为变量的名字value为分配给变量的值通常,C251编译器忽略register存储类。如果有可能,所有变量都保存在寄存器中注:存储类register只能在函数定义内使用存储类别
--staticstatic存储类限制变量的范围并修改局部变量的生存期其格式如下:staticdata-typename<[>=value<]>;其中data-type为变量的数据类型name为变量的名字value是分配给变量的值使用static在函数外部声明变量时,无法在声明变量的源文件外部访问该变量当使用static在函数内部声明变量时,该变量在启动时就被初始化(与其他全局变量一样),并且在调用该函数时保留其值在进入函数时,它不会被重新初始化存储类别
--externextern存储类声明在另一个源模块中定义的全局变量其格式如下:externdata-namename;其中data-type为变量的数据类型name为变量的名字当使用extern声明变量时,无法初始化该变量,这是因为它已经在定义的位置初始化了存储类别【例8-7】存储类用法的C语言描述
在extern.c文件中定义变量shortinta=3000,b=-2000;
在main.c文件中调用外部变量#include"math.h"externshortinta,b;voidmain(){volatilelongintc; c=a*b;}存储类别该C语言代码对应的反汇编代码
3:voidmain()4:{5:volatilelongintc;6:c=a*b;0xFF00427E17000AMOVWR2,b(0x000A)0xFF00461A02MOVSWR0,R20xFF00481A00MOVSWR0,R00xFF004A7E370008MOVWR6,a(0x0008)0xFF004E1A26MOVSWR4,R60xFF00501A24MOVSWR4,R40xFF005212005ALCALLC?LMUL(C:0x005A)0xFF00557A1F000CMOVc(0x000C),DR47:}存储类别有符号乘法运算的算法C?LMUL:0xFF005A7D51MOVWR10,WR20xFF005CAD03MULWR0,WR60xFF005E7D02MOVWR0,WR40xFF00607D21MOVWR4,WR20xFF0062AD05MULWR0,WR100xFF00642D12ADDWR2,WR40xFF0066AD35MULWR6,WR100xFF00682D21ADDWR4,WR20xFF006A22RET存储类别【例8-8】static关键字的C语言用法inti=0;//声明全局变量iintcal(intx)//定义函数cal,形参x{ staticinty=0;//定义局部静态变量yy=x-y-i;//x-y-i→y,由于y为静态变量,y的结果被保存returny;//返回y值}
存储类别voidmain()//定义main主函数{ intj=1000;//定义并初始化本地局部变量j i=cal(j);//第一次调用函数cal i=cal(j);//第二次调用函数cal i=cal(j);//第三次调用函数cal}存储类别
9:voidmain()10:{11:intj=1000;12:i=cal(j);0xFF00427E3403E8MOVWR6,#0x03E80xFF0046120064LCALLcal(C:0x0064)0xFF00497A370008MOVi(0x0008),WR613:i=cal(j);0xFF004D7E3403E8MOVWR6,#0x03E80xFF0051120064LCALLcal(C:0x0064)0xFF00547A370008MOVi(0x0008),WR6存储类别14:i=cal(j);0xFF00587E3403E8MOVWR6,#0x03E80xFF005C120064LCALLcal(C:0x0064)0xFF005F7A370008MOVi(0x0008),WR615:}0xFF006322RET存储类别2:intcal(intx)3:{4:staticinty=0;5:y=x-y-i;0xFF00649E37000ASUBWR6,y(0x000A)0xFF00689E370008SUBWR6,i(0x0008)0xFF006C7A37000AMOV
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年幼儿园茶道课件
- 2026年幼儿园课程家
- 深度解析(2026)《GBT 21675-2022非洲马瘟诊断技术》
- 深度解析(2026)《GBT 21300-2007塑料管材和管件 不透光性的测定》
- 《JBT 20106-2022药用V型混合机》专题研究报告
- 《JBT 15242-2025永磁电机内装单绳缠绕式矿井提升机》专题研究报告
- 《JBT 15069-2025货架有轨穿梭车》专题研究报告
- 记账实操-石油行业账务处理分录案例
- 2026年幼儿园大班社会领域
- 2026年幼儿园糖画
- 2026年总工会招聘笔试全网首发独家试题及答案
- 律师调解工作室工作制度
- 《社会工作综合能力(初级)》课件全套 第1-12章 社会工作服务的内涵 社会工作综合能力(初级)-社会工作服务相关法规与政策 社会工作综合能力(初级)
- 厨余垃圾处理项目环评报告
- 2026年低空经济(eVTOL)载人项目商业计划书
- AI辅助麻醉深度监测的临床应用
- 大连理工大学《机器学习》2024 - 2025 学年第一学期期末试卷
- 下腔静脉阻塞的护理
- 广州市从化区卫生健康局所属事业单位招聘考试真题2025
- 2025年慢性非传染性疾病控制副高真题含答案
- 宫颈机能不全诊治中国专家共识2025版
评论
0/150
提交评论