• 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个字。

  • 相关阅读:
    用js实现广告图片后加载
    Sql server存储过程和C#分页类简化你的代码
    SQL Server 1069 错误(由于登录失败而无法启动服务)解决方法
    ASP.NET编程中的十大技巧
    ASP.NET通用分页程序
    asp.net中使用SPLIT这个函数把一个字符串分成数组
    win2003+iis6服务器设置问题集
    一个较优雅的GridView隐藏列取值解决方案
    ACCESS的iif语句转到SQL语句!!!
    SCOPE_IDENTITY 和 @@IDENTITY
  • 原文地址:https://www.cnblogs.com/WeyneChen/p/4635467.html
Copyright © 2020-2023  润新知