如何用MSP432 DriverLib'c C代码编写C ++ ISR?

时间:2017-07-20 15:34:19

标签: c++ c microcontroller interrupt msp432

我想使用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 ++内容为C++03
  • C stuff是C89

1 个答案:

答案 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函数。