发布时间:2026/9/7 14:54:57
Linux驱动多设备实战:告别全局变量,两个技巧搞定RK3568多实例管理 先说个最近的实际场景。我在基于瑞芯微RK3568的板子上调一个双路CAN驱动板子上两路CAN控制器用的是同一个IP设备树里也确实是两个独立节点看起来工程量不大。可真动手写驱动的时候才发现一个Linux驱动要同时管好两个硬件实例坑比想象中多。最初图省事在驱动里用了一个全局变量保存寄存器基地址结果第二路设备probe进来之后第一路的地址被覆盖中断回调里读到的寄存器全是第二路的现场用惨不忍睹来形容一点不过分。这篇文章就是围绕这个主题展开的。Linux驱动支持多设备说到底是两件事第一驱动怎么“认识”多个硬件节点第二驱动怎么把每个硬件节点各自的运行状态分开记不互相串扰。文章会给出两个亲测好用的技巧都基于瑞芯微平台的真实开发环境适合正在做嵌入式Linux驱动、或者准备在RK系列芯片上做二次开发的工程师参考。文章里涉及的代码、排查思路我尽量按实际调试时的真实过程来写。1. 先摸清底细驱动与设备原本就是“一对多”不是“一对一”1.1 多设备场景在瑞芯微平台上有多常见有人可能会觉得一个驱动管一个设备不是挺正常的吗为什么非要追求“一驱多设备”如果你只看过那种教学例程确实容易产生这种错觉。但瑞芯微平台的实际情况是一颗芯片上集成了大量同类型的外设控制器而且同一个IP会被反复例化多次。以RK3568为例CAN控制器有俩UART可能有八九路I2C、SPI的控制器数量也不少。你在设备树里看到的节点往往是这样的can0节点、can1节点或者uart0到uart7各一个节点。这些节点的compatible字符串经常是同一个背后对应同一个平台驱动但每个节点拥有独立的寄存器地址、独立的中断号、独立的时钟和引脚配置。换句话说一个驱动被probe多次是Linux驱动模型下的默认行为不是需要什么特殊魔法才能做到的事情。问题只在于很多人在写驱动的时候并没有意识到这一点用的是“一个驱动、一份全局数据”的老思路于是多设备一接入就乱了套。1.2 全局变量管理多设备状态为什么必挂前面我说的全局变量覆盖问题不是偶发是必然会遇到的问题。驱动被probe几次不代表顺序是串行安全的。设备模型在枚举的时候可能连续触发两次probe第二次probe执行到priv_base ioremap(...)时第一次probe里辛辛苦苦保存的地址就被覆盖掉了。更麻烦的是中断上下文。中断是异步发生的你没法保证它触发的时候使用的正是对应设备的全局变量。一旦两个设备共用一个中断处理函数而处理函数里读的是同一个全局变量那中断来了之后你到底该操作哪个设备完全取决于这个变量最后被哪次probe写过不确定性极大。这还只是地址覆盖的问题。如果全局变量是一个数组比如struct mydev *devs[2]你确实可以通过索引区分设备了但接下来要面对的是并发保护、数组越界、设备热插拔带来的空指针等一系列麻烦。我在实际项目中见过不少因为这

相关新闻

2026/9/7 14:49:57

单张24G显卡如何跑通法律大模型:开源法律AI私有化部署5步走

单张24G显卡如何跑通法律大模型:开源法律AI私有化部署5步走 【免费下载链接】Awesome-Chinese-LLM 整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主,包括底座模型,垂直领域微调及应用,数据…

2026/9/7 14:49:57

地平线征程芯片量产破1500万:智驾芯片量产背后的工程密码

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 14:49:57

电池管理系统BMS学习教案:从三级架构到安全保护

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 15:45:13

TCP面试核心知识点全攻略:从三次握手到拥塞控制

1. 为什么TCP值得你花时间死磕TCP这块内容,几乎是每一场技术面试躲不过去的坎。无论是校招还是社招,无论是后端、客户端还是网络方向,面试官总喜欢从TCP切入,先问三次握手、四次挥手,再问流量控制、拥塞控制、粘包拆包…

2026/9/7 15:45:13

LeetCode 693:交替位二进制数的位运算判断技巧

1. 题目到底在问什么:交替位二进制数的本质刚看到“交替位二进制数”这个题名,很多朋友第一反应是“又要写一个判断函数”,但真正动手之后才发现,这题考的是对二进制位模式的理解和位运算的基本功。LeetCode 693 的要求很简单&…

2026/9/7 15:45:13

Windows mklink命令实战:目录联接两行搞定数据同步与路径迁移

在日常工作中,我经常遇到这样的需求:代码仓库放在 D 盘开发目录,但某个工具只认 C 盘固定路径;或者笔记本的文档散落在多个磁盘,想统一汇总到网盘同步目录;又或者是重装系统后,想把旧的用户配置…

2026/9/7 15:45:13

深入解析MCP Transport层:从Stdio到HTTP的选型与排坑指南

1. MCP的Transport到底在解决什么问题先说结论:MCP的Transport层是整个协议的地基,它决定了你的MCP server怎么被找到、怎么被连接、怎么传数据、怎么处理断连。前面几篇笔记我分别梳理了MCP的协议模型、工具调用链路和资源体系,这篇专门把Tr…

2026/9/7 15:40:13

2026 上下文缓存进阶:把前缀契约写进SPEC,MonkeyCode 云端跑通

2026 上下文缓存进阶:别把整本手册每次都重算一遍 老赵 6 人小队给省级税务局做政策问答助手。客户口头说系统提示和口径手册每次都带上,回答要快,别让窗口再等。 他们把 18 页口径、角色说明、禁答清单整包塞进每一次请求。Qwen 每次都把前缀…

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…