
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ランキング
-
CPU負荷率の安全な上限と計...
-
電車で待機列の割り込みについ...
-
sleep関数の原理について
-
割り込みの衝突
-
定周期での割り込み
-
volatileについて
-
Macターミナルで実行中のプログ...
-
TCP/IP通信時のサーバーからの受信
-
Excel(VBA)でSetTimer関数を使...
-
AIXでのプロセス使用メモリの最...
-
C# シリアル通信でデータ受信...
-
FOM出版の公認テキスト&問題集...
-
メッセージボックスのボタン名変更
-
powershell を使いカレントディ...
-
Windows上で、シグナル(SIGTERM...
-
プロセスIDの取得方法について
-
エクセルVBA 大容量CSVファイル...
-
UdpClient 送信元のIPアドレ...
-
vb.netでEXCEL起動がうまくでき...
-
アプリケーションが終了するま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
CPUの処理量を減らすコーデ...
-
スーパーのレジで並んでいたら...
-
このレジの並び方は間違ってま...
-
Amazonfireタブレットにわから...
-
CPU負荷率の安全な上限と計...
-
【組込み】割り込み中のstatic...
-
USJでの割り込み
-
VB6でSendKeyを利用したTab移動...
-
irqbalance って
-
インバウンドで迷惑している人...
-
VB.NET スレッドからのイベント...
-
デュアルCPUのパソコンでCPUを1...
-
Timerコンポーネントのインター...
-
C言語でPICマイコン開発
-
Arduinoのプログラムで質問です。
-
マイコンSH-2の割り込みを用い...
-
H8マイコンでの割り込み(シリ...
-
優先度順方式とプリエンプショ...
-
マイコン C言語 割り込み処理...
おすすめ情報