http://t.csdn.cn/dlndk
接上片,在使用Keil5和GD32F407单片机时出现了如下故障。
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
经过研究发现是在使用FATFS文件系统的f_open,f_close等函数进行txt文件的写入时造成。具体的FATFS文件系统使用有很多帖子,我在这主要记录一下自己的问题出现和解决。
在完成了一系列查找和调试后,我可以在sd里通过fatfs文件写东西了,但紧接着发现退出包含了f_open,f_close等函数的子函数时,系统会直接掉进HardFault_Handler的死循环。针对这个硬件故障自己查了很多帖子,最共性的点都是说
自己检查一番后,感觉只能是堆栈溢出的问题,然而本人作为新手菜鸡,没遇到过这类问题不知道哪里为什么溢出了,查找无果后,本人直接搜“fatfs sd卡 Hardfault”这几个关键字组合起来,果然找到了更进一步的东西。
http://t.csdn.cn/UbNz4(文章出处)
据此找到了一个修改堆栈大小的帖子,在startup_gd32f407.s文件中,修改了堆栈的大小
然而,问题并没有结局,仍然会溢出。那么根据第一张图中说,Fatfs中有两个结构体非常大那么我便将
FATFS FileSys;
FIL File;
这两个结构体都放在了全局变量中,然而。。。依然无效。根据原理现在变量从栈区到了全局静态区,但是还会溢出,至此本人求助了一同事。同事通过如下操作解决了问题即:将FATFS生命的变量开辟在全局,而具体文件的FIle开辟在了局部。。。 然后就ok了。
FATFS FileSys;
void function()
{FIL File;}
个人分析,全放在全局变量同样导致了内存相应存储区的溢出,而把他们分开一个在全局变量,一个在局部变量,两个空间就都不会冲突了。