『壹』 Keil优化及如何设置某段代码不优化
Keil默认会对代码进行优化的
一般情况缺省编译优化设置被设定为8级优化,实际最高可设定为9级优化。
1、Dead code elimination
2、Data overlaying
3、Peephole optimization
4、Register variables
5、Common subexpression elimination
6、Loop rotation
7、Extended Index Access Optimizing
8、Reuse Common Entry Code
9、Common Block Subroutines
如何设定不优化或改变某个文件的优化设置
1、针对某个文件
(1) 右键->Option for File XXXX
(2) 切换到【C51】选项卡
default表示与工程设置一致
2、针对某段代码(局部优化)
#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级优化,以空间最小为主。
『贰』 keil c51优化等级介绍
在使用Keil C51进行编程时,推荐使用优化等级8,其他等级可能会引发问题。编译完成后,务必检查data和xdata段,确保它们没有超出目标芯片的最大值。特别是在处理data段时,要特别注意其值不能超过128,即使接近128也可能导致错误。如果确实需要使用到256的data空间,那么可以考虑将多余的128位数据定义为idata类型,以此来避免数据溢出的问题。
优化等级8是针对C51编译器的推荐设置,因为它能够提供良好的性能和兼容性,同时减少代码大小,提升执行效率。然而,在实际应用中,如果数据段的使用范围超过了128,就需要进行额外的内存管理。具体来说,当data段需要超过128个字节时,应当重新评估数据存储的需求,考虑将部分数据重新定义为idata或xdata类型,确保数据能够正确地存储和访问。
数据段的管理是C51编程中的一个重要环节。data段主要用于存储临时变量和局部变量,而xdata段则用于存储外部数据。在使用过程中,合理分配和管理这些数据段对于确保程序的稳定性和效率至关重要。尤其是data段,其大小受到严格限制,一旦超过128个字节,就可能引发溢出问题,进而影响程序的正常运行。
因此,在进行Keil C51编程时,建议开发者密切关注数据段的使用情况。当data段接近其最大值128时,应当采取措施避免溢出。这可能包括优化代码结构,减少不必要的变量声明,或者将部分数据重新定义为其他存储类型。通过细致地管理数据段,可以显著提高程序的可靠性和性能。
『叁』 KEIL中的设置
在KEIL中针对用户因程序产生的机器码大小超过所选单片机Flash ROM空间的问题,可以通过以下设置进行解决:
**1. 更换目标单片机 步骤:在KEIL的项目选项中,找到“Device”设置。这里列出了所有支持的单片机型号。 操作:根据程序的机器码大小和所需资源,选择一个ROM容量更大的单片机型号。确保所选型号满足程序需求。
**2. 优化代码以减小机器码大小 步骤:虽然更换单片机是最直接的解决方法,但在某些情况下,优化代码也可以有效减小机器码大小。 操作:检查并优化代码,例如去除不必要的函数调用、减少全局变量的使用、合并相似的代码段等。此外,可以利用KEIL的优化选项,尝试不同的优化级别,以进一步减小生成的机器码大小。
**3. 检查链接脚本 步骤:链接脚本定义了如何将程序的不同部分映射到单片机的内存中。 操作:检查链接脚本,确保没有不必要的内存分配或浪费。根据需要调整脚本中的内存布局,以充分利用单片机的Flash ROM空间。
**4. 使用外部存储器 步骤:如果单片机的内部Flash ROM空间确实无法满足需求,可以考虑使用外部存储器。 操作:这通常涉及硬件设计和软件配置。需要确保单片机支持外部存储器接口,并在软件中进行相应的配置和初始化。
综上所述,针对程序产生的机器码大小超过单片机Flash ROM空间的问题,最直接的方法是更换一个ROM容量更大的单片机。同时,也可以考虑优化代码、检查链接脚本或使用外部存储器等方法来解决问题。