PICC 编译环境编写PIC单片机程序的探讨

发布者:炉火旁的Yye最新更新时间:2015-04-16 来源: eechina关键字:PICC  编译环境  PIC单片机 手机看文章 扫描二维码
随时随地手机看文章
目前,Microchip公司生产的PIC系列单片机以其低成本、低功耗、高性能、开发速度快且一次性用户可编程等优点迅速占领了国内市场,成为国内销售量最大的单片机。但国内介绍其C语言开发工具的书籍和文章却比较少,在开发过程中给广大程序员带来了许多困难和不便。

Microchip公司没有针对中低档系列PIC单片机的C语言编译器,但很多专业的第三方公司提供众多支持PIC单片机的C语言编译器,常见的有 Hitech、CCS、IAR以及Bytecraft等公司。Hitech公司的PICC编译器稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到广泛认可。因此,本文主要以Hi—Tech PICC为基础,介绍PIC的C语言的基本特点。

1 HiTech PICC语言的特点

PICC基本上符合ANSI标准,但是不支持函数的递归调用,其主要原因是 PIC单片机特殊的堆栈结构。PIC单片机中的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法;另外在PIC单片机中实现软件堆栈的效率也不是很高。为此,PICC编译器采用一种“静态覆盖”技术,以实现对C语言函数中的局部变量分配固定的地址空间。经这样处理后产生出的机器代码效率很高。当代码量超过4 KB后,C语言编译出的代码长度与全部用汇编代码实现的差别已经不是很大(<10%),当然前提是在整个C代码编写过程中需时时注意所编写语句的效率。

2 PICC中的变量

PICC中的变量类型和标准C语言一样,这里不再重复。为了使编译器产生最高效的机器码,PICC把单片机中数据寄存器的bank交由编程员自己管理,因此在定义用户变量时必须自己决定这些变量具体放在哪一个bank中。如果没有特别指明,所定义的变量将被定位在13ank()。定义在其他bank内的变量前面必须加上相应的baruk序号,例如:

    bankl lresigned char temp; //变量定位在bankl中

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

1.gif 

链接器提示,总共有Oxl2c(300)字节准备放到bankl中,但bankl容量不够。虽然变量所在的bank定位必须由编程员自己决定,但编写源程序时在进行变量存取操作前无需再特意编写设定bank的指令。C编译器会根据所操作的对象自动生成对应bank设定的汇编指令。为避免频繁的bank切换以提高代码效率,尽量把实现同一任务的变量定位在同一个bank内;对不同bank内的变量进行读写操作时也尽量把位于相同bank内的变量归并在一起进行连续操作。

bit型位变量只能是全局的或静态的。PICC将把定位在同一bank内的8个位变量合并成一个字节存放于一个固定地址。PICC对整个数据存储空间实行位编址,Ox000单元第O位位地址是0x0000,以此类推,每个字节有8个位地址。如果一个位变量flagl被编址为Oxl23,那么实际的存储空间位于:

2.gif 

即flagl位变量位于地址为0x24字节的第3位。在程序调试时如果要观察flagl的变化,必须观察地址为Ox24的字节而不是0x123。PICC在编译原代码时只要有可能,对普通变量的操作也将以最简单的位操作指令来实现。假设一个字节变量tmp最后被定位在地址Ox20,那么tmp |=Ox80=>bsf Ox20.7另外,函数可以返回一个位变量,返回的位变量将存放于单片机的进位位中返回。

3 PICC中的指针

3.1 指向RAM的指针

PICC在编译C源程序时,将指向RAM的指针操作最终用FSR来实现间接寻址。FSR能够直接连续寻址的范围是256 B,所以一个指针可以同时覆盖2个bank的存储区域(bankO/1或1aank2/3,一个bank区域是128 B)。要覆盖最大512 B的内部数据存储空间,在定义指针时必须明确指定该指针适用的寻址区域。例如:

3.gif 

3.2 指向ROM常数的指针

如果一组变量是已经被定义在ROM区的常数,那么指向其的指针可以这样定义:

4.gif 

3.3 指向函数的指针

因为在PIC单片机这一特定的架构上实现函数指针调用的效率不高,因此,除非特殊算法的需要,建议大家尽量不要使用函数指针。

4 PICC中的子程序和函数

中档系列的PIC单片机程序空间有分页的概念,但用C语言编程时基本不用过多关心代码的分页问题。因为所有函数或子程序调用时的页面设定(如果代码超过一个页面)都由编译器自动生成的指令实现。[page]

4.1 函数的代码长度限制

PICC决定了C源程序中的一个函数经编译后生成的机器码一定会放在同一个程序页面内。中档系列PIC单片机的一个程序页面的长度是2 KB,用C语言编写的任何一个函数最后生成的代码不能超过2 KB。如果为实现特定的功能确实要连续编写很长的程序,这时就必须把这些连续的代码拆分成若干函数,以保证每个函数最后编译出的代码不超过一个页面空间。

4.2 调用层次的控制

PIC单片机采用硬件堆栈,所以编程时函数的调用层次会受到一定限制。一般PIC系列的中档单片机硬件堆栈深度为8级。程序员必须自己控制子程序调用时的嵌套深度以符合这一限制要求。PICC在最后编译链接成功后可以生成一个链接定位映射文件 (*.map),在此文件中有详细的函数调用嵌套指示图“call graph”,有些函数调用是编译时自动加入的库函数,这些函数调用从C源程序中无法直接看出,但在嵌套指示图上则一目了然。

5 C语言和汇编语言混合编程

单片机的一些特殊指令操作在标准的C语言语法中没有直接对应的描述,例如PIC单片机的清看门狗指令“clrwdt”和休眠指令“sleep”;单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。在C程序中嵌入汇编指令有2种方法。

①如果只需要嵌入少量几条汇编指令,PICC提供了一个类似于函数的语句:

    asm(“clrwdt”):
    这是在C源程序中直接嵌入汇编指令的最直接最容易的方法。 
    ②如果需要编写一段连续的汇编指令,PICC支持另外的一种语法描述:用“#asm”来开始汇编指令段,用

5.gif 

5.1 汇编指令寻址C语言定义的全局变量

所有C语言中定义的符号在编译后将自动在前面添加下划线“一”。因此,若要在汇编指令中寻址C语言定义的各类变量,一定要在变量前加上“一”符号,例如上例中的count是在C语言中定义的无符号全局变量,在汇编语言中只需在其前面加上“一”符号就可进行访问了。另外,对于C语言中定义的多字节全局变量,例如C语言中的如下定义:

6.gif 

5.2 汇编指令寻址C函数的局部变量

前面已经提到,PICC对自动型局部变量(包括函数调用时的入口参数)采用一种“静态覆盖”技术,对每一个变量确定一个固定地址(位于bankO),嵌入的汇编指令对其寻址时只需采用数据寄存器的直接寻址方式即可,因此关键是要知道这些局部变量的寻址符号。建议读者先编写一小段C代码,其中有最简单的局部变量操作指令,把此源代码编译成对应的PICC汇编指令;查看C编译器生成的汇编指令是如何寻址这些局部变量的,自己编写的行内汇编指令就采用同样的寻址方式。

相对于汇编语言,用C语言编程的优势是毋庸置疑的:开发效率大大提高、人性化的语句指令及模块化的程序易于日常管理和维护、程序在不同平台间移植方便。所以既然使用C语言编程,就应该尽量避免嵌入汇编指令或编写汇编指令模块文件。例如:

变量的循环右移操作用C语言实现非常不方便,PIC单片机已有对应的移位操作汇编指令,因此用嵌入汇编的形式实现效率最高。对移位次数的控制,实际上变量 countl的递减判零也可以直接用汇编指令实现,这样可节约代码,但用标准C语言描述更直观、更易于维护。

6 注意事项

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

②当程序中把非位变量进行强制类型转换成位变量时,要注意编译器只对普通变量的最低位做判别:若最低位是0,则转换成位变量O;若最低位是1,则转换成位变量1。

③由于PIC系列单片机的内部资源十分有限,所以在允许的条件下应尽量使用无符号字符型变量,以节约空间。

④PICC对绝对定位的变量不保留地址空间,例如:

7.gif 

所以请读者慎用。

⑤尽量使用全局变量进行参数传递,使用全局变量最大的好处是寻址直观,只需在C语言定义的变量名前增加一个下划线符即可在汇编语句中寻址;使用全局变量进行参数传递的效率也比形参高。

⑥对于多字节变量(如int型、float型变量等)PICC遵循Little endian标准,即低字节放在存储空间的低地址,高字节放在高地址,编程时需注意。

结语

一般C语言产生的代码是比较繁琐的,所以要写出高质量、实用的C语言程序,就必须对单片机体系结构和硬件资源作详尽的了解。用C语言开发PIC系列单片机系统软件具有编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等优点,因此C语言编程在单片机系统设计中的应用必将越来越广泛。

参考文献

   1. 蔡纯洁.邢武 PIC 16/17单片机原理和应用 1997
   2. Hitech Software PICC ANSI C Compiler User's Guide 2002
关键字:PICC  编译环境  PIC单片机 引用地址:PICC 编译环境编写PIC单片机程序的探讨

上一篇:USB传感器与存储器在数据记录中的应用
下一篇:采用PIC16C54的计数器

推荐阅读最新更新时间:2024-03-16 13:58

PIC单片机-冲压出料监控
一个小产品,实现功能: 需在两次冲压间隙,冲压件必须经过冲压监控光幕出料。如果在设定时间内没有出料,则必须要停机,以免冲坏模具,不用时一定可关机,而不影响工作,监控时间可调节。该机本身已有光电,为气压连冲,每分钟约45次。 ------------------------------------------------------------------------------------------------- PIC16C54单片机,程序中的时间调整可参考“无AD口,经IO口测量温度(asm程序)” 实验时单片机管脚测到的波形: --------------------------------
[单片机]
<font color='red'>PIC单片机</font>-冲压出料监控
PIC单片机的复位系统模块
PIC16F87X系列单片机的复位功能设计得比较完善,引起单片机内部复位的条件和原因可以大致归纳成以下5种.   1.上电复位   每次单片机加电时,上电复位电路都要对电源电压VDD的上升过程进行检测,当VDD值上升到规定值1.6~1.8V时,就产生一个有效的复位信号,需经过72ms加1024个时钟周期的延时,才会使单片机复位。   2.人工复位(单片机在执行程序期间)   无论是单片机在按预先设定的正常顺序运行程序,还是出现单片机进入不可预知的某一个死循环,都必须认为单片机在执行程序。单片机在执行程序期间,只要在人工复位端MCLR加入一个低电平信号,就会令其复位。   3.人工复位(单片机在睡眠期间)   单片机处在睡眠
[单片机]
PIC单片机浮点数与十进制数转换
  重点说明浮点数的格式,十进制数与浮点之间的相互转换以及程序设计。   在我们设计的仪表中采用PIC系列单片机,碰到了浮点数的运算问题,查阅其有关资料发现,其浮点数的格式及其与十进制数之间的转换,与我们常用的MCS-51单片机所提供的三字节、四字节浮点数完全不同,本文将说明其浮点数的格式及其与十进制数之间的转换和程序设计步骤。   1 浮点数的格式   Microchip公司单片机所采用的浮点数格式是IEEE-754标准的变异型。32位浮点数格式为:      其中:×表示一位二进制数0或1;eb 为指数的偏差;S为浮点数的符号位,S=0为正数,S=1为负数;小数点“·”在符号位S的右边;BY0 BY1 BY2
[单片机]
<font color='red'>PIC单片机</font>浮点数与十进制数转换
基于PIC单片机控制温度传感器测温的设计
试温度,并用1602显示屏显示温度//1、第一行显示:Temperature//2、第二行显示:实测温度值//********** //************************************************** //实验目的: //熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度 //1、第一行显示:Temperature //2、第二行显示:实测温度值 //************************************************** //************************************************** //硬件
[单片机]
基于<font color='red'>PIC单片机</font>控制温度传感器测温的设计
PIC单片机的端口RB中断的设计思路及电路设计
1. 设计思路   本例利用PIC16F877的RB端口中断设计一个抢答器,该抢答器可供不多于4个参赛队或者个人的抢答比赛场合使用。   每个参赛队的座位前安装1只抢答按钮开关和1个信号灯。主持人的座位前安装1只复原按钮开关、1只蜂呜器和1个抢答器工作状态指示灯。   每当主持人发出允许抢答的命令之后,哪个队先按下座位J的按钮开关,该座位的信号灯就先被点亮, 司时封锁其他按钮开关的活动,并且熄灭主掎人座位阝的状态指小灯和发出3声类似于电话振铃的提示声,以声明此次抢答动作已经完成。   在主持人确认后,按下“复原”按钮,状态指示灯重新点亮,并且同时发出“笛、笛”声,为下一次的抢答做好准备。   2.电路设计   电路原理
[单片机]
<font color='red'>PIC单片机</font>的端口RB中断的设计思路及电路设计
PIC单片机的原理介绍
简介:据统计,我国的单片机年容量已达1-3亿片,且每年以大约16%的速度增长,但相对于世界市场我国的占有率还不到1%。这说明单片机应用在我国才刚刚起步,有着广阔的前景。培养单片机应用人才,特别是在工程技术人员中普及单片机知识有着重要的现实意义。 本文主要介绍PIC单片机的原理。 当今单片机厂商琳琅满目,产品性能各异。针对具体情况,我们应选何种型号呢?首先,我们来弄清两个概念:集中指令集(CISC)和精简指令集(RISC)。采用CISC结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构。它的指令丰富,功能较强,但取指令和取数据不能同时进行,速度受限,价格亦高。采用RISC结构的单片机数据线和指令线分离,即所谓哈佛结构。这使
[单片机]
PIC单片机ad采样在LCD上显示
/* Main.c file generated by New Project wizard * * Created: 周二 4月 10 2018 * Processor: PIC18F452 * Compiler: MPLAB C18 */ #include p18f452.h #define RW PORTBbits.RB5 #define RS PORTBbits.RB6 #define EN PORTBbits.RB7 #define P0 PORTD #define ADGO ADCON0bits.GO void tmr(void); void KeyInterrupt1 (void); //中断服务函数 void
[单片机]
PIC单片机:读-修改-写问题及解决方案
  何谓读-修改-写,导致的问题及其解决之道:   只要PICmicro的命令,所处理的FILE (暂存器,内存,和I/O的统称),其最终的值,和命令处理前的值有关,那么,这种命令便是所谓的读-修改-写命令。因为这类命令的操作,可以再细分为三个小步骤,即是读(READ),修改(MODIFY),接著才是写(WRITE)。   如:ADDWF,DECF,IORWF,XORWF,BSF,BCF,‥‥等等皆是。   在使用这类命令的时候,如果所处理的FILE是I/O, 就必须要特别小心。因为,假设任务电压为5V;而您在PORTB的8支脚,没有串接电阻,分别接了8颗二极管(也许是LED)到地。如果,您在先前下了"BSF PORTB,0
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved