Как написать 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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]