中斷處理
1:外設的處理速度一般慢於
cpu。2:
cpu不能一直等待外部事件,所以裝置必須有一種方法來通知
cpu它的工作進度,這個方法就是中斷,外設與
cpu資訊互動的機制,提高
cpu利用率。處理之外還有查詢,但是查詢會一直占有
cpu資源,導致
cpu低利用率,好處是實現簡單。
linux系統中為裝置實現中斷處理程式,需要做兩件事,
1:向核心註冊中斷,讓
linux
核心知道中斷的存在。
2:實現中斷處理函式。
一:中斷的註冊:int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *devname, void *dev_id) 返回0
表示成功,讓核心找到中斷函式呼叫。
引數:irq
:中斷號,
irq_handler_t handler
:中斷處理函式,
flags:
中斷標誌
devname:裝置名,中斷處理程式屬於的裝置,
dev_id
:共享中斷時使用
flag中斷標誌:1:
irqf_disabled
如果設定這個標誌,表示是乙個「快中斷」處理程式,如果沒有設定,那麼是乙個「慢中斷」處理程式。 2:
irqf_shared
該位表示中斷可在裝置間共享。
快速/慢速中斷:
快速中斷處理程式是不允許發生中斷巢狀的,慢速中斷允許巢狀。舉例:在cpu
執行過程中突然某個點產生串列埠中斷,進入串列埠中斷處理程式,處理到某個時間點後產生並口中斷,這時會暫停串列埠中斷處理函式處理,轉向處理並口中斷,執行完後,繼續處理串列埠中斷,結束後退回
cpu,這就是巢狀情況,在串列埠執行過程中嵌入並口中斷。如果中斷巢狀發生就是慢速中斷,如果是快速中斷情況,在產生並口中斷時,丟掉並口中斷。預設慢速中斷。
共享中斷:早期中斷源不同的情況,講不同中斷裝置掛到同乙個中斷線上,有相同中斷號,通過request_irq
函式註冊,
flags
指定irqf_shared
,dev_id
必須是唯一的,不能使用中斷的處理程式
disable_irq(unsigned int irq)。
二:中斷處理函式:中斷處理程式是在中斷上下文中執行。流程
void short_sh_interrupt (int irq, void *dev_id, struct pt_regs *reg) ;
#if !defined (config_qq2440_buttons)
static struct button_irq_desc buttons_irqs = ,
, ,, ,
,};#else
static struct button_irq_desc button_irqs = ,
, ,, ,
,};#endif
static volatile char key_values = ;
static declare_wait_queue_head (button_waitq);
static volatile int env_press = 0;
static int s3c24xx_button_read (struct file *filp, char __user *buff, size_t count, loff_t *offp)
//有資料往下走
ev_press = 0;
err = copy_to_user(buf, (const void *)key_values, min(sizeof(key_value), count));
//通過按鍵的鍵值key_values判斷哪個鍵,讀走鍵值
return err? = -efault:min(sizeof(key_values),count);
}static unsigned int s3c24xx_buttons_poll (struct file *file, struct poll_table_struct *wait)
static irqretum_t buttons_interrupt (int irq, void *dev_id)
return irq_retval(irq_handled);
}static int s3c24xx_buttons_open (struct inode *inode, struct file *file)
//按鍵按下高->低電平
err = request_irq(button_irqs[i].irq, buttons_interrupt, irq_type_edge_both,
//中斷雙沿觸發,按鍵按下彈起都會觸發,按鍵按下和彈起都有資料讀。
button_irq[i].name, (void*)&button_irqs[i]); //為6個按鍵分別中斷處理程式
if(err)
break;
} if(err)
disable_irq(button_irq[i].irq);
free_irq(button_irq[i].irq, (void *)&button_irq[i]);
} return -ebusy;
} ev_press = 1;
return 0;
}static int s3c24xx_buttons_close (struct inode *inode, struct file *file)
free_irq(button_irq[i].irq, (void *)&button_irq[i]);
} return 0;
}static int s3c24xx_buttons_op[(struct inode *inode, struct file *file)
static struct file_operations dev_fops =
static struct miscdevice misc =
static int __init dev_init (void)
static void __exit dev_exit(void)
module_init(dev_init);
module_exit(dev_exit);
LINUX 基於裝置樹編寫按鍵中斷驅動程式
linux核心版本 4.14.2 1.在原理圖中確定home按鍵的引腳 2.在裝置樹檔案中新增節點描述home引腳 3.重新編譯燒寫裝置樹 4.編寫驅動程式,呼叫裝置樹介面函式獲取home引腳的中斷號,使用中斷號註冊按鍵中斷處理程式 在原理圖中確定home按鍵的引腳 在原理圖中找到home按鍵對應的...
驅動 按鍵 中斷模式
驅動 按鍵 中斷模式 eint drv.c 驅動 include include include include include include include include include include include static struct class eintdrv class sta...
fl2440按鍵中斷驅動
include include include include include include include include include include include copy to user include 核心時鐘 include atomic t include s3c2410 gpf...