FDCAN在使用过程中遇到突然Down掉的情况(20分钟内),重新Close再Open无法解决
FDCAN不是采用USB转CAN总线工具,使用机器原生CAN口(SPI TO CAN,虚拟为网络接口设备)使用dmesg查看出错时的数据信息与数据DMA传送有
使用示波器观察异常状态下的总线发送,确认linux主机在出现问题是未向总线发送任何数据,确认为linux发送端问题
咨询供应商,供应商认为可能由于发送数据过于频繁导致驱动内部Buffer爆掉,工程师根据此反馈做了如下修改
- 降低linux软件调用发送接收频率
- 在运动间断点关闭can,再打开(清除底层buffer)
- 找can清除驱动层buffer的函数接口(未找到)
- 每次读can总线时多次读,时直到读空防止读buffer爆掉
以上措施均无效,直接介入处理
- 给出备选方案,采用USB TO CAN方案,让供应商对驱动进行编译
- 检查工程师CAN设备的写法
- 学习C++下CAN设备的调用方法,基本与网络相同,收发为write与read
- 检查到工程师在两个线程使用的read函数,怀疑此处可能有问题
工程师修改CAN总线读取的写法,仅在一个位置读取CAN总线数据,读到数据后更新内部buffer,其它需要使用数据的位置均使用内部buffer
测试1小时均不再复现,确认为该问题导致
该问题出现可能的原因
- FDCAN总线数据转换为SPI存储在驱动内部的buffer
- 调用read时由驱动内部buffer通过DMA传输至用户层buffer或者在驱动内部有DMA数据传输
- 两个线程同时调用时DMA在运行过程中做了再次启动,导致DMA Down掉
- 进一步导致FDCAN Down掉,dmseg报错