如何使用 MSP432 DriverLib 的 C 代码编写 C++ ISR?
How to write C++ ISR with MSP432 DriverLib'c C code?
我想使用 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 context 我不能使用 C++ 代码,例如类 等等 ISR 中的其他内容。
2) 如何在不触及 DriverLib 的 ISR 初始化(例如 startup_msp432p401r_ccs.c
)的情况下将 C++ 保留在源代码的 C++ 部分的 ISR 中?
- C++ 的东西是
C++03
- C 东西是
C89
如果驱动库是静态的(即.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 函数。
我想使用 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 context 我不能使用 C++ 代码,例如类 等等 ISR 中的其他内容。
2) 如何在不触及 DriverLib 的 ISR 初始化(例如 startup_msp432p401r_ccs.c
)的情况下将 C++ 保留在源代码的 C++ 部分的 ISR 中?
- C++ 的东西是
C++03
- C 东西是
C89
如果驱动库是静态的(即.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 函数。