|
最近在调试SD卡驱动和FAT32文件系统,今晚碰到如下代码
最开始现象的代码如下:
- int main(void)
- {
- ....
- ....
- ....
- SDReadSingleBlock(0x4040,Buff_For_Test);
- while(0x0!=Buff_For_Test[i])
- {
- UartSendCh(Buff_For_Test[i++]);
- }
- .....
- .....
- .....
- return 0x0
- }
复制代码
debug发现,当程序执行到while时就会进HardFault_Handler。摸不着头脑。遂换种写法,如下
- int main(void)
- {
- ....
- ....
- ....
- SDReadSingleBlock(0x4040,Buff_For_Test);
- for(i=0;i<512;)
- {
- UartSendCh(Buff_For_Test[i++]);
- }
- .....
- .....
- .....
- return 0x0
- }
复制代码
debug发现程序可以执行。
但是,就C语言语法而言,while与for应该是没问题的。遂推断,第一个代码错,错不在while,应该在别的地。然后,debug单步到while之后,无意发现变量i的值竟然是0x080008A8;
然后看Buff_For_Test的起始地址是0x20000018。使用的芯片是STM32F103RB,片内RAM的起始地址为0x20000000,大小为20KB,那么片内RAM的结束地址为0x20000000+0x5000-1。
但是,执行到while时i的值为0x080008A8再加上Buff_For_Test的起始地址。此时,地址范围远远超过片内RAM地址。也就是说地址越界了。操作的地址空间没有存储单元。
参考《CM3权威指南》 “访问没有存储器的空地址产生MemFault” 这难道不该产生“MemFault”嘛?
但是在debug窗口,观察如下图:
如图所示,并没有响应的MemFault产生。
这是为什么呢? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|