C++中的 ARM Cortex-M 中断处理程序
ARM Cortex-M interrupt handler in C++
是否可以用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
。另一方面,中断处理程序根本没有参数。
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 在遍历处理程序的向量时注册和注销处理程序
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 通过安装信号处理程序关闭多线程应用程序
- QDateTime::toString() 在退出处理程序中使用时失败
- 如何在 WindowProc 处理程序中区分箭头键和数字键盘?
- async_write完成处理程序最早何时完成?
- C++事件系统 - 多态事件和事件处理程序
- 具有shared_ptr的处理程序中的分段错误
- 为什么我的信号处理程序只执行一次?
- Atmel Studio 7:ASF 库提供的 USART 中断处理程序仅在 main() 中遇到无限循环时工作一次?
- 为什么我的中断被调用,但不会进入处理程序?
- 如何在 Arduino 中使用 C++ 成员函数作为中断处理程序?
- C++中的 ARM Cortex-M 中断处理程序
- STM32L011:无法在中断处理程序中清除中断标志
- 将 INT3 中断保留给视觉工作室上的应用程序异常处理程序
- 中断处理程序中的浮点操作(PowerPC, VxWorks)