PIC C语言编程_PICC中的指针

来源:本站
导读:目前正在解读《PIC C语言编程_PICC中的指针》的相关信息,《PIC C语言编程_PICC中的指针》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《PIC C语言编程_PICC中的指针》的详细说明。
简介:PIC C语言编程_PICC中的指针

PICC中指针的基本概念和标准C语法没有太多的差别。但是在PIC单片机这一特定的架构上,指针的定义方式还是有几点需要特别注意。

1) 指向RAM的指针

如果是汇编语言编程,实现指针寻址的方法肯定就是用FSR寄存器,PICC也不例外。为了生成高效的代码,PICC在编译C原程序时将指向RAM的指针操作最终用FSR来实现间接寻址。这样就势必产生一个问题:FSR能够直接连续寻址的范围是256字节(bank0/1或bank2/3),要覆盖最大512字节的内部数据存储空间,又该如何让定义指针?PICC还是将这一问题留给编程员自己解决:在定义指针时必须明确指定该指针所适用的寻址区域,例如:

unsignedchar*ptr0;//①定义覆盖bank0/1的指针

bank2unsignedchar*ptr1;//②定义覆盖bank2/3的指针

bank3unsignedchar*ptr2;//③定义覆盖bank2/3的指针

上面定义了三个指针变量,其中①指针没有任何bank限定,缺省就是指向bank0和bank1;②和③一个指明了bank2,另一个指明了bank3,但实际上两者是一样的,因为一个指针可以同时覆盖两个bank的存储区域。另外,上面三个指针变量自身都存放在bank0中。我们将在稍后介绍如何在其它bank中存放指针变量。

既然定义的指针有明确的bank适用区域,在对指针变量赋值时就必须实现类型匹配,下面的指针赋值将产生一个致命错误:

unsignedchar*ptr0;

bank2unsignedcharbuff[8];

程序语句:

//定义指向bank0/1的指针

//定义bank2中的一个缓冲区

ptr0=buff;//错误!试图将bank2内的变量地址赋给指向bank0/1的指针

若出现此类错误的指针操作,PICC在最后连接时会告知类似于下面的信息:

Fixupoverflowinexpression(...)

同样的道理,若函数调用时用了指针作为传递参数,也必须注意bank作用域的匹配,而这点往往容易被忽视。假定有下面的函数实现发送一个字符串的功能:

voidSendMessage(unsignedchar*);

那么被发送的字符串必须位于bank0或bank1中。如果你还要发送位于bank2或bank3内的字符串,必须再另外单独写一个函数:

voidSendMessage_2(bank2unsignedchar*);

这两个函数从内部代码的实现来看可以一模一样,但传递的参数类型不同。

按笔者的应用经验体会,如果你看到了“Fixupoverflow”的错误指示,几乎可以肯定是指针类型不匹配的赋值所至。请重点检查程序中有关指针的操作。

2)指向ROM常数的指针

如果一组变量是已经被定义在ROM区的常数,那么指向它的指针可以这样定义:

constunsignedcharcompany[]=”Microchip”;

constunsignedchar*romPtr;

程序中可以对上面的指针变量赋值和实现取数操作:

romPtr=company;//指针赋初值

data=*romPtr++;//取指针指向的一个数,然后指针加1

//定义ROM中的常数

//定义指向ROM的指针

反过来,下面的操作将是一个错误,因为该指针指向的是常数型变量,不能赋值。

*romPtr=data;//往指针指向的地址写一个数

3) 指向函数的指针

单片机编程时函数指针的应用相对较少,但作为标准C语法的一部分,PICC同样支持函数指针调用。如果你对编译原理有一定的了解,就应该明白在PIC单片机这一特定的架构上实现函数指针调用的效率是不高的:PICC将在RAM中建立一个调用返回表,真正的调用和返回过程是靠直接修改PC指针来实现的。因此,除非特殊算法的需要,建议大家尽量不要使用函数指针。

4) 指针的类型修饰

前面介绍的指针定义都是最基本的形式。和普通变量一样,指针定义也可以在前面加上特殊类型的修饰关键词,例如“persistent”、“volatile”等。考虑指针本身还要限定其作用域,因此PICC中的指针定义初看起来显得有点复杂,但只要了解各部分的具体含义,理解一个指针的实际用图就变得很直接。

㈠bank修饰词的位置含义

前面介绍的一些指针有的作用于bank0/1,有的作用于bank2/3,但它们本身的存放位置全部在bank0。显然,在一个程序设计中指针变量将有可能被定位在任何可用的地址空间,这时,bank修饰词出现的位置就是一个关键,看下面的例子:

//定义指向bank0/1的指针,指针变量为于bank0中

unsignedchar*ptr0;

//定义指向bank2/3的指针,指针变量为于bank0中

bank2unsignedchar*ptr0;

//定义指向bank2/3的指针,指针变量为于bank1中

bank2unsignedchar*bank1ptr0;

从中可以看出规律:前面的bank修饰词指明了此指针的作用域;后面的bank修饰词定义了此指针变量自身的存放位置。只要掌握了这一法则,你就可以定义任何作用域的指针且可以将指针变量放于任何bank中。

㈡volatile、persistent和const修饰词的位置含义

如果能理解上面介绍的bank修饰词的位置含义,实际上volatile、persistent和const这些关键词出现在前后不同位置上的含义规律是和bank一词相一致的。例如:

//定义指向bank0/1易变型字符变量的指针,指针变量位于bank0中且自身为非易变型

volatileunsignedchar*ptr0;

//定义指向bank2/3非易变型字符变量的指针,指针变量位于bank1中且自身为易变型

bank2unsignedchar*volatilebank1ptr0;

//定义指向ROM区的指针,指针变量本身也是存放于ROM区的常数

constunsignedchar*constptr0;

亦即出现在前面的修饰词其作用对象是指针所指处的变量;出现在后面的修饰词其作用对象就是指针变量自己。

提醒:《PIC C语言编程_PICC中的指针》最后刷新时间 2024-03-14 01:13:49,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《PIC C语言编程_PICC中的指针》该内容的真实性请自行鉴别。