Я хочу использовать 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++03
C89
Если библиотека драйвера является статической (т.е. .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.
Других решений пока нет …