Как написать C++ ISR с кодом MSP432 DriverLib'c C?

Я хочу использовать 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 (последовательный интерфейс ПК). Итак, я сделал это:

/* 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 не запускается. Вместо этого вызывается ISR по умолчанию из DriverLib. Я удивился и начал пытаться копать себя.

В какой-то момент я случайно поставил extern "C" вокруг ISR, определенного в C++ части исходного кода. И это сработало:

/* 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) зарегистрировал векторы ISR и extern Подписи ISR в части исходного кода на C (а не на C++), мой ISR на C++ является своего рода выходом за рамки подписи ISR.

1) Я прав?

Но тут есть подвох. Поскольку я переместил свой C++ ISR в контекст C, я больше не могу использовать код C++, например, классы и т. Д. В пределах ISR.

2) Как сохранить C++ в ISR в части C++ исходного кода, не касаясь инициализации ISR DriverLib (например, startup_msp432p401r_ccs.c )?

  • C++ материал C++03
  • C вещи это C89

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.

Другие вопросы по тегам