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