问题描述:当程序某个高优先级的中断触发后(如pcie中断),或者底层接口物理链路初始化的一瞬间,原本正常运行的程序突然进入异常中断程序,并报出“synchronous external abort”错误。
问题原因分析:通过排查代码,发现是由于串口接收中断服务函数中将接收缓冲区指定为一个固定长度的结构体(例如:仅容纳一帧串口数据的13个字节)。结果发现在高优先级中断触发或底层接口物理链路初始化时,cpu被占用,未能够及时响应串口接收中断,导致下次正常进入串口接收中断函数后,一次读取出两帧数据(26个字节)。这两帧数据直接导致缓冲区结构体的内存空间溢出,所以才会报出“synchronous external abort”错误。
解决办法:不再使用固定长度的结构体作为接收缓冲区,而是使用一个较长的数组作为缓冲区(确保长度大于理论最大接收长度),这样就算有一次串口接收中断未响应,也不会出现上述错误。