2012-04-02 11 views
7

私は特定のARMベースのLinuxボード(実際にはカスタムUARTドライバ)用のカスタムシリアルバスドライバを実装しています。このドライバは、カスタムプロトコルを介してバスの他端の特定のMCUとの通信を可能にするものとする。ドライバはその機能をユーザー空間に公開していないし、ユーザ空間に実装することもできない(つまり、在庫TTYサブシステムを使用する代わりにカスタムドライバが必要になる)(実際にはでなければならない)。Linuxカーネルで正しいモジュール間同期を実装する

ドライバは、通信プロトコルとUARTの読み取り/書き込みを実装し、MCUとの通信を許可するために、一連の高レベル機能をユーザーにエクスポートする必要があります(read_register()drive_gpios()など) 。このモジュールのユーザーは1人だけです。

呼び出しモジュールは、操作の完了を待たなければなりません(前述のread_register()など)。私は現在、セマフォーの使用を検討しています。ユーザーモジュールは私のドライバーの関数を呼び出し、転送を開始し、セマフォーを待ちます。私のドライバのIRQハンドラはMCUに要求を送り、答えを読んで、セマフォにポストし、呼び出しモジュールを起動させます。しかし、私はカーネルプログラミングに精通していませんし、可能性のある代替実装(タスクレット?待ち行列?)の数々に悩まされています。

質問:私のセマフォベースのアプローチはOKですか、あまりにもナイーブですか?可能な選択肢は何ですか?私に欠けている可能性のある落とし穴はありますか?

+3

セマフォーは、私が理解しているところから仕事をしなければなりません。より良いlinux内部を魅力的なものにするには、無料pdfとして入手可能な最新の(39カーネルです)素晴らしい本 "linex kernel development 3rd edition"その本は本当に深くはありませんが、基本原則とオプションを示しています。楽しいハッキングをしてください。 – AoeAoe

+0

素敵な本です、ありがとう!他の誰かが興味を持っているなら、Linux Drivers DevelopmentとLinux Kernel Module Developmentを入手することをお勧めします(どちらもオンラインで無料で入手できます) –

答えて

5

は伝統的に二つの部分で行われているのLinuxでの取り扱いIRQ:

だから、「上半分」と呼ばれる
  1. IRQのコンテキストで実際の作業(IRQハンドラ自体)です。この部分はできるだけ早く終了する必要があります。したがって、基本的に割り込みソースをチェックしてからボトム・ハーフを開始します。

  2. 「ボトム・ハーフ」。それは作業待ち行列として実施されてもよい。それは実際の仕事が行われるところです。それは、ブロッキング機能を使用できるように、あなただけcompletionと呼ばれる特殊なオブジェクトを使用することをお勧めし、あなたのワーカースレッドにIRQを待ちたい場合には

  3. など、通常のコンテキストで

を実行します。これは、このタスクのために作成されたものです。

関連する問題