当前位置: 首页 > article >正文

顶半部与底半部:那次中断风暴让我彻底搞懂了

那天晚上产线测试机突然卡死屏幕上的数据刷新停滞在23:47:15。重启后查看内核日志满屏的“IRQ handler took too long”警告。问题定位到我们新加的传感器驱动——中断频率从设计的100Hz变成了实际跑起来的2kHzISR里那个浮点运算和I2C读写直接把系统拖垮了。中断处理的现实困境中断服务程序要求快进快出这是教科书上的铁律。但现实场景总是打脸数据要处理、协议要解析、有时还得做点计算。那个出问题的驱动最初长这样staticirqreturn_tsensor_isr(intirq,void*dev_id){structsensor_data*datadev_id;// 读取原始数据i2c_read_bytes(data-client,REG_DATA,raw_buf,12);// 浮点校准运算问题就在这里floatcalibrated(raw_buf[0]*1.23fraw_buf[1]*0.45f)/1.68f;// 写入结果缓冲区data-buffer[data-index]calibrated;// 通知应用层wake_up_interruptible(data-wait_queue);returnIRQ_HANDLED;}看起来挺合理对吧但在2kHz中断频率下每次ISR执行时间超过200微秒CPU很快被中断占满其他任务根本抢不到时间片。顶半部的生存法则顶半部Top Half就是我们的ISR它的设计原则就三条第一只做最紧急的硬件操作。读状态寄存器、清中断标志、把数据从硬件FIFO搬到内存缓冲区——这些必须在顶半部完成否则可能丢数据。第二绝对不要睡眠。在ISR里调用kmalloc带GFP_KERNEL标志想都别想。等锁更不行。这里一旦睡眠整个系统基本就挂了。第三耗时操作统统丢出去。我们的修复方案把ISR改成了这样staticirqreturn_tsensor_isr(intirq,void*dev_id){structsensor_data*datadev_id;// 只做最必要的读取硬件数据i2c_read_bytes(data-client,REG_DATA,data-raw_buffer,12);data-raw_ready1;// 标记需要处理启动底半部tasklet_schedule(data-process_tasklet);returnIRQ_HANDLED;}ISR执行时间从200微秒降到了15微秒中断风暴瞬间平息。底半部的三种武器Linux给了我们三种主要的底半部机制选哪个得看场景tasklet——适合中等延迟要求的场景。我们的传感器驱动最终选了它voidprocess_sensor_data(unsignedlongarg){structsensor_data*data(structsensor_data*)arg;if(!data-raw_ready)return;// 放心做浮点运算floatcalibrated(data-raw_buffer[0]*1.23fdata-raw_buffer[1]*0.45f)/1.68f;// 甚至可以睡眠如果需要mutex_lock(data-buffer_lock);data-buffer[data-index]calibrated;mutex_unlock(data-buffer_lock);data-raw_ready0;}// 初始化时声明tasklet_init(data-process_tasklet,process_sensor_data,(unsignedlong)data);tasklet在软中断上下文执行还是不能睡眠但至少不占用硬中断时间。工作队列workqueue——需要睡眠时的选择。上周调试的另一个驱动需要在中断后等待GPIO稳定就用到了工作队列structwork_structprocess_work;voiddeferred_processing(structwork_struct*work){// 这里可以调用msleep、mutex_lock等可能睡眠的函数msleep(2);// 等待硬件稳定process_data();}// ISR中提交工作schedule_work(process_work);软中断softirq——内核级的高性能选择。网络栈、块设备层这些对性能敏感的核心子系统在用。普通驱动不建议自己注册软中断内核提供的tasklet其实就是在软中断基础上封装的。那些年踩过的坑内存分配陷阱在tasklet里用GFP_KERNEL分配内存理论上tasklet还是软中断上下文不能睡眠。但实际测试发现在某些内核版本下小内存分配可能不会触发睡眠但这种依赖版本的行为很危险。稳妥做法是预分配或者用GFP_ATOMIC。共享数据保护ISR和底半部共享数据时记得用原子操作或者关本地中断// 在ISR中data-raw_indexnew_index;smp_wmb();// 写内存屏障确保数据先于标志位更新// 在tasklet中读取if(data-raw_ready){smp_rmb();// 读内存屏障process_data(data-raw_buffer);}嵌套与重入tasklet在同一个CPU上不会重入但不同CPU可能并行执行同一个tasklet。如果数据是per-CPU的没问题全局数据就得加锁。实战建议性能敏感场景先测量用ktime_get_ns()在ISR入口和出口打时间戳超过10微秒的操作就要考虑挪到底半部。那次调试我们就是靠这个发现浮点运算太耗时。选型简单原则不需要睡眠→用tasklet需要睡眠或延迟执行→用工作队列超高频率中断比如网络收包→考虑NAPI或者自己注册软中断。调试技巧/proc/interrupts看中断计数/proc/softirqs看软中断分布。如果某个软中断计数异常增长很可能对应的tasklet处理太慢。新的选择内核现在有threaded IRQ算是官方推荐的另一种方案特别适合那些既想简单又需要睡眠的中断处理。用request_threaded_irq就行内核会自动帮你管理线程。那次中断风暴后我们定了个规矩所有新驱动的中断处理代码必须经过“顶半部时间审计”。ISR超过20微秒的review不通过。这个规矩让我们避开了很多性能坑。记住中断处理不是越快越好而是“该快的部分要快该慢的部分要挪出去”。平衡好顶半部和底半部驱动才能既稳定又高效。

相关文章:

顶半部与底半部:那次中断风暴让我彻底搞懂了

那天晚上,产线测试机突然卡死,屏幕上的数据刷新停滞在23:47:15。重启后查看内核日志,满屏的“IRQ handler took too long”警告。问题定位到我们新加的传感器驱动——中断频率从设计的100Hz变成了实际跑起来的2kHz,ISR里那个浮点运…...

Clockwork for Dynamo:建筑信息模型自动化技术栈的转型引擎

Clockwork for Dynamo:建筑信息模型自动化技术栈的转型引擎 【免费下载链接】ClockworkForDynamo A collection of 450 custom nodes for the Dynamo visual programming environment 项目地址: https://gitcode.com/gh_mirrors/cl/ClockworkForDynamo 在建筑…...

macOS菜单栏管理架构:Ice系统的事件驱动设计与模块化实现

macOS菜单栏管理架构:Ice系统的事件驱动设计与模块化实现 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 在macOS生态系统中,菜单栏作为系统级交互界面的核心组件&#xff0c…...

FanControl终极指南:从基础配置到高级调优的Windows风扇控制完整实战

FanControl终极指南:从基础配置到高级调优的Windows风扇控制完整实战 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitH…...

python学习-05列表

1列表定义1、以[]开头和结尾2、可以存放任意对象(数字、字符串、列表、字典。。。)3、可对列表进行增删改查2列表的创建方式1、直接定义2、多维列表(嵌套)3、使用list函数:list(可迭代对象):将其他类型的转…...

【AI原生UX设计反直觉真相】:为什么“更智能”反而导致用户流失率上升47%?——基于127个A/B测试的归因分析

第一章:AI原生UX设计的认知范式重构 2026奇点智能技术大会(https://ml-summit.org) 传统UX设计以“用户任务流”为中心,预设界面状态与交互路径;而AI原生UX要求设计者将系统视为具备意图推演、上下文感知与协同进化的认知协作者。这种转变不…...

MICROCHIP微芯 24AA02UIDT-I/OT SOT23 EEPROM

特性: 预编程的32位序列号: 在所有UID系列EEPROM中唯一 可扩展至48位、64位、128位、256位及其 他长度 单电源供电,工作电压低至1.7V 低功耗CMOS技术: -读取电流最大为1mA。 -待机电流最大1A。 2线串行接口,兼容12CTM Schmitt触发输入用于噪声抑制 输出斜…...

Inter字体终极指南:从屏幕优化到可变字体的完整实战手册

Inter字体终极指南:从屏幕优化到可变字体的完整实战手册 【免费下载链接】inter The Inter font family 项目地址: https://gitcode.com/gh_mirrors/in/inter Inter字体是一款专为数字屏幕设计的开源无衬线字体,以其卓越的可读性和灵活的可变字体…...

PowerPaint-V1 Gradio在STM32嵌入式系统中的应用:智能图像处理方案

PowerPaint-V1 Gradio在STM32嵌入式系统中的应用:智能图像处理方案 1. 引言 想象一下,你正在开发一款智能门禁系统,需要实时处理摄像头捕捉的人脸图像,但设备资源有限,只有一块STM32微控制器。传统方案要么图像处理效…...

Queue<T> 完整知识点详解

一是什么Queue<T> 是 先进先出&#xff08;FIFO&#xff09; 的泛型集合。只能从尾部入队只能从头部出队不支持索引访问顺序严格按照进入顺序二命名空间using System.Collections.Generic;三创建队列1.空队列Queue<int> queue new Queue<int>();2.指定容量Q…...

如何快速彻底清理显卡驱动:Display Driver Uninstaller终极使用指南

如何快速彻底清理显卡驱动&#xff1a;Display Driver Uninstaller终极使用指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...

2.5D转真人引擎数字人构建:Anything to RealCharacters + LivePortrait联动教程

2.5D转真人引擎数字人构建&#xff1a;Anything to RealCharacters LivePortrait联动教程 1. 什么是2.5D转真人&#xff1f;为什么需要它&#xff1f; 你有没有试过——画了一个精致的二次元角色&#xff0c;或者用AI生成了一张动漫风格的立绘&#xff0c;但想把它变成能用在…...

ComfyUI Qwen人脸生成图像教程:提示词分层写法,效果更稳定

ComfyUI Qwen人脸生成图像教程&#xff1a;提示词分层写法&#xff0c;效果更稳定 1. 认识Qwen人脸生成模型 1.1 模型核心能力解析 Qwen-Image-Edit-F2P模型是一款专注于从单张人脸生成完整全身图像的专业工具。它不同于普通的图像生成模型&#xff0c;而是专门针对人脸到全…...

ESP-12E外围电路设计与调试全攻略

1. ESP-12E外围电路设计基础 ESP-12E作为一款高性价比的Wi-Fi模块&#xff0c;其核心是ESP8266芯片。要让这个"大脑"正常工作&#xff0c;必须给它搭建合适的外围电路。这就像给电脑配电源、内存和硬盘一样&#xff0c;缺一不可。我刚开始玩ESP-12E时&#xff0c;就因…...

计算机毕业设计:Python空气污染数据分析可视化系统 Django框架 可视化 数据分析 Prophet时间序列 大数据 大模型 深度学习(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…...

跨平台图像采集封装头文件: 一行代码切换 Basler / 海康 / Baumer工业相机?

一行代码切换 Basler / 海康 / USB 摄像头&#xff1f; 开源&#xff1a;跨平台图像采集统一头文件来了&#xff01; “项目要支持三家相机&#xff0c;难道写三套采集逻辑&#xff1f;” “Windows 上跑得好好的&#xff0c;一到 Linux 就崩&#xff1f;” 在工业视觉、机器人…...

分布式任务调度:XXL-Job 与 Elastic-Job

分布式任务调度&#xff1a;XXL-Job 与 Elastic-Job 在分布式系统中&#xff0c;任务调度是确保业务逻辑高效执行的核心组件。随着微服务架构的普及&#xff0c;传统的单机调度工具已无法满足高可用、弹性扩展的需求。XXL-Job和Elastic-Job作为两款主流的分布式任务调度框架&a…...

用STM32 CubeMX HAL库玩转SG90:180度舵机和360度舵机代码一键生成教程

STM32 CubeMX HAL库驱动SG90舵机实战&#xff1a;从图形配置到多模式控制 在嵌入式开发领域&#xff0c;舵机控制一直是机器人、自动化设备中的基础技能。传统开发方式需要手动配置寄存器、计算分频系数&#xff0c;不仅耗时还容易出错。而现代开发工具链如STM32CubeMX配合HAL库…...

TypeScript的unreachable类型:表示永远不会到达的代码分支

TypeScript作为JavaScript的超集&#xff0c;以其强大的类型系统闻名。其中&#xff0c;unreachable类型是一个特殊的存在&#xff0c;它用于标记那些理论上永远不会被执行的代码分支。这个概念看似简单&#xff0c;却蕴含着类型安全与代码健壮性的深层逻辑。本文将深入探讨unr…...

《电磁波也会“转圈圈“?极化特性才是雷达识别的“指纹密码“!》思考题解答

思考题 1&#xff1a;为什么圆极化天线接收相反旋向的圆极化波时&#xff0c;理论损耗是 3dB 而不是无穷大&#xff1f;解答&#xff1a;这个问题需要澄清一个常见的误解。理想情况下&#xff0c;相反旋向的圆极化是完全正交的&#xff0c;理论损耗应为无穷大&#xff08;完全接…...

AAAI 2026 大模型安全相关论文整理

AAAI 2026 大模型安全相关论文整理 总目录 大模型安全研究论文整理 2026年版&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/159047894 https://claude.ai/chat/916dfe36-9753-4199-baa2-44fc2f709fb6 统计&#xff1a;共收集 27 篇论文&#xff0c;来自 AAAI …...

UE5物体附加后 结束附加物体会回到原点解决方法

附加栏右键设置 属性...

从Gazebo仿真到训练脚本:拆解 DRL-robot-navigation 复现中最容易卡住的几个环节

从Gazebo仿真到训练脚本&#xff1a;拆解DRL机器人导航复现中的工程陷阱 当你第一次打开DRL-robot-navigation这个项目时&#xff0c;README里简洁的安装说明可能让你误以为一切都会很顺利——直到你在Gazebo里看到一个静止不动的机器人&#xff0c;或是终端不断弹出的"Fa…...

别再死记硬背了!用湖科大计网视频+实战抓包,真正搞懂TCP/IP协议栈

从抓包实战到协议栈精通&#xff1a;TCP/IP学习者的可视化进阶指南 当计算机网络的抽象理论遇上真实的数据流动&#xff0c;学习曲线会变得陡峭还是平缓&#xff1f;答案取决于你是否找到了那把打开协议栈大门的钥匙——数据包捕获与分析。本文将带你突破传统死记硬背的学习方式…...

Python使用SymSpell详解:打造极速拼写检查引擎

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;拼写检查是提升文本质量的关键环节。传统方法如PyEnchant依赖语言规则库&#xff0c;而基于深度学习的模型&#xff08;如BERT&#xff09;虽精度高但计算成本高昂。本文将聚焦SymSpell——一个基于对称删除算法的Py…...

网约摩的席卷县城:2公里收费超网约车,外卖员排队加入引争议

2026年春&#xff0c;一场由“网约摩的”掀起的出行变革正席卷广东、湖南多地县城。在茂名、乐昌、衡东等地&#xff0c;一款名为“摩的一下”的网约摩托车平台悄然上线&#xff0c;其定价模式引发热议&#xff1a;起步价6元/2公里&#xff0c;折合每公里高达3元&#xff0c;短…...

惊艳!Face3D.ai Pro生成4K级3D人脸纹理,效果堪比专业扫描

惊艳&#xff01;Face3D.ai Pro生成4K级3D人脸纹理&#xff0c;效果堪比专业扫描 1. 从单张照片到专业级3D人脸 想象一下&#xff0c;你只需要一张普通的手机自拍照&#xff0c;就能在几秒钟内获得一个细节丰富、纹理清晰的3D人脸模型——这不再是科幻电影中的场景&#xff0…...

虚拟现实开发3D渲染与交互设计

虚拟现实开发中的3D渲染与交互设计正以前所未有的速度改变着人机交互的体验边界。从游戏娱乐到医疗培训&#xff0c;从建筑可视化到远程协作&#xff0c;VR技术通过逼真的三维场景和自然交互方式&#xff0c;让用户沉浸于数字世界。这一领域的核心在于如何通过高效渲染技术构建…...

YOLO 系列:从零搭建 YOLOv5 全系列改进模板:支持注意力、卷积替换、损失调优

“训练5分钟,部署5天。”这句话在YOLO开发者圈子里流传已久。 如果你刚接触YOLOv5的改进工作,一定深有体会:想加个注意力机制,得先搞懂它的底层原理,写对代码结构,改对配置文件,跑通训练还得调参,最后还要确保它能顺利导出到ONNX部署到设备上……一个小改动,可能要折…...

OpenMV+STM32串口通信避坑指南:从数据打包到LCD显示的完整流程(附源码)

OpenMV与STM32串口通信实战&#xff1a;从数据帧设计到LCD显示的避坑全攻略 引言 当你第一次尝试将OpenMV的识别结果通过串口传输到STM32并在LCD上显示时&#xff0c;大概率会遇到数据丢包、解析错误或显示异常等问题。这不是你的代码写得不够好&#xff0c;而是串口通信本身就…...