[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 メーリングリストの案内