现在,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容量,在终究衔接时会报错,大致信息如下:
链接器提示,总共有Oxl2c(300)字节预备放到bankl中,但bankl容量不行。尽管变量地点的bank定位有必要由编程员自己决议,但编写源程序时在进行变量存取操作前无需再特意编写设定bank的指令。C编译器会依据所操作的目标主动生成对应bank设定的汇编指令。为防止频频的bank切换以进步代码功率,尽量把完成同一使命的变量定位在同一个bank内;对不同bank内的变量进行读写操作时也尽量把坐落相同bank内的变量归并在一起进行接连操作。
bit型位变量只能是大局的或静态的。PICC将把定位在同一bank内的8个位变量合并成一个字节存放于一个固定地址。PICC对整个数据存储空间实施位编址,Ox000单元第O位位地址是0x0000,以此类推,每个字节有8个位地址。假如一个位变量flagl被编址为Oxl23,那么实践的存储空间坐落:
即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.2 指向ROM常数的指针
假如一组变量是现已被界说在ROM区的常数,那么指向其的指针能够这样界说:
3.3 指向函数的指针
由于在PIC单片机这一特定的架构上完成函数指针调用的功率不高,因而,除非特别算法的需求,主张我们尽量不要运用函数指针。
4 PICC中的子程序和函数
中档系列的P%&&&&&%单片机程序空间有分页的概念,但用C言语编程时根本不必过多关怀代码的分页问题。由于一切函数或子程序调用时的页面设定(假如代码超越一个页面)都由编译器主动生成的指令完成。