在嵌入式系統(tǒng)中,經(jīng)常會(huì)用到gpio外部中斷來(lái)獲取外部事件,比如按鍵、傳感器、網(wǎng)絡(luò)通信等等。一般中斷都會(huì)綁定一個(gè)中斷回調(diào)函數(shù),來(lái)執(zhí)行產(chǎn)生中斷后的一些任務(wù)。Linux的中斷是操作系統(tǒng)管理的資源,需要在內(nèi)核層配置中斷以及綁定回調(diào)函數(shù)。
內(nèi)核編程可以直接修改內(nèi)核源碼,也可以使用Linux提供的模塊編程方式。使用模塊很方便,編譯很快而且可以很方便的插入和移除。當(dāng)然插入和移除操作需要管理員權(quán)限,與模塊相關(guān)的命令有l(wèi)smod、insmod和rmmod。
詳細(xì)的模塊編程的方法網(wǎng)上和書(shū)上一大堆,很容易找到。
主要結(jié)構(gòu)
1、init函數(shù)
2、exit函數(shù)
3、module_init和module_exit
4、作者、版權(quán)聲明等。
注意:模塊的編譯需要用到源碼,就是安裝一個(gè)以headers結(jié)尾的東西。
在/usr/src下會(huì)有對(duì)應(yīng)的目錄,使用uname -r看看版本是否一致,如果不一樣一般是當(dāng)前系統(tǒng)的要比較舊,可以使用apt-get upgrade升級(jí)系統(tǒng)。不同的版本編譯的模塊不能加載,會(huì)提示格式無(wú)法識(shí)別之類(lèi)的錯(cuò)誤。
另外,內(nèi)核編程用到的頭文件和應(yīng)用編程用到的頭文件也不是一個(gè)系統(tǒng)的,內(nèi)核編程用的是
/usr/src/linux-headers-xxx/include下的頭文件,而應(yīng)用編程用的是/usr/include/下的頭文件。
ok,回到gpio中斷。
在init函數(shù)里,使用gpio需要先請(qǐng)求一個(gè)并配置它的模式,使用gpio_request_one()函數(shù),三個(gè)參數(shù)分別是gpio號(hào)、模式和名稱(chēng)。
使用函數(shù)enable_irq()使能中斷,參數(shù)是中斷號(hào),gpio對(duì)應(yīng)的中斷號(hào)可以使用gpio_to_irq()獲取。
調(diào)用request_irq()配置中斷的回調(diào)函數(shù)、觸發(fā)方式、名稱(chēng)和傳入?yún)?shù)。
在exit函數(shù)中,對(duì)應(yīng)的我們需要釋放中斷和對(duì)應(yīng)的gpio。
編寫(xiě)中斷回調(diào)函數(shù)。中斷回調(diào)函數(shù)的格式定義如下:
Linux的中斷函數(shù)分為了兩個(gè)部分:頂半部和底半部。 頂半部是真正的回調(diào)函數(shù),執(zhí)行在中斷上下文中,一般是不能被打斷的,所以這里要盡可能短,只做非做不可的事。
底半部由頂半部觸發(fā),執(zhí)行中斷回調(diào)的其他不太緊急的事務(wù)。底半部的機(jī)制由軟中斷、tasklet、工作隊(duì)列等(不知道是否有其它新技術(shù)了)。底半部的程序會(huì)參與內(nèi)核的調(diào)度,可以被中斷。
一些必要的頭文件:
編譯模塊我看大家都用make,還好寫(xiě)個(gè)簡(jiǎn)單的Makefile也不復(fù)雜。小寫(xiě)的makefile有時(shí)候make不認(rèn)識(shí),不知道什么原因,如果遇到改成大寫(xiě)就好。
make然后插入模塊
查看模塊lsmod
使用dmesg查看log信息。如果init函數(shù)有printk打印可以看到信息。
在/proc/interrupts中可以看到中斷比較詳細(xì)的信息,紅框就是我們的gpio中斷。
在/proc/stat中也有關(guān)于中斷的信息。intr(黃框)就是所有的中斷統(tǒng)計(jì)情況,最后四個(gè)(紅線)就是gpio中斷的次數(shù)。
在proc/irq/下有以中斷號(hào)命名的目錄,目錄下有跟中斷相關(guān)的文件。
關(guān)于Linux的gpio中斷目前就知道這么多了,歡迎大家補(bǔ)充交流。 限于個(gè)人水平,肯定會(huì)有遺漏和錯(cuò)誤的地方,還望大家海涵。 在另一篇關(guān)于字符設(shè)備的專(zhuān)欄里,我會(huì)講如何通過(guò)創(chuàng)建字符設(shè)備把內(nèi)核的數(shù)據(jù)(比如中斷處理的結(jié)果)傳給用戶(hù)空間,歡迎大家閱讀。
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3593瀏覽量
129482 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209535 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41504 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62629 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52106
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論