keil优化论】的更多相关文章

附表:Keil C51中的优化级别及优化作用 级别说明 0 常数合并:编译器预先计算结果,尽可能用常数代替表达式.包括运行地址计算. 优化简单访问:编译器优化访问8051系统的内部数据和位地址. 跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除. 1  死代码删除:没用的代码段被删除. 拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除. 2    数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识.BL51连接/定位器可以通过全局数据流分析,选择可被覆盖的段. 3…
谈到优化,其实很多人都哭笑不得,因为在一个C51软件工程师的生涯中,总要被KEIL的优化耍那么一次到几次.我被耍过,想必看着文章的你也被耍过,如果你回答说不,那只能说你写的C51程序不多! 看看KEILC的优化级别选项吧: 0-9共10个级别的优化,0是最低,9最高,一个普通的程序,设置最高级别和最低级别,编译后代码量有时会相差很远,以DX板DEMO程序为例,0级优化后是14K的CODE,9级优化后是10K的CODE,前后相差了4K.可见这个差别是多么的大. 事实上我们不需要知道对应的各个级别K…
对程序进行优化,通常是指优化程序代码或程序执行速度.优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难鱼与熊掌兼得,只能在设计时掌握一个平衡点. 一.程序结构的优化 1.程序的书写结构 虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰.明了的程序,有利于以后的维护.在书写程序时,特别是对于While.for.do…while.if…elst.swit…
C51的内存分配不同于一般的PC,内存空间有限,采用覆盖和共享技术.在Keil编译器中,经过编译后,会形成一个M51文件,在其内部可以详细的看到内存的分配情况. C51内存常见的两个误区: A.变量超过128字节后必须用COMPACT模式.其实,只要不超过256字节,都可以用SMALL模式 B.内部RAM,128字节以上的是SFR用,不给程序用.其实,由于C51寻址的不同,高128字节也可以用来存储变量,虽与SFR地址相同,但寻址的方式不同. 下面通过几个程序来看内存的分配. *********…
源:keil mdk中如何确保某一段程序不被优化掉 使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它: void (*UserProgram)();          //函数指针 UserProgram = (void (*)()) (0x00002000);//定位到指定的入口地址0x000…
本帖最后由 Cresta 于 2014-1-21 10:49 编辑 看到这篇C51的内存分配和优化的文章,个人觉得分析的十分到位,在这里转给大家   C51的内存分配不同于一般的PC,内存空间有限,采用覆盖和共享技术.在Keil编译器中,经过编译后,会形成一个M51文件,在其内部可以详细的看到内存的分配情况. C51内存常见的两个误区: (1)       变量超过128字节后必须用COMPACT模式. 其实,只要不超过256字节,都可以用SMALL模式 (2)       内部RAM,128字…
使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它: void (*UserProgram)(); //函数指针 UserProgram = (void (*)()) (0x00002000); //定位到指定的入口地址0x00002000 (*UserProgram)(); //调用test()…
KeilC51中将工程中没有调用的函数不进行编译的方法 把Target Options中的Device页中选上"Use Extended Linker(LX51)instead of BL51",然后在LX51 Misc页中的Misc Control中填入"REMOVEUNUSED",确认后重新编译即可自动去掉未调用的函数.…
第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过汇编语言后再使用C来开发,体会更加深刻.Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面.另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解.在开发大型软件时更能体现高级语…
http://www.eeboard.com/bbs/thread-25219-1-1.html 如今ARM体系架构的处理器在嵌入式市场上呼风唤雨,从低端的MCU应用到高端的多媒体消费电子,移动设备领域,工业控制,医疗设备,汽车电子等,到处是ARM架构处理器大军的身影. ARM开发工具就是ARM公司为庞大的各领域工程师和开发人员装备的完整的开发工具链,帮助迅速搭建开发平台,降低开发的成本和难度,缩短开发周期,让工程师们尽情享用ARM架构处理器这道'饕餮大餐'. 这里我将针对ARM开发工具的各种产…
keil uvison 是用来开发 单片机的,Keil mdk 是用来开发 ARM 的. 芯片型号是:STM32F103RB6 1,新建工程 配置属性 晶振为8M 根据实际晶振选择 生成 HEX 文件,选中 2,复制启动文件,头文件,这里为了简单,全部放在了项目文件夹中,不像有的教程,要建这个,配置那个,新手容易头大. 启动文件在,STM32F10x_StdPeriph_Lib_V3.5.0.rar 里面,解压LIB库文件. 复制 STM32F10x_StdPeriph_Lib_V3.5.0\L…
在keil建立ARM的工程时 其中有一项是选 use MicroLIB 由于对KEIL不是很熟悉,于是就查了查,得到了以下信息: microlib 是缺省 C 库的备选库. 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用. 这些应用程序不在操作系统中运行. microlib 进行了高度优化以使代码变得很小. 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性. 某些库函数的运行速度也比较慢,例如,memcpy(). 与缺省 C 库之间的差异 microlib 与缺省 C…
Primace 软件是CME(京微雅格)公司的FPGA芯片开发专用软件.因为CME的FPGA,如M5.M7等内嵌有8051核,所以可以和MCU联合在线仿真,虽然FPGA内的程序不可控,不能一步一步的仿真,但是因为MCU程序可控,可以一步一步的运行,所以可以利用此特性,用MCU给FPGA发送命令,然后控制FPGA的运行与操作. 所以此FPGA开发板也可以做8051单片机开发板. 这里主要介绍FPGA与keiLl联合仿真的时候的关于KEIL的工程的建立与设置.主要是做的比较简单的仿真,比较粗俗.简单…
Keil编译项目,如果使用微库MicroLIB,就可以使用malloc.微库内部位置一个堆管理模块.芯片的RAM大小是固定了的,前面分为全局变量,后面分给堆和栈,这是一般开发方式.但是我们在开发项目的过程中,市场遇到各种各样问题,栈穿透到堆里面,或者堆不够大,相当烦人!有时候就在想,何不让全局变量以外的所有RAM给堆栈共用?因为堆从低到高分配,而栈从高到低分配,理论上是可行的! 但是堆的分配由__heap_base和__heap_limit两个标签决定,不是变量又不能改! 因为我们使用很多种芯片…
Ⅰ.概述 上一篇文章是总结关于Keil使用方法-常用功能(一),关于(文件和编译)工具栏每一个按钮的功能描述和快捷键的使用. 我将每一篇Keil使用方法的文章都汇总在一起,回顾前面的总结请点击下面的链接(微信点击阅读原文),Keil使用方法(汇总): http://blog.csdn.net/ybhuangfugui/article/details/51647893 今天总结关于工程目标(配置)选项的常用功能,不会总结每一个功能,计划在今后的文章中会整理出详细的文档说明. 本着免费分享的原则,方…
1.选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍.将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序.合并排序或根排序代替,都可以大大提高程序执行的效率.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多.数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解.对于大部分的编译器,使用指针比使用数组…
要解决一个问题就怕不知道怎么搜索,或是别人没有遇到过: 同样碰到Keil MDK Debug调试无法设置断点问题,首先来问百度,GOOGLE,一下是我搜索到的结果:   1.keil 不能设置断点,每次点调试都出现以下对话框, 有几个按钮不能点. 解决办法:购买正版Keil或够找破解包,worldsing笔记里有(仅供学习用),商业请支持正版:   2.软件能Debug, 硬件无法Debug, 硬件仿真Debug时提示: **JLink Warning: T-bit of XPSR is 0 b…
我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进行内存清零.初始化堆栈外,还需要将全局变量的初始值加载到内存的指定区域(编译过程中为全局变量分配的空间).(2)局部变量:局部变量通常使用那些缓冲内存(用作保存运算过程的中间数据).初始化的局部变量,通常程序中都会对用到的缓冲内存重新赋值. 但是,对于没有初始化的局部变量需要注意“无知情的情况下被赋…
(1)初始值不是0的全局变量 在程序调到main()函数执行前,除了要进行内存清零.初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间). (2)未初始化的局部变量 实际的编译后的反汇编程序也看不到这些局部变量的初始化.这些局部变量占据哪些还未被使用的内存或者其他函数中局部变量释放的空间.倘若是后者,其他函数局部变量释放的空间并没有清零,所以使用这些释放空间的局部变量就一开始被赋值了,这是需要程序员小心的. void function() { unsig…
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为 CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工 汇编的方法了.机器汇编是通过汇编软件将源程序变为机器码,用于 MCS-51 单片机的汇编 软件有早期的 A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级 语言开发,单片机的开发软件也在不断发展,Keil 软件是目前最流行开发 MCS-51 系列单片 机的软件,这从近年来各仿真机厂商纷纷宣布全面支持 Keil 即可…
KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,但是界面是英文的好多初学者看很多教程都是一头雾水,这个相对简单的教程.KEIL C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品,其效率已经达到了相当搞的程度.C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器.uVision2 IDE可为它们提供单一而灵活的开发环境. Keil C51 软件是众多单片机应用开发的优秀软件之一…
用Keil C51编写程序时,经常需要调试,如果不是经常用这个软件的话,很容易忘记这些调试步骤,现在举一个例子“验证延迟函数delay()使其延迟的时间为500ms”说明. 源程序写完后,就可以调试了,按照图1所示,先进行第一步和第二步操作,使界面切换到图2的状态,可以看到在文本编辑窗口中,有一个黄色箭头指向13行的位置,说明程序从这个位置开始执行.左上角有一些跟调试相关的按钮,如“全速执行”.“单步进入”……. 对于这个例子,目的是验证delay()函数的延迟时间,使其大约为500ms.按照下…
转用MDK有一段时间了,越来越觉得MDK的强大,因为我之前都是用ADS1.2开发产品,所以更能体会到MDK的强大与易用性.MDK编译出来的代码与ADS1.2相比,代码量减少了很多,我的一个工程用ADS1.2编译为25.4KB(都是bin格式),但用MDK编译出来仅有19.5KB(采用默认优化级别,即L2优化级别).根据我个人的经验,使用一个新的编译器,难点往往有三个,一个是建立一个新的工程,以及工程项目的配置:二是启动代码的编写:三是如何下载和单步调试.今天重点写一下MDK的启动代码.使用MDK…
熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例,详细的写一下MDK的设置.界面.工具.可能会有些杂乱,但我想所涉及的东西都是最常用的:可能不是那么的严谨清晰,我想谁也没把我期望成专家!哈,有问题欢迎留言.正式开始. 首先启动MDK.当然要先安装好MDK,如果找不到在哪里下载,可以翻翻我以前的博文.启动后的MDK界面如图1所示. 图1 MDK界面…
阅读了<单片机与嵌入式系统应用>2005年第10期杂志<经验交流>栏目的一篇文章<Keil C51对同一端口的连续读取方法>(原文)后,笔者认为该文并未就此问题进行深入准确的分析,文章中提到的两种解决方法并不直接和简单.笔者认为这并非是Keil C51中不能处理对一个端口进行连续读写的问题,而是对Kei1 C51的使用不够熟悉和设计不够细致的问题,因此特撰写本文. 本文中对原文提到的问题,提出了三种不同于原文的解决方法.每种方法都比原文中提到的方法更直接和简单,设计也更…
Keil  uVISION2  是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的 MCS-51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持.PLM.汇编和 C 语言的程序设计,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能. 因此很多开发 51 单片机  应用的工程师或普通的单片机爱好者,都对它十分喜欢. Keil Cx51  是一个商业的软件,分两个版本,一个是完全版,使用时对生成的机器代码空间不作任何限制,另一个是只能编译 2K 代码空间 的 DEMO…
一.混合编程 1.模块内接口: 使用如下标志符: #pragma asm 汇编语句 #pragma endasm 注意:如果在c51程序中使用了汇编语言,注意在keil编译器中需要激活Properties中的“Generate Assembler SRC File” 和“Assembler SRC File ”两个选项.来个实例吧: #include void main(void) { P2=; #pragma asm MOV R7,# DEL:MOV R6,# DJNZ R6,$ DJNZ R…
keil中的指针分为两种,一种是普通指针,兼容标准C语言的指针:另一种是我翻译成内存特殊指针(memory-specific pointers,翻译的不好:>) 一.普通指针 普通指针的定义方式如下, char * ptr;   跟标准C的定义方式一样.这种指针占三个字节.第一个字节是标识存储类型,是指针指向的变量的数据类型. 第二个字节是指针存储地址的高位字节.第三个字节是指针存储地址的低位字节. 普通指针默认存储在内部存储器data,即片上RAM.如果想指定指针的存储位置,可以在 * 后加上…
第一节 绝对地址访问C51提供了三种访问绝对地址的方法: 1. 绝对宏:在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE.XBYTE.PWORD.DBYTE.CWORD.XWORD.PBYTE.DWORD,具体使用可看一看absacc.h便知. 例如: rval=CBYTE[0x0002]; //指向程序存贮器的0002h地址 rval=XWORD[0x0002]; //指向外RAM的0004h地址  2. _at_关键字直接在数据定义后加上_at_ cons…
在利用keil进行8051单片机编程的时,常常需要进行绝对地址进行访问.特别是对硬件操作,如DA AD 采样 ,LCD 液晶操作,打印操作.等等.C51提供了三种访问绝对地址的方法: 1. 绝对宏 在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括:CBYTE.XBYTE.PWORD.DBYTE.CWORD.XWORD.PBYTE.DWORD 具体使用可看一看absacc.h便知  例如: rval=CBYTE[0x0002] ;指向程序存贮器的000…