[Armadillo:01640] Re: GPIOの割り込みについて
Takeharu KATO
email@hidden
2007年 6月 7日 (木) 19:09:41 JST
加藤と申します。
> それで、今回の割り込みを利用して、
> 以前に作ったナイトライダープログラムを編集いたしました。
>
「ナイトライダー」という言葉に反応してしまいました。
> 一応、機能としては実現できたのですが、このようにプログラムを記述するのが一般的なのでしょうか?
> 複数のプロセスに分けてしまうと、同期等いろいろな面で苦労するの可能性があるかとおもいます。
> ですので、可能であれば、「割り込みが発生したら指定した関数を実行する」などといったことは可能でしょうか?
>
カーネル内の関数を呼び出すのであれば、遅延実行ハンドラをキックする手があります。
これには、tasklet_schedule機構を使うのが一般的ではないかと思います。
おおよそ、以下の手順で使用できると思います。
(1) DECLARE_TASKLETでtasklet構造体を宣言する。
大域変数で
static DECLARE_TASKLET(the_tasklet,the_tasklet_handler,0);
として宣言。
ここで、the_tasklet_handlerは、実際に呼び出される関数(へのポインタ)で
実体は、
static void
the_tasklet_handler(unsigned long arg)
という形式の関数です。
DECLARE_TASKLETの第3引数で与えた値がargに渡されてきますが、
使用しないことが多いです。
(2) 割込みハンドラで、タスクレット呼び出しを宣言する。
割込みハンドラ内に
tasklet_schedule(&the_tasklet);
のような記述を入れることで(引数は (1)で宣言した構造体へのポインタ)
割込みハンドラ終了後(かつユーザ空間に戻るまえ)に(1)で
指定した関数(DECLARE_TASKLETの第2引数で指定)が呼び出されます。
当該の関数は、下記条件で呼び出されることを想定して処理を
記載する必要があります。
i) 割込みコンテキスト
ii) 割込み許可状態
つまり、当該関数を作成する上では、下記に注意する必要があります。
(A) 自プロセスを休眠させるような処理は記述してはいけない
(B) 割込みハンドラと(メモリなどの)資源を共有してはいけない
以上、お役に立てば幸いです。
armadillo メーリングリストの案内