PIC C语言编程_PICC中的指针

发布者:勾剑寒最新更新时间:2020-02-24 来源: eefocus关键字: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  指针 引用地址:PIC C语言编程_PICC中的指针

上一篇:PIC C语言编程_PICC中的变量定义
下一篇:PIC C语言编程_PICC中断函数的实现

推荐阅读最新更新时间:2024-11-02 10:40

基于PIC的FSK/ASK超外差收发机的设计
  基于FSK/ASK的超外差收发机在远程无线进入、汽车胎压检测、无线传感器等方面都有很广泛的应用。本文以PICl6F819和MAXl471、MAXl479为基本部件,设计并实现FSK/ASK超外差射频收发机的过程。 1 元器件的选择 (1)控制器的选择   在本系统设计中,需要涉及到以下几个方面:处理器性能、所支持的开发工具、处理器的成本和功耗.综合以上几个方面考虑,微控制器选择Microchip公司的一款高性价比的8位微控制器PICl6F819。PICl6FSl9采用20脚贴片封装,在线方式进行程序调试和烧写;可采用内部晶振,工作频率可选31 kHz~8 MHz;工作电压从2~5.5V;正常工作时使用2V电压供电、使用内部晶
[网络通信]
读写PIC16F877內部EEPROM的实例
//**********************************************写入1字节到eerom********************************////// void write_eprom(unsigned char date,unsigned char addr) { while(wr==1);//等待写周期完成 eeadr=addr;//准备要写入的地址 eedata=date;//准备要写入的数据 eepgd=0;//to data memory wren=1;//允许写 gie=0; eecon2=0x55; eecon2=0xaa; wr=1;//启动写周期 while(wr==
[单片机]
浅谈USB闪存盘与PIC微控制器系统的连接
  作为现今普遍接受的移动存储工具,USB闪存盘在各种嵌入式系统中也获得广泛应用。本文介绍低成本PIC控制器通过USB2.0全速接口与闪存盘进行连接的实现过程,并着重针对PIC微控制器和VinculumUSB接口芯片说明有关嵌入式接口的硬件设计以及程序的编写。   如今各种闪存盘和USB外设价格已相当低廉,并被广泛应用到带USB接口的PC中.而要将它们应用于8位或16位嵌入式系统中,如何解决成本和功耗等问题才是关键.这其中的原因主要是这类系统中用到的嵌入式控制器,如Microchip公司推出并得到广泛应用的PIC系列器件具有多种存储密度和外设,但由于缺乏接口、资源和性能,无法作为USB的主控制器。   在实际应用中,可用VNC1LV
[单片机]
指针万用表检修故障两例
在家电维修过程中,因电容漏电或容量变化而引发的故障可谓屡见不鲜且故障现象各异。一般的指针万用表和部分数字万用表都无法测量电容,特别是那些小电容,给维修造成很大的不便。在此,我给大家介绍几种小容量电容的测量方法,供参考。 方法l:找一个β≥250的晶体三极管(要求穿透电流要小),如一时找不到,可用两只同型号的三极管复合成达林顿形式,见图1。将被测电容并接在三极管的c-e结(若为有极性电容则电容正极接三极管c极),然后用万用表R×10k挡,黑表笔接c极,红笔接e极,见图2,观察表针瞬时摆动程度。照此法用几个已知容量的正常(高精确度)的电容反复测试,记录下表针每次的瞬时最大摆动幅值,l进行处理计算,算出表盘上每小格应代表的电容值,备日后
[测试测量]
<font color='red'>指针</font>万用表检修故障两例
PIC18 CAN波特率配置
CAN波特率计算: 标称位时间 = 8 TQ:【可配置为8-25】 因为:CANRATE =(1/TQ)*8(标称时间) 因为:TQ=2*(BRPVAL+1)/_XTAL_FREQ 所以:1/TQ=(2*(BRPVAL+1))/_XTAL_FREQ 所以:CANRATE/8 =(2*(BRPVAL+1))/_XTAL_FREQ 所以我们只要根据CANRATE 去求得BRP_val的值即可。 所以:BRPVAL=(_XTAL_FREQ / CANRATE / TQ_VAL / 2 - 1)
[单片机]
C51、PIC和AVR单片机性能比较
传统51:适合菜鸟入门,容易上手,价格一般(从性价比方面说)。IDE环境推荐keil。 缺点:解密容易,一般功能也有,但AD、eeprom等功能要靠扩展,增加硬件和软件负担。 PIC:pic的好处就是各个型号的兼容性强,学好了PIC16f877a,16系列的就OK了,别的型号要用的时候拿出2分钟看看数据手册就行了。12系列、16系列、18系列也是充分的向下兼容。功能全,型号多,适于选型分析,抗干扰能力强。 缺点:解密容易,单片机价格贵(从性价比方面说)。 IDE环境:推荐picc+mplab。 avr mega系列:价格便宜(从性价比方面说),硬件结构适合C语言编程,功能齐全,不容易解密。抗干扰能力强。型号之间兼容性一般。应
[单片机]
PIC16F946中如何使用LCD
   由PIC16F946的Datasheet中得知,将值写到LCD做显示有两种方法   1.直接将值写入LCDDATA1~LCDDATA23   2.利用断开将值写入LCDDATA1~LCDDATA23   第一种方法有一个缺点需判断LCDPS里的WA,若WA=1,才可以写入LCDDATA1~LCDDATA23   这在程序中是非常不好写,也容易造成错误,若WA=0时将值写入LCDDATA1~LCDDATA23,会造成错误(LCDCON的WERR会变成1),   若在程序中用回圈一直判断WA是否为1然后再将值写入LCDDATA,对系统而言这个等待时间太长了(几个ms),且写入错误时   (WERR=1)
[单片机]
PIC单片机与触摸屏串行通信的MODBUS协议实现
  摘要:介绍一种在PIC单片机与触摸屏之间采用Modbus协议实现异步串行通信的方法。简单介绍了Modbus通信协议,给出了硬件电路连接图、程序流程图以及用PIC单片机C语言编写的部分通信程序。实际使用证明该方法数据传输稳定可靠,并提供了良好的人机交互环境。   关键词:触摸屏 PIC单片机 Modbus协议 通信   工控中经常需要观察系统的运行状态或者修改运行参数。触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus
[工业控制]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved