I want to use C++
as my main programming language for my microcontroller (MSP432) projects.
I wrote some simple scripts not involving interrupt service routines (ISR). They all worked fine. The code had looked like the following:
/* 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. */
}
Now I wanted to upgrade my code to have simple ISR like for UART communication (serial PC interface). So I did this:
/* 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. */
}
The issue with this code is that the ISR is not get triggered. Instead the default ISR from the DriverLib is called. I wondered and started to try digging myself.
At some point I accidentally put extern "C"
around the ISR defined in the C++ part of the source code. And it worked:
/* 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 assume since "I" (DriverLib) registered the ISR vectors and extern
ISR signatures in the C (not the C++) part of the source code, my C++ ISR is some kind out of scope for the ISR signature..
1) Am I right?
But there is a catch. Since I moved my C++ ISR into C context I am not able to use C++ code e.g. classes etc. anymore within the ISR.
2) How to keep C++ within the ISR within the C++ part of the source code without touching DriverLib's ISR initialization (e.g. startup_msp432p401r_ccs.c
)?
- C++ stuff is
C++03
- C stuff is
C89