编写高度优化的代码

来源:互联网 发布:java 鼠标移动事件 编辑:程序博客网 时间:2024/06/05 11:43
Keil 编译器能从你的C 程序源代码中产生高度优化的代码但你可以帮助编译器产生
更好的代码下面将讨论这方面的一些问题
8.1 采用短变量
一个提高代码效率的最基本的方式就是减小变量的长度使用C 编程时我们都习惯
于对循环控制变量使用int 类型这对8 位的单片机来说是一种极大的浪费你应该仔
细考虑你所声明的变量值可能的范围然后选择合适的变量类型很明显经常使用的变
量应该是unsigned char 只占用一个字节
8.2 使用无符号类型
为什么要使用无符号类型呢原因是8051 不支持符号运算程序中也不要使用含有带
符号变量的外部代码除了根据变量长度来选择变量类型自外你还要考虑是否变量是否会用于负数的场合如果你的程序中可以不需要负数那么把变量都定义成无符号类型的
8.3避免使用浮点指针
在8 位操作系统上使用32 位浮点数是得不偿失的你可以这样做但会浪费大量的时
间所以当你要在系统中使用浮点数的时候你要问问自己这是否一定需要可以通过提
高数值数量级和使用整型运算来消除浮点指针处理ints 和longs 比处理doubles 和floats
要方便得多你的代码执行起来会更快也不用连接处理浮点指针的模块如果你一定要
采用浮点指针的话你应该采用西门子80517 和达拉斯半导体公司的80320 这些已经对数
处理进行过优化的单片机
如果你不得不在你的代码中加入浮点指针那么你的代码长度会增加程序执行速
度也会比较慢如果浮点指针运算能被中断的话你必须确保要么中断中不会使用浮点指
针运算要么在中断程序前使用 fpsave 指令把中断指针推入堆栈在中断程序执行后使
用 fprestore 指令把指针恢复还有一种方法是当你要使用像sin()这样的浮点运算程
序时,禁止使用中断在运算程序执行完之后再使能它
8.5 用局部变量代替全局变量
把变量定义成局部变量比全局变量更有效率编译器为局部变量在内部存储区中分配
存储空间而为全局变量在外部存储区中分配存储空间这会降低你的访问速度另一个
避免使用全局变量的原因是你必须在你系统的处理过程中调节使用全局变量因为在中断
系统和多任务系统中不止一个过程会使用全局变量
8.6 为变量分配内部存储区
局部变量和全局变量可被定义在你想要的存储区中根据先前的讨论,当你把经常使用
的变量放在内部RAM 中时,可使你的程序的速度得到提高,除此之外,你还缩短了你的代码,
因为外部存储区寻址的指令相对要麻烦一些考虑到存储速度按下面的顺序使用存储器
DATA IDATA PDATA XDATA 当然你要记得留出足够的堆栈空间
8.7 使用特定指针
当你在程序中使用指针时你应指定指针的类型确定它们指向哪个区域如XDATA 或
CODE 区这样你的代码会更加紧凑因为编译器不必去确定指针所指向的存储区因为你
已经进行了说明
8.8使用调令
对于一些简单的操作如变量循环位移编译器提供了一些调令供用户使用许多调
令直接对应着汇编指令而另外一些比较复杂并兼容ANSI 所有这些调令都是再入函数
你可在任何地方安全的调用他们
和单字节循环位移指令RL A 和 RR A 相对应的调令是_crol_ 循环左移和_cror_(循
环右移) 如果你想对int 或long 类型的变量进行循环位移调令将更加复杂而且执行的
时间会更长对于int 类型调令为_irol_,_iror_ ,对于long 类型调令为_lrol_,_lror_
在C 中也提供了像汇编中JBC 指令那样的调令_testbit_ 如果参数位置位他将返回1
否则将返回0 这条调令在检查标志位时十分有用而且使C 的代码更具有可读性调令
对于小段代码像使能某些电路或从锁存器中读取数据你可通过使用宏来替代函数
使得程序有更好的可读性你可把代码定义在宏中这样看上去更像函数编译器在碰到
宏时按照事先定义的代码去替代宏宏的名字应能够描述宏的操作当需要改变宏时
你只要修该宏定义处
列表 0-14
#define led_on() {\
led_state=LED_ON; \
XBYTE[LED_CNTRL] = 0x01;}
#define led_off() {\
led_state=LED_OFF; \
XBYTE[LED_CNTRL] = 0x00;}
#define checkvalue(val) \
( (val < MINVAL || val > MAXVAL) ? 0 : 1 )
宏能够使得访问多层结构和数组更加容易可以用宏来替代程序中经常使用的复杂语
句以减少你打字的工作量且有更好的可读性和可维护性
原创粉丝点击