C51程序编译生成汇编代码的效率,是由许多因素共同决定的,对于Keil C51,主要受以下两种因素影响:
第一节 存储模式的影响
存储模式决定了缺省变量的存储空间,而访问各空间变量的汇编代码的繁简程度决定了代码率的高低。
例如:一个整形变量i,如放于内存18H、19H空间,则++i的操作编译成四条语句:
INC 0x19
MOV A,0x19
JNZ 0x272D
INC 0x18
0x272D:
而如果放于外存空间0000H、0001H则++i的操作编译成九条语句:
MOV DPTR,0001
MOVX A,@ DPTR
INC A
MOVX @ DPTR,A
JNz #5
MOV OPTR,#0000
MOVX A,@DPTR
INC A
MOVX @ DPTR,A
就汇编之后的语句而言,对外部存储器的操作较内部存储器操作代码率要低得多,生成的语句为内存的两倍以上,而程序中有大量的这种操作,可见存储模式对代码率的响了。
因此程序设计的原则是
1、存储模式从small-Compact-large依次选择,实在是变量太多,才选large模式。
2、即使选择了large模式,对一些常用的局部的或者可放于内存中的变量,最好放于内存中,以尽量提高程序的代码率。
第二节 程序结构的影响
程序的结构单元包括模块、函数等等。同样的功能,如果结构越复杂,其所涉及的操作、变量、功能模块函数等就越多,较之结构性好,代码简单的程序其代码率自然就低得多。
此外程序的运行控制语句,也是影响代码率的关键因素,例如:switch -case语句,许多编译器都把它们译得非常复杂,Keil C51也不例外,相对较为简易的Switch-case语句,编译成跳转指令形式,代码率较高,但对较为复杂的Switch-Case,则要调用一个系统库函数?C?ICASE进行处理,非常复杂。
再如if( ),while( ),等语句也是代码相对较低的语句,但编译以后比switch-case要高得多。
因此建议设计者尽量少用switch-case之类语句来控制程序结构,以提高代码率。
除以上两点外,其它因素也会对代码率产生影响,例如:
是否用寄存器传递参数 即NOAREGS选项是否有
是否包括调试信息:即DEBUG选项
是否包括扩展的调试信息:即BJECTEXTEND
关键字:Keil C51 代码效率
引用地址:
Keil C51使用教程---代码效率(七)
推荐阅读最新更新时间:2024-03-16 15:21
keil中printf
在keil中printf 默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1。 如果为1则清0,然后送出一个字符。因此 你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1。这时你的程序就相当于直接死掉了。你可以通过改写putchar函数 实现自己的目的。TI相当于是初始化~不给赋初值就不干活 2.Keil的串口处理比较巧妙的,我的分析如下: putchar.c里面,是先检测TI再发送。这样做的目
[单片机]
电子电路设计之C51单片机常见问题
笔者在工作中实际使用过AT89C2051、AT89C51、AT89C52等51单片机,后来应用台湾新茂、华邦等厂家的51单片机。实践中遇到许多问题,都是书本上没有的。我印象中,书本上的知识只有一页插图了,就是cpu的时序图。最初直接用汇编写程序,然后是C51嵌套汇编。编译器曾用伟福系列编译器,后来使用keil等,感觉这些编译器大同小异。需要熟练的C语言基础,加上单片机应用的特殊性。 本文就51单片机应用中一些常见问题作个总结,这都是我实际碰到过的,因为文章篇幅所限,这些问题远远不足以表达单片机的常见问题。希望对初学者有所帮助,文中不完善的地方务请指点。谢谢! 1:C51编译器如何区分位地址和字节地址 是靠预定
[单片机]
C51单片机学习笔记之密码锁
简介 根据之前学的LCD1602显示器和矩阵键盘实现一个简单的密码锁。 原理图 请翻之前的文章 LCD1602:C51单片机学习笔记之LCD1602 矩阵键盘:C51单片机学习笔记之矩阵键盘 代码部分 LCD1602.c #include reg52.h #include intrins.h sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; #define RS_CLR RS = 0 #define RS_SET RS = 1 #define RW_CLR RW = 0 #define RW_SET RW = 1 #define EN_CLR
[单片机]
Keil 实现花式流水灯
#include reg51.h unsigned char code seg = {0xFE,0xFB,0xEF,0xBF, //0表示亮 0x7F,0xDF,0xF7,0xFD, 0xAA, 0x55, 0xE7, 0xDB, 0xBD, 0x7E, 0x3C, 0x18, 0x00 }; //只能粗略延时2n+6,若想精确则用汇编语言或者定时器 void DelayUs2x(unsigned char n) { while(n--); }
[单片机]
mini244-------keil for ARM系列之时钟的配置(附带LED代码)
整篇文章的结构如下: 一、直接把时钟管理用到的寄存器罗列出来进行分析。 二、对其中的一些原理性的东西做介绍。 三、对于在后面编写串口时会出现的问题注意点提出说明。 四、LED 代码 一、在时钟管理中会用到的寄存器有以下一些。 LOCKTIME,MPLLCON,UPLLCON,CLKCON,CLKSLOW,CLKDIVN,CAMDIVN。 LOCKTIME:是对于配置好锁相环之后需要延时的一段时间,这时为了上锁稳定。其中包括两部分 ①U_LTIME:这是UCLK(USB专用的一个时钟)配置好后需要的延时时间。 ②M_LTIME:这时FCLK(系统时钟即CPU的频率),HCLK(一些高速设备所用到时钟),PCLK(低速设备所用到
[单片机]
基于keil5新建STM32F10x寄存器版本工程
一、前言 前面文章分享了很多关于STM32F103系列知识点、物联网相关的小项目,工程都采用的是寄存器方式编写;很多小伙伴接触STM32开始都采用库函数编程,不清楚如何使用寄存器方式开发STM32;这篇文章就讲一下如何新建寄存器风格的STM32工程,并介绍需要用到哪些官方系统文件等。 比较具有代表性的几篇物联网教程: 1. 智慧农业项目(基于腾讯物联网服务器) 2. 遥控小车项目 3. 智能门锁项目(基于腾讯物联网服务器) 4. 物联网项目(基于阿里云物联网服务器) 5. 智能家居项目(基于中国移动OneNet物联网服务器) 二、环境介绍 开发环境: keil5.25 编程语言: C语言 操作系
[单片机]
STM32F072RB 实作笔记(二)- 第一次启动 Keil 编写 C 语言
设定特别的档案夹 在桌面上 Keil 的 图标是长这个样子的! 把他点开后 应该是下图这个样子: 找到 Project 选择 New uVision Project, 我们把这个动作叫做 New 一个新 Project! 当你选择完成后会出现下图的需求,要求 给一个档案名称 选择一个档案夹给他! 从整体规划上,我建议按照下面的方式规划 1 将所有的 STM32F072RB 实作计划都放在一个目录下 2 把Project 名称设置的和档案夹一样 我的档案夹里面有许多叫 “模板” 的,是因为里面都有两个固定的程式。我的做法是copy一堆 “模板” 档案夹,然后改名。这样就不会遗忘这些固定的档案。 Keil
[单片机]
用C51系列单片机设计物体分级设备的测量光幕
摘要:首先介绍了光幕测量高度的原理,给出了高度测量光幕的一种实现方法,分析了由该方法设计的系统结构和主要性能。从而彻底解决了相邻通路间的干扰,提高了测量精度。
关键词:单片机;测量光幕;分级
1 引言
光幕是电子测量系统中应用比较多的一种设备。利用光幕可以测量恒速传送带上的物体高度、长度或宽度等一系列数据,以便为后面的电子系统提供相应的参数。本文给出了一种利用单片机实现物体高度测量的光幕测量方法。
2 光幕测量物体高度的基本原理
图1所示是一个用普通光幕测量物体高度的测试原理结构示意图。图中,光幕的一边等间距安装有多个红外发射管,另一边相应的有相同数量同样排列的红外接收管,每一个红外发射管都对应有一个相应的红外接收管,且
[应用]