码迷,mamicode.com
首页 > 其他好文 > 详细

STM32堆栈溢出

时间:2015-07-10 15:00:11      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

在使用STM32读取SD Card的文件时,总是会卡死在读函数那里

res = f_read(&fsrc, gbuffer, sizeof(gbuffer)-1, &br);

而且出现很奇怪的现象。若是我只定义全局变量

BYTE gbuffer[TEMP_SIZE];// file copy gbuffer,8-bit

那么程式必定会卡死。

若是我定义两个全局变量

BYTE gbuffer[TEMP_SIZE];// file copy gbuffer,8-bit
BYTE temp[TEMP_SIZE];//for log record

还是只用到gbuffer,temp只是定义并不使用,这时程式就会OK。这是问题一

这在逻辑上完全说不通,我没有使用到temp,只是定义了而已,为什么会影响到gbuffer呢?

于是调试程式,发现程式最终卡死在sdcard.c中的一个while循环里面。

else if (DeviceMode == SD_INTERRUPT_MODE)
{
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE);

while ((TransferEnd == 0) && (TransferError == SD_OK))
{

}
if (TransferError != SD_OK)
{
return(TransferError);
}
}

跳出while循环的两个条件TransferEnd和TransferError值的改变都是在interrupt里面。

在interrupt里面设置断点,发现程式根本没有进去。但是gbuffer里面的值都有变化。

意思也就是说,读SD card都正常,但是就是不进中断。

为什么不进中断?我把所有触发中断的条件都打开了。这是问题二。

综合问题一和二,我发现从程序逻辑上来分析已经讲不通了。于是想到了栈的大小。。。

尝试着把Stack_Size      EQU     0x00000200

改为Stack_Size      EQU     0x00000800

结果,程式再也不会卡死了,数据也能正常读取。。。。

 

虽然问题解决了,但是问题出现的根本原因还是不清楚。

STM32堆栈溢出

标签:

原文地址:http://www.cnblogs.com/WeyneChen/p/4635467.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!