变量定义的顺序不同,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条回答
aril1227
1楼-- · 2019-07-14 20:45
有熟悉汇编的能解答下么
aril1227
2楼-- · 2019-07-15 01:34
胡德胜快回答 发表于 2019-1-4 10:54
定义的顺序不同,所以初始化的顺序也不同
优化不一样,应该是正常现象吧

感谢您的回复,现在问题是优化后运行不正常了,出现该延时函数不正确了。2个图对比的结果是少了一个LDR加载数据的指令。
jfuwre
3楼-- · 2019-07-15 05:52
aril1227 发表于 2019-1-4 11:16
感谢您的回复,现在问题是优化后运行不正常了,出现该延时函数不正确了。2个图对比的结果是少了一个LDR加载数据的指令。

现在还这么客气的人不多啦!!!!出现不正常指的是什么???延时函数不出来?还是延时时间不对?
aril1227
4楼-- · 2019-07-15 09:08
jfuwre 发表于 2019-1-4 11:31
现在还这么客气的人不多啦!!!!出现不正常指的是什么???延时函数不出来?还是延时时间不对?

本帖最后由 野马-425178 于 2017-5-12 10:00 编辑

让版主费心了!
这个问题是我在USB-HOST枚举U盘时发现的,如果将将定义 “const Uint32 uTime = (Uint32)120 * usec / 7;” 放到 “__IO Uint32 uCount = 0;” 代码前面,就出现部分U盘无法枚举,而把定义顺序反过来就正常了。
我现在想了解的是为什么这两个变量定义顺序交换一下就会出现异常,到底我错在哪里了
正常的代码如下:
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;
  }
}
}
正常和错误的反汇编截图在顶贴有附图,感谢版主!
jfuwre
5楼-- · 2019-07-15 13:34
 精彩回答 2  元偷偷看……
aril1227
6楼-- · 2019-07-15 17:50
jfuwre 发表于 2019-1-4 11:53
首先呢,USB我没有搞过,只是以前稍微看过一点点,这方面你会比我清楚很多!!!!但是呢,我看你都定位到错误的原因是那个延时函数!!!所以我想问的是,你把变量顺序改过后,这个延时函数出现了那些问题,是变成死循环了,还是延时不达标了!!!! ...

哦,是延时函数不达标引起的。我不熟悉汇编,还要麻烦您看下顶帖的反汇编对比图。

一周热门 更多>