![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
今、H8S2368のために書かれたプログラムを見ているのですが、このプログラムではuC/OSというプログラムの関数である"OSIntEnter();"という関数が出てくることがわかりました。それで、OSIntEnter()関数というのが現在のソースプログラムの中でどのように使われているのかを、全ソースに対して検索をかけてみたところ、必ずと言っていいほど割り込みベクタのプログラムである下記のようなプログラムで使われていることがわかりました。
__interrupt(vect=22) void INT_IRQ6(void)
{
OSIntEnter();
OSSemPost(CmxInt);
OSIntExit();
}
たぶん、割り込みが発生して、その割り込みの種類の割り込みベクタに飛ぶときにこの”OSIntEnter()”というのを使わなければならないのだろうと推測しているのですが、
もし、割り込みベクタで”OSIntEnter()”を使わなかった場合、どのような問題がおきるのでしょうか?
No.3ベストアンサー
- 回答日時:
以下参考まで、
指定マニュアルにレジスタ保存は別途記載があるか、コンパイラがやっているので
記載がない のどちらかと思います。
1.タスク状態以外からの呼び出しに限る。
-->つまりハンドラ等ということなんでしょう。
2.安全に割込みネストカウンターを更新します。
--> このOSでは多重割込みを許可しているものです。多重割込みの回数を
カウンターで把握しています。なので出るときにもデクリメントしている
のでしょう。 また安全な更新は、割込不可状態で実施する必要があり、
なので、通常割込みハンドラの入り口では割込み禁止状態なので
まずカウンターをインクリメントし、そのあと割込み許可(ただし、レベル管理
が可能なCPUの場合は、その割込み優先以下はマスク)
までしてぬけるんじゃないかと思います。
3. 割込みネスト数は最大255まで
--> たぶん8bitでカウンターを持っているのが理由で、まぁ255もあれば十分
ですので、実際そこまでいくと、先にスタックが不足しますから
なぜ、割込みネストカウンターが必要なのかは、0になったときにスケジューラの
起動が必要だからでしょう。これをμITRONでは遅延ディスパッチといいます。
回答頂きありがとうございます。
たくさんの情報頂きありがとうございました。私のRTOSに関する知識が不足しているのが原因なので、RTOSに関して今後もご協力お願いたします。
No.2
- 回答日時:
こんにちは。
割り込みベクタのエントリは、必ずコンテキスト(context)を保存します。
コンテキストというのは、ここではCPUのレジスタ情報です。
どのCPUであっても、既存の何らかの処理が動いているときに、割り込みによって最優先処理を動かすわけですよね。そして、割り込み処理が終わったら、元の処理が何事も無かったように動くことを保証してあげなければなりませんよね?
そのために、コンテキストを保存するのです。
この仕組みは、あらゆるCPUで全て同じです。H8でもH330でも、Z80、i8086、PentiumとかTurionであれ皆同じです。そして、戻るときの OSIntExit() はそのコンテキストを復元する処理なのです。
一般的に割り込みベクタのエントリでは、多重割り込みを禁止するためにフラグを操作してから割り込みコンテキストを保存して、何らかの処理をできるだけ早く処理するようにして、終わったらコンテキストを復元しつつ割り込みを許可してリターンします。コンテキストの保存は、大抵はスタックにレジスタを保存するアセンブラ命令とかを実行しているはずです。復元は同じくスタックからレジスタにロードするアセンブラ命令があります。
なお、同じ処理が書ければいいのですから、同じ関数である必要はありません。
でも、普通は、セオリー通りに同じ関数を呼んだほうがトラブルが少ないと思います。
回答頂きありがとうございます。
たくさんの情報頂きありがとうございました。私のRTOSに関する知識が不足しているのが原因なので、RTOSに関して今後もご協力お願いたします。
No.1
- 回答日時:
使わなかった場合にどんな現象がおこるかは、uC/OSの振る舞いによる。
といいますかuC/OSのマニュアル等を参照してみてください としかいえませんね。
そう書いてください とかしかマニュアルに記載がない場合もあるかもしれません。
以下、想定での回答なのであまり期待しないでほしいのですが、
いわゆる割り込みハンドラの中で、uC/OSの動作に関係する操作はまずできない というのが
ひとつあると思います。
μITRONの場合を考えると、割り込みハンドラに入るときに同様に入り口で同じように
指定の関数をコールする決まりがある実装としてMISPOのNortiとかあります。
実際にNortiの場合にそれを書かなかったばかりにうまく動作しないというQ&Aはみかける
ことがあるので、同様の問題が発生するように思います。
なぜ、そういったOSを利用するときにまじないのように指定関数のコールが必要か
というと、Nortiのマニュアルにも動作内容の概要がかかれていますが、
ひとつはレジスタ退避、もうひとつは、割り込みマスクの変更のようです。
レジスタ退避は、OSを使わない場合でも同様に必要性がありますが、Nortiは多数のMPUで同様の
対応をしているため、やっているのだと思います。割り込みマスクの変更は、通常は多重割り込みを
受け付けるための変更を行っているでしょう。
さらにuC/OSのまじないとして、割り込みハンドラの終わりにOSIntExit();が必要なはずです。
OSIntEnter();
OSSemPost(CmxInt);
OSIntExit();
これはたぶん、あるデバイスかなにかの割り込みが発生したら、セマフォーで知らせるという 動作かと
思います。 セマフォ待ちのタスクはここで待ち状態からレディ状態になるでしょう。
OSIntEnt()は多重割り込みだった場合は割り込んだ元に戻りますが、タスク実行中に
割り込んだ場合は、タスクスケジューラに行き、そのときの最適な(たぶん最優先度の)タスクに切り替わる
ために呼ばないといけないルーチンかと思います。
OSSemPost(CmxInt);によってレディになるタスクが増える場合があり、その結果割り込まれたタスクよりも
優先度の高いタスクがレディになった場合にタスク切り替えが必要になるからです。
OSIntExit();を書かないとセマフォ待ちのタスクに切り替わらないという現象が現れるかもしれませんが、
スタック退避や割り込みマスクの処理の不整合があってそこまで動かないように思います。
回答頂きありがとうございました。
確かに現在H8S2368マイコンで使用しているOSというのはuC/OSというのを搭載しているとのことです。
それで、”OSIntEnter();”というのをuC/OSのマニュアルを下記のURL
http://www.scribd.com/doc/7046520/Ucos-II-Refman
このサイトでダウンロードできることがわかったので、pdfファイルをダウンロードしてみ説明を見てみたところ
このような説明があったので、yahoo翻訳で調べて読んでみました。
なんとなく使い方がわかったような気がしています。
OSIntEnter
1. This function must not be called by task-level code.
2. You can increment the interrupt-nesting counter (OSIntNesting) directly in your ISR to avoid the
overhead of the function call/return. It’s safe to increment OSIntNesting in your ISR because interrupts
are assumed to be disabled when OSIntNesting needs to be incremented.
3. You are allowed to nest interrupts up to 255 levels deep.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- au(KDDI) iPhone 12 pro(au povo) から iPhone14(買い換えるならPro) に機種 7 2022/09/08 19:53
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(プログラミング・Web制作) Python3プログラムについて 4 2023/05/21 14:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
USJでの割り込み
-
割り込みベクタに飛んだ場合必...
-
スーパーのレジで並んでいたら...
-
VB6でSendKeyを利用したTab移動...
-
定周期での割り込み
-
割り込みの衝突
-
pic 複数の割り込み関数 切り分...
-
インバウンドで迷惑している人...
-
SH2 (SH7144)のソフトウェアス...
-
電車乗車時、並んでいるのに割...
-
raspberry pi の 割り込み原因...
-
STATUSのZフラグについて
-
Macターミナルで実行中のプログ...
-
逆コンパイルと逆アセンブルの...
-
緯度、経度の 10進法と 60進法...
-
バックグラウンドのプロセスの...
-
C言語で、メモリを解放しないで...
-
家電製品の電力周波数を変える機械
-
DoEvents関数って何?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
このレジの並び方は間違ってま...
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
ショッピング
-
CPUの処理量を減らすコーデ...
-
一定時間操作がなかったら、と...
-
CPU負荷率の安全な上限と計...
-
pic 複数の割り込み関数 切り分...
-
Amazonfireタブレットにわから...
-
【組込み】割り込み中のstatic...
-
マイコン C言語 割り込み処理...
-
USB機器からのデータ受信による...
-
駅のトイレでナイチンに邪魔さ...
-
インバウンドで迷惑している人...
-
PICのSleepからの復帰に関して
-
PICでのプログラムによるチャタ...
-
実行した後、どうしてもフリー...
-
PICで内部タイマーを使わずカウ...
-
SH2のタイマ出力
-
割り込み中に例外異常
おすすめ情報