
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で質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- 教育ソフト・学習ソフト vbsで分割した値をそれぞれの変数に 1 2022/10/17 19:52
- Excel(エクセル) Excelの関数で可能でしょうか、日付や式の値の自動更新 4 2023/05/19 17:17
- 数学 写真の数学の質問です。 ①のとき、tanθを求めよという問題です。 cosで割るとと書いてあるのです 1 2023/07/16 16:58
- Visual Basic(VBA) 1つの入力フォルダの値を読み込み、3分割をして新しい変数に代入する方法を教えていただきたいです。 読 4 2022/10/17 20:52
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- クレジットカード クレジットカードのあとから分割について聞きたいことがあります たとえば家電をクレジットカードで購入し 3 2023/04/23 08:10
- Excel(エクセル) [Excel2016] 相関表等の自動作成 2 2022/08/01 20:34
- ライブ・コンサート・クラブ ticketboardに関して質問です。滑り止めで複数日の申し込みをした場合、1日分だけを残してキャ 1 2023/01/02 13:32
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
割り込み処理から引数を取得す...
-
H8マイコンでの割り込み(シリ...
-
PIC・eepromとPIN設定について
-
割り込みハンドラの処理の簡素化
-
CPUの処理量を減らすコーデ...
-
STATUSのZフラグについて
-
CPU負荷率の安全な上限と計...
-
PICマイコンでエンコーダパルス...
-
スタンドで割込したアホに果物...
-
VB.NET スレッドからのイベント...
-
マイコン C言語 割り込み処理...
-
スーパーのレジで並んでいたら...
-
このレジの並び方は間違ってま...
-
PIC 入力端子の監視?
-
デュアルCPUのパソコンでCPUを1...
-
【組込み】割り込み中のstatic...
-
Excelでタイマーの一時停止する...
-
USB機器からのデータ受信による...
-
割り込みのカウントの仕方
-
マイコンSH-2の割り込みを用い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
このレジの並び方は間違ってま...
-
スーパーのレジで並んでいたら...
-
H8マイコンで割り込みが任意の...
-
【組込み】割り込み中のstatic...
-
CPU負荷率の安全な上限と計...
-
CPUの処理量を減らすコーデ...
-
PICマイコンでエンコーダパルス...
-
pic 複数の割り込み関数 切り分...
-
irqbalance って
-
Amazonfireタブレットにわから...
-
USB機器からのデータ受信による...
-
マイコン C言語 割り込み処理...
-
デーモンと無限ループの違いは...
-
アトメル社製ATtiny2313マイコ...
-
アプリケーションをフルスクリ...
-
VB.net 割り込みの禁止
-
H8 3694 受信割込みについてです
-
C-Builder OnChangeをマスク
-
VB6でSendKeyを利用したTab移動...
おすすめ情報