3.2 指向ROM常数的指针
如果一组变量是已经被定义在ROM区的常数,那么指向其的指针可以这样定义:
3.3 指向函数的指针
因为在PIC单片机这一特定的架构上实现函数指针调用的效率不高,因此,除非特殊算法的需要,建议大家尽量不要使用函数指针。
4 PICC中的子程序和函数
中档系列的PIC单片机程序空间有分页的概念,但用C语言编程时基本不用过多关心代码的分页问题。因为所有函数或子程序调用时的页面设定(如果代码超过一个页面)都由编译器自动生成的指令实现。
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”来开始汇编指令段,用