1

組み込みプログラミングでは、コードのアトミック セクション (クリティカル セクションと呼ばれる) を作成する必要があります。これらは通常、次のようにマクロを介して実装されます。

#define ENTER_CRITICAL() int saved_status_ = CPU_STATUS_REGISTER; __disable_irq();
#define EXIT_CRITICAL()  CPU_STATUS_REGISTER = saved_status_

つまり、割り込みのステータス(有効または無効)に入ると保存されます。終了時 - 復元されます。問題は、これには追加の変数が必要なことです。

私の質問は、constexpr 関数を介してクリティカル セクションを作成することは可能ですか (そして、これまでになくマクロを削除することは可能ですか)?

4

1 に答える 1

6

RAII ソリューションは伝統的なものになります。

struct CriticalSection {
  int saved_status_;
  void Enter() {
    saved_status_ = CPU_STATUS_REGISTER;
    __disable_irq();
  }
  CriticalSection() { Enter(); }
  void Exit() {
    CPU_STATUS_REGISTER = saved_status_;
  }
  ~CriticalSection() {
    Exit(); // Can you call this more than once safely?  Dunno.
  }
};

次のように使用します。

void foo() {
  // unprotected code goes here
  {
    CriticalSection _;
    // protected code goes here
  }
  // unprotected code goes here
}

CPU_STATUS_REGISTERは実行時の値であるため、状態なしでこれを行うことはできません。C/C++ の状態は、ほとんどが変数に格納されます。

重要な最適化レベルの下では、上記の RAII クラスは、EXIT_CRITICAL() を覚えておく必要がないことを除いて、マクロがコンパイルされたのとまったく同じコードにコンパイルされると強く思います。

于 2013-04-17T20:18:22.823 に答える