在使用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个字。

STM32堆栈溢出的更多相关文章

  1. STM32/GD32上内存堆栈溢出探测研究

    无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!主要溢出情况如下:1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间2, ...

  2. arcgis engine 中出现的内存堆栈溢出问题。

    两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...

  3. CC_STACKPROTECTOR防内核堆栈溢出补丁分析【转】

    转自:https://yq.aliyun.com/articles/1723 摘要: 作者:王智通   CC_STACKPROTECT补丁是Tejun Heo在09年给主线kernel提交的一个用来防 ...

  4. Javascript中递归造成的堆栈溢出及解决方案

    关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...

  5. js堆栈溢出错误

    function prompt() { var answer = prompt("What is your name","") if (answer) { al ...

  6. 如何解决js递归里面出现的堆栈溢出

    16.下面的递归代码在数组列表偏大的情况下会导致堆栈溢出.在保留递归模式的基础上,你怎么解决这个问题? var list = readHugeList(); var nextListItem = fu ...

  7. VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)

    在调试一个代码时,执行过程中会出现如下错误(0xC00000FD: Stack overflow). 很明显是堆栈溢出了. 网上很多方法,都是通过修改设置工程配置,把堆栈调大一些,如下图. 但是堆栈到 ...

  8. stm32 堆溢出

    STM32 堆溢出 遇到的问题 最近在给旧项目添加了段代码,程序经常到某个状态就突然崩溃了,也不一定是在运行新代码的时候崩溃.检查了几遍代码,数组越界访问,除数为0,内存泄露等常见的问题都不存在. 原 ...

  9. propertychange事件导致的IE浏览器堆栈溢出

    前段事件做项目,在IE下测试时,发现会报堆栈溢出的错误,其他浏览器正常,于是开始了苦逼的IE查错路程... 由于是在操作了某个输入框之后才出现的错误,所以把重点放到了input的相关事件,最终发现是这 ...

随机推荐

  1. datatable绑定comboBox显示数据[C#]

    实现功能: datatable绑定comboBox,在下拉菜单中显示对应数据 实现方法: 1.生成datatable,并为combox绑定数据源: comboBox1.DataSource = dt1 ...

  2. ioc和aop的理解(Spring就是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。)

    IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转.在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决.这个第三方指的就是Spring的容 ...

  3. AS技巧合集「编码技巧篇」

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=254725&extra=page%3D2%26filter%3Dautho ...

  4. MapReduce实现WordCount

    package algorithm; import java.io.IOException; import java.util.StringTokenizer; import org.apache.h ...

  5. 【codeforces 733F】 Drivers Dissatisfaction

    http://codeforces.com/problemset/problem/733/F (题目链接) 题意 给出一张n个点的无向图,每一条变有两个特征值:${w,c}$:分别表示这条边的权值为$ ...

  6. bzoj3262: 陌上花开(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  7. bzoj3669[Noi2014]魔法森林

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. fabric note

    #!/usr/bin/env python # -*- coding:utf-8 -*- from fabric.api import * from fabric.context_managers i ...

  9. 通过Calendar类判断是否是周末及是否在指定时间

    package time; import java.sql.Timestamp; import java.util.Calendar; import java.util.Date; public cl ...

  10. 和redis谈一场恋爱(第二天约会了解彼此)

    最近使用了Memcache,带来的便利已经让我欣喜若狂.开启了另一种又快又好的方式存储和读取数据.中间经过了一番折腾,学习了mysql,终于有学到了redis. Redis的全名是Remote Dic ...