谈到优化,其实很多人都哭笑不得,因为在一个C51软件工程师的生涯中,总要被KEIL的优化耍那么一次到几次。我被耍过,想必看着文章的你也被耍过,如果你回答说不,那只能说你写的C51程序不多!

  看看KEILC的优化级别选项吧:
  0-9共10个级别的优化,0是最低,9最高,一个普通的程序,设置最高级别和最低级别,编译后代码量有时会相差很远,以DX板DEMO程序为例,0级优化后是14K的CODE,9级优化后是10K的CODE,前后相差了4K。可见这个差别是多么的大。
  事实上我们不需要知道对应的各个级别KEIL会如何优化你的程序或优化了些什么,我们只需要以一种严谨的态度去编写和对待你的程序就可以了。在我个人的观念中,程序在9级优化后依然能保持完美无误的运行,你才算了解KEIL的脾气。
  

  好了,还是说点正点的:
  有些人习惯整体程序都选择同一个优化级,事实上每个C文件都可以有独立的优化级别的,在工作区右键选择你的模块(.C)然后选取Options for File xxx就会出现如下界面:

在C51选项中就可以选择优化级别和警告级别等东西了,被独立设置过的C文件会有特殊的标记的:
     
用以提醒你这个文件的编译处理并非默认设置!

  如果你觉得模块优化都不够细的话,你可以考虑局部优化,也就是说对某个函数实行某个级别的优化。当你发现9级优化的时候某个函数总是变的不正常,但你又希望其它函数和程序段保持最高的简洁度,那么局部优化可以说是相当有用的了。在KEIL手册中有介绍这个功能:
#pragma OPTIMIZE(x) x就是你希望的优化级别,一般应用如下:

#pragma OPTIMIZE(6)
void FunA()
{
}
......
......

#pragma OPTIMIZE(9)
void FunB()
{
}

  上面的意思就是说,在void FunA()到void FunB()之前的所有函数,包括FunA在内,都采用6级的优化,而从FunB开始直到之后,只要没碰上#pragma OPTIMIZE,都采用9级优化了。
OPTIMIZE还可以多一个参数,就是speed和size,
用法: #pragma OPTIMIZE(9,speed)或#pragma OPTIMIZE(5,size),对应的就是9级优化,以速度为主,或5级优化,以空间最小为主

4.StartUp.a51
  在之前第一节的建立工程中就曾经提到过StartUp.a51这个东西了,就是在工程初建的时候有个对话框用于选择是否为工程添加这个a51文件。
  其实这个文件给大家最最深刻的感觉就是:开机清空RAM。事实上它还有其他特别的用途的,例如初始化堆栈(很多人不知道KEILC一开始把堆栈设定为多少,事实上可以通过软件仿真的时候从这个文件找到答案),然后是再入函数的虚拟堆栈的设置,还有更高级一点的,BANK的初始化。
  旧版本KEIL自动为每个工程默认添加相同的StartUp文件,后期的KEIL就有了上图的选择,如果选择添加,则会为每个工程添加一个独立的StartUp。用户可以通过手工改写StartUp.a51实现某些必要的上电初始化。例如最通常的:取消单片机开机清RAM功能!!
  关于STARTUP的介绍,我建议大家看看以下的文章,它的解释非常详尽。

##################################

在实际使用时发现仿真时,有些程序是白色的无法进行断点设置。搜索到的答案是优化等级过高,一些普通的程序被优化。只得把优化程序等级降低。

keil优化论的更多相关文章

  1. keil优化等级设置

    附表:Keil C51中的优化级别及优化作用 级别说明 0 常数合并:编译器预先计算结果,尽可能用常数代替表达式.包括运行地址计算. 优化简单访问:编译器优化访问8051系统的内部数据和位地址. 跳转 ...

  2. C51 Keil 优化

    对程序进行优化,通常是指优化程序代码或程序执行速度.优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难 ...

  3. Keil C51内存分配与优化

    C51的内存分配不同于一般的PC,内存空间有限,采用覆盖和共享技术.在Keil编译器中,经过编译后,会形成一个M51文件,在其内部可以详细的看到内存的分配情况. C51内存常见的两个误区: A.变量超 ...

  4. keil mdk中如何确保某一段程序不被优化掉(转)

    源:keil mdk中如何确保某一段程序不被优化掉 使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在RO ...

  5. 谈谈Keil 中C51的内存分配与优化

    本帖最后由 Cresta 于 2014-1-21 10:49 编辑 看到这篇C51的内存分配和优化的文章,个人觉得分析的十分到位,在这里转给大家   C51的内存分配不同于一般的PC,内存空间有限,采 ...

  6. keil mdk中如何确保某一段程序不被优化掉

    使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为vo ...

  7. keil 51警告编译优化

    KeilC51中将工程中没有调用的函数不进行编译的方法 把Target Options中的Device页中选上"Use Extended Linker(LX51)instead of BL5 ...

  8. [转]keil使用详解

    第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...

  9. ARM 开发工具 Keil和DS-5的比较。

    http://www.eeboard.com/bbs/thread-25219-1-1.html 如今ARM体系架构的处理器在嵌入式市场上呼风唤雨,从低端的MCU应用到高端的多媒体消费电子,移动设备领 ...

随机推荐

  1. 15、Cocos2dx 3.0游戏开发找小三之Sprite:每一个精灵都是上辈子折翼的天使

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395 Sprite  Sprite 能够说是 ...

  2. lnux内核的malloc实现(Oracle的cache buffer影子)

    lnux内核的malloc实现(Oracle的cache buffer影子) 本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/artic ...

  3. Swift: 继承

    为了在属性值改变的时候获得通知,类可以为继承的属性添加属性观察者.属性观察者可以添加到任何属性上,不管这个属性原来是存储属性还是计算属性. Swift中的类没有一个统一的基类. 为了讲明白继承,我们先 ...

  4. yii 验证码那点事儿

    今天要使用yii验证码, 不过, 这个验证码是整站通用的, 也就是说, 有个表单的提交是使用ajax方式来提交, 整站, 不管在哪个地方, 都能点出来此窗口, 来提交信息 关于yii验证码, fram ...

  5. Linux shell入门基础(六)

    六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...

  6. 使用CSS、JS的几种方法

    引用CSS到html网页里的4种方法 1.行内式 在标记的style属性中设定CSS样式,这种方式本质上没有体现出CSS的优势,因此不推荐使用     <div style="widt ...

  7. MVC中给TextBoxFor设置默认值和属性

    例如:(特别注意在设置初始值的时候 Value 中的V要大写) @Html.TextBoxFor(model => model.CustomerCode, new { Value=" ...

  8. 基于CANVAS与MD5的客户端生成验证码

    好久没写东西,工作太忙了!不想服务端请求太多,搞了个这玩意儿,不过项目中并不会用上,还是使用服务端生成的机制(会安全多少呢?):我就想问个问题,除了图像识别来破解这样的简单验证码外,针对我这种例子,可 ...

  9. UIView -> image & 本地时间获取

    //UIView 转换为图片 UIGraphicsBeginImageContext(self.rootsView.bounds.size); [_rootsView.layer renderInCo ...

  10. javaScript 手写图片轮播

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...