6

コードが以下の場合

void test(void)
{
  spin_lock_irqsave(&lock1, flag);
  ...
  func1();
  ...
  spin_unlock_irqrestore(&lock1, flag);
}

void func1(void)
{
  spin_lock_irqsave(&lock2, flag);
  ...
  spin_unlock_irqrestore(&lock2, flag);
}

コードに問題はありますか?func1 で が呼び出されたとき、spin_unlock_irqrestore割り込みは既に有効になっていますか? 私が達成したいのはtest()、スケジューラや割り込みによる中断なしにルーチンを実行できることです。どうもありがとう

4

1 に答える 1

6

ドキュメントで見つけた限り、検索を完全に使い果たしたわけではありませんがflag、さまざまなフラグを設定するビットの状態を保存し、割り込みをオフにしてから、最後に復元します。最初の呼び出しで割り込みがオフになっていて、別の呼び出しを行った場合、割り込みをオフのままにし、内部testに保存して復元し、復元すると想定します状態に戻しました。flagsfunc()flagtest

割り込みは、関数の後でのみ再度有効にする必要がありますtest

唯一の問題は、両方の関数で同じ変数を使用できないことflagです。それ以外の場合は、内部呼び出しで最初の変数を上書きしてからリセットし、呼び出しの間にフラグが変更された場合は、外部をリセットできます1 つを間違った状態にします。

于 2012-09-25T15:41:00.383 に答える