历史上的今天
返回首页

历史上的今天

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

正在发生

2020年02月14日 | PICC——基本知识(变量)

2020-02-14 来源:eefocus

利用这一技术后所有的动态局部变量都可以按已知的固定地址地进行直接寻址,用 PIC 汇编指令实现的效率最高,但这时不能出现函数递归调用。PICC 在编译时会严格检查递归调用的问题并认为这是一个严重错误而立即终止编译过程。


为了使编译器产生最高效的机器码,PICC 把单片机中数据寄存器的 bank问题交由编程员自己管理,因此在定义用户变量时你必须自己决定这些变量具体放在哪一个 bank 中。如果没有特别指明,所定义的变量将被定位在 bank0,除了 bank0 内的变量声明时不需特殊处理外,定义在其它 bank 内的变量前面必须加上相应的 bank序号


中档系列 PIC 单片机数据寄存器的一个 bank 大小为 128 字节,刨去前面若干字节的特殊功能寄存器区域,在 C 语言中某一 bank 内定义的变量字节总数不能超过可用 RAM 字节数。如果超过 bank 容量,在最后连接时会报错,大致信息如下:


Error[000] : Can't find 0x12C words for psect rbss_1 in segment BANK1


连接器告诉你总共有 0x12C(300)个字节准备放到 bank1 中但 bank1 容量不够。显然,只有把一部分原本定位在 bank1 中的变量改放到其它 bank 中才能解决此问题。


为避免频繁的 bank 切换以提高代码效率,尽量把实现同一任务的变量定位在同一个 bank 内;对不同 bank 内的变量进行读写操作时也尽量把位于相同 bank 内的变量归并在一起进行连续操作。


所有的局部变量将占用 bank0的存储空间,因此用户自己定位在 bank0 内的变量字节数将受到一定的限制,在实际使用时需注意。


bit 型位变量只能是全局的或静态的。PICC 将把定位在同一 bank 内的 8 个位变量合并成一个字节存放于一个固定地址。因此所有针对位变量的操作将直接使用 PIC 单片机的位操作汇编指令高效实现。基于此,位变量不能是局部自动型变量,也无法将其组合成复合型高级变量。


PICC 对整个数据存储空间实行位编址,0x000 单元的第 0 位是位地址 0x0000,以此后推,每个字节有 8 个位地址。编制位地址的意义纯粹是为了编译器最后产生汇编级位操作指令而用,对编程人员来说基本可以不管。但若能了解位变量的位地址编址方式就可以在最后程序调试时方便地查找自己所定义的位变量,如果一个位变量 flag1 被编址为 0x123,那么实际的存储空间位于:

字节地址=0x123/8 = 0x24

位偏移 =0x123%8 = 3

即 flag1 位变量位于地址为 0x24 字节的第 3 位。在程序调试时如果要观察 flag1 的变化,必须观察地址为 0x24 的字节而不是 0x123。


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 事先没有被绝对定位,那就不能用上面的位变量定位方式。

推荐阅读

史海拾趣

Benchmarq Microelectronics Inc公司的发展小趣事

Benchmarq Microelectronics Inc的创立源于几位工程师对半导体技术的深刻理解和市场需求的敏锐洞察。他们看到在快速发展的电子行业中,高性能、低功耗的半导体产品具有巨大的市场潜力。于是,他们决定共同创立Benchmarq Microelectronics Inc,致力于研发和生产先进的半导体产品。在创立初期,公司面临着资金短缺、技术挑战和市场竞争等多重困难。然而,通过团队的努力和合作,公司逐渐攻克了技术难关,推出了一系列受到市场欢迎的半导体产品,初步实现了盈利。

Arctic Silicon Devices公司的发展小趣事

在电子行业的早期阶段,Arctic Silicon Devices以其卓越的技术研发能力脱颖而出。公司成功研发出一款低功耗、高性能的芯片,满足了市场对移动设备日益增长的需求。这一技术突破让Arctic Silicon Devices在业内赢得了良好的声誉,并吸引了大量合作伙伴和投资者。随着公司业务的不断拓展,Arctic Silicon Devices逐渐成为了行业内的佼佼者。

Genesys Logic公司的发展小趣事

进入21世纪,“General Microcircuits”开始实施全球化战略,先后在美国、欧洲、亚洲等地建立研发中心和生产基地。通过全球化布局,公司不仅能够更快地响应不同地区的市场需求,还能充分利用各地的资源优势和技术优势,进一步提升产品的竞争力和市场占有率。同时,公司还加强了与国际知名电子制造商的战略合作,共同推动半导体技术的创新与发展。

CEVA, Inc公司的发展小趣事

CEVA, Inc.最初于1999年11月22日在美国特拉华州注册成立,起初的名称并非CEVA。随着公司的业务扩展和技术积累,其在2002年11月进行了更名,成为ParthusCeva公司。这一更名反映了公司业务的进一步发展和市场定位的调整。随后,在2003年12月,公司再次更名为CEVA公司,这一名称沿用至今,成为无线连接和智能传感技术领域的知名品牌。

Greenwich Instruments Ltd公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,Greenconn Corp积极推动智能制造转型。公司引进先进的生产设备和技术,优化生产流程和管理模式,提高生产效率和产品质量。同时,公司还加强与高校、科研机构的合作,共同研发智能制造关键技术,推动智能制造技术在连接器生产领域的应用。这些努力不仅提升了Greenconn Corp的竞争力,还为公司的可持续发展奠定了坚实基础。

BOPLA公司的发展小趣事

近年来,随着环保意识的提高和政府对塑料污染治理的关注,BOPLA积极响应国家号召,开始研发和推广生物基可降解材料。经过多年的努力,公司成功推出了BOPLA生物基膜材,实现了产品的绿色转型。这一创新不仅有助于减少塑料污染,还为公司赢得了更多的环保意识和绿色消费市场的青睐。

问答坊 | AI 解惑

基于FPGA的PCI总线接口设计

摘 要 :PCI是一种高性能的局部总线规范,可实现各种功能标准的PCI总线卡。本文简要介绍了PCI总线的特点、信号与命令,提出了一种利用高速FPGA实现PCI总线接口的设计方案。 关键词 :PCI总线;信号;命令;协议 在现代数据采集及处理系统中,ISA ...…

查看全部问答>

插补算法

插补算法!!!!!!!!!!!!!!!!…

查看全部问答>

数字信号处理的FPGA实现(好书共享)

数字信号处理的FPGA实现(好书共享)…

查看全部问答>

关于步进电机的疑问

我想在坐标(X1,Y1),(X2,Y2)之间走一条直线,但我不知道怎么编写程序的,还有它与电机的步数有什么样的关系呢?知道的告诉我,谢谢。…

查看全部问答>

DZK后缀的文件用什么软件开

DZK,HZK后缀的文件用什么软件开。…

查看全部问答>

理解下一代数据采集技术

  来源:NI : 理解下一代数据采集技术——USB和Wi-Fi数据采集的优势美国国家仪器有限公司 Graham Green过去20年中,数据采集从一种应用有限的技术已经发展为可适用于各种高性能测量应用的平台。通过软件为核心的图形化编程和基于PC的模 ...…

查看全部问答>

arm9 自己编译的2.6.12内核 屏幕整体左移

我买了一块 LJD-2440 带一块CT35T触摸屏 自己用厂家提供的Linux2.6.12包编译内核成功 跟光盘上带的官方编译的内核大小差了几百字节 将zImage 烧到NAND FLASH后启动系统 发现一切似乎正常  屏幕整体向左上偏移 分别用3.4.1和3.3. ...…

查看全部问答>

关于没有通电的FPGA自动工作的奇怪现象

这几天在工作中遇到一个很奇怪的现象。我有一块FPGA的板子(I/O使用+3.3V,内核使用+1.2V),但是使用时我没有对它进行供电,而是将这块板子的信号地和另一块板子连接起来,从另一块板子上引出一个+3.3V接到FPGA的随意一个I/O管脚,此时FPGA及其外 ...…

查看全部问答>

求一张PCB图,原理图已给出,急!急!急!

毕业论文要求一张PCB图,原理图已有,全自动应急灯的、、、急!急!急! 求帮忙...........联系QQ:339739667、:carnation:…

查看全部问答>

launchpad 按键控制LED

void main( void ){   // Stop watchdog timer to prevent time out reset  WDTCTL = WDTPW + WDTHOLD;    P1DIR |= BIT0 | BIT6;  //俩灯配置为输出    P1DIR &= ~BIT3;     ...…

查看全部问答>