历史上的今天
返回首页

历史上的今天

今天是:2025年02月24日(星期一)

正在发生

2020年02月24日 | PIC C语言编程_PICC中的指针

2020-02-24 来源:eefocus

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;


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

推荐阅读

史海拾趣

DURATOOL公司的发展小趣事

DURATOOL公司自成立以来,一直致力于电子工具的技术创新。在20世纪90年代,公司研发出了一款具有革命性的数字万用表,该产品在精确度、稳定性和操作便捷性方面均大幅超越当时的市场主流产品。这一创新不仅为DURATOOL公司赢得了大量忠实用户,也为其在电子测量工具市场树立了技术领先的形象。随后,DURATOOL公司不断加大研发投入,推出了一系列具有竞争力的新产品,逐步巩固了其在电子工具行业的领先地位。

CDI-DIODE公司的发展小趣事

在电子行业的早期,CDI-DIODE公司以其精湛的技术研发能力崭露头角。公司通过不断投入研发,成功开发出一款高效能、低成本的二极管产品,迅速占领了市场份额。这一技术突破不仅提升了公司的竞争力,也为整个电子行业带来了革命性的变化。

Electronic Sensor + Resistor GmbH公司的发展小趣事

随着全球对环保和可持续发展的日益关注,ESR公司积极响应国家政策和市场趋势,致力于实现绿色生产和发展。公司引进先进的环保设备和技术,减少生产过程中的废弃物和污染排放;同时加强资源回收利用和节能减排工作,降低生产成本和能耗。

此外,ESR公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色发展和可持续发展贡献自己的力量。这种对环保的关注和投入不仅提升了公司的社会形象也增强了公司的竞争力和可持续发展能力。

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

随着全球对环保和可持续发展的日益关注,ESR公司积极响应国家政策和市场趋势,致力于实现绿色生产和发展。公司引进先进的环保设备和技术,减少生产过程中的废弃物和污染排放;同时加强资源回收利用和节能减排工作,降低生产成本和能耗。

此外,ESR公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色发展和可持续发展贡献自己的力量。这种对环保的关注和投入不仅提升了公司的社会形象也增强了公司的竞争力和可持续发展能力。

芯旺微电子(ChipON)公司的发展小趣事

近年来,芯旺微电子在资本市场也取得了显著的成果。公司先后完成了多轮融资,吸引了众多知名投资机构的关注和投资。同时,芯旺微电子也在积极推进上市进程,计划通过资本市场进一步拓展业务规模和提升品牌影响力。这些战略布局的实施不仅为芯旺微电子提供了更多的资金支持和发展动力,也为其未来的发展奠定了坚实的基础。

Fairchild公司的发展小趣事

随着科技的不断进步和市场环境的变化,Fairchild公司也面临着转型和创新的挑战。为了保持竞争力和市场地位,Fairchild公司不断加大对新技术和新产品的研发投入。同时,公司也积极寻求与其他企业和研究机构的合作,共同推动半导体技术的创新和发展。通过这些努力,Fairchild公司成功实现了从传统半导体制造商向创新型科技企业的转型。

以上五个故事简要概述了Fairchild公司在电子行业发展的历程和成就。作为半导体行业的领军企业之一,Fairchild公司凭借其卓越的技术实力、创新能力和市场洞察力,为电子行业的发展做出了重要贡献。

问答坊 | AI 解惑

威盛694XB公版主板电路图(INTEL810E)

威盛694XB公版主板电路图,需要的朋友看看吧.... 威胜的那套图被黑客给黑掉了,我也没有了.换一套INTEL810E的吧.再过几天我会陆续在上一些PC主板的图的. [ 本帖最后由 西门 于 2009-5-15 22:32 编辑 ]…

查看全部问答>

【新手指南】论坛帮助帖汇总

最近抽空整理了一些论坛的帮助帖,希望能对大家有帮助,不断完善中........ 大家多提意见,多问问题,我会帮大家找到答案并在帖子中逐步完善!                   一、 &nbs ...…

查看全部问答>

wince5.0怎样才能收到蓝牙耳机按键消息?

修改C:\\WINCE500\\PRIVATE\\WINCEOS\\COMM\\BLUETOOTH里面的代码,进行全编译都编不进去 有什么办法可以截获蓝牙耳机按键消息吗?…

查看全部问答>

想走嵌入式

我是一个专科的学生,我想往嵌入式方面学习,可是现在外面的书籍很多,各位朋友,有没有学嵌入式比较好的书籍可以介绍一下?…

查看全部问答>

终结者9800GT/512M/128BIT 显卡

详细信息    规格 9800GT 512M 128B 数量 100   说明 全新   9800GT 512M 128B DDR3  3铜管双风扇 …

查看全部问答>

请问AT91RM9200的网络DMA

它的EMC的传输方式是不是就称为DMA?  还是说他另外有一种DMA的传输方式可以选择?…

查看全部问答>

请问PocketPC和WinCE有什么区别

我的一个项目要用带扫描条码功能的PDA,我使用VS2005C#开发,我在网上看了PHL5300不错,但是对于VS2005是否能对这个PDA开发不太清楚,不知道这是什么操作系统的.网上对PHL5300的介绍有的说系统是PocketPC,有的说是WinCE4.2,有的说是WinCE4.2PockedPC.不 ...…

查看全部问答>

混合编程通过堆栈传递变量问题

混合编程时,如果形参多于两个就是通过堆栈传递,那么在汇编中如何使用这些参数呢?…

查看全部问答>

cyclone2 FPGA 开发板转让

  [ 本帖最后由 wenhuawu 于 2011-6-3 10:57 编辑 ]…

查看全部问答>

学习板教程 第八课——蜂鸣器

蜂鸣器发生的基本原理以及代码,欢迎下载,谢谢! [ 本帖最后由 764workshop 于 2012-1-11 21:54 编辑 ]…

查看全部问答>