OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2359|回复: 1

STM32堆栈溢出

[复制链接]

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
发表于 2018-7-11 16:17:38 | 显示全部楼层 |阅读模式
在使用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个字。


嵌入式学习交流群:769843038
参考资料:http://www.makeru.com.cn/


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2013-8-15
在线时间
44 小时
发表于 2018-7-11 17:27:50 | 显示全部楼层
请问你最后的结论是什么呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 19:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表