お風呂の温度、何℃にしてますか?

ハード的な割り込みの入る可能性のあるシステムにおいて
static変数を更新する間は割禁をかけるように指導されたのですが
理由がよく分かりません。

値が変えられる可能性があるとのことなのですが
少し詳しく教えていただけるとありがたいです。
(autoは平気でstaticはダメな理由、書き変わる際のシーケンス等)

以上、よろしくお願いします。

A 回答 (4件)

zwiさんが一通り解説してくれたので、もうあまり書くことはないのですが...



#2でも書いたように、代入に関しては排他制御が不要の場合もあり得ます。ただし、sig_atomic_t型を使う場合を除き、移植性に配慮するなら排他制御を行った方が無難です(パフォーマンスとの相談になります)。
基本的には、割り込みは命令と命令の間に発生しますが、アーキテクチャによっては、ブロック転送のような高級命令の実行途中で割り込みが発生することもあるので要注意です。また、割り込みだけでなく、DMA転送なども起こりえますので、排他制御の必要性を考慮する場合はお忘れなく。
なお、割り込み云々といっていることからしても、スレッド間の排他制御も割り込み禁止で行うことが出来る可能性は高いと思います。

マルチプロセッサの環境で、プロセッサ間の共有メモリに配置された変数を更新する場合はさらに注意が必要です。このような場合、たとえアトミックオペレーションだとしても、メモリアクセスが分割される場合にはやはり排他制御が必要になります。
また、排他制御は割り込み禁止では不十分で、スピンロックを使うか、OSの支援があるならセマフォやミューテックス等の機構を使う必要があります。
    • good
    • 0

>割り込みハンドラ内で同じ変数が呼ばれる可能性がなければ、特に割禁にする必要はないのでしょうか?


同じ変数というか、同じアドレスに対して参照や書き換えをしていない限りは割り込み禁止にする必要はありません。

では、なぜ割り込み禁止にする必要があるか考えて見ましょう。
割り込みはマシン語の1命令単位で発生しますから、変数の処理がマシン語の1命令で完結しない場合は、割り込み禁止にする必要があります。
例えば、加算で
a=a+b;
はC言語なら1命令ですが、機械語レベルで見れば数命令必要です。
a+bを代入する前に割り込んで、割り込み先でaを書き換えても、割り込みから戻ってきた後aへの代入が起こるので、割り込み先で書き換えた値はロストしてしまいます。
これはスレッドでも同様ですが、スレッドはセマフォ等の同期処理で排他制御します。

volatileが必要な理由は、こちらを参照してください。
http://www.kumikomi.net/article/explanation/2003 …

>ここでの排他制御は、ハード的な割り込みが入る可能性から考えて
>セマフォを握ってれば大丈夫。というレベルではないですよね?
ハード的な割り込みとの排他制御でセマフォを使うことは出来ません。使うと必ずデットロックします。
    • good
    • 0

更新中に割り込みが発生した場合、割り込みハンドラで同じ変数を更新または参照を行う可能性があるためです。


ただし、単なる代入の場合には、sig_atomic_t型のように、代入がアトミックオペレーションで行われることが保証されている型に限れば、割り込み禁止等の排他制御は不要です。
なお、割り込みハンドラや他のタスクと共有する変数は、排他制御の他にvolatile修飾子を付ける必要があります。

> (autoは平気でstaticはダメな理由、書き変わる際のシーケンス等)

コンパイラの出力結果を見ればすぐに理解できるはずです。

この回答への補足

回答ありがとうございます。

割り込みハンドラ内で同じ変数が呼ばれる可能性がなければ、特に割禁にする必要はないのでしょうか?
(割り込む側の都合なので、対応は必要だと思いますが、理由はそれ以外にないかを確認したいです。)

>コンパイラの出力結果を見ればすぐに理解できるはずです。
これは割りついている領域が違うからという見解で正しいでしょうか?

お手数ですが、よろしくお願いします。

補足日時:2007/11/02 19:58
    • good
    • 0

マルチスレッドでプログラミングしているということですね。


排他制御をしなさいということだと思います。

排他制御ができていれば割り込み禁止でなくてもよいと思います。

この回答への補足

回答ありがとうございます。

ご意見通り、マルチスレッドでのプログラミングになります。

ここでの排他制御は、ハード的な割り込みが入る可能性から考えて
セマフォを握ってれば大丈夫。というレベルではないですよね?

補足日時:2007/11/02 20:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報