我一直堅持一段時間如何設置一個回調時發生異常。如何在發生異常時設置回調函數?
我有這樣的測試代碼:
void main()
{
long * bad = (long*)0x0A000000; //Invalid address
//When the following line gets executed
//it causes an error and the debugger sends me to an assembly file.
*bad = 123456789;
}
,我發送到看起來像這樣(實際文件的片段)的彙編文件:
.macro DEFAULT_ISR_HANDLER name=
.thumb_func
.weak \name
\name:
1: b 1b /* endless loop */
.endm
DEFAULT_ISR_HANDLER SRC_IRQHandler /*Debugger stops on this line*/
據我瞭解DEFAULT_ISR_HANDLER是一個宏它定義了一個無限循環。 我想要做的是在C文件中定義我自己的函數,以便在出現異常時調用,而不是調用DEFAULT_ISR_HANDLER宏中定義的內容。
我的問題是,我將如何定義一個宏,在該程序集中調用特定的C函數?
希望我解釋一下自己。任何有關這個主題的信息或方向,我們都很感激
在情況下,它是有關我使用GCC ARM編譯器v5.4_2016q3
感謝, 艾薩克
編輯
我使用的是Cortex-M3的。
直到現在我意識到我在談論處理器異常。根據數據表,有16種異常類型的列表。
顯然,它的工作方式是將所有的異常類型都重定向到宏,然後調用一些拇指函數,然後調用無限循環(根據代碼中的DEFAULT_ISR_HANDLER)。
我想要做的就是確定自己的功能在C文件中,爲了方便,所以每一個任何類型的處理器異常出現的時候,我可以控制如何進行。
C確實支持nmoit異常。 – Olaf
是的,但有*處理器異常/陷阱/ ...似乎是這樣的事情。我認爲需要澄清一些,例如使用的確切平臺和編譯器/運行時。 –
儘管C不支持異常,但特定環境提供擴展來支持它們。例如,avr-gcc。問題的答案可能在於所使用的特定編譯器支持特定平臺的文檔。作爲一個快速提示,它看起來像服務例程被定義爲一個弱符號,所以可能有一些宏可以幫助您定義自己的具有相同符號名稱的處理程序,以便鏈接器或init代碼安裝它而不是默認的。 – spectras