诗诺比 发表于 2014-5-12 17:02:06

发现AME源码一个恶性BUG, FSMC初始化缺一个成员!

在void LCD_FSMC_Config(void)函数中, 初始化FSMC时,
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
这条语句缺了....
============================

FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;
在函数体内, 这个结构体是局部变量,
局部变量并不总是0的...

发现经过..
1. 移植MDK后, 总是进入HardFault_Handler中断...
   跟踪到的位置很奇怪...表面上没啥问题是个Delay,而且不是第一次执行

2. 发现关闭FPU后, 一切OK

3. 陷入误区, 找不到原因

4. 发现屏蔽LCD_FSMC_Config这个函数后, 一切正常

5. 发现调速语序后, 适当的地方加入FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);就OK

6. 逐一核对 FSMC_NORSRAMStructInit函数, 发现源码中缺了之前提到的那条...

7. 总结原因:FPU开启后应该会有额外的初始化, 造成RAM占用比不开时多些,

原本FSMC_NORSRAMInitStructure所在的RAM区在上电后清零的, 但在FPU初始化时, 脏掉了...
导致 FSMC配置错误 , 执行失败


8.后记, 局部变量一定要先赋值后使用...局部结构体尤其要注意


ZephRay 发表于 2014-5-14 13:41:26

IAR下好像没遇到什么问题,谢谢提醒。

诗诺比 发表于 2014-5-14 14:45:16

本帖最后由 诗诺比 于 2014-5-14 14:47 编辑

nbzwt 发表于 2014-5-14 13:41 static/image/common/back.gif
IAR下好像没遇到什么问题,谢谢提醒。
问题在于 未初始化的局部变量, 这在某些情况下可能有问题, 某些情况下可能没有


但从C语言规范来说...是不可以使用未赋值的局部变量的, 其值未知

我在MDK下, 开启FPU才出现这问题
页: [1]
查看完整版本: 发现AME源码一个恶性BUG, FSMC初始化缺一个成员!