• ベストアンサー

volatile修飾について

組み込み系等でよく用いられる、volatile修飾子について質問させてください。 たまに、"volatile const int aaa" などと宣言された変数を見かけることがあります。 volatileやconstの意味はわかっているつもりですが、"const int aaa"ではなく、"volatile const int aaa"と宣言しなくてならないケースというのは、どういった場合があるのでしょうか? 具体的なコードで例を示していただけると助かります。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 私のつたない認識では、const宣言された変数はROMにマッピングされるものと思っております。 const修飾されたオブジェクトがROMに配置されるのは、非volatileの場合だけです。volatile修飾された場合は、const修飾子が付いていても初期化子も省略できます。これは組み込みであろうがなかろうが同じことです(コンパイラの不具合や非標準処理系の場合は知りません)。 > どんな要因でもaaaが変更されることはなく、つまりvolatileをつける意味がないように思えるのです。 先に書いたように、volatileが付いていれば原則としてRAMに配置されませんし、制御レジスタやI/Oポートの場合はリンカやアセンブラで指定したり、(*(const volatile unsigned char*)0x123456)のように定義したマクロなどを使うでしょうから、十分意味あることです。 仮にaaaがROMに配置された場合でも、バンク切り替えやフラッシュメモリの書き換えで値が変化する可能性はいくらでも考えられますね。

kappa_
質問者

お礼

>const修飾されたオブジェクトがROMに配置されるのは、非volatileの場合だけです 知りませんでした。 大変勉強になりました。ありがとうございます

その他の回答 (4)

  • rigidbody
  • ベストアンサー率60% (20/33)
回答No.5

>"volatile aaa"でいいような気がして ん?論点が摩り替わってしまっていますよ。命題は「volatileが必要か否か」ですよね?が、返信内容は「const intが必要か否か」になってしまっています。これではどちらを知りたいのか分かりません。 私が言いたい結論は、 「命題のvolatileコードを書いた人の意図は、"変数aaaに最適化操作を施さない絶対の安全性を保証したかった"のでは?」 という事です。 >constで宣言された変数はROM上にマッピングされる いいえ、volatile無しの変数なら必ず割り当てられる保証はありません。 前回お話した通りコンパイル時、前段処理が「const変数が何処にも使われた形跡が無い」と判断したら、後段処理(オプティマイザ)が「じゃあ削除しちゃえ!」とするような環境もあるからです。無い物をROMに割り当てる事はありませんから。 コンパイラの目には使われた形跡が無くとも、実は使っている場合もある訳です。間接的な参照の仕方をするコーディングも行えるからです(既述)。こういう時は、最適化段で勝手な真似をして欲しくない訳です。

kappa_
質問者

お礼

大変参考になりました。 理解できました。ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

#3です。 一箇所下記間違いました。 > volatileが付いていれば原則としてRAMに配置されませんし ×RAMに配置されません ○ROMに配置されません

  • rigidbody
  • ベストアンサー率60% (20/33)
回答No.2

>どういった場合があるのでしょうか? オプティマイザによる削除を避ける為ではないでしょうか。 一見 aaaを参照するコードが見当たらないようなソースがあったとします。 それをコンパイルすると、オプティマイザによってはaaaを削除される場合があります。が、valatile指定によりそれを避けようという意図ではないでしょうか。 一見、aaaを使わないように見えても、実際には即値アドレッシングによるポートアクセス等で、aaaを使う場合があります。が、コンパイラはそれを見抜く事ができない訳です。 こういう希な状況下においてvolatileを使ったのではないか、と推測しました。

kappa_
質問者

お礼

回答ありがとうございます。 私のうすい知識では、おっしゃているような状況では、"volatile aaa"でいいような気がしてしまいます。 組み込みでは、constで宣言された変数はROM上にマッピングされるため、値がどういう状況下でも変わらないと思っています。 間違ってますでしょうか?

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

早い話が入力ポートのようなものがconst volatile修飾されます。他には受信バッファなどもそうかと思います。 要するに、Cの文脈で値を変更することはできないけれども、別の要因で、読み込むたびに値が変化する可能性があるようなオブジェクトに対して指定します。

kappa_
質問者

お礼

早速の回答ありがとうございます。 私のつたない認識では、const宣言された変数はROMにマッピングされるものと思っております。 どんな要因でもaaaが変更されることはなく、つまりvolatileをつける意味がないように思えるのです。