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

ARM Cortex-M interrupt handler in C++

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

目前我为ARM cortex芯片开发了大量的C++代码。我有点受够了必须从 C 回调函数调用 static/global/singleton C++ 对象。有没有办法不必通过 C 函数。

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

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

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

在C++中,首先启用与extern "C"的C语言联动。还可以使用任何 compiler-specific 关键字作为您在 C 中使用的中断处理程序,例如 __interrupt.

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


在 ARM Cortex M 芯片上,在预设内存地址处有一个 table 函数指针。 table 可以用 C 或汇编语言构建,如果您的中断处理程序没有以正确的名称导出,链接器将无法找到属于 table 的地址。 C 语言链接确保以与启动代码中的符号引用兼容的方式执行任何名称修改。

其他处理器系列仅对复位向量使用固定地址,并通过将每个处理程序地址写入与其中断对应的 special-function 寄存器来安装其他中断处理程序。对于这些,只有调用约定很重要,而不是函数 name/linkage。 ARM Cortex-M 允许您编写特殊功能寄存器以在备用地址找到整个向量 table,但不能重新定位各个处理程序。

Is away to directly call a C++ object function when a interrupt occurs?

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