微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机 C编程技巧

PIC单片机 C编程技巧

时间:11-13 来源:互联网 点击:
全局变量等。对于一些常用的功能模块,还可以封装为一个应用程序库,以
便需要时可以直接调 用。但是在使用模块化时,如果将模块分成太细太小,又会导致程序的执行效率变低(进
入和退出一个函数时保护和恢复寄存器占用了一些时间)。
4、 定义常数
在程序化设计过程中,对于经常使用的一些常数,如果将它直接写到程序中去,一旦常数的数值发生
变化,就必须逐个找出程序中所有的 常数,并逐一进行修改,这样必然会降低程序的可维护性。因此,应
尽量当采用预处理命令方式来定义常数,而且还可以避免输入错误。
5、减少 判断语句
能够使用条件编译(ifdef)的地方就使用条件编译而不使用if 语句,有利于减少编译生成的代码的长度。
6、表达式
对 于一个表达式中各种运算执行的优先顺序不太明确或容易混淆的地方,应当采用圆括号明确指定它
们的优先顺序。一个表达式通常不能写得太复杂,如果表 达式太复杂,时间久了以后,自己也不容易看得
懂,不利于以后的维护。
7、函数
对于程序中的函数,在使用之前,应对函数的类型进行 说明,对函数类型的说明必须保证它与原来定
义的函数类型一致,对于没有参数和没有返回值类型的函数应加上“void”说明。如果果需要缩短代码的 长
度,可以将程序中一些公共的程序段定义为函数,在Keil 中的高级别优化就是这样的。如果需要缩短程序
的执行时间,在程序调试结束 后,将部分函数用宏定义来代替。注意,应该在程序调试结束后再定义宏,
因为大多数编译系统在宏展开之后才会报错,这样会增加排错的难度。
8、 尽量少用全局变量,多用局部变量。因为全局变量是放在数据存储器中,定义一个全局变量,MCU 就
少一个可以利用的数据存储器空间,如果定义了太 多的全局变量,会导致编译器无足够的内存可以分配。
而局部变量大多定位于MCU 内部的寄存器中,在绝大多数MCU 中,使用寄存器操作速度比数据存储器快,
指令也更多更灵活,有利于生成质量更高的代码,而且局部变量所的占用的寄存器和数据存储器在不同的
模 块中可以重复利用。
9、设定合适的编译程序选项
许多编译程序有几种不同的优化选项,在使用前应理解各优化选项的含义,然后选用最合适的一 种优
化方式。通常情况下一旦选用最高级优化,编译程序会近乎病态地追求代码优化,可能会影响程序的正确
性,导致程序运行出错。因此应熟悉 所使用的编译器,应知道哪些参数在优化时会受到影响,哪些参数不
会受到影响。
在ICCAVR 中,有“Default”和“Enable Code Compression”两个优化选项。
在CodeVisionAVR 中,“Tiny”和“small”两种内存模式。
在IAR 中,共有7 种不同的内存模式选项。
在GCCAVR 中优化选项更多,一不小心更容易选到不恰当的选项。
二、代码的优化
1、 选择合适的算法和数据结构
应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上
都有介绍。将比较 慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排
序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选 择一种合适的数据结构也很重要,比如
你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。
数组与指针具有十分密码的 关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大
部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在 Keil 中则相反,使用数组比
使用的指针生成的代码更短。
2、 使用尽量小的数据类型
能够使用字符型(char)定义的变量, 就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就
不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过
变量的作用范围,如果超过变量的范围赋值,C 编译器并不报错,但程序运行结果却错了,而且这样的错
误很难发现。在ICCAVR 中,可以在Options 中设定使用printf 参数,尽量使用基本型参数(%c、%d、%x、
%X、%u 和%s 格式说明符),少用长整型参数(%ld、%lu、%lx 和%lX 格式说明符),至于浮点型的参数(%f)
则尽量不要使用,其它C 编译器也一样。在其它条件不变的情况下,使用%f 参数,会使生成的代码的数量
增 加很多,执行速度降低。
3、 使用自加、自减指令
通常使用自加、自减指令和复合赋值表达式(如a-=1 及a+=1 等)都能够生成高质量的程序代码,编译器
通常都能够生成inc 和dec 之类的指令,而使用a=a+1 或a=a-1 之类的指令,有很多C 编译器都会生成二到
三个字节的指令。在AVR 单片适用的ICCAVR、GCCAVR、IAR 等C 编译器以上几种书写方式生成的代
码 是一样的,也能够生成高质量的inc 和dec 之类的的代码。
4、减少运算的强度
可以使用运算量小但功能相同的表达式替换原来复杂的的 表达式。如下:
(1)、求余运算。
a=a%8;
可以改为:
a=a&7;
说明:位操作只需一个

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top