启用CONFIG_PREEMPT_RT后CAN通信无法工作的技术求助
问题分析与解决方案
核心问题根源
你使用的RT补丁版本(5.15.55-rt48)与当前运行的内核主版本(5.15.52)不匹配,这是导致CAN收发故障的最主要原因。RT补丁与内核主版本严格一一对应,版本不匹配会破坏iMX6ULL的FlexCAN驱动的锁机制、中断处理逻辑,引发底层通信异常。
具体调整步骤
1. 替换为匹配版本的RT补丁
下载与内核5.15.52完全对应的RT补丁,Linux内核RT项目补丁命名规则为patch-<内核版本>-rt<补丁版本>.patch.gz,需找到5.15.52对应的rt补丁包,重新打补丁并编译内核。
2. 验证FlexCAN驱动相关配置
- 确保
CONFIG_CAN_FLEXCAN、CONFIG_CAN_RAW、CONFIG_CAN_BCM配置项仍处于启用状态,开启PREEMPT_RT时可能误改相关配置。 - 检查
CONFIG_CAN_FLEXCAN_USE_FIFO是否启用,FIFO模式在RT内核下能提升CAN收发的稳定性,避免单帧处理的实时性瓶颈。
3. 调整CAN控制器的中断优先级
在RT内核环境下,中断优先级直接影响驱动响应时效性:
- 通过
cat /proc/interrupts找到FlexCAN对应的中断号。 - 使用sysfs调整中断优先级(示例中
<irq_num>替换为实际中断号):
也可在设备树中修改FlexCAN节点的echo 1 > /proc/irq/<irq_num>/priorityinterrupts属性,设置更高的中断优先级值(具体数值需参考iMX6ULL硬件手册)。
4. 检查RT内核核心配置
- 确认
CONFIG_PREEMPT_RT_FULL已启用(而非CONFIG_PREEMPT_RT_BASE等其他RT模式),Full RT模式提供最完整的实时调度能力。 - 若需要极致实时性,可启用
CONFIG_NO_HZ_FULL,并将CAN驱动绑定到专属CPU核心(通过echo <cpu_core> > /sys/class/net/can0/queues/rx-0/cpumask等命令配置),避免其他进程抢占CPU资源。
5. 排查驱动兼容性问题
若暂时无法替换补丁,可对比5.15.52原生内核、5.15.55-rt48补丁对FlexCAN驱动代码的修改,手动修复冲突部分:
- 重点检查中断处理函数、自旋锁/互斥锁的替换逻辑(RT补丁会将部分自旋锁转为
rtmutex或raw_spinlock_t)。 - 查看
dmesg输出,搜索flexcan相关报错信息,定位具体故障点(如初始化失败、发送超时、中断未触发等)。
内容的提问来源于stack exchange,提问作者akash
相关产品推荐
相关产品推荐

