我想使用C++
作为我的微控制器(MSP432)项目的主要编程语言。
我写了一些不涉及中断服务程序( ISR )的简单脚本。他们一切都很好。代码如下所示:
/* MSP and DriverLib includes */
/* no <<extern "C">> needed due to the header files implement it. */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
int main()
{
/* Some C++ code here that worked fine. */
}
现在我想升级我的代码以获得简单的ISR,例如UART通信(串行PC接口)。所以我这样做了:
/* MSP and DriverLib includes */
/* no <<extern "C">> needed due to the header files implement it. */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
int main()
{
/* Some C++ code here that worked fine. */
}
void EUSCIA0_IRQHandler(void)
{
/* Some C++ code here that worked fine. */
}
此代码的问题是ISR未被触发。而是调用DriverLib的默认ISR。我想知道并开始尝试挖掘自己。
在某些时候,我意外地将extern "C"
放在源代码的C ++部分中定义的ISR周围。它起作用了:
/* MSP and DriverLib includes */
/* no <<extern "C">> needed due to the header files implement it. */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
int main()
{
/* Some C++ code here that worked fine. */
}
extern "C"
{
void EUSCIA0_IRQHandler(void)
{
/* Only C code here works fine. */
}
}
我假设因为“I”(DriverLib)在源代码的C(而不是C ++)部分注册了ISR向量和extern
ISR签名,我的C ++ ISR是ISR的某种范围之外的签名..
1)我是对的吗?
但有一个问题。由于我将我的C ++ ISR移动到C 上下文,我无法使用C ++代码,例如ISR内的课程等等。
2)如何在不触及DriverLib的ISR初始化(例如startup_msp432p401r_ccs.c
)的情况下将C ++保留在源代码的C ++部分的ISR中?
C++03
C89
答案 0 :(得分:1)
如果驱动程序库是静态的(即.a
),您可以执行以下操作:
extern "C" void EUSCIA0_IRQHandler(void)
{
// whatever ...
}
这应该用您的标准函数替换[您可以使用nm
等进行检查]。并且,当驱动程序库注册ISR函数时,它应该捕获你的而不是它的内部函数
我相信您现在可以通过此功能调用c++
代码。
如果没有,您可能需要:
void cplus_plus_handler(void)
{
// whatever ...
}
extern "C" void EUSCIA0_IRQHandler(void)
{
cplus_plus_handler();
}
这可能是原样的。但是,cplus_plus_handler
可能需要位于单独的.cpp
文件中[使用.c
中的C处理程序。
如果库是动态的(即.so
,.dll
),您可能需要调用注册函数来附加您的ISR函数。