社区导航

 

搜索
查看: 1790|回复: 3

[讨论] 【我的 Nucleo 】优化 ---- 要慎用!

[复制链接]

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

发表于 2015-1-7 13:45 | 显示全部楼层 |阅读模式
编的程序,在不优化时运行很正常,优化一下就不正常了。

可能大家都有体会吧。

好则我对特别关注的函数都要看看它编译后所产生的汇编代码。所以很快发现了问题所在。

下面举例看看编译器是怎么优化的:(IAR编译器

在编译器的优化选项中,只选择 “ LOOP UNROLLING ”, 这样对某些循环作优化,
函数原型:
inline void Delay(unsigned int DelayCnt)
{
        while ( DelayCnt-- );
}

优化后的结果:
Delay:
        BX       LR               ;; return


由此可见,这个延时函数并没有起到延时的作用,

对于程序的优化问题,编译也是有控制命令的。使用控制命令可以对某一个函数作控制。而设置选项中,设置的结果会对全局起作用。


控制命令:
#pragma optimize=[goal][level][no_optimization...]Parameters


goal :它可以选择size ----  对代码大小作优化,可以选择以下参数:
balanced: 优化时在速度和代码大小作平衡
speed: 速度第一
no_size_constraints,:优化速度,放宽对代码大小的约束
level :S指定优化级别,可选择以下参数:

none:不优化:
low:……
medium:……
high:……
no_optimization :禁止一个或多个优化选项,可以选择以下参数:
no_code_motion:……
no_cse,:……
no_inline:……
no_tbaa:……
no_unroll:……
no_vectorize:……
no_scheduling:……

vectorize:……



此帖出自stm32/stm8论坛

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2015-1-7 19:55 | 显示全部楼层
#pragma optimize命令只对紧跟在它后面的一个函数起作用,用于 “ 降低 ” 编译设定的优化等级


参数size、 balanced、speed、以及no_size_constraints 只有在最高优化级别时有效。并且不能同时优化速度和代码大小

再者,使用此命令后,会影响其它预处理命令的作用,如宏的正常展开


----------用些命令时,如果命令的优化等级高于编译设定的优化等级,命令将无效

回复

使用道具 举报

1876

TA的帖子

1

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2015-1-10 23:56 | 显示全部楼层
应该不属于“ LOOP UNROLLING ” 控制的优化,这函数对外界没影响,外界也不会影响函数,cc会认为这个函数没用而整体消除掉,DelayCnt 声明加个 volatile 就好了。

点评

嗯,好象不属于LOOP UNROLLING,[/backcolor]  详情 回复 发表于 2015-1-11 09:53
人已离开,无事别找,找也找不到。

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2015-1-11 09:53 | 显示全部楼层
freebsder 发表于 2015-1-10 23:56
应该不属于“ LOOP UNROLLING ” 控制的优化,这函数对外界没影响,外界也不会影响函数,cc会认为这个函数没用而整体消除掉,DelayCnt 声明加个 volatile 就好了。

嗯,好象不属于LOOP UNROLLING,



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-20 13:12 , Processed in 0.170268 second(s), 20 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表