今天在移植Arduino的时候,一直不明白Due是如何进入串口中断的。Due是在串口中断中接收字符,并将其存储。有下面的代码: void USARTClass::IrqHandler( void ) { uint32_t status = _pUsart->US_CSR; // Did we receive data ? if ((status & US_CSR_RXRDY) == US_CSR_RXRDY) _rx_buffer->store_char( _pUsart->US_RHR ) ; // Acknowledge errors if ((status & US_CSR_OVRE) == US_CSR_OVRE || (status & US_CSR_FRAME) == US_CSR_FRAME) { // TODO: error reporting outside ISR _pUsart->US_CR |= US_CR_RSTSTA; } } 这个代码到时不难,能看懂,但是不知道这个中断是如何进入的。 希望了解的能够给点提示。 |
// IT handlers
void USART0_Handler(void)
{
Serial1.IrqHandler();
}
void USART1_Handler(void)
{
Serial2.IrqHandler();
}
void USART3_Handler(void)
{
Serial3.IrqHandler();
}
但是不明白的是,在启动代码中,写的那些中断处理函数,能不能调用C++的函数呢?
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件,并重命名为xxx.cpp,让编译器用C++的方式进行编译,从而include C++ 的头文件不会报错。
(2)加 extern "C" 功能,告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。
extern "C"{
// IT handlers
void USART0_Handler(void)
{
Serial1.IrqHandler();
}
void USART1_Handler(void)
{
Serial2.IrqHandler();
}
void USART3_Handler(void)
{
Serial3.IrqHandler();
}
}
不明白的地方就在这里,之前都是C++调用C,这次是C调用C++,感觉有点奇葩。在汇编的启动文件中,那些函数是C的还是C++的呢?我觉得是C的。。。
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Serial pc(USBTX, USBRX);
void callback() {
// Note: you need to actually read from the serial to clear the RX interrupt
printf("%c\n", pc.getc());
led2 = !led2;
}
int main() {
pc.attach(&callback);
while (1) {
led1 = !led1;
wait(0.5);
}
}
看这个例子,这是一个串口中断的,主函数使能中断 pc.attach(&callback);
callback就是中断服务函数,这是直接调用mbed API操作。 pc.getc()可以直接截取接收到的内容十分方便,建议去看看mbed 的库函数!
例如Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK] //这一句就是连接到了外部你编写的函数名了
这个外部函数是C语言的还是C++得呢?