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個字。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM