問題描述
在使用基于 ARM CORTEX-M3、M4 或 M7 系列的 STM32 芯片做產(chǎn)品開發(fā)時,可能有人遇到過單次事件會觸發(fā)兩次中斷的情形?;蛟S對異?,F(xiàn)象的表述不盡相同,比方有的人會說怎么中斷請求標志要清 2 次才行;由于中斷里有些執(zhí)行操作,有人會說代碼里明明只執(zhí)行一次,可實際運行時卻是兩次;有的人會說,有些執(zhí)行動作放在中斷外執(zhí)行正常,放到中斷服務(wù)程序里又異常了等等。記得有一次,有個 STM32 用戶反映,他的 SPI 實際發(fā)送效果跟程序代碼里設(shè)計的完全不一樣,明明是 8 位發(fā)送,硬生生變成了 16 位發(fā)送,詭異的很。諸如此類。
問題分析
像上面提到的這些情況,他們的中斷服務(wù)程序代碼都有個共性。那就是他們把清外設(shè)中斷請求標志的那行代碼放在中斷程序的結(jié)尾處。
問題驗證
其實,當執(zhí)行完那句清標志的代碼后,按理 CPU 該做出棧操作了。但是,由于此時硬件檢測到剛才沒有實際清零的有效中斷請求標志,立即做出了一個決定----不做出棧操作,而是馬上準備響應(yīng)該中斷請求。這就是 ARM 為 Cortex-M 內(nèi)核中斷設(shè)計的咬尾機制。新的中斷響應(yīng)基于剛完成的中斷服務(wù)程序不做壓棧只稍作準備后立即運行新的中斷服務(wù)程序,當然這里的“新”理解為新的一次比較合適。說到這里,既然決定不做出棧操作了,至于出棧所需時間是多少個 CLK已經(jīng)不重要了。
問題小結(jié)
這里基于多個客戶共性話題,由淺入深地做了相應(yīng)分析和釋疑。拋磚引玉地就 ARMCortex-M4 內(nèi)核的咬尾中斷機制做了相關(guān)介紹,并基于具體測試代碼做了些直觀的體驗。希望能對大家在未來的 STM32 應(yīng)用開發(fā)有所幫助。