簡體   English   中英

C ++中的ARM Cortex-M中斷處理程序

[英]ARM Cortex-M interrupt handler in C++

是否可以用C ++為ST和NXP等ARM Cortex芯片編寫中斷處理程序。

目前,我為ARM皮質芯片開發了許多C ++代碼。 我對必須從C回調函數中調用靜態/全局/單個C ++對象感到不勝其煩。 有沒有辦法不必通過C函數。

有沒有辦法在發生中斷時直接調用C ++對象函數?

可以使用任何編譯為本地代碼的語言編寫中斷處理程序。

它仍然必須與中斷處理程序調用約定一起使用C語言鏈接。 這意味着沒有成員函數。 (雖然通常在實踐中會使用靜態成員函數,但它們通常也是非法的。不能使用非靜態成員函數。)

在C ++中,首先使用extern "C"啟用C語言鏈接。 對於在C中使用的中斷處理程序,還要使用任何特定於編譯器的關鍵字,例如__interrupt

在函數內部,您可以使用C ++的全部功能-對象,for-in循環,智能指針,模板實例等。盡管您仍要注意在中斷上下文中要執行多少工作,並且C ++傾向於隱藏復雜性,因此您不再需要了解正在生成多少機器指令。


在ARM Cortex M芯片上,在預設的存儲器地址處有一個函數指針表。 該表可以用C或匯編語言構造,並且如果未使用正確的名稱導出中斷處理程序,則鏈接程序將無法找到該表中的地址。 C語言鏈接可確保以與啟動代碼中的符號引用兼容的方式執行任何名稱修飾。

其他處理器系列僅將固定地址用於復位向量,並通過將每個處理程序地址寫入對應於其中斷的特殊功能寄存器來安裝其他中斷處理程序。 對於這些,僅調用約定很重要,而函數名稱/鏈接無關。 ARM Cortex-M允許您編寫一個特殊的功能寄存器,以在備用地址處查找整個向量表,而無需重新定位各個處理程序。

是否可以在發生中斷時直接調用C ++對象函數?

總之,沒有。 即使你宣布你的非靜態方法void (void) ,它仍然有一個隱含參數- this 另一方面,中斷處理程序根本沒有參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM