PICC——基本知识(变量)

2020-02-14来源: eefocus关键字:PICC  基本知识  变量

利用这一技术后所有的动态局部变量都可以按已知的固定地址地进行直接寻址,用 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 事先没有被绝对定位,那就不能用上面的位变量定位方式。

关键字:PICC  基本知识  变量 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488248.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PICC编译指针详解
下一篇:PICC——嵌入汇编

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PICC ---- 函数
简介:一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。函数的代码长度限制PICC决定了C原程序中的一个函数经编译后生成的机器码一定会放在同一个程序页面内。中档系列的 PIC 单片机其一个程序页面的长度是 2K字,换句话说,用 C 语言编写的任何一个函数最后生成的代码不能超过 2K字。一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。如果为实现特定的功能确实要连续编写很长的程序,这时就必须把这些连续的代码拆分成若干函数,以保证每个
发表于 2020-02-13
PICC ---- 各种变量修饰
简介:如果在一个C程序文件中要使用一些变量但其原型定义写在另外的文件中,那么在本文件中必须将这些变量声明成“extern”外部类型。extern — 外部变量声明如果在一个 C 程序文件中要使用一些变量但其原型定义写在另外的文件中,那么在本文件中必须将这些变量声明成“extern”外部类型。例如程序文件 code1.c中有如下定义:bank1 unsigned char var1, var2; //定义了bank1 中的两个变量在另外一个程序文件 code2.c 中要对上面定义的变量进行操作,则必须在程序的开头定义:extern bank1 unsigned char var1, var2; //声明位于bank1的外部变量
发表于 2020-02-13
PICC中主程序和中断调用同一个子程序的问题
#pragma interrupt_level 1void function (void){}然后在中断函数那写句#pragma interrupt_level 1void interrupt(void){function();}void main (void){function();}程序中出现重入现象是错误的。PICC具有的重入保护可以防止这种现象的出现。换言之,在PIC架构的单片机中,楼主的做法是错误的。主程序和中断程序是不允许调用同一子程序的。比如子程序A,在主程序中被调用,这时发生中断,该子程序又在中断程序中被调用,这时就发生程序重入。在别的构造的单片机中,如果堆栈可以扩展,则重入问题可以解决,但PIC的堆栈的层数固定
发表于 2020-02-13
PIC8位在PICC中的数据类型
简介:PIC8位MCU的内存都是8位字节结构的,所以PICC中对于数据的划分都是以8位为基础的。在汇编中,我们对一个地址为0X20的内存附值:movlw 255;movwf 0x20;但一个内存是8位结构,能表示最大的数是255。要是超过了会怎么样呢?movlw 256;movwf 0x20;通过DEBUG后,可以看出0X20中的值不是256,而是0了。这里可以看出PIC处理器计算过程是当计算结果超过内存能容纳的最大数(也就是所谓溢出),则自动抛弃最高位。如下:255 - 25611111111-100000000256的2进制有9位,于是PIC处理器就自动抛弃最高位1,剩下的8个0放入内存,于是就成了0了。这过程是由硬件自动
发表于 2020-02-13
PIC单片机如何从汇编转向PICC
一、如何从汇编转向PICC首先要求你要有C语言的基础。C代码的头文件一定要有#include,它是很多头文件的集合,C编译器在pic.h 中根据你的芯片自动载入相应的其它头文件。这点比汇编好用。载入的头文件中其实是声明芯片的寄存器和一些函数。static volaTIle unsigned char TMR0 @ 0x01;staTIc volaTIle unsigned char PCL @ 0x02;staTIc volatile unsigned char STATUS @ 0x03;可以看出和汇编的头文件中定义寄存器是差不多的。如下:TMR0 EQU 0X01;PCL EQU 0X02;STATUS EQU 0X03;都是
发表于 2020-01-06
PIC单片机如何从汇编转向PICC
通过PICC编译环境下,对PIC单片机程序进行操作研究
PICC基本上符合ANSI标准,但是不支持函数的递归调用,其主要原因是PIC单片机特殊的堆栈结构。PIC单片机中的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法;另外在PIC单片机中实现软件堆栈的效率也不是很高。为此,PICC编译器采用一种“静态覆盖”技术,以实现对C语言函数中的局部变量分配固定的地址空间。经这样处理后产生出的机器代码效率很高。当代码量超过4KB后,C语言编译出的代码长度与全部用汇编代码实现的差别已经不是很大(<10%),当然前提是在整个C代码编写过程中需时时注意所编写语句的效率。PICC中的变量类型和标准C语言一样,这里不再重复。为了使编译器产生最高效的机器码,PICC把单片机中
发表于 2019-12-11
通过PICC编译环境下,对PIC单片机程序进行操作研究
小广播
何立民专栏 单片机及嵌入式宝典

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

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