
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
zwiさんが一通り解説してくれたので、もうあまり書くことはないのですが...
#2でも書いたように、代入に関しては排他制御が不要の場合もあり得ます。ただし、sig_atomic_t型を使う場合を除き、移植性に配慮するなら排他制御を行った方が無難です(パフォーマンスとの相談になります)。
基本的には、割り込みは命令と命令の間に発生しますが、アーキテクチャによっては、ブロック転送のような高級命令の実行途中で割り込みが発生することもあるので要注意です。また、割り込みだけでなく、DMA転送なども起こりえますので、排他制御の必要性を考慮する場合はお忘れなく。
なお、割り込み云々といっていることからしても、スレッド間の排他制御も割り込み禁止で行うことが出来る可能性は高いと思います。
マルチプロセッサの環境で、プロセッサ間の共有メモリに配置された変数を更新する場合はさらに注意が必要です。このような場合、たとえアトミックオペレーションだとしても、メモリアクセスが分割される場合にはやはり排他制御が必要になります。
また、排他制御は割り込み禁止では不十分で、スピンロックを使うか、OSの支援があるならセマフォやミューテックス等の機構を使う必要があります。
No.3
- 回答日時:
>割り込みハンドラ内で同じ変数が呼ばれる可能性がなければ、特に割禁にする必要はないのでしょうか?
同じ変数というか、同じアドレスに対して参照や書き換えをしていない限りは割り込み禁止にする必要はありません。
では、なぜ割り込み禁止にする必要があるか考えて見ましょう。
割り込みはマシン語の1命令単位で発生しますから、変数の処理がマシン語の1命令で完結しない場合は、割り込み禁止にする必要があります。
例えば、加算で
a=a+b;
はC言語なら1命令ですが、機械語レベルで見れば数命令必要です。
a+bを代入する前に割り込んで、割り込み先でaを書き換えても、割り込みから戻ってきた後aへの代入が起こるので、割り込み先で書き換えた値はロストしてしまいます。
これはスレッドでも同様ですが、スレッドはセマフォ等の同期処理で排他制御します。
volatileが必要な理由は、こちらを参照してください。
http://www.kumikomi.net/article/explanation/2003 …
>ここでの排他制御は、ハード的な割り込みが入る可能性から考えて
>セマフォを握ってれば大丈夫。というレベルではないですよね?
ハード的な割り込みとの排他制御でセマフォを使うことは出来ません。使うと必ずデットロックします。
No.2
- 回答日時:
更新中に割り込みが発生した場合、割り込みハンドラで同じ変数を更新または参照を行う可能性があるためです。
ただし、単なる代入の場合には、sig_atomic_t型のように、代入がアトミックオペレーションで行われることが保証されている型に限れば、割り込み禁止等の排他制御は不要です。
なお、割り込みハンドラや他のタスクと共有する変数は、排他制御の他にvolatile修飾子を付ける必要があります。
> (autoは平気でstaticはダメな理由、書き変わる際のシーケンス等)
コンパイラの出力結果を見ればすぐに理解できるはずです。
この回答への補足
回答ありがとうございます。
割り込みハンドラ内で同じ変数が呼ばれる可能性がなければ、特に割禁にする必要はないのでしょうか?
(割り込む側の都合なので、対応は必要だと思いますが、理由はそれ以外にないかを確認したいです。)
>コンパイラの出力結果を見ればすぐに理解できるはずです。
これは割りついている領域が違うからという見解で正しいでしょうか?
お手数ですが、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C-Builder OnChangeをマスク
-
電車で待機列の割り込みについ...
-
(H8マイコン)タイマ割込で変更...
-
H8マイコンで割り込みが任意の...
-
マイコン C言語 割り込み処理...
-
一定時間操作がなかったら、と...
-
【組込み】割り込み中のstatic...
-
H8/3052F/IRQを使った割り込み
-
ショッピング
-
割り込みハンドラの処理の簡素化
-
このレジの並び方は間違ってま...
-
CPU負荷率の安全な上限と計...
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
winsockでソケット通信の開発を...
-
メッセージボックスのボタン名変更
-
VB.NETで起動したExcelの閉じ方...
-
DoEvents関数って何?
-
C言語で、メモリを解放しないで...
-
ACCESS側からEXCELの書式を設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
このレジの並び方は間違ってま...
-
電車で待機列の割り込みについ...
-
CPU負荷率の安全な上限と計...
-
PIC16F84Aから16F628Aの...
-
【組込み】割り込み中のstatic...
-
コールバック関数について
-
マイコン C言語 割り込み処理...
-
USB機器からのデータ受信による...
-
スーパーのレジで並んでいたら...
-
VB.NET スレッドからのイベント...
-
割り込みについて
-
一定時間操作がなかったら、と...
-
PICマイコンでエンコーダパルス...
-
CPUの処理量を減らすコーデ...
-
pic 複数の割り込み関数 切り分...
-
PICマイコン 割り込み実行時間...
-
ロータリーエンコーダがうまく...
-
SH7727(SH3-DSP)
-
VBAのDoEventsが上手く動きません
-
割り込みの入り方。考え方。
おすすめ情報