历史上的今天
返回首页

历史上的今天

今天是:2025年02月14日(星期五)

正在发生

2020年02月14日 | PICC编译指针详解

2020-02-14 来源:eefocus

指向 RAM 的指针


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

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

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

bank3 unsigned char *ptr2; //③定义覆盖bank2/3的指针

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


指向函数的指针

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


bank 修饰词的位置含义

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

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

unsigned char *ptr0;

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

bank2 unsigned char *ptr0;

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

bank2 unsigned char * bank1 ptr0;

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


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

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

volatile unsigned char *ptr0;

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

bank2 unsigned char * volatile bank1 ptr0;

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

const unsigned char * const ptr0;

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


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

unsigned char *ptr0; //定义指向bank0/1的指针

bank2 unsigned char buff[8]; //定义bank2中的一个缓冲区

程序语句:

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

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

Fixup oveRFlow in expression (...)


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

void SendMessage(unsigned char *);

那么被发送的字符串必须位于 bank0 或bank1 中。如果你还要发送位于 bank2或 bank3内的

字符串,必须再另外单独写一个函数:

void SendMessage_2(bank2 unsigned char *);

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


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

推荐阅读

史海拾趣

amcc [applied micro circuits corp]公司的发展小趣事

Applied Micro Circuits Corp(AMCC)是一家半导体公司,主要从事高性能处理器和高速互连解决方案的设计和制造。以下是关于AMCC公司发展的五个相关故事:

  1. 公司成立与早期发展:AMCC公司于1979年由Hemant Kanakia等人在美国加利福尼亚州的圣塔克拉拉创立。公司最初专注于设计和制造用于通信和数据中心应用的集成电路芯片。在成立初期,AMCC致力于开发高性能、低功耗的处理器和互连解决方案,以满足不断增长的通信市场需求。

  2. 技术创新与产品发布:AMCC公司在技术创新方面处于行业领先地位。公司持续投入研发,并推出了一系列创新产品。1997年,AMCC发布了第一款64位PowerPC处理器,开创了其在高性能处理器市场的先河。随后,公司不断推出新一代的处理器产品,包括PowerPC、ARM等系列,以满足不同客户的需求。

  3. 业务拓展与市场扩张:随着时间的推移,AMCC不断拓展其业务范围和市场覆盖。公司不仅在通信领域取得了成功,还逐渐进军数据中心、云计算、存储等新兴领域。AMCC通过与各大客户和合作伙伴的紧密合作,扩大了产品的市场份额和影响力。

  4. 收购与整合:AMCC通过一系列收购和整合,加强了自身的技术实力和市场竞争力。公司收购了一些在特定领域具有核心技术的公司,如Tahoe Networks(2004年)、3ware(2005年)、Mindspeed Technologies(2014年)等。这些收购使得AMCC得以快速扩大产品线,并加速了公司在新兴市场的布局。

  5. 英特尔收购:2016年,英特尔公司宣布以约17亿美元的价格收购AMCC。这一交易使得AMCC成为英特尔旗下的子公司,英特尔得以借助AMCC在通信和数据中心领域的技术优势和客户资源,进一步拓展其在半导体行业的地位。此次收购也标志着AMCC作为独立实体的终结,但其在半导体行业的技术贡献和市场影响将持续延续。

这些故事展示了AMCC公司在技术创新、产品发布、业务拓展、收购整合等方面的发展历程,以及其作为半导体行业重要参与者的地位和影响力。

Ametherm公司的发展小趣事

Ametherm公司成立于XXXX年,由一群热衷于电子技术的工程师创立。他们看到了功率热敏电阻在电子行业中的巨大潜力,并决定专注于此领域的发展。在创立初期,公司面临着资金短缺、市场竞争激烈等挑战,但创始人们凭借着对技术的热情和坚持,逐步攻克了技术难关,开发出了具有竞争力的产品。

DRI Relays Inc公司的发展小趣事

品质是企业的生命线。为了提升产品质量和客户满意度,DRI Relays Inc公司不断加强品质管理。公司建立了严格的质量检测体系,对原材料、生产过程和成品进行全面检测。同时,公司还注重员工素质的提升,定期开展培训和技能竞赛等活动,提高员工的技能水平和质量意识。这些措施有效地保证了公司产品的稳定性和可靠性,赢得了客户的信任和好评。

Chip Technologies Inc公司的发展小趣事

随着电子行业的竞争加剧,Chip Technologies Inc面临着来自各方面的挑战。为了应对这些挑战,公司及时调整了发展策略,加大了在研发和市场拓展方面的投入。同时,公司还加强了内部管理,提升了生产效率和质量水平。这些举措使得公司在激烈的市场竞争中保持了稳健的发展态势。

APLUS Products公司的发展小趣事

在XXXX年,APLUS Products公司迎来了一次重要的技术突破。公司研发团队成功开发出了一款具有划时代意义的电子产品,该产品在性能、稳定性和用户体验等方面均达到了行业领先水平。这一技术突破不仅为公司赢得了大量订单,还进一步巩固了其在电子行业中的市场地位。

DDK公司的发展小趣事

人才是企业发展的根本。DDK公司深知人才的重要性,因此一直致力于人才培养和引进。公司建立了完善的人才培养机制,通过内部培训、外部引进等多种方式,不断吸引和培养了一批批优秀的电子工程师、研发人员和管理人才。这些人才为公司的发展提供了强大的智力支持和人才保障。

问答坊 | AI 解惑

以集成化的车用软件平台应对汽车业的软件危机

如今,汽车制造业已经与软件结下了不解之缘。不仅如此,汽车制造业已经深陷于软件危机之中。问题不是出在汽车制造业,这种软件危机只不过是设备软件产业本身所面临压力的间接反映而已。如今,新产品能够获得的市场窗口期非常狭窄,而功能上的复 ...…

查看全部问答>

对IP DSLAM设备有关问题的探讨

从2000年末开始,原中国电信以及重组后的中国电信和中国网通等固网运营商都把宽带接入、特别是利用现有市话双绞线提供的ADSL接入作为自己最为重要的新的业务增长点之一,并以此作为阻击其它一些新兴的驻地网运营商发展宽带业务的利器之一。以北京通 ...…

查看全部问答>

求助,只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?

只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?…

查看全部问答>

电容式触摸按键

silicon labs 电容式触摸按键解决方案 RELEVANT DEVICES The concepts and example code in this application note are applicable to the following device families: C8051F30x, C8051F31x, C8051F320/1, C8051F33x, C8051F34x, C8051F35x, C8 ...…

查看全部问答>

问一个IP地址的路由问题(非独立IP)

现在的IP地址已经不够用了,但是依然可以使用非独立的IP地址来访问网络。 例如我的IP:10.15.1.79[mask:255.255.0.0],这个应该肯定不是独立IP了。 如果我要给外网发送一个IP报(140.252.0.1),可以判断是外网,就可以通过默认路由转发这个IP报。 ...…

查看全部问答>

哪有freescale imx31开发板?

哪有freescale imx31开发板,大概过少钱一块?…

查看全部问答>

ADC12参考电压怎么选择,依据是什么?

请问版主和高手们: AD中的参考电压怎么选择,内部参考电压何时用2.5V和1.5V,ADC12MCTLx中的Sref位的参考电压源应该根据什么选择。对此我不明白,请懂的朋友给解释一下,谢谢了!!…

查看全部问答>

Nicrosystem Freescale Kinetis教程---DAC转换

这是Nicrosystem Freescale Kinetis系列教程的DAC转换部分…

查看全部问答>

TI电池电量监测基础知识

本帖最后由 dontium 于 2015-1-23 11:51 编辑 本文介绍德州仪器电池电量监测的基础知识,其包含电池电量基础知识、传统电池电量监测方法、基于电压的电量监测计、抗阻跟踪技术优势、电量检测等五部分内容。 希望对大家有所帮助噢!!~~ ...…

查看全部问答>

智能小车驱动电路

本帖最后由 Grizabella 于 2014-3-11 10:45 编辑 智能小车驱动电路是一个全桥驱动电路, Q1,Q2, Q3, Q4四个三极管组成4个桥臂, Q5 控制Q2和Q3的导通和关断, Q6控制Q1 和Q4 的导通和关断, 驱动电路分别用于后轮动力驱动电路和前轮方向驱动电路 ...…

查看全部问答>