volatile
メモリ マップド ハードウェア レジスタ、ISR、およびマルチスレッド プログラムでの C キーワードの使用について読みました。
1) 登録する
uint8_t volatile * pReg;
while (*pReg == 0) { // do sth } // pReg point to status register
2) ISR
int volatile flag = 0;
int main()
{
while(!flag) { // do sth }
}
interrupt void rx_isr(void)
{
//change flag
}
3) マルチスレッド
int volatile var = 0;
int task1()
{
while (var == 0) { // do sth }
}
int task2()
{
var++;
}
while
1)volatile
変数がハードウェアから変更されたため、コンパイラは code から作成された変数の変更を認識しない場合があります。
しかし、ケース 2) と 3) の場合、なぜ volatile が必要なのですか? どちらの場合も、 variable はglobalと宣言されており、コンパイラはそれが複数の場所で使用されていることを確認できます。while
では、変数が ではない場合、なぜコンパイラはループを最適化するのでしょうvolatile
か?
設計上のコンパイラが「非同期呼び出し」(ISR の場合) またはマルチスレッドを認識していないためですか? しかし、これはあり得ませんよね?
volatile
また、ケース 3) はキーワードなしのマルチスレッドで一般的なプログラムのように見えます。グローバル変数 (volatile
キーワードなし)にロックを追加するとします。
int var = 0;
int task1()
{
lock(); // some mutex
while (var == 0) { do sth }
release()
}
int task2()
{
lock();
var++;
release();
}
それは私には十分に正常に見えます。volatile
マルチスレッドで本当に必要ですか?マルチスレッド プログラムでの最適化を回避するために修飾子が変数に追加されるのを見たことがないvolatile
のはなぜですか?