2017-06-22 68 views
2

我一直堅持一段時間如何設置一個回調時發生異常。如何在發生異常時設置回調函數?

我有這樣的測試代碼:

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文件中,爲了方便,所以每一個任何類型的處理器異常出現的時候,我可以控制如何進行。

+0

C確實支持nmoit異常。 – Olaf

+0

是的,但有*處理器異常/陷阱/ ...似乎是這樣的事情。我認爲需要澄清一些,例如使用的確切平臺和編譯器/運行時。 –

+1

儘管C不支持異常,但特定環境提供擴展來支持它們。例如,avr-gcc。問題的答案可能在於所使用的特定編譯器支持特定平臺的文檔。作爲一個快速提示,它看起來像服務例程被定義爲一個弱符號,所以可能有一些宏可以幫助您定義自己的具有相同符號名稱的處理程序,以便鏈接器或init代碼安裝它而不是默認的。 – spectras

回答

6

你有兩個選擇:

只要定義一個C函數與void SRC_IRQHandler(void)簽名,因爲宏定義的默認處理是軟弱的,你的功能將覆蓋在鏈接階段的默認處理程序。

在您的項目中應該有一個地方,SRC_IRQHandler被放置在Cortex-M3架構中的所謂的矢量表中。你可以用你自己的C函數替換這個函數的名字,當這個中斷(異常)發生時,你的函數將被調用。

+0

我正在閱讀這個[教程](https://community.arm.com/processors/b/blog/posts/writing-your-own-startup-code-for-cortex-m),你正在解釋的是在做什麼現在對我來說很有意義。我會在早上嘗試這個。榮譽給你。 – Qnoobish

+0

我可以證實,這工作得很好。感謝您的答覆。 – Qnoobish

0

cortex-m系列通常有16個以上的例外,還有那些中斷由該內核實現,32,64,128,256。但它們都基本相同。在Cortex-M系列的工作方式是他們執行的EABI呼籲你,如果你願意,他們保留一些寄存器,然後在中,這樣你可以有地址的方式來完成量表叫出來的地址開始執行一個正常編譯的C函數直接在表中。從歷史上看,你需要用一些代碼來封裝這個函數來保存和恢復狀態,而且通常指令集有一個特殊的中斷返回,但是它們做了一些不同的cortex-m。

因此,知道那麼接下來的問題是如何獲得表中的地址,這取決於您的代碼,構建系統等。這些處理程序可能會設置指向RAM中的地址,也許你是在RTOS上運行,並且有一個函數稱爲運行時註冊異常函數,然後RTOS更改代碼或某個數據值,並將其與綁定到它們的處理程序綁定在一起,該處理程序實質上是圍繞着您的。或者你正在彙編或其他工具特定的東西(儘管彙編在那裏,工作和簡單)向量表,你只需倒數正確數量的條目(或添加更多的條目,所以你可以倒數到右邊輸入)並放置C函數的名稱。

好主意在運行之前反彙編或對結果進行一些其他檢查以仔細檢查是否已將處理程序地址放置在該中斷/異常的正確物理地址處。

相關問題