mirror of
https://github.com/sysprog21/lkmpg.git
synced 2024-11-22 08:52:28 +08:00
Refine wordings
This commit is contained in:
parent
56f566abe6
commit
8cd1c6a322
22
lkmpg.tex
22
lkmpg.tex
|
@ -1931,34 +1931,36 @@ The example below modifies the previous example to also run an additional task w
|
|||
|
||||
\subsection{Threaded IRQ}
|
||||
|
||||
Threaded IRQ is a mechanism to handle both top-half and bottom-half of an IRQ at once.
|
||||
A threaded IRQ splits one handler into two: one for the top-half, the other for the bottom-half.
|
||||
Those two handlers are registered at once by \cpp|request_threaded_irq()|.
|
||||
Threaded IRQ is a mechanism to organize both top-half and bottom-half of an IRQ at once.
|
||||
A threaded IRQ splits the one handler in \cpp|request_irq()| into two: one for the top-half, the other for the bottom-half.
|
||||
The \cpp|request_threaded_irq()| is the function for using threaded IRQs.
|
||||
Two handlers are registered at once in the \cpp|request_threaded_irq()|.
|
||||
|
||||
Those two handlers run in different context.
|
||||
The top-half handler runs in interrupt context.
|
||||
It's the equivalence of the handler passed to the \cpp|request_irq()|.
|
||||
The bottom-half handler on the other hand runs in its own thread.
|
||||
This thread is created on registration of a threaded IRQ. Its sole purpose is to run this bottom-half handler.
|
||||
This thread is created on registration of a threaded IRQ.
|
||||
Its sole purpose is to run this bottom-half handler.
|
||||
This is where a threaded IRQ is ``threaded''.
|
||||
|
||||
Whether the bottom-half handler will be invoked is determined by the return value of the top-half handler.
|
||||
If \cpp|IRQ_WAKE_THREAD| is returned, that bottom-half serving thread will wake up.
|
||||
If \cpp|IRQ_WAKE_THREAD| is returned by the top-half handler, that bottom-half serving thread will wake up.
|
||||
The thread then runs the bottom-half handler.
|
||||
|
||||
Here is an example of how to do the same thing as before, with top and bottom halves, but using threads.
|
||||
|
||||
\samplec{examples/bh_threaded.c}
|
||||
|
||||
\cpp|request_threaded_irq()| only takes one additional parameter than the \cpp|request_irq()| -- the bottom-half handling function that runs in its own thread.
|
||||
A threaded IRQ is registered using \cpp|request_threaded_irq()|.
|
||||
This function only takes one additional parameter than the \cpp|request_irq()| -- the bottom-half handling function that runs in its own thread.
|
||||
In this example it is the \cpp|button_bottom_half()|.
|
||||
Usage of other parameters are the same as \cpp|request_irq()|.
|
||||
|
||||
Presence of both handlers is not mandatory.
|
||||
If either of them is not needed, pass the \cpp|NULL| instead.
|
||||
A \cpp|NULL| top-half handler implicitly means doing nothing but waking up the bottom-half serving thread; A \cpp|NULL| bottom-half handler will have the same effect as \cpp|request_irq()|.
|
||||
A \cpp|NULL| top-half handler implicitly means doing nothing but waking up the bottom-half serving thread (for running the bottom-half handler); A \cpp|NULL| bottom-half handler would have the same effect as if \cpp|request_irq()| were used.
|
||||
In fact, this is how \cpp|request_irq()| is implemented.
|
||||
|
||||
Note that passing \cpp|NULL| as both handlers is considered an error and will make registration fail.
|
||||
Note that passing \cpp|NULL| to both handlers is considered an error and will make registration fail.
|
||||
|
||||
\section{Virtual Input Device Driver}
|
||||
\label{sec:vinput}
|
||||
|
|
Loading…
Reference in New Issue
Block a user