问题描述:
使用MDK4或5编译ST的USB-host库时,里面有个USB_OTG_BSP_uDelay函数,本函数本身在-03级优化下是没有问题的,但我手痒,对里面的变量的定义顺序做了一下修改,结果-o3优化下出问题了(
表现为该延时函数不准确,导致部分U盘枚举失败),请教大师分析一下:
错误改法: 将定义 “const Uint32 u
time = (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;
}
}
}
附件是正常的与错误的反汇编截图,请大家指点!
显然的,你这么写后,47EE处开始的代码和其循环,总是把值从ram中取出,然后加,又存到了ram,最后比较,如此循环,这个是没问题的。
一周热门 更多>