zoukankan      html  css  js  c++  java
  • 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个字。

  • 相关阅读:
    自定义行操作事件——DataGrid系列
    分页样式——DataGrid系列
    勾选批量操作——DataGrid系列
    快速排序的基本实现
    2021/06--09学习情况一些总结和反思
    IntegerCache的一些联想
    Hibernate, Jpa, Spring Data Jpa的关系与区别
    Springboot+Hibernate+Transactional中save提交引发的db异常无法捕获
    一个涉及多系统多步骤的业务需求设计与思考
    Use SQL to query dataverse
  • 原文地址:https://www.cnblogs.com/WeyneChen/p/4635467.html
Copyright © 2011-2022 走看看