1)使用尽量小的数据类型.
对于8位机来说,能使用字符型定义的变量,就不要使用整型来定义;能使用整型来定义的变量就不要使用长整型来定义;能不使用浮点型变量就不要使用浮点型变量.
2)善于利用合适的算法和数据结构以及数学方法.
要熟悉算法语言,了解各种算法的优缺点.例如将比较慢的顺序查找法用较快的二分查找法代替;插入排序用快速顺序,合并排序代替.可以大大提高程序的执行效率.
3)建ROM表,以空间换时间,以FLASH换SRAM.
在程序中一般不要进行非常复杂的运算.例如,浮点数和乘除及开方以及一些复杂的数学模型的插补运算等.对于这些即消耗时间又消费资源的运算,如果运算的过程及结果为有限个,可以考虑将运算的结果预先通过其他工具计算好建成表存放在FLASH中,通过查表得到计算结果,以减少程序执行过程中重复计算的工作量.这就是以空间换时间的方法.应用程序中经常有一些表格数据,比如BCD到7段数码管的译码表,若直接定义成数组,会占用相当的SRAM资源,一般单片机的SRAM资源很有限,通常将该类表格存放在FLASH中,以释放节约更多的SRAM资源.
4)尽量减少运算的强度.
可以使用运算量小但功能相同的表达式替换原来复杂的表达式.
(1)善于使用自加,自减指令.
通常使用自加,自减指令和复合赋值表达式(a-=1 and a+=1等)都能够生成高质量的程序代码,编译器通常都能够够生成INC和DEC之类的汇编指令,这些指令一般只占用1个字节,而使用"a = a + 1"和"a = a - 1"之类的指令,很多C编译器都会生成2到3个字节的指令.
(2)"与"操作的妙用.
(1)用"与"操作实现快速求余运算.例如: a = a % 8可以用 a = a & 0x07代替.因为位操作只需要一个指令周期就可以完成,而大部分C编译器的"%"运算均是调用子程序来完成的,代码长,执行速度慢.
(2)用"与"操作实现增1过限自归零的if语句功能.例如: if(++i>15) i=0;可以用 i++; i&=0x0f代替.既节约时间,又节省空间.
(3)用移位操作实现快速乘除法及示模运算.
左移相当于乘2,右移相当于除2;只要是乘以或除以一个整,均可以用移位方法得到结果.例如:
a = a * 9;可以用 a = (a << 3) + a;代替.用移位的方法得到的代码比调用乘除法子程序生成的代码效率高.不要一味的认为CPU处理速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,自已可以做的决不要留给CPU去做.
5)循环程序设计要点.
(1)关于循环延时函数.
通常使用延时函数都采用自加的形式,然而其实改为自减的延时函数会更好些,虽然延时效果相似,但几乎所有的C编译器对后一种函数生成的代码均比前一种代码少1~3个字节,因为几乎所有MCU都有为0转移的指令.
(2)while循环和do-while循环.
在使用这两种循环产生同样效果的前提下,使用do-while循环编译后生成的代码长度要比while短.
6)Volatile的作用.
这是区分C程序员和嵌入式系统程序员的最基本方法.定义为volatile的变量是指变量可能会被随机改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.下面是几个volatile变量的例子:
->并行设备的硬件寄存器(例如,状态寄存器);
->一个中断服务子程序中会访问到的非自动变量;
->多线程应用中被几个任务共享的变量.
7)程序规范.
作为一个合格的程序员,要遵循一定的软件工程编程规范,按照一定的流程(当然不是教条式)进行,这样有利于软件的开发,测试和维护等.
阅读(2110) | 评论(2) | 转发(1) |