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も見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
あなたにとってのゴールデンタイムはいつですか?
一週間の中でもっともテンションが上がる「ゴールデンタイム」はいつですか? その逆で、一週間でもっとも落ち込むタイミングでも構いません。 よかったら教えて下さい!
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
マイコン C言語 割り込み処理で変数参照
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
このレジの並び方は間違ってま...
-
複数の割込み処理からアクセス...
-
割り込みのカウントの仕方
-
電車で待機列の割り込みについ...
-
マイコンのメインルーチン内でw...
-
VB.net 割り込みの禁止
-
VB6でSendKeyを利用したTab移動...
-
PICの割り込みフラグについて
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
VBAの配列サイズとメモリに関して
-
vba listviewにおけるtextのAli...
-
3のつく数字と3の倍数のみを表...
-
三角形を逆三角形にしたいです...
-
C言語で、メモリを解放しないで...
-
VBSの処理中一旦処理を止めて再...
-
C# シリアル通信でデータ受信...
-
VB6からVB2010への変換について
-
ACCESS側からEXCELの書式を設定...
-
大容量のメモリ確保をスワップ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
このレジの並び方は間違ってま...
-
【組込み】割り込み中のstatic...
-
USJでの割り込み
-
VB6でSendKeyを利用したTab移動...
-
CPU負荷率の安全な上限と計...
-
CPUの処理量を減らすコーデ...
-
pic 複数の割り込み関数 切り分...
-
Excelでタイマーの一時停止する...
-
VB.NET スレッドからのイベント...
-
H8マイコンでの割り込み(シリ...
-
割り込みのカウントの仕方
-
H8SX/1655のタイマー割り込みに...
-
マイコン C言語 割り込み処理...
-
一定時間操作がなかったら、と...
-
(H8マイコン)タイマ割込で変更...
-
STATUSのZフラグについて
-
定周期での割り込み
-
PICマイコンでエンコーダパルス...
おすすめ情報