Для обработчиков прерываний требуется компоновка C, если используется компиляция C ++:
extern "C" void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
Без связи C функция USART1_IRQHandler
не заменит обработчик по умолчанию с тем же именем, но с связью C, которая является бесконечным циклом, следовательно, она выглядит как " застрявшая в функции прерывания " , что это ... просто другая функция прерывания.
Связка C предотвращает "искажение имени" в C ++, которое иначе приводит к тому, что символ не совпадает с именем символа слабой ссылки обработчика прерываний.