• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

keil的优化级别对程序有啥影响?

liuxiaofei126 2018-03-12 浏览量:2539

对于在stm32中,keil的优化级别对程序有啥具体影响吗啊,优化级别越高,程序的执行速度越快?

有的程序中使用关键字volatile来修饰,防止被优化,那这个优化到底是怎么回事



0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 影响还是很明显的,如果针对时间优化,一般能提速10%左右,编译器如果发现你给一个变量先赋值10,紧接着又赋值5,那不加volital的话它可能直接就赋值5了,加了的话就不会了
    • 发布于 2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :封装: SOIC-20_300mil 品牌: STC(宏晶) 型号: STC11F04E-35I-SOP20 回复

其他答案 数量:12
  • 优化还是有必要的,这样就不用每次使用的时候都去读值了,节省了时间,采用volatile就是为了不优化,针对那种时刻变化的变量
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :造成电机运行不平滑的可能原因很多,需要驱动芯片和控制芯片配合完成 常见原因可能会是驱动信号占空比配置等等 建议客户参考原厂文档中的建议进行配置 回复

  • 运行效率优化,代码大小优化,影响很多的,建议你看看编译器,不是一句两句可以说清楚的
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :请客户遵循原厂提供的规格书100M频率下在测测看看https://atta.szlcsc.com/upload/public/pdf/source/20210916/2389196E6DC4CA1121B2D3610B126F46.pdf 回复

  • 对此问题,翻阅Keil C51的手册很容易发现:KeilC51的编译器有一个优化设置,不同的优化设置,会产生不同的编译结果。一般情况缺省编译优化设置被设定为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。
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :1.直插的碳膜电阻没有4.99K的,是否可换成其他材料成分的 2.客户没有说明所需电阻的功率以及精度,请与客户确定 回复

  • 0         常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。
    优化简单访问:编译器优化访问8051系统的内部数据和位地址。
    跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。
    1         死代码删除:没用的代码段被删除。
    拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。
    2         数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通过全局数据流分析,选择可被覆盖的段。
    3         窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存储空间或执行时间可节省时,用简单操作代替复杂操作。
    4         寄存器变量:如有可能,自动变量和函数参数分配到寄存器上。为这些变量保留的存储区就省略了。
    优化扩展访问:IDATA、XDATA、PDATA和CODE的变量直接包含在操作中。在多数时间没必要使用中间寄存器。
    局部公共子表达式删除:如果用一个表达式重复进行相同的计算,则保存第一次计算结果,后面有可能就用这结果。多余的计算就被删除。
    Case/Switch优化:包含SWITCH和CASE的代码优化为跳转表或跳转队列。
    5         全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果保存在寄存器中,在一个新的计算中使用。
    简单循环优化:用一个常数填充存储区的循环程序被修改和优化。
    6         循环优化:如果结果程序代码更快和有效则程序对循环进行优化。
    7         扩展索引访问优化:适当时对寄存器变量用DPTR。对指针和数组访问进行执行速度和代码大小优化。
    8         公共尾部合并:当一个函数有多个调用,一些设置代码可以复用,因此减少程序大小。
    9         公共块子程序:检测循环指令序列,并转换成子程序。Cx51甚至重排代码以得到更大的循环序列。
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :8-pin QFN没有满足此封装的替代型号 回复

  • 0级优化:
    1、 常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算。
    2、 简单访问优化:对8051系统的内部数据和位地址进行访问优化。
    3、 跳转优化:编译器总是将跳转延至最终目标上,因此跳转到跳转之间的命令被删除。
    1级优化:
    1、 死码消除:无用的代码段被消除。
    2、 跳转否决:根据一个测试回溯,条件跳转被仔细检查,以决定是否能够简化或删除。
    2级优化:
    1、 数据覆盖:适于静态覆盖的数据和位段被鉴别并标记出来。连接定位器BL51通过对全局数据流的分析,选择可静态覆盖的段。
    3级优化:
    1、“窥孔”优化:将冗余的MOV命令去掉,包括不必要的从存储器装入对象及装入常数的操作。另外如果能节省存储空间或者程序执行时间,复杂操作将由简单操作所代替。
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :没有找到 回复

  • 楼上描述的很消息,直观的感受就是仿真的时候发现好多代码无法打断点
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :国产没有符合替代型号。 回复

  • 优化只是把代码中没有用的优化掉,间接可以提高速度,但不明显。
    最大的用处是减小代码量。
    • 发布于2018-03-12
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :铝制仪器盒,保护作用。 回复

电子老工程师 回复了  :请参考原厂图纸。 回复

  • 带给coder最直观的感觉,就是编的快了,生成的可执行文件小了
    • 发布于2018-03-13
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :MT40A512M16LY-062E 与 MT40A512M16LY-062E IT:E二者的区别是 不带IT的是商业级,带IT的是工业级的;不带E的版本不详,带E的是E版本/ / MT41K256M16TW-107 IT:P 与 MT41K256M16TW-107 二者的区别是 不带IT的是商业级,带IT的是工业级的;不带P的版本不详,带P的是P版本 回复

  • 优化使代码量少了,但同时也对编写代码提出更高要求,一不留神,有些语句就会被优化掉。


    • 发布于2018-03-13
    • 举报
    • 评论 2
    • 0
    • 0
电子老工程师 回复了  :1452653-1已经停产,7-1452653-1是原厂推荐的替代型号。 回复
电子老工程师 回复了  :不是同一型号 7-的型号是针对更新的产品应用的 具体可参考原厂datasheet 回复

  • 主要就是会影响CoreMark的跑分也就是系统运行性能了,我那次试过在MDK里面设置不同的优化级别,CoreMark跑分前后差了100多。至于volatile关键字那跟优化没有太大关系,主要作用是提醒编译器这个变量时刻在变化,要读变量在内存单元中的数据而不是缓存中的备份。

    • 发布于2018-03-13
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :SOT23-3 回复

  • 比如有一些声明了但没有使用的形参会被无视掉,节省内存空间。
    • 发布于2018-03-15
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :厂牌信息错误,无法查询。请确认。 回复

相关问题

问题达人换一批

keil的优化级别对程序有啥影响?