问题现象
#define DEMO_LPUART_IRQHandler LPUART1_IRQHandler
对于RT1052中断服务函数,发现串口1中断服务没有编译,中断也无法进入。
void DEBUG_UART_IRQHandler(void)
{
BaseType_t xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
uint8_t ucTemp;
/*串口接收到数据*/
if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))
{
/*读取数据*/
ucTemp = LPUART_ReadByte(DEMO_LPUART);
queue_push(ucTemp);
/*将读取到的数据发送出去*/
//xQueueSendFromISR(xQueueUart, (void*)&ucTemp, &xHigherPriorityTaskWoken);
//portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
问题原因
__weak 或 [weak] 具有相同的功能,用于定义变量或者函数,常见于定义函数,在 MDK 链接时优先链接定义为非 weak 的函数或变量,如果找不到则再链接 weak 函数。
解决方法之一
显示定义串口中断服务函数,直接把startup_MIMXRT1052.s启动文件中的中断服务函数定义名称复制过来,重新定义,相对于C++的重载模式(覆写);
参考链接:
博文提供这样一种方法:FreeRTOS中串口接收数据中断,然后通过队列将数据传递给任务A,在任务A中对数据进行处理,串口使用的通讯协议为自定义。
https://blog.youkuaiyun.com/weixin_43499780/article/details/106392129