欢迎来到天天文库
浏览记录
ID:42709013
大小:18.96 KB
页数:4页
时间:2019-09-20
《重要的#pragma声明》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、重要的#pragma声明#pragma声明是基于单片机开发的特点而对标准C语法的一个扩充。它对充分利用单片机内各类有限的资源起到不可或缺的关键作用。下面简单介绍几个最常用的#pragma声明。1#pragmaDATA_SEG定义变量所处的数据段。其语法型式为:#pragmaDATA_SEG<属性>名称数据段名称可以自己任意命名,但习惯上有些约定的名称,其作用分别为:DEFAULT-缺省的数据段,在08·系列单片机中的地址为0x100以上。一般的变量定义可以放在这一区域。MY_ZEROPAGE-·特指第0页数据段,地址范围0x00-0xff,但实际用户可用的空间不到256字
2、节,因为前面的一些地址空间已经分配给了片内寄存器。需要频繁或快速存取的变量应该指定放在这一特殊区域,特别是位变量。数据段名称必须和prm文件中的数据段配置说明相关连才能真正发挥其定位作用。如果你自己命名的数据段在prm文件中没有特别说明,那此数据段的性质等同于“DEFAULT”。数据段的“属性”可以缺省,它主要的目的是告诉编译器此段数据可适用的寻址模式。不同的寻址模式所花的指令数量和运行时间都不同。对于08系列单片机,关键的是第0页数据段可以用8位地址进行直接快速寻址,故对应此数据段应尽量指明其属性为“__SHORT_SEG”。对于一般数据段没有属性描述,其缺省是“__F
3、AR_SEG”,将用16位地址间接寻址。举几个数据段定义的例子加以进一步说明。#pragmaDATA_SEG__SHORT_SEGMY_ZEROPAGE//开始0页数据定义volatilestruct{unsignedpowerOn:1;unsignedalarmOn:1;unsignedcommActive:1;unsignedsysError:1;}myFlag;volatilewordmsCounter;bytei,j,k;#pragmaDATA_SEGDEFAULT//开始普通数据段定义(结束0页数据段)bytetmpBuff[16];2#pragmaCONST_
4、SEG定义一个常数数据段,必须和变量的const修饰关键词配合使用。其语法型式为:#pragmaCONST_SEG名称该数据段下定义的所有数据将被放置在程序只读的ROM区,也就是08系列单片机内的Flash程序空间区。常数段名称可以用户自由定义,但一般都用“DEFAULT”,让连接器按可用的ROM区域自由分配变量位置。举例如下:#pragmaCONST_SEGDEFAULTconstbyteprjName[]=”Thisisademo”;FSL系列单片机开发及C语言编程简介constwordversion=0x0301;#pragmaCONST_SEGDEFAULTwor
5、dversion=0x0301;//没有const该变量将被放置在RAM区!#pragmaDATA_SEGDEFAULTconstwordversion=0x0301;//尽管有const但该变量将被放置在RAM区!3.3.3#pragmaINTO_ROM功能类似于“CONST_SEG”,和变量修饰词“const”配合使用。但它只定义一个常数变量到ROM区,且只作用于紧接着的下一行定义。例如:#pragmaINTO_ROMconstbyteprjName[]=”Thisisademo”;//变量将被放置在ROM区wordverData=0x0301;//变量将被放置在缺省
6、RAM区4#pragmaCODE_SEG用以定义程序段并赋以特定的段名,语法型式如下:#pragmaCODE_SEG<属性>名称一般的程序设计是无需对代码段做特殊处理的。因为所有传统的08系列单片机其程序空间都不超过64KB(16位寻址最大范围)且在内存地址中呈线性连续分布。对于项目中所有的代码文件或库文件,连接器会在最后按程序模块出现的先后顺序挨个自动安排所有程序函数在内存中所处的实际位置,用户不必太关心某一个函数的具体位置。但最新推出的几款8位机程序将超过64KB,这样必须在内存空间中以页面型式映射到首64KB地址范围,其对应的程序段属性要特殊声明。某些特殊的设计需要
7、将不同部分的程序分别定位到不同的地址空间,例如实现程序代码下载自动更新。这样的设计需要把负责应用程序下载更新的驱动代码固定放置在一个保留区域内,而把一般的应用程序放置在另外一个区域以便在需要时整体擦除后更新。这时就需要用“CODE_SEG”来分别指明不同的程序段,但还必须配合prm文件对程序空间进行分配和指派。代码段的属性一般都用缺省的“__FAR_SEG”,表明所有的函数调用都是长调用(对应汇编指令为JSR)。但C08和S08系列单片机支持效率更高的函数短调用(对应汇编指令为BSR),如果你的某一个功能模块含有多个相互调用的
此文档下载收益归作者所有