十八、中断之独立按键
一、簡介
中斷:是指 CPU 在執行程序的過程中, 出現突發事件去處理, CPU 需要停止當前程序的執行, 轉去處理突發 事件, 處理完成之后再返回原程序部分。
?
中斷源:是指引發中斷的原因。
?
硬件中斷:一般指外設發出的中斷請求以及內部硬件產生的中斷(計算溢出, 除數為 0, 掉電等)
軟件中斷:?典型的是中斷處理程序的下半部操作.
?
硬件中斷的分類
內部中斷: 內部硬件產生的中斷(例如: 除數為 0)
外部中斷: 外設產生的中斷(重點)
?
外部中斷的觸發方式
上升沿觸發和下降沿觸發電平觸發
?
中斷優先級
系統根據中斷事件的重要性和緊迫程度, 將中斷源分為若干個等級, 優先級高的先執行。
中斷處理函數
中斷產生之后執行的一段代碼。
中斷向量號
中斷源的識別標志, 是跳往中斷程序的“入口地址”。
中斷向量和非中斷向量
硬件提供中斷處理函數的地址
軟件通過判斷之后, 提供中斷處理函數的最終地址
向量中斷和非向量中斷的判斷方法
一般一個中斷號對應一個中斷函數就是向量中斷(獨立按鍵) 多個中斷函數共用一個中斷號(矩陣鍵盤)
?
中斷處理程序架構
操作系統中會產生很多中斷, 如果每一個中斷都全部處理完之后再向后執行, 是不可能的, 所以就將中斷處理程序分解為上半部和下半部。上半部一般是和硬件緊密相關的代碼, 下半部一般是耗時的一些操作。
例如給 PC 插入 U 盤會產生中斷, 接收之后, 硬件會馬上響應, 中斷操作會很快執行上半部分, 然后就向上半部分通知系統調用對應的驅動程序。 后面調用驅動的這個過程可以稱之為下半部分。
二、按鍵原理圖
?三、驅動代碼
中斷申請函數
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
有下面幾個參數。
參數 unsigned int irq: irq 是中斷號
參數 irq_handler_t handler: handler 是向系統登記的處理函數
參數 unsigned long flags: irqflags 是觸發標志位(
????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_EDGE_RISING(上升沿)
????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_EDGE_BOTH(上升、下降沿)
????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_LEVEL_HIGH(高電平)
????????????????????????????????????????????????????????????????????????????????/?IRQ_TYPE_LEVEL_LOW(低電平)
????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_SIMPLE(Simple中斷)
????????????????????????????????????????????????????????????????????????????????/IRQ_TYPE_PERCPU(Per CPU中斷):
)
參數 const char *name: devname 是中斷名稱, 可以通過注冊之后可以通過“cat /proc/interrupts”查看
參數 void *dev: dev_id 是設備
和上面中斷申請函數對應的就是中斷釋放函數 free_irq, 卸載驅動的時候需要調用, 如下圖所示, 也是在頭文件“include/linux/interrupt.h”中。
四、添加設備
vim arch/arm/mach-exynos/mach-itop4412.c
?
?五、運行
??cat /proc/interrupts (查看中斷)
?
總結
以上是生活随笔為你收集整理的十八、中断之独立按键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十七、字符类 GPIOS
- 下一篇: 十九、I2C驱动及应用