驅動開發硬核特訓 · Day 17:深入掌握中斷機制與驅動開發中的應用實戰

🎥 視頻教程請關注 B 站:“嵌入式 Jerry”


一、前言

在嵌入式驅動開發中,“中斷”幾乎無處不在。無論是 GPIO 按鍵、串口通信、網絡設備,還是 SoC 上的各種控制器,中斷都扮演著核心觸發機制的角色。對中斷機制掌握程度的高低,直接影響到你驅動開發水平的深度。

本篇將從以下結構展開:

  • 中斷的基本概念與分類
  • Linux 內核中的中斷框架
  • request_irq() 的實戰用法與原理解析
  • 中斷處理函數與上下半部機制
  • 中斷在 DTS 中的描述與匹配方式
  • 實戰:為一個 GPIO 按鍵注冊中斷
  • 調試技巧與常見誤區

二、中斷基礎概念

2.1 什么是中斷?

中斷(Interrupt)是指處理器在運行過程中,外部設備或內部條件發生特定事件時,打斷當前正在執行的任務,轉而執行一個中斷服務程序(ISR)的機制。

2.2 中斷的分類

類型描述
外部中斷外設發出的信號,如 GPIO、UART、定時器等
內部中斷處理器內部事件觸發,如異常、軟中斷等
邊沿觸發在電平變化的瞬間觸發(如上升沿、下降沿)
電平觸發在保持某一電平時持續觸發(如高電平、低電平)

三、Linux 內核中的中斷機制

Linux 內核為中斷提供了統一的框架,通過 IRQ(Interrupt Request)編號管理設備之間的中斷。
在這里插入圖片描述

3.1 中斷號(IRQ number)

每個硬件中斷都被映射為一個唯一的 IRQ 號,Linux 內核使用這個編號來注冊/處理中斷。

可通過如下命令查看系統中斷分配:

cat /proc/interrupts

3.2 request_irq() 的框架

int request_irq(unsigned int irq,irq_handler_t handler,unsigned long flags,const char *name,void *dev);
參數含義
irq要申請的中斷號
handler中斷服務函數
flags觸發方式,如 IRQF_TRIGGER_FALLING 等
name中斷名稱,用于 /proc/interrupts 識別
dev通常為 pdev 或私有結構體指針,用于共享中斷區分

四、中斷處理函數與上下半部機制

中斷處理時間越短越好,因此 Linux 提供 中斷上下半部機制

部分描述
上半部(top half)中斷剛發生時的 ISR(中斷服務函數),需快速返回
下半部(bottom half)通過 tasklet、workqueue 等機制延遲處理

示例:使用 workqueue 實現下半部

static void my_work_handler(struct work_struct *work)
{pr_info("Bottom half executed.\n");
}static DECLARE_WORK(my_work, my_work_handler);static irqreturn_t my_irq_handler(int irq, void *dev)
{schedule_work(&my_work);return IRQ_HANDLED;
}

五、設備樹中斷描述與解析

5.1 DTS 中的中斷定義

button@0 {compatible = "gpio-keys";gpios = <&gpio3 19 GPIO_ACTIVE_LOW>;linux,code = <KEY_ENTER>;label = "Enter Button";interrupt-parent = <&gpio3>;interrupts = <19 IRQ_TYPE_EDGE_FALLING>;
};

5.2 驅動中解析中斷號

irq = of_irq_get(np, 0);
ret = request_irq(irq, handler, IRQF_TRIGGER_FALLING, "button", dev);

六、實戰講解:為 GPIO 按鍵注冊中斷

以下是一個完整的按鍵中斷驅動代碼片段:

static irqreturn_t button_isr(int irq, void *dev_id)
{pr_info("Button interrupt triggered!\n");return IRQ_HANDLED;
}static int btn_probe(struct platform_device *pdev)
{int irq;struct device_node *np = pdev->dev.of_node;irq = of_irq_get(np, 0);if (irq < 0)return irq;return devm_request_irq(&pdev->dev, irq, button_isr,IRQF_TRIGGER_FALLING, "button", NULL);
}

驅動匹配表

static const struct of_device_id btn_of_match[] = {{ .compatible = "myvendor,button" },{ }
};
MODULE_DEVICE_TABLE(of, btn_of_match);

七、調試技巧與排錯建議

7.1 無法響應中斷?

  • 檢查 of_irq_get() 返回值
  • 確保設備樹中 interrupt-parent 正確
  • 查看內核是否啟用了相應的 GPIO 中斷支持
  • 使用 cat /proc/interrupts 觀察中斷是否觸發計數增加

7.2 中斷多次觸發?

  • 檢查 IRQF_TRIGGER_* 設置是否與實際硬件匹配
  • 排查上拉/下拉電阻或信號抖動問題

八、問答環節總結

Q1:一個驅動中能注冊多個中斷嗎?

可以。使用 request_irq() 多次注冊不同 irq。

Q2:可以使用中斷做耗時操作嗎?

不建議。應放入下半部如 workqueue 中。

Q3:中斷共享怎么辦?

設置 IRQF_SHARED,并正確傳入 dev_id 區分中斷源。

Q4:中斷服務函數可以被搶占嗎?

在默認情況下,中斷服務函數運行在中斷上下文,不能被搶占,但可以被更高優先級中斷打斷。


九、總結提煉

關鍵點說明
中斷是驅動中的基礎機制幾乎所有外設都依賴中斷響應事件
request_irq() 是核心接口注冊中斷的入口函數
使用設備樹描述中斷資源通過 interrupts + interrupt-parent 精確匹配
上下半部機制非常重要把耗時操作放到 workqueue/tasklet
實戰中注意調試利用 /proc/interrupts 和日志追蹤觸發行為

? 今日作業建議

  1. 在你的開發板上找一個 GPIO 按鍵,編寫設備樹 + 驅動注冊中斷。
  2. 使用 printk 或 dev_info() 輸出中斷觸發信息,驗證中斷觸發次數。
  3. 嘗試通過 workqueue 延遲執行中斷下半部邏輯,如點亮 LED。

🎥 視頻教程請關注 B 站:“嵌入式 Jerry”


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78396.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過門店銷售明細表用PySpark得到每月每個門店的銷冠和按月的同比環比數據

假設我在Amazon S3上有銷售表的Parquet數據文件的路徑&#xff0c;包含ID主鍵、門店ID、日期、銷售員姓名和銷售額&#xff0c;需要分別用PySpark的SparkSQL和Dataframe API統計出每個月所有門店和各門店銷售額最高的人&#xff0c;不一定是一個人&#xff0c;以及他所在的門店…

PostgreSQL 常用日志

PostgreSQL 常用日志詳解 PostgreSQL 提供了多種日志類型&#xff0c;用于監控數據庫活動、排查問題和優化性能。以下是 PostgreSQL 中最常用的日志類型及其配置和使用方法。 一、主要日志類型 日志類型文件位置主要內容用途服務器日志postgresql-<日期>.log服務器運行…

MySQL 存儲過程:解鎖數據庫編程的高效密碼

目錄 一、什么是存儲過程?二、創建存儲過程示例 1:創建一個簡單的存儲過程示例 2:創建帶輸入參數的存儲過程示例 3:創建帶輸出參數的存儲過程三、調用存儲過程調用無參數存儲過程調用帶輸入參數的存儲過程調用帶輸出參數的存儲過程四、存儲過程中的流控制語句示例 1:使用 …

基于STM32的物流搬運機器人

功能&#xff1a;智能循跡、定距夾取、顏色切換、自動跟隨、自動避障、聲音夾取、藍牙遙控、手柄遙控、顏色識別夾取、循跡避障、循跡定距…… 包含內容&#xff1a;完整源碼、使用手冊、原理圖、視頻演示、PPT、論文參考、其余資料 資料只私聊

pg_jieba 中文分詞

os: centos 7.9.2009 pg: 14.7 pg_jieba 依賴 cppjieba、limonp pg_jieba 下載 su - postgreswget https://github.com/jaiminpan/pg_jieba/archive/refs/tags/vmaster.tar.gzunzip ./pg_jieba-master cd ~/pg_jieba-mastercppjieba、limonp 下載 su - postgrescd ~/pg_jie…

基于Python+Flask的MCP SDK響應式文檔展示系統設計與實現

以下是使用Python Flask HTML實現的MCP文檔展示系統&#xff1a; # app.py from flask import Flask, render_templateapp Flask(__name__)app.route(/) def index():return render_template(index.html)app.route(/installation) def installation():return render_templa…

【“星睿O6”AI PC開發套件評測】GPU矩陣指令算力,GPU帶寬和NPU算力測試

【“星睿O6”AI PC開發套件評測】GPU矩陣指令算力&#xff0c;GPU帶寬和NPU算力測試 安謀科技、此芯科技與瑞莎計算機聯合打造了面向AI PC、邊緣、機器人等不同場景的“星睿O6”開發套件 該套件異構集成了Armv9 CPU核心、Arm Immortalis? GPU以及安謀科技“周易”NPU 開箱和…

【Go語言】RPC 使用指南(初學者版)

RPC&#xff08;Remote Procedure Call&#xff0c;遠程過程調用&#xff09;是一種計算機通信協議&#xff0c;允許程序調用另一臺計算機上的子程序&#xff0c;就像調用本地程序一樣。Go 語言內置了 RPC 支持&#xff0c;下面我會詳細介紹如何使用。 一、基本概念 在 Go 中&…

11、Refs:直接操控元素——React 19 DOM操作秘籍

一、元素操控的魔法本質 "Refs是巫師與麻瓜世界的連接通道&#xff0c;讓開發者能像操控魔杖般精準控制DOM元素&#xff01;"魔杖工坊的奧利凡德先生輕撫著魔杖&#xff0c;React/Vue的refs能量在杖尖躍動。 ——以神秘事務司的量子糾纏理論為基&#xff0c;揭示DOM…

MinIO 教程:從入門到Spring Boot集成

文章目錄 一. MinIO 簡介1. 什么是MinIO&#xff1f;2. 應用場景 二. 文件系統存儲發展史1. 服務器磁盤&#xff08;本地存儲&#xff09;2. 分布式文件系統(如 HDFS、Ceph、GlusterFS)3. 對象存儲&#xff08;如 MinIO、AWS S3&#xff09;4.對比總結5.選型建議6.示例方案 三.…

電競俱樂部護航點單小程序,和平地鐵俱樂部點單系統,三角洲護航小程序,暗區突圍俱樂部小程序

電競俱樂部護航點單小程序開發&#xff0c;和平地鐵俱樂部點單系統&#xff0c;三角洲護航小程序&#xff0c;暗區突圍俱樂部小程序開發 端口包含&#xff1a; 超管后臺&#xff0c; 老板端&#xff0c;打手端&#xff0c;商家端&#xff0c;客服端&#xff0c;管事端&#x…

基于 IPMI + Kickstart + Jenkins 的 OS 自動化安裝

Author&#xff1a;Arsen Date&#xff1a;2025/04/26 目錄 環境要求實現步驟自定義 ISO安裝 ipmitool安裝 NFS定義 ks.cfg安裝 HTTP編寫 Pipeline 功能驗證 環境要求 目標服務器支持 IPMI / Redfish 遠程管理&#xff08;如 DELL iDRAC、HPE iLO、華為 iBMC&#xff09;&…

如何在SpringBoot中通過@Value注入Map和List并使用YAML配置?

在SpringBoot開發中&#xff0c;我們經常需要從配置文件中讀取各種參數。對于簡單的字符串或數值&#xff0c;直接使用Value注解就可以了。但當我們需要注入更復雜的數據結構&#xff0c;比如Map或者List時&#xff0c;該怎么操作呢&#xff1f;特別是使用YAML這種更人性化的配…

短信驗證碼安全實戰:三網API+多語言適配開發指南

在短信服務中&#xff0c;創建自定義簽名是發送通知、驗證信息和其他類型消息的重要步驟。萬維易源提供的“三網短信驗證碼”API為開發者和企業提供了高效、便捷的自定義簽名創建服務&#xff0c;可以通過簡單的接口調用提交簽名給運營商審核。本文將詳細介紹如何使用該API&…

RabbitMQ和Seata沖突嗎?Seata與Spring中的事務管理沖突嗎

1. GlobalTransactional 和 Transactional 是否沖突&#xff1f; 答&#xff1a;不沖突&#xff0c;它們可以協同工作&#xff0c;但作用域不同。 Transactional: 這是 Spring 提供的注解&#xff0c;用于管理單個數據源內的本地事務。在你當前的 register 方法中&#xff0c…

一臺服務器已經有個python3.11版本了,如何手動安裝 Python 3.10,兩個版本共存

環境&#xff1a; debian12.8 python3.11 python3.10 問題描述&#xff1a; 一臺服務器已經有個python3.11版本了&#xff0c;如何手動安裝 Python 3.10&#xff0c;兩個版本共存 解決方案&#xff1a; 1.下載 Python 3.10 源碼&#xff1a; wget https://www.python.or…

c++中的enum變量 和 constexpr說明符

author: hjjdebug date: 2025年 04月 23日 星期三 13:40:21 CST description: c中的enum變量 和 constexpr說明符 文章目錄 1.Q:enum 類型變量可以有,--操作嗎&#xff1f;1.1補充: c/c中enum的另一個細微差別. 2.Q: constexpr 修飾的函數,要求傳入的參數必需是常量嗎&#xff…

postman工具

postman工具 進入postman官網 www.postman.com/downloads/ https://www.postman.com/downloads/ https://www.postman.com/postman/published-postman-templates/documentation/ae2ja6x/postman-echo?ctxdocumentation Postman Echo is a service you can use to test your …

Spring和Spring Boot集成MyBatis的完整對比示例,包含從項目創建到測試的全流程代碼

以下是Spring和Spring Boot集成MyBatis的完整對比示例&#xff0c;包含從項目創建到測試的全流程代碼&#xff1a; 一、Spring集成MyBatis示例 1. 項目結構 spring-mybatis-demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com.example/…

【數據可視化-24】巧克力銷售數據的多維度可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…