是否可以用C ++为ST和NXP等ARM Cortex芯片编写中断处理程序。
当前,我用C ++开发了许多用于ARM cortex芯片的代码。我对必须从C回调函数中调用静态/全局/单个C ++对象感到不胜其烦。有没有办法不必通过C函数。
是否会在发生中断时直接调用C ++对象函数?
答案 0 :(得分:2)
可以使用任何可编译为本机代码的语言编写中断处理程序。
它仍然必须与中断处理程序调用约定一起使用C语言链接。这意味着没有成员函数。 (虽然静态成员函数通常在实践中也可以使用,但通常来说它们也是非法的。不能使用非静态成员函数。)
在C ++中,首先使用extern "C"
启用C语言链接。对于在C中使用过的中断处理程序,还可以使用任何特定于编译器的关键字,例如__interrupt
。
在该函数内部,您可以使用C ++的全部功能-对象,for-in循环,智能指针,模板实例等。尽管您仍然要注意在中断上下文和C ++中要做的工作量往往掩盖了复杂性,因此您不再需要了解正在生成多少机器指令。
在ARM Cortex M芯片上,在预设的存储器地址处有一个函数指针表。该表可以用C或汇编语言构造,并且如果未使用正确的名称导出中断处理程序,则链接程序将无法找到该表中的地址。 C语言链接可确保以与启动代码中的符号引用兼容的方式执行任何名称修饰。
其他处理器系列仅将固定地址用于复位向量,并通过将每个处理程序地址写入对应于其中断的特殊功能寄存器来安装其他中断处理程序。对于这些,仅调用约定很重要,而函数名称/链接无关。通过ARM Cortex-M,您可以编写一个特殊的功能寄存器来在备用地址处查找整个向量表,而无需重新定位各个处理程序。
答案 1 :(得分:1)
是否会在发生中断时直接调用C ++对象函数?
总之,不。即使您将非静态方法声明为void (void)
,它仍然具有隐式参数-this
。另一方面,中断处理程序根本没有参数。