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