历史上的今天
返回首页

历史上的今天

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

正在发生

2020年02月24日 | PIC C语言编程_PICC中的变量定义

2020-02-24 来源:eefocus

简介:PIC C语言编程_PICC中的变量定义


1)PICC中的基本变量类型


PICC支持的基本变量类型见表1。PICC遵循Little-endian标准,多字节变量的低字节放在存储空间的低地址,高字节放在高地址。

表1:PICC支持的基本变量类型

表1:PICC支持的基本变量类型


2)PICC中的高级变量


基于表1的基本变量,除了bit型位变量外,PICC完全支持数组、结构和联合等复合型高级变量,这和标准的C语言所支持的高级变量类型没有什么区别。例如:


数组:unsignedintdata[10];


结构:structcommInData{


unsignedcharinBuff[8];


unsignedchargetPtr,putPtr;


};


联合:unionint_Byte{


unsignedcharc[2];


unsignedinti;


};


3)PICC中的局部变量


PICC把所有函数内部定义的auto型局部变量放在bank0。为节约宝贵的存储空间,它采用了一种被叫做“静态覆盖”的技术来实现局部变量的地址分配。其大致的原理是在编译器编译原代码时扫描整个程序中函数调用的嵌套关系和层次,算出每个函数中的局部变量字节数,然后为每个局部变量分配一个固定的地址,且按调用嵌套的层次关系各变量的地址可以相互重叠。利用这一技术后所有的动态局部变量都可以按已知的固定地址地进行直接寻址,用PIC汇编指令实现的效率最高,但这时不能出现函数递归调用。PICC在编译时会严格检查递归调用的问题并认为这是一个严重错误而立即终止编译过程。既然所有的局部变量将占用bank0的存储空间,因此用户自己定位在bank0内的变量字节数将受到一定的限制,在实际使用时需注意。


4)PICC中的位变量


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


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


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


位偏移=0x123%8=3


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


PIC单片机的位操作指令是非常高效的。因此,PICC在编译原代码时只要有可能,对普通变量的操作也将以最简单的位操作指令来实现。假设一个字节变量tmp最后被定位在地址0x20,那么


tmp|=0x80 =>bsf 0x20,7


tmp&=0xf7 =>bcf 0x20,3


if(tmp&0xfe)=>btfsc0x20,0


即所有只对变量中某一位操作的C语句代码将被直接编译成汇编的位操作指令。虽然编程时可以不用太关心,但如果能了解编译器是如何工作的,那将有助于引导我们写出高效简介的C语言原程序。在有些应用中需要将一组位变量放在同一个字节中以便需要时一次性地进行读写,这一功能可以通过定义一个位域结构和一个字节变量的联合来实现,例如:


union{


struct{


unsignedb0:1;


unsignedb1:1;


unsignedb2:1;


unsignedb3:1;


unsignedb4:1;


unsignedb5:1;


unsigned:2;//最高两位保留


}oneBit;


unsignedcharallBits;


}myFlag;


需要存取其中某一位时可以


myFlag.oneBit.b3=1;//b3位置1


一次性将全部位清零时可以


myFlag.allBits=0;//全部位变量清0


当程序中把非位变量进行强制类型转换成位变量时,要注意编译器只对普通变量的最低位做判别:如果最低位是0,则转换成位变量0;如果最低位是1,则转换成位变量1。而标准的ANSI-C做法是判整个变量值是否为0。另外,函数可以返回一个位变量,实际上此返回的位变量将存放于单片机的进位位中带出返回。

推荐阅读

史海拾趣

格瑞宝(GP)公司的发展小趣事

随着产品线的拓展和技术实力的增强,格瑞宝开始积极拓展国内外市场。公司不仅在消费电子和工业类电子领域取得了显著成绩,还努力将产品和服务拓展到通信、汽车电子等新兴领域。同时,格瑞宝注重品牌建设,通过提供优质的产品和服务,赢得了广大客户的信赖和好评。公司的品牌知名度和影响力不断提升,为公司的长远发展奠定了良好基础。

Altera (Intel)公司的发展小趣事

格瑞宝公司致力于功率器件的研发与销售,其产品线不断丰富和完善。从最初的MOSFET产品系列,到后来逐渐扩展到DIODE、BJT、IC集成电路等多个领域,格瑞宝始终坚持技术创新,不断推出符合市场需求的新产品。特别是在SGT MOST工艺方面,格瑞宝达到了国内领先水平,这一技术突破不仅提升了产品的性能和质量,也进一步巩固了公司在行业内的地位。

DDK公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。DDK公司深知这一点,因此始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测的每一个环节都严格把控,确保每一件产品都符合高标准、严要求。这种对品质的执着追求,让DDK公司的产品在市场上赢得了良好的声誉,赢得了消费者的信任和忠诚。

BESTECH公司的发展小趣事

DDK公司在发展过程中,始终牢记社会责任,积极履行企业公民的义务。公司积极参与公益事业,关注环境保护和社会发展,为社会做出了积极贡献。同时,DDK公司还积极推动行业健康发展,与同行企业共同维护市场秩序和公平竞争环境。这种社会责任的担当,让DDK公司在电子行业中树立了良好的企业形象。

Delta Electronics公司的发展小趣事

近年来,网络安全问题日益严重。2022年,Delta Electronics遭遇了一起勒索软件攻击。面对这一挑战,公司迅速启动了应急响应机制,与专业的网络安全机构合作,成功阻止了攻击者的进一步行动。这一事件虽然给公司带来了一定的损失,但也让Delta更加重视网络安全问题,加强了公司网络安全防护体系的建设。

Cornerstone Sensors公司的发展小趣事

Cornerstone Sensors一直致力于技术创新和产品升级。公司不断投入研发资源,探索传感器技术的新应用和新领域。例如,公司率先推出了具有自校准功能的智能传感器,大大提高了产品的使用便捷性和准确性。此外,Cornerstone Sensors还积极探索物联网、人工智能等新兴技术与传感器的结合点,为行业发展注入了新的活力。

问答坊 | AI 解惑

毕业论文 无线电子音乐门铃

哪位朋友有。帮帮忙吧! zhengzhouyuchao@126.com…

查看全部问答>

CE编译Directx Show播放声音,代码正常,但不能创建COM组件(问题复杂,请仔细看描述)

这几天我可被CE5头都搞大了? 先是 PlatForm Builder 编译的CE 不能播放音乐。 http://topic.eeworld.net/u/20100118/21/f22dfbcd-987f-4651-b1df-4a578fae77a2.html。编译能通过,但一播放就退出! 重装系统才解决!(这个问题解决了,但没有搞 ...…

查看全部问答>

mc55模块上电20秒后自动关机问题

将mc55模块/IGT引脚置低电平后,mc55模块上电开机,但20秒后mc55模块会自动关机.每次都是这样,找不到原因,请各位指教.谢谢…

查看全部问答>

wince4.2 USB口为什么会出现这种现象

当我插上u盘的时候,不出现盘标。但是当我拔掉u盘的时候就出现盘标了!这是怎么回事!有谁遇到过这中问题,如何解决?…

查看全部问答>

求教香版主EKSTM32F107VC-PKT问题

香版主您好,我手上有EKSTM32F107VC-PKT的开发板,这个板子资料只能从网上找一些,官方的好像没有,这两天在弄以太网的程序,根据http://www.stmsky.com/bbs/thread-2956-1-1.html这个帖子上的修改步骤调试程序,一改程序debug后就不能正常进 ...…

查看全部问答>

51下广告灯数码管和MSP430数码管

本来只是想的实现一个开关的,但是最近自己拖拉了所以再加上点功能吧,这个功能就是广告灯的左右移动,不过我加了一个可以开关控单灯的输入。本来准备430也是一样的不过今天拿到开发板发现没有那么多LED⊙﹏⊙,所以就直接用数码管了。 #include ...…

查看全部问答>

关于ADS1115的一点问题

本帖最后由 paulhyde 于 2014-9-15 03:53 编辑 最近一直在调ADS1115这款AD,用I/O口模拟的I2C时序,结果总是不理想。读出来的数字我表示看不出规律,输入什么都不接有的时候是满值65535,有的时候乱跳。下面是我的程序,大家看下。我感觉我写的时 ...…

查看全部问答>

【PSOC4心得】6个夜晚完成了系统,智能调整平台分享

首先简单介绍一下这个系统,该系统由矩阵键盘、电源模块、PSOC4、lcd12864、舵机2个、亚克力板2块黑色、支架一套、角度传感器一个、语音模块 介绍系统的功能:可以任意设置平台倾斜的角度,只需使用按键输入你想设定的方向即可,平台会根据角度传 ...…

查看全部问答>