LiDAR360激光点云数据处理:航带拼接、分类滤波与行业成果生产
2026/11/4 20:07:29
中断上半部(硬中断)本身必须极短、无阻塞、无复杂逻辑,提升响应时间的本质是:把能移到下半部 / 线程的全移走,只留最必要的硬件清中断 + 标记事件,再配合硬件、驱动、内核配置做极致裁剪。
上半部(irq handler)原则:
只做 3 件事
tasklet/workqueue/threaded irq上半部严禁
msleep、mutex、copy_from/to_user、kmalloc(GFP_KERNEL)printk极慢)local_irq_save尽量少用、极短)只要上半部超过几微秒,就是设计问题,优先重构代码。
把绝大部分逻辑放到线程上下文,上半部只做判断和唤醒:
// 上半部:极简 static irqreturn_t demo_irq_handler(int irq, void *dev_id) { if (!intr_pending(dev)) return IRQ_NONE; /* 仅清中断 */ clear_intr(dev); return IRQ_WAKE_THREAD; // 直接唤醒线程 } // 下半部:真正的处理逻辑 static irqreturn_t demo_irq_thread(int irq, void *dev_id) { /* 读数据、处理、协议、提交、调度... 所有逻辑放这 */ return IRQ_HANDLED; } // 注册时: ret = devm_request_threaded_irq(dev, irq, demo_irq_handler, // 上半部:极短 demo_irq_thread, // 线程:可调度、可阻塞 IRQF_ONESHOT, "demo_irq", dev);效果:上半部响应时间直接压到<1µs 级别。
IRQ_NONEpr_info/pr_err在中断上下文会同步写串口 /console,毫秒级延迟trace_printk或 eBPF 打点,生产环境全删如果你追求硬实时、稳定低延迟:
CONFIG_PREEMPT_RT无 RT 补丁时至少选:
CONFIG_PREEMPT(完全可抢占内核)CONFIG_PREEMPT_VOLUNTARY、CONFIG_PREEMPT_NONEecho 2 > /proc/irq/<irq_num>/smp_affinity_listisolcpus=2等这些都会增加中断路径开销:
CONFIG_DEBUG_INFO、CONFIG_LOCKDEP、CONFIG_PROVE_LOCKINGC-state 切换会导致中断响应毛刺、几十微秒抖动:
idle=poll或intel_idle.max_cstate=1performance调频策略:cpupower frequency-set -g performancerequest_threaded_irqisolcpus隔离CONFIG_PREEMPT或直接上PREEMPT_RT