C++中的 ARM Cortex-M 中断处理程序

ARM Cortex-M interrupt handler in C++

本文关键字:中断处理 程序 Cortex-M ARM 中的 C++      更新时间:2023-10-16

是否可以用C++为ARM Cortex芯片(如ST和NXP的芯片)编写中断处理程序。

目前,我为ARM皮层芯片开发了很多C++代码。我有点厌倦了不得不从 C 回调函数调用静态/全局/单例C++对象。有没有办法不必通过 C 函数。

有没有办法在发生中断时直接调用C++对象函数?

可以用任何编译为本机代码的语言编写中断处理程序。

它仍然必须使用带有中断处理程序调用约定的 C 语言链接。 这意味着没有成员函数。 (从形式上讲,静态成员函数也是非法的,尽管它们通常在实践中工作。 不能使用非静态成员函数。

在C++中,首先启用 C 语言与extern "C"的链接。 还可以对在 C 中使用的中断处理程序使用任何特定于编译器的关键字,例如__interrupt

在函数内部,您可以使用C++的全部功能 - 对象,for-in循环,智能指针,模板实例等。 尽管您仍然希望注意在中断上下文中执行了多少工作,并且C++倾向于隐藏复杂性,因此您不再了解正在生成多少机器指令。


在 ARM Cortex M 芯片上,有一个位于预设内存地址的功能指针表。 该表可以用 C 或程序集构造,如果中断处理程序未使用正确的名称导出,则链接器将无法找到属于表中的地址。 C 语言链接可确保以与启动代码中的符号引用兼容的方式执行任何名称重整。

其他处理器家族仅对复位向量使用固定地址,并通过将每个处理程序地址写入与其中断对应的特殊功能寄存器来安装其他中断处理程序。 对于这些,只有调用约定很重要,而不是函数名称/链接。 ARM Cortex-M 允许您编写一个特殊的函数寄存器,以在备用地址查找整个向量表,但不能重新定位单个处理程序。

发生中断时是否可以直接调用C++对象函数?

简而言之,没有。即使将非静态方法声明为void (void),它仍然有一个隐式参数 -this。另一方面,中断处理程序根本没有参数。