首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的ARM Cortex-M中断处理程序

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

Stack Overflow用户
提问于 2019-05-29 13:18:39
回答 2查看 1.5K关注 0票数 2

是否可以在C++中为ARM Cortex芯片编写中断处理程序,比如ST和NXP。

目前,我在C++中为ARM皮层芯片开发了大量代码。我受够了必须从C回调函数调用静态/全局/单例C++对象。有没有办法不用通过C函数。

当中断发生时,是否有一种直接调用C++对象函数的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-29 13:41:18

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

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

在C++中,首先启用C语言与extern "C"的链接。还可以为C中使用的中断处理程序使用任何特定于编译器的关键字,如__interrupt

在这个函数中,您可以使用C++的全部功能--对象、in循环、智能指针、模板实例等等。尽管您仍然希望对在中断上下文中所做的工作保持谨慎,而且C++倾向于隐藏复杂性,这样您就不会再感觉到生成了多少机器指令。

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

其他处理器家族只对重置向量使用固定地址,并通过将每个处理程序地址写入与其中断对应的特殊功能寄存器来安装其他中断处理程序。对于这些,只有调用约定才重要,而函数名称/链接则不重要。ARM Cortex-M允许您编写一个特殊的函数寄存器,以在另一个地址找到整个向量表,但不需要重新定位单个处理程序。

票数 3
EN

Stack Overflow用户

发布于 2019-05-29 14:02:09

是否在中断发生时直接调用C++对象函数?

在短时间内,没有。即使您将非静态方法声明为void (void),它仍然有一个隐式参数- this。另一方面,中断处理程序根本没有任何参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56361596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档