嵌入式linux之按鍵驅動程式

2021-07-03 19:54:05 字數 1838 閱讀 5993

1.寫出框架

2.硬體操作(操作虛擬位址ioremap

1.重要函式 trap_init() init_irq();

asm_do_irq中斷總入口: 分辨中斷,處理中斷,清中斷。

讀一下wait_event_interruptible()的原始碼,不難發現這個函式先將

當前程序的狀態設定成task_interruptible,然後呼叫schedule(),

而schedule()會將位於task_interruptible狀態的當前程序從runqueue

佇列中刪除。從runqueue佇列中刪除的結果是,當前這個程序將不再參

與排程,除非通過其他函式將這個程序重新放入這個runqueue佇列中,

這就是wake_up()的作用了。

由於這一段**位於乙個由condition控制的for(;;)迴圈中,所以當由

shedule()返回時(當然是被wake_up之後,通過其他程序的schedule()而

再次排程本程序),如果條件condition不滿足,本程序將自動再次被設

置為task_interruptible狀態,接下來執行schedule()的結果是再次被

從runqueue佇列中刪除。這時候就需要再次通過wake_up重新新增到

runqueue佇列中。

如此反覆,直到condition為真的時候被wake_up.

可見,成功地喚醒乙個被wait_event_interruptible()的程序,需要滿足:

在 1)condition為真的前提下,2) 呼叫wake_up()。

所以,如果你僅僅修改condition,那麼只是滿足其中乙個條件,這個時候,

被wait_event_interruptible()起來的程序尚未位於runqueue佇列中,因

此不會被 schedule。這個時候只要wake_up一下就立刻會重新進入執行排程。

關於wait_event_interruptible的返回值

根據 wait_event_interruptible 的巨集定義知:

1) 條件condition為真時呼叫這個函式將直接返回0,而當前程序不會

被 wait_event_interruptible和從runqueue佇列中刪除。

2) 如果要被wait_event_interruptible的當前程序有nonblocked pending

signals, 那麼會直接返回-erestartsys(i.e. -512),當前程序不會

被wait_event_interruptible 和從runqueue佇列中刪除。

3) 其他情況下,當前程序會被正常的wait_event_interruptible,並從

runqueue佇列中刪除,進入task_interruptible狀態退出執行排程,

直到再次被喚醒加入runqueue佇列中後而參與排程,將正常返回0。

附1:wait_event_interruptible 巨集

() 注: c語言中的的值等於最後一項,即x,因此上述

巨集的值是 __ret。

嵌入式linux的驅動程式

摘至嵌入式linux裝置驅動開發詳解 1.4 嵌入式linux驅動程式 1.4.1 嵌入式linux的核心空間和使用者空間 目前,各種處理器都能防止資源的未經授權訪問,包括嵌入式處理器。一般都是給cpu劃分不同的操作模式。不同的模式有不同的作用,某些操作不允許在低級別模式使用。核心態和使用者態是在硬...

linux 嵌入式驅動程式測試例項

include include include include include include include int main fd open dev fs o rdwr if fd 0 else printf open ok nwrite write fd,buf,strlen buf if n...

嵌入式linux系統中裝置驅動程式

嵌入式linux系統中裝置驅動程式是核心的一部分,完成對裝置初始 讀寫操作和控制等功能。驅動程式隱藏了 硬體裝置的具體細節,對不同的裝置提供一致的介面,這些介面通過file operation結構來定義,設計驅動程式的大部分工作就是 根據硬體結構來 填寫 結構體中定義的函式。主要的函式包括open ...