
No.3ベストアンサー
- 回答日時:
>このケースにおけるvolatile修飾子は必要なのでしょうか?
AとBが多重にならないのでしたら、volatile は不要だと思います。
>コンパイラに割り込み処理AとBの終了時にxの値を変数にストアするという規定がない限り
>割り込み処理AとBの変数xを介したインタフェースに問題が生じるはずと思います。
例えば、グローバル変数を変更する他のファイルの関数を呼び出すと、どんな最適化がされていても、戻って来た時点でその変数は確実に変更された値が書き込まれていると思います。
なんらかの特性を利用するか、(もしあれば)#pragma を使うなどしてから、割り込みを終了させればいいのではないかと思います。
No.2
- 回答日時:
volatile は名前のとおり「揮発する」という意味です。
I/O アクセスを頭に思い浮かべてもらえれば、volatile の意図するところがわかると思います。
レジスタに値が残っていることから変数の再読込が省略されたり、同じ値を2回書き込んでいるので一方が省略されたり、アクセスの順番を勝手に変更したりすることがなくなるということです。
それで、考えなければならない事は2つあると思います。1つは、他の割り込みが「書き込む」可能性のある共通変数には、全て volatile を付けて、常に最新の値を読み込めるようにすること。
もう1つは、例えば共通変数 var があったとして、
var += 2;
というような場合に、アセンブリレベルでは、
1. レジスタに var の値をロードする
2. レジスタに 2 を加算する
3. レジスタの値を var にストアする
などの数ステップに展開されますが、1 と 2 の間、もしくは 2 と 3 の間で他の割り込み処理によって var の値が変更されても、戻ってきてまた var の値が変更されてしまうので、1~3 を実行中は、他の割り込みがかからないようにするなど、なんらかの安全策を講じる必要があるというところでしょう。
volatile によって、その変数にアクセスしている周辺で最適化が制限されることにはなりますが、深刻に考えるほどではないと思います。アセンブラで作ったとしても必要な無駄でしょうから、アルゴリズムを改善すると割り切った方が健全です。
この回答への補足
質問の回答をありがとうございます。
回答の中での2つの考えなければならないことについての特に後者の方は
今まで認識が薄かったため今後プログラミングをする上で十分に注意を払っていきたいと思います。
ところで質問の内容をしぼり再度補足をさせて頂きたいと思います。
例えば2つの割り込み処理ルーチンAとBがあり2つの割り込み処理ルーチンは
共に変数xを書き換えるとします。
プログラム全体でxを書き換えるのは割り込み処理ルーチンのAとBの中のみです。
2つの割り込み処理AとBは交互に発生しますが同一優先順位のため
多重割り込みにはなりません。
コンパイラのマニュアルを見ても
以上の様なケースでは変数xにvolatileをつけるような指示はありませんが
もし変数xにvolatile修飾子をつけなければ
コンパイラに割り込み処理AとBの終了時にxの値を変数にストアするという規定がない限り
割り込み処理AとBの変数xを介したインタフェースに問題が生じるはずと思います。
このケースにおけるvolatile修飾子は必要なのでしょうか?
No.1
- 回答日時:
割り込みを使ったプログラムということですが,
まずどのような実行環境と開発環境(せめて対象CPU
と使用するコンパイラくらい)を想定している
のかを教えてくれないと, アドバイスは難しいと
思います.
組み込み系ソフトウェアなんでしょうかね.
処理を高速化することよりも, 割り込み禁止時間を
短くする方が重要だとは思いますけど.
この回答への補足
回答をありがとうございます。
具体的な内容を示します。
組み込みソフトウェアでCPUは日立のSH-1です。コンパイラはSuperH C/C++コンパイラVer7です。
割り込みは全て外部信号からの割り込みで多重割り込み処理を行います。
外部信号の割り込みは複数あるのですがそれを2つに分類して
割り込み優先順位を分けています。
優先順位の高い信号の割り込み処理のみで高速化が必要です。
優先順位の高い信号は2本あり、
この2つの信号の割り込み処理は独立しておらず密接に関係しています。
volatile修飾子をどうするかの判断になやんでいるのは
優先順位の高い2種類の割り込み処理で共通に使用している変数です。
尚これらの変数は優先順位の低い割り込み処理群とは独立しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- メガネ・コンタクト・視力矯正 最近、新聞の文字がぼやけて見づらくなった。対処法は? 6 2023/01/14 18:29
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパーのレジで並んでいたら...
-
PIC・eepromとPIN設定について
-
STATUSのZフラグについて
-
CPUの処理量を減らすコーデ...
-
H8SX/1655のタイマー割り込みに...
-
割り込み処理から引数を取得す...
-
PIC 入力端子の監視?
-
H8マイコンでの割り込み(シリ...
-
割り込みハンドラの処理の簡素化
-
マイコンSH-2の割り込みを用い...
-
スタンドで割込したアホに果物...
-
VB.NET スレッドからのイベント...
-
マイコン C言語 割り込み処理...
-
デュアルCPUのパソコンでCPUを1...
-
【組込み】割り込み中のstatic...
-
H8マイコンで割り込みが任意の...
-
ショッピング
-
USB機器からのデータ受信による...
-
Excelでタイマーの一時停止する...
-
auの携帯で「パケット通信中...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
このレジの並び方は間違ってま...
-
スーパーのレジで並んでいたら...
-
H8マイコンで割り込みが任意の...
-
【組込み】割り込み中のstatic...
-
CPU負荷率の安全な上限と計...
-
CPUの処理量を減らすコーデ...
-
PICマイコンでエンコーダパルス...
-
pic 複数の割り込み関数 切り分...
-
irqbalance って
-
Amazonfireタブレットにわから...
-
USB機器からのデータ受信による...
-
マイコン C言語 割り込み処理...
-
デーモンと無限ループの違いは...
-
アトメル社製ATtiny2313マイコ...
-
アプリケーションをフルスクリ...
-
VB.net 割り込みの禁止
-
H8 3694 受信割込みについてです
-
C-Builder OnChangeをマスク
-
VB6でSendKeyを利用したTab移動...
おすすめ情報