最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【i.MX6ULL】驅(qū)動(dòng)開發(fā)8——中斷法檢測按鍵

2021-12-26 12:21 作者:碼農(nóng)愛學(xué)習(xí)-B站  | 我要投稿

上篇,學(xué)習(xí)GPIO輸入功能的使用,本篇,來學(xué)習(xí)使用中斷的方式來檢測按鍵的按下。

1 Linux中斷介紹

1.1 中斷的上半部與下半部

中斷處理函數(shù)的執(zhí)行,越快越好,但實(shí)際使用中,某些情況確實(shí)需要比較耗時(shí)是中斷過程,為此,Linux內(nèi)核將中斷分為上半部和下半部兩個(gè)處理部分

  • 上半部:中斷處理函數(shù),那些處理過程比較快,不會占用很長時(shí)間的處理就可以放在上半部完成

  • 下半部:如果中斷處理過程比較耗時(shí),那么就將這些比較耗時(shí)的代碼提出來,交給下半部去執(zhí)行,這樣中斷處理函數(shù)就會快進(jìn)快出

對于一個(gè)中斷,如何劃分出上下兩部分呢?

  • 時(shí)間敏感,將其放在上半部

  • 硬件相關(guān),將其放在上半部

  • 要求不被其他中斷打斷,將其放在上半部

  • 其他所有任務(wù),考慮放在下半部

1.2 下半部的3種實(shí)現(xiàn)方式

1.2.1 軟中斷

Linux內(nèi)核使用softirq_action結(jié)構(gòu)體表示軟中斷:

一共有 10 個(gè)軟中斷

要使用軟中斷,必須先使用open_softirq函數(shù)注冊對應(yīng)的軟中斷處理函數(shù):

注冊好軟中斷以后需要通過raise_softirq函數(shù)觸發(fā):


1.2.2 tasklet

Linux內(nèi)核使用tasklet_struct結(jié)構(gòu)體來表示tasklet:

要使用 tasklet,必須先定義一個(gè)tasklet,然后初始化:

在上半部(中斷處理函數(shù))中調(diào)用tasklet_schedule函數(shù)就能使tasklet在合適的時(shí)間運(yùn)行:


1.2.3 工作隊(duì)列

工作隊(duì)列(work queue)是另外一種將中斷的部分工作推后的一種方式,它可以實(shí)現(xiàn)一些tasklet不能實(shí)現(xiàn)的工作,比如工作隊(duì)列機(jī)制可以睡眠。

Linux 內(nèi)核使用work_struct結(jié)構(gòu)體表示一個(gè)工作

這些工作組織成工作隊(duì)列,工作隊(duì)列使用workqueue_struct結(jié)構(gòu)體表示。

在工作隊(duì)列機(jī)制中,將推后的工作交給一個(gè)稱之為工作者線程(worker thread)的內(nèi)核線程去完成。

1.3 中斷API函數(shù)

1.3.1 request_irq中斷請求函數(shù)

flags中斷標(biāo)志,有下面幾種類型


1.3.2 free_irq中斷釋放函數(shù)

1.3.3 irq_handler_t中斷處理函數(shù)

irqreturn_t枚舉類型定義:

1.3.4 中斷使能/禁用函數(shù)

1.3.5 獲取中斷號

使用中斷時(shí),中斷信息先寫到了設(shè)備樹里面,然后通過irq_of_parse_and_map函數(shù)從interupts屬性中提取到對應(yīng)的中斷號


2 軟件編寫

仍使用上篇按鍵實(shí)驗(yàn)中用到的兩個(gè)按鍵:

為了理解簡單,本次程序暫不實(shí)現(xiàn)中斷的下半部邏輯,直接將整個(gè)中斷處理過程都放到中斷的上半部中處理。

2.1 修改設(shè)備樹文件

在上篇key實(shí)驗(yàn)代碼的基礎(chǔ)上,修改imx6ull-myboard.dts,主要是修改key子節(jié)點(diǎn),添加中斷,修改后內(nèi)容如下:


2.2 按鍵中斷驅(qū)動(dòng)程序

2.2.1 硬件初始化與中斷配置

中斷檢測到按鍵按下后,為了消除按鍵抖動(dòng),這里使用定時(shí)器來進(jìn)行按鍵消抖,因?yàn)楸敬螌?shí)驗(yàn)用到兩個(gè)按鍵,所以就先也使用兩個(gè)定時(shí)器。

2.2.2 中斷服務(wù)函數(shù)

中斷函數(shù)檢測到按鍵按下后,會開啟一個(gè)10ms的定時(shí)器,用來按鍵消抖。

2.2.3 定時(shí)器服務(wù)函數(shù)

定時(shí)器的10ms到達(dá)之后,會觸發(fā)定時(shí)器服務(wù)函數(shù),此時(shí)再次讀取按鍵的值,若仍為按下,則是按鍵真的按下了,若10ms后又檢測不到按鍵了,則說明是按鍵抖動(dòng)導(dǎo)致的按鍵誤觸發(fā)。

2.2.4 按鍵讀取函數(shù)

2.3 按鍵中斷驅(qū)動(dòng)程序

按鍵中斷的應(yīng)用程序,使用上篇的按鍵檢測的應(yīng)用程序即可

3 實(shí)驗(yàn)

編譯設(shè)備樹與驅(qū)動(dòng)文件(irqkey-BSp.ko),使用上篇的按鍵應(yīng)用程序(key-App),按下按鍵,會打印get key,松開按鍵,會打印key release。

4 總結(jié)

本篇主要介紹了Linux中斷的使用方法,通過按鍵來進(jìn)行中斷實(shí)驗(yàn)測試,并使用Linux定時(shí)器進(jìn)行按鍵去抖。



【i.MX6ULL】驅(qū)動(dòng)開發(fā)8——中斷法檢測按鍵的評論 (共 條)

分享到微博請遵守國家法律
娄烦县| 铜梁县| 财经| 肃宁县| 临高县| 武宣县| 合山市| 温州市| 新竹县| 曲水县| 定州市| 西贡区| 湖口县| 依安县| 永善县| 茌平县| 曲阳县| 安溪县| 临桂县| 韩城市| 冕宁县| 定西市| 万安县| 嘉禾县| 札达县| 桓仁| 南和县| 大方县| 达日县| 桦甸市| 鄂伦春自治旗| 南江县| 泰来县| 新野县| 德令哈市| 玉田县| 万荣县| 阿克| 长阳| 芜湖县| 南京市|