是否可以用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语言链接可确保以与启动代码中的符号引用兼容的方式执行任何名称修饰。

其他处理器系列仅将固定地址用于复位 vector ,并通过将每个处理程序地址写入对应于其中断的特殊功能寄存器来安装其他中断处理程序。对于这些,仅调用约定很重要,而函数名称/链接无关。 ARM Cortex-M允许您编写一个特殊的功能寄存器,以在备用地址处查找整个 vector 表,而无需重新定位各个处理程序。

07-24 09:44
查看更多