繁体   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