STM32/STM8技术论坛
直播中

ben111

11年用户 2640经验值
擅长:模拟技术 嵌入式技术 MEMS/传感技术
私信 关注
[经验]

STM32堆栈溢出和中断服务程序

在使用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值的改变都是在SD卡的interrupt服务程序里面。
在interrupt里面设置断点,发现程式根本没有进去。但是gbuffer里面的值都有变化。
意思也就是说,读SD card都正常,但是就是不进中断。
为什么不进中断?我把所有触发中断的条件都打开了。这是问题二。
综合问题一和二,我发现从程序逻辑上来分析已经讲不通了。于是想到了栈的大小。。。
尝试着把Stack_Size      EQU     0x00000200
改为Stack_Size      EQU     0x00000800
结果,程式再也不会卡死了,数据也能正常读取。。。。
虽然问题解决了,但是问题出现的根本原因还是不清楚,大概推断是堆栈溢出了。中断服务程序是要
使用MSP主堆栈的。在堆栈溢出的情况下,中断服务程序的PC就找不到了,或者发生了其他问题,所以程序就跑飞了。
以下摘自 《CM3权威指南》,关于中断服务程序和堆栈的描述




进入中断后,入栈的8个字。



更多回帖

发帖
×
20
完善资料,
赚取积分