Преобразование Keil5 C Project в C ++ Project Error с помощью функции прерывания - PullRequest
0 голосов
/ 16 января 2019

После того, как я преобразовал Проект из C в C ++, программа, похоже, застряла в функции прерывания.

Я написал встроенный проект keil для C, а затем попытался написать его для C ++. Затем я обнаружил, что программа застряла в функции прерывания, даже если я правильно пишу функции IRQHandler (они работают в C-проекте). USART1 будет зависать, пока прием / передача CAN все еще работает.

// this is the USART_IRQHandler   

void USART1_IRQHandler(void)      
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   
    {                                                                        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

1 Ответ

0 голосов
/ 16 января 2019

Для обработчиков прерываний требуется компоновка 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 ++, которое иначе приводит к тому, что символ не совпадает с именем символа слабой ссылки обработчика прерываний.

...