中斷處理函數(shù)如何【發(fā)送信號】給應(yīng)用層?
目錄
· 驅(qū)動程序
示例代碼全貌
Makefile 文件
編譯、測試
· 應(yīng)用程序
示例代碼全貌
編譯、測試
別人的經(jīng)驗,我們的階梯!
大家好,我是道哥,今天我為大伙兒解說的技術(shù)知識點是:【中斷程序如何發(fā)送信號給應(yīng)用層】。
最近分享的幾篇文章都比較基礎(chǔ),關(guān)于字符類設(shè)備的驅(qū)動程序,以及中斷處理程序。
也許在現(xiàn)代的項目是用不到這樣的技術(shù),但是萬丈高樓平地起。
只有明白了這些最基礎(chǔ)的知識點之后,再去看那些進化出來的高級玩意,才會有一步一個腳印的獲得感。
如果缺少了這些基礎(chǔ)的環(huán)節(jié),很多深層次的東西,學(xué)起來就有點空中樓閣的感覺。
就好比研究Linux內(nèi)核,如果一上來就從Linux 4.x/5.x內(nèi)核版本開始研究,可以看到很多“歷史遺留”代碼。
這些代碼就見證著Linux一步一步的發(fā)展歷史,甚至有些人還會專門去研究 Linux 0.11 版本的內(nèi)核源碼,因為很多基本思想都是一樣的。
今天這篇文章,主要還是以代碼實例為主,把之前的兩個知識點結(jié)合起來:
在中斷處理函數(shù)中,發(fā)送信號給應(yīng)用層,以此來通知應(yīng)用層處理響應(yīng)的中斷業(yè)務(wù)。
驅(qū)動程序
示例代碼全貌
所有的操作都是在 ~/tmp/linux-4.15/drivers 目錄下完成的。
首先創(chuàng)建驅(qū)動模塊目錄:
$ cd ~/tmp/linux-4.15/drivers
$ mkdir my_driver_interrupt_signal
$ touch my_driver_interrupt_signal.c
文件內(nèi)容如下:
以上代碼主要做了兩件事情:
1. 注冊中斷號 1 的處理函數(shù):myirq_handler();
2. 創(chuàng)建設(shè)備節(jié)點 /dev/mydev;
這里的中斷號1,是鍵盤中斷。
因為它是共享的中斷,因此當(dāng)鍵盤被按下的時候,操作系統(tǒng)就會依次調(diào)用所有的中斷處理函數(shù),當(dāng)然就包括我們的驅(qū)動程序所注冊的這個函數(shù)。
中斷處理部分相關(guān)的幾處關(guān)鍵代碼如下:
在中斷處理函數(shù)中,目標是發(fā)送信號 SIGUSR1 到應(yīng)用層,因此驅(qū)動程序需要知道應(yīng)用程序的進程號(PID)。
根據(jù)之前的文章Linux驅(qū)動實踐:驅(qū)動程序如何發(fā)送【信號】給應(yīng)用程序?,應(yīng)用程序必須主動把自己的 PID 告訴驅(qū)動模塊才可以。這可以通過 write 或者ioctl函數(shù)來實現(xiàn),
驅(qū)動程序用來接收 PID 的相關(guān)代碼是:
知道了應(yīng)用程序的 PID,驅(qū)動程序就可以在中斷發(fā)生的時候(按下鍵盤ESC鍵),發(fā)送信號出去了:
Makefile 文件
編譯、測試
首先查看一下加載驅(qū)動模塊之前,1號中斷的所有驅(qū)動程序:
再看一下設(shè)備號:
$ cat /proc/devices
因為驅(qū)動注冊在創(chuàng)建設(shè)備節(jié)點的時候,是動態(tài)請求系統(tǒng)分配的。
根據(jù)之前的幾篇文章可以知道,系統(tǒng)一般會分配244這個主設(shè)備號給我們,此刻還不存在這個設(shè)備號。
編譯、加載驅(qū)動模塊:
$ make
$ sudo insmod my_driver_interrupt_signal.ko
首先看一下 dmesg 的輸出信息:
然后看一下中斷驅(qū)動程序:
可以看到我們的驅(qū)動程序( mydev )已經(jīng)登記在1號中斷的最右面。
最后看一下設(shè)備節(jié)點情況:
驅(qū)動模塊已經(jīng)準備妥當(dāng),下面就是應(yīng)用程序了。
應(yīng)用程序
應(yīng)用程序的主要功能就是兩部分:
通過 ioctl 函數(shù)把自己的 PID 告訴驅(qū)動程序;
注冊信號 SIGUSR1 的處理函數(shù);
示例代碼全貌
在應(yīng)用程序的最后,是一個 while(1) 死循環(huán)。因為只有在按下鍵盤上的ESC按鍵時,驅(qū)動程序才會發(fā)送信號上來,因此應(yīng)用程序需要一直存活著。
編譯、測試
新開一個中斷窗口,編譯、執(zhí)行應(yīng)用程序:
由于應(yīng)用程序調(diào)用了 open 和 ioctl 這兩個函數(shù),因此,驅(qū)動程序中兩個對應(yīng)的函數(shù)就會被執(zhí)行。
這可以通過 dmesg 命令的輸出信息看出來:
這個時候,按下鍵盤上的 ESC 鍵,此時驅(qū)動程序中打印如下信息:
說明:驅(qū)動程序捕獲到了鍵盤上的 ESC 鍵,并且發(fā)送信號給應(yīng)用程序了。
在執(zhí)行應(yīng)用程序的終端窗口中,可以看到如下輸出信息:
說明:應(yīng)用程序接收到了驅(qū)動程序發(fā)來的信號!
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
-
5 夾縫中的文遠知行
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市