文档介绍:使用HITECH编译器编写C程序的心得
用 C 语言来开发单片机系统有很多好处例如:编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高、等等。但在单片机上用 C 语言写程序和在 PC 机上写程序绝对不能简单等同。因为单片机内的资源非常有限,控制的实时性要求又很高,因此,写单片机程序需要对单片机及编译器有足够的了解才能写出高效的代码。
在使用PIC单片机编程时,尤其的对于软件工程师来说,漂亮的语法,完美的编程思想,系统的函数构造等等都是考虑的重点,也是用软件思维评判代码的标准。但是,对于单片机及编译器的了解也是编写程序不可忽视的部分。他们在提高空间利用率和代码运行速度上往往有着不可替代的作用。对他们多一些了解也会让调试程序的过程豁然开朗。
现在我以HETICH编译器为例,根据工作中程序编写经历介绍几点提高编程效率的方法。
优化配置问题
很多时候,对程序的编写主张不开优化,由于对汇编不是十分了解,的优化器还是很稳定的。而且我曾经做过一个小试验,打开优化,可以节约很多资源。也有可靠资料显示,开启优化可以节约20%左右的。如果对自己所编写的代码有足够的信心完全可以开启优化。
项目中所有的 C 原程序都将通过 C 编译器编译成机器码,这些选项决定了 C 编译器是如何工作的。所有选项又分为两组:普通选项(General)和高级选项(Advanced) ,分别见C 编译器的普通选项最重要的就是针对代码优化的设定。如果没有特殊原因,应该设定全局优化级别为 9 级(最高级别优化) ,同时使用汇编级优化,这样最终得到的代码效率最高(长度和执行速度两方面) 。如果碰到的一些问题很大可能是自己的程序问题,例如一些变量应该是 volatile 型但编程员没有明确定义,在优化前程序可以正常运行,一旦使用优化,程序运行就出现异常。
但是使用优化后可能对原程序级的调试带来一些不便之处。一次编写代码,为调试程序的临时变量无法中断。可能是因 可能会重组编译后的代码,例如多处重复的代码可能会改成同一个子程序调用以节约程序空间,这样在调试过程中跟踪原程序时可能会出现程序乱跳的现象。若为了强调更直观的代码调试过程,你可以将优化级别降低甚至关闭所有优化功能,这样调试时程序的运行就可以按部就班了。
二、汇编程序的使用问题
HITECH编译器支持内联汇编的使用,这给程序的编写带来很大的方便。因为单片机的一些特殊指令操作在标准的 C 语言语法中没有直接对应的描述,例如 PIC 单片机的清看门狗指令“clrwdt”和休眠指令“sleep”;单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中必然会出现 C 和汇编混合编程的情形,在代码中常见的有如下指令:
asm("clrwdt");
asm("sleep");
asm("nop");
同时单片机中的汇编指令实现有些功能的效率要高与C。只要通过试验就可以用于代码中。给出两个实例:
1、实现循环右移若干位
unsigned int RR_Shift16(unsigned int var, unsigned char count)
{
while(count--) //移位次数控制
{
#asm //开始嵌入汇编
rrf ?_RR