微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC 单片机 C 语言编程简介(2)

PIC 单片机 C 语言编程简介(2)

时间:11-22 来源:互联网 点击:
11.5.7 PICC 中变量的绝对定位

首先必须强调,在用 C 语言写程序时变量一般由编译器和连接器最后定位,在写程序

之时无需知道所定义的变量具体被放在哪个地址(除了 bank 必须声明)。

真正需要绝对定位的只是单片机中的那些特殊功能寄存器,而这些寄存器的地址定位在

PICC 编译环境所提供的头文件中已经实现,无需用户操心。编程员所要了解的也就是 PICC

是如何定义这些特殊功能寄存器和其中的相关控制位的名称。好在 PICC 的定义标准基本上

按照芯片的数据手册中的名称描述进行,这样就秉承了变量命名的一贯性。一个变量绝对定

位的例子如下:

unsigned char tmpData @ 0x20; //tmpData 定位在地址 0x20

千万注意,PICC 对绝对定位的变量不保留地址空间。换句话说,上面变量 tmpData 的

地址是 0x20,但最后 0x20 处完全有可能又被分配给了其它变量使用,这样就发生了地址冲

突。因此针对变量的绝对定位要特别小心。从笔者的应用经验看,在一般的程序设计中用户

自定义的变量实在是没有绝对定位的必要。

如果需要,位变量也可以绝对定位。但必须遵循上面介绍的位变量编址的方式。如果一

个普通变量已经被绝对定位,那么此变量中的每个数据位就可以用下面的计算方式实现位变

量指派:

unsigned char tmpData @ 0x20; //tmpData 定位在地址 0x20

bit tmpBit0 @ tmpData*8+0; //tmpBit0 对应于 tmpData 第 0 位

bit tmpBit1 @ tmpData*8+1; //tmpBit0 对应于 tmpData 第 1 位

bit tmpBit2 @ tmpData*8+2; //tmpBit0 对应于 tmpData 第 2 位

如果 tmpData 事先没有被绝对定位,那就不能用上面的位变量定位方式。

11.5.8 PICC 的其它变量修饰关键词

&O1540; extern 外部变量声明

如果在一个 C 程序文件中要使用一些变量但其原型定义写在另外的文件中,那么在本

文件中必须将这些变量声明成“extern”外部类型。例如程序文件 code1.c 中有如下定义:


bank1 unsigned char var1, var2;


//定义了 bank1 中的两个变量


在另外一个程序文件 code2.c 中要对上面定义的变量进行操作,则必须在程序的开头定义:

extern bank1 unsigned char var1, var2; //声明位于 bank1 的外部变量

&O1540; volatile — 易变型变量声明

PICC 中还有一个变量修饰词在普通的 C 语言介绍中一般是看不到的,这就是关键词

“volatile”。顾名思义,它说明了一个变量的值是会随机变化的,即使程序没有刻意对它进

行任何赋值操作。在单片机中,作为输入的 IO 端口其内容将是随意变化的;在中断内被修

改的变量相对主程序流程来讲也是随意变化的;很多特殊功能寄存器的值也将随着指令的运

行而动态改变。所有这种类型的变量必须将它们明确定义成“volatile”类型,例如:

volatile unsigned char STATUS @ 0x03;

volatile bit commFlag;

“volatile”类型定义在单片机的 C 语言编程中是如此的重要,是因为它可以告诉编译

器的优化处理器这些变量是实实在在存在的,在优化过程中不能无故消除。假定你的程序定

义了一个变量并对其作了一次赋值,但随后就再也没有对其进行任何读写操作,如果是非

volatile 型变量,优化后的结果是这个变量将有可能被彻底删除以节约存储空间。另外一种

情形是在使用某一个变量进行连续的运算操作时,这个变量的值将在第一次操作时被复制到

中间临时变量中,如果它是非 volatile 型变量,则紧接其后的其它操作将有可能直接从临时

变量中取数以提高运行效率,显然这样做后对于那些随机变化的参数就会出问题。只要将其

定义成 volatile 类型后,编译后的代码就可以保证每次操作时直接从变量地址处取数。

&O1540; const — 常数型变量声明

如果变量定义前冠以“const”类型修饰,那么所有这些变量就成为常数,程序运行过

程中不能对其修改。除了位变量,其它所有基本类型的变量或高级组合变量都将被存放在程

序空间(ROM 区)以节约数据存储空间。显然,被定义在 ROM 区的变量是不能再在程序

中对其进行赋值修改的,这也是“const”的本来意义。实际上这些数据最终都将以“retlw”

的指令形式存放在程序空间,但 PICC 会自动编译生成相关的附加代码从程序空间读取这些

常数,编程员无需太多操心。例如:

const unsigned char name[]=”This is a demo”; //定义一个常量字符串

如果定义了 “const”类型的位变量,那么这些位变量还是被放置在 RAM 中,但程序

不能对其赋值修改。本来,不能修改的位变量没有什么太

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top