变量定义的顺序不同,MDK的优化结果却不一样

2019-07-14 14:49发布


问题描述:
使用MDK4或5编译ST的USB-host库时,里面有个USB_OTG_BSP_uDelay函数,本函数本身在-03级优化下是没有问题的,但我手痒,对里面的变量的定义顺序做了一下修改,结果-o3优化下出问题了(表现为该延时函数不准确,导致部分U盘枚举失败),请教大师分析一下:
错误改法: 将定义 “const Uint32 utime = (Uint32)120 * usec / 7;” 放到 “__IO Uint32 uCount = 0;” 代码前面。
我的问题:仅仅是变量定义的顺序不同,为什么优化后结果却不一样(不是存储对齐的问题)?


正常的代码如下:
void USB_OTG_BSP_uDelay(const uint32_t usec)
{
__IO Uint32 uCount = 0;
const Uint32 uTime = (Uint32)120 * usec / 7;

while (1)
{
   if (++uCount > uTime)
   {
    return;
   }
}
}

错误的代码如下:
void USB_OTG_BSP_uDelay(const uint32_t usec)
{
const Uint32 uTime = (Uint32)120 * usec / 7;
__IO Uint32 uCount = 0;


while (1)
{
   if (++uCount > uTime)
   {
    return;
   }
}
}


附件是正常的与错误的反汇编截图,请大家指点!





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
jfuwre
2019-07-15 22:55
aril1227 发表于 2019-1-4 12:09
哦,是延时函数不达标引起的。我不熟悉汇编,还要麻烦您看下顶帖的反汇编对比图。

如果是软延时呢,那就是很正常不过的了,因为有时候编译器会采用不同的优化策略,即使是非常小的改动,甚至无关的改动!!!硬延时的话,那就要看看数值是否正确了!!!如果是软延时,个人建议可以加大一下数值,或者直接用宏nop,如果要求非常高的化!!!!

一周热门 更多>