(九)linux中断编程
生活随笔
收集整理的這篇文章主要介紹了
(九)linux中断编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- (一)linux中斷的介紹
- (二)內核中斷的操作過程
- (三)實例代碼
(一)linux中斷的介紹
linux內核中的中斷通過中斷子系統來管理。linux系統中有專門的中斷子系統,原理很復雜,驅動開發者不需要知道具體細節,只需要知道如何應用該子系統提供的api來編寫中斷驅動代碼即可
在linux內核中,文件大多以功能命名,內核中提供了一個interrupt.h的文件用來進行中斷先關接口及數據結構的聲明,內核使用struct irqaction結構體描述一個中斷,編寫中斷程序終極目標就是實現這個結構體
flags :
IRQF_DISABLED:私有中斷,即一個中斷請求對應一個中斷服務函數 IRQF_SHARED:共享中斷,多個中斷請求對應一個中斷服務函數(二)內核中斷的操作過程
cpu給中斷的一個編號,一個IRQ number是一個虛擬的interrupt ID,和硬件無關.
查找中斷線比較費時,所以內核中提供了一個操作接口來獲取指定引腳的中中斷號
參數為gpio口:
在內核中生產廠商提供了先關的gpio口的聲明,分別存放在指定架構目錄下的gpio.h
其他相關函數:
void disable_irq(unsigned int irq);//失能void enable_irq(unsigned int irq);//使能 int gpio_get_value(unsigned int gpio);// 獲取設備gpio口的值: void gpio_set_value(unsigned int gpio, int value);//設置設備的gpio的值(三)實例代碼
#include <linux/interrupt.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/gpio.h>irqreturn_t key1_handler(int irq, void *dev) {int value=gpio_get_value(EXYNOS4_GPX3(2));printk("key1 value is %d\n",value);return IRQ_HANDLED; } irqreturn_t key2_handler(int irq, void *dev) {int value=gpio_get_value(EXYNOS4_GPX3(3));printk("key2 value is %d\n",value);return IRQ_HANDLED; } irqreturn_t key3_handler(int irq, void *dev) {int value=gpio_get_value(EXYNOS4_GPX3(4));printk("key3 value is %d\n",value);return IRQ_HANDLED; } irqreturn_t key4_handler(int irq, void *dev) {int value=gpio_get_value(EXYNOS4_GPX3(5));printk("key4 value is %d\n",value);return IRQ_HANDLED; }static int __init handler_module_init(void) {int ret=0;unsigned long flags=IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING|IRQF_DISABLED;unsigned int irq=gpio_to_irq(EXYNOS4_GPX3(2)); //獲取K1的irqret=request_irq(irq,key1_handler,flags, "key0", NULL);irq=gpio_to_irq(EXYNOS4_GPX3(3)); //獲取K1的irqret=request_irq(irq,key2_handler,flags, "key0", NULL);irq=gpio_to_irq(EXYNOS4_GPX3(4)); //獲取K1的irqret=request_irq(irq,key3_handler,flags, "key0", NULL);irq=gpio_to_irq(EXYNOS4_GPX3(5)); //獲取K1的irqret=request_irq(irq,key4_handler,flags, "key0", NULL);return 0; } static void __exit handler_module_cleanup(void) {unsigned int irq=gpio_to_irq(EXYNOS4_GPX3(2)); //獲取K1的irqfree_irq(irq, NULL);irq=gpio_to_irq(EXYNOS4_GPX3(3)); //獲取K2的irqfree_irq(irq, NULL);irq=gpio_to_irq(EXYNOS4_GPX3(4)); //獲取K3的irqfree_irq(irq, NULL);irq=gpio_to_irq(EXYNOS4_GPX3(5)); //獲取K4的irqfree_irq(irq, NULL); } module_init(handler_module_init); module_exit(handler_module_cleanup); MODULE_LICENSE("GPL");Makefile
CFLAG=-C TARGET=cdev #APP=cdev_app KERNEL=/driver/linux-3.5 obj-m +=$(TARGET).o all:make $(CFLAG) $(KERNEL) M=$(PWD) #arm-linux-gcc -o $(APP) $(APP).c clean:make $(CFLAG) $(KERNEL) M=$(PWD) clean #rm $(APP)本文章僅供學習交流用禁止用作商業用途,文中內容來水枂編輯,如需轉載請告知,謝謝合作
微信公眾號:zhjj0729
微博:文藝to青年
總結
以上是生活随笔為你收集整理的(九)linux中断编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014 网选 广州赛区 hdu 502
- 下一篇: java中Cookie中文字符乱码问题