Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的armcortex-M中断处理程序+; < >可以在C++中编写一个类似于ST和NXP的ARM皮质芯片的中断处理程序。 目前,我开发了大量的C++皮质ARM芯片代码。我有点厌倦了不得不调用C回调函数中的静态/全局/单点C++对象。有没有一种方法不必通过C函数 在中断发生时有没有直接调用C++对象函数的方法?< /p>_C++_C_Arm_Interrupt Handling_Cortex M - Fatal编程技术网

C+中的armcortex-M中断处理程序+; < >可以在C++中编写一个类似于ST和NXP的ARM皮质芯片的中断处理程序。 目前,我开发了大量的C++皮质ARM芯片代码。我有点厌倦了不得不调用C回调函数中的静态/全局/单点C++对象。有没有一种方法不必通过C函数 在中断发生时有没有直接调用C++对象函数的方法?< /p>

C+中的armcortex-M中断处理程序+; < >可以在C++中编写一个类似于ST和NXP的ARM皮质芯片的中断处理程序。 目前,我开发了大量的C++皮质ARM芯片代码。我有点厌倦了不得不调用C回调函数中的静态/全局/单点C++对象。有没有一种方法不必通过C函数 在中断发生时有没有直接调用C++对象函数的方法?< /p>,c++,c,arm,interrupt-handling,cortex-m,C++,C,Arm,Interrupt Handling,Cortex M,,可以用编译成本机代码的任何语言编写中断处理程序。< /P> 它仍然必须使用C语言链接和中断处理程序调用约定。这意味着没有成员功能。(从形式上讲,静态成员函数也是非法的,尽管它们通常在实践中工作。非静态成员函数不能使用。) 在C++中,首先启用C语言链接,并使用外部“C”< /代码>。还可以对中断处理程序使用任何编译器特定的关键字,如\uu interrupt 函数内,你可以使用C++的全部力量——对象,对于in循环,智能指针,模板实例等等。尽管你仍然需要小心在中断上下文中做多少工作,C++趋向

,可以用编译成本机代码的任何语言编写中断处理程序。< /P> 它仍然必须使用C语言链接和中断处理程序调用约定。这意味着没有成员功能。(从形式上讲,静态成员函数也是非法的,尽管它们通常在实践中工作。非静态成员函数不能使用。)

在C++中,首先启用C语言链接,并使用<代码>外部“C”< /代码>。还可以对中断处理程序使用任何编译器特定的关键字,如
\uu interrupt

函数内,你可以使用C++的全部力量——对象,对于in循环,智能指针,模板实例等等。尽管你仍然需要小心在中断上下文中做多少工作,C++趋向于隐藏复杂性,这样你就不再有对生成多少机器指令的感觉。


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

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

不在中断发生时直接调用C++对象函数?< /P>


简而言之,不是。即使将非静态方法声明为
void(void)
,它仍然有一个隐式参数-
this
。另一方面,中断处理程序根本没有参数。

我可以将您的答案总结为:不,这是不可能的,因为需要使用C调用约定?如果是这样,那就引出了另一个问题,为什么我们要遵守这个惯例?@Bart:很难总结,因为你有多个问题。你的第一个问题是:是否有可能在C++中为ARM皮质芯片编写一个中断处理程序?答案是肯定的。对于“是否有一种方法不必通过C函数前进?”也是肯定的。因为“有没有一种方法在中断发生时直接调用C++对象函数?”“没有。”C++对象函数“可以表示多个东西,它们都不可用作中断处理程序。”处理器不知道
这个
指针或类似的东西。事实上,中断处理程序可能甚至不使用用于其他函数的C调用约定,您可能会通过使用关键字获得特殊调用约定(例如,代码>“YORD中断< /代码>”,因此在C++中,您将以 Extn”C“y-中断无效(空(空))< /代码>)。(关键字的拼写取决于您的编译器)编译器将处理此详细信息。它不能做的是凭空创建一个
这个
指针。感谢您的澄清。我明白你的意思。通过使用单一对象或全局对象,我隐式地停止了使用,因此解决了这个问题。@old_timer:你能检查我的编辑是否足够精确以避免混淆吗?谢谢你的回答,我理解你的意思。只有该类的静态函数才是有效的候选函数。