2

我想将其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)extern在源代码的 C(不是 C++)部分中注册了 ISR 向量和 ISR 签名,因此我的 C++ ISR 超出了 ISR 签名的范围。

1)我是对的吗?

但是有一个问题!由于我C++ ISR 移动到 C上下文中,因此我无法在 ISR 中使用 C++ 代码,例如类等。

2) 如何在不触及 DriverLib 的 ISR 初始化(例如)的情况下将 C++ 保持在源代码的 C++ 部分内的 ISR 内startup_msp432p401r_ccs.c

  • C++ 的东西是C++03
  • C的东西是C89
4

1 回答 1

2

如果驱动程序库是静态的(即.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 函数。

于 2017-07-20T15:46:04.243 回答