打印
[牛人杂谈]

Keil C51 高效代码的几点建议

[复制链接]
801|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuomuniao110|  楼主 | 2018-11-21 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、编译模式
Keil C51有三种编译模式:Large, Compact, Small模式,Large模式是把默认的变量都分配到外部存储空间,即xdata,通过DPTR访问,生成代码量最大,效率最低的模式;Small模式是把变量的默认位置分配在直接寻址的128字节空间中,即data,是效率最高,成生代码量最少的一种编译模式。
2、手工设置变量位置
xdata,pdata,idata,data,bdata,只有data与bdata是直接寻址的,效率最高,如果选择small编译模式,定义的变量默认都是这两种类型,也可以手工设置如:
unsigned char data i;
或者
data unsigned char i;
3、使用无符号型整数
在C51中没有专门的符号处理指令,两数比较时会生成比较符号的代码,如果没有必要就不要用带符号型的而用无符号型,这样生成的代码效率更高(用unsigned int与unsigned char 代替int, char)
4、用复合操作符
复合操作符如 |=, &=, ^=, >>=, <<=,用这样的操作符生成的代码比用单个的操作符效率更高,如
P1 = P1 | 0xF0,没有 P1 |= 0xF0的效率高,而且结果也不一样,前者是P1口的引脚值与0xF0相或,而后都则是用一条或指令对内部的IO寄存器进行操作
5、把自增与自减操作放到表达式外,如:
while(*string){
  *string = '/0';
string++;
}
要比:
while(*string){
  *(string++) = '/0';
}
效率高
6、使用指定类型的指针
如,要操作保存在xdata中的字符串,
定义
char xdata buff[];
unsigned char xdata *ptr
ptr = buff;
比定义成
unsigned char *ptr
效率要高,后者为通用指针
7、用单个变量,少使用结构
对于structure定义的变量,Keil 会通过地址的偏移量寻址,使的生成的代码效率很低,使用单个的变量,虽然组织起来稍麻烦一些,但效率较高


沙发
zhuomuniao110|  楼主 | 2018-11-21 14:01 | 只看该作者
单条指令实现的,比多条指令实现的方法更合理。

使用特权

评论回复
板凳
小明的同学| | 2018-11-21 20:59 | 只看该作者
如果用数据结构或者结构体,肯定要考虑存储模式。

使用特权

评论回复
地板
小明的同学| | 2018-11-21 21:39 | 只看该作者
懂了以后尽量不用有符号数。

使用特权

评论回复
5
huangcunxiake| | 2018-11-22 00:00 | 只看该作者
复合操作符是要常用才行。

使用特权

评论回复
6
dongnanxibei| | 2018-11-22 12:43 | 只看该作者
养成编程的良好习惯。

使用特权

评论回复
7
734774645| | 2018-11-24 09:53 | 只看该作者
主要设计的程序不要乱。之前学编程还要先设计流程图,其实那挺好的。

使用特权

评论回复
8
wanduzi| | 2018-11-24 13:32 | 只看该作者
默认的类型就是最合适的吧,一般

使用特权

评论回复
9
稳稳の幸福| | 2018-11-24 23:49 | 只看该作者
for循环和while循环也是不同的。

使用特权

评论回复
10
xdlbass| | 2018-12-7 19:15 | 只看该作者
int a = 0xff
a = a / 8;
a = a >> 3;
跟楼主学习了,请教如上这两种运算方法编译后效率一样吗?位移会否高一点

使用特权

评论回复
11
643757107| | 2018-12-8 23:00 | 只看该作者
多谢分享,看到xdata了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

3247

帖子

10

粉丝