JP2002073374A - 割り込みシミュレーション方法及び装置 - Google Patents

割り込みシミュレーション方法及び装置

Info

Publication number
JP2002073374A
JP2002073374A JP2000261614A JP2000261614A JP2002073374A JP 2002073374 A JP2002073374 A JP 2002073374A JP 2000261614 A JP2000261614 A JP 2000261614A JP 2000261614 A JP2000261614 A JP 2000261614A JP 2002073374 A JP2002073374 A JP 2002073374A
Authority
JP
Japan
Prior art keywords
interrupt
thread
level
function
processing
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
JP2000261614A
Other languages
English (en)
Inventor
Seiji Sasaki
誠司 佐々木
Hiroyasu Watanabe
浩康 渡辺
Toshio Yabe
俊夫 矢部
Masahiro Ogawara
将広 大河原
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Canon Inc
Original Assignee
Canon Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Canon Inc filed Critical Canon Inc
Priority to JP2000261614A priority Critical patent/JP2002073374A/ja
Publication of JP2002073374A publication Critical patent/JP2002073374A/ja
Withdrawn legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

(57)【要約】 【課題】 割り込み処理を含む機器組込みプログラムの
シミュレーション実行及びデバッグを、汎用OS上で高
速に行うことはできなかった。 【解決手段】 CPU及び割り込みコントローラによっ
て実行されることによってメイン処理及び複数レベルの
割り込み処理を実現する機器組み込みプログラムを擬似
する割り込みシミュレーション方法であって、前記メイ
ン処理に対してメイン処理スレッド110及び同期セマ
フォを割り当て、前記複数レベル毎の割り込み処理に対
して割り込み処理スレッド120,121,122及び
同期セマフォを割り当て、現在実行中でないスレッドに
対してサスペンド状態又は対応する同期セマフォの待ち
状態のいずれかを保証することにより、CPUの逐次実
行性を実現する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は割り込みシミュレー
ション方法及び装置に関し、特に機器組込み系ソフトウ
ェアによる割り込み処理をシミュレートする割り込みシ
ミュレーション方法及び装置に関する。
【0002】
【従来の技術】一般に、機器に組込まれたプログラムの
デバッグを行う際には、該ターゲット機器にインサーキ
ット・エミュレータ(ICE)を接続することによっ
て、リアルタイムデバッグを行う。
【0003】しかしながら、ターゲット機器と一体とな
ったプログラムのデバッグ作業は、該ターゲット機器の
開発または試作品の完成を待たなければならないため、
ソフトウェアの開発日程は長期化してしまう傾向にあ
る。
【0004】また近年、ICEが対応可能なクロック周
波数を超えたマイクロプロセッサが多数出現している。
このような高速マイクロプロセッサを対象とした機器組
込みプログラムにおいては、ICEを用いたデバッグは
不可能である。
【0005】そこで、ワークステーション(以下、W
S)または、パーソナルコンピュータ(以下、PC)を
ホストコンピュータとする、UNIX(登録商標)、W
indows(登録商標)等の汎用OS上において、機
器組込みプログラムをシミュレートする方法が求められ
ている。
【0006】例えば特開平6−208480号において
は、ターゲットのマイクロプロセッサのシミュレータ上
で、機器組込みプログラムをマシンコードレベルでシミ
ュレートし、該プログラムが入出力要求(I/O操作)
を実行する際に、その命令を疑似周辺装置への入出力命
令に変換する。そして、該疑似周辺装置における入出力
動作の完了通知を、同マイクロプロセッサシミュレータ
への割り込み入力とすることで、機器組込みプログラム
をデバッグ可能とする技術が開示されている。
【0007】また特開平7−64802号においては、
汎用OSであるUNIXが提供するシグナル機構(ユー
ザが利用可能な割り込み機能)を利用して、機器組込み
プログラムの割り込み処理のシミュレーションを行う技
術が開示されている。
【0008】
【発明が解決しようとする課題】しかしながら、上記特
開平6−208480号に開示されたシミュレーション
方法では、マイクロプロセッサのシミュレートに時間が
かかりすぎるという問題点があった。
【0009】また、特開平7−64802号に開示され
たシミュレーション方法は、あくまでもOSとしてUN
IXの使用を前提としており、他の汎用OS上で同様な
ことを実現するのは困難であった。また、UNIXを使
用している場合においても、ユーザが自由に利用可能な
シグナルチャンネルは、SIGUSR1,SIGUSR
2の2チャンネルしかない。従って、それ以上の割り込
み入力を必要とする機器組込みプログラムについては、
シミュレーションによるデバッグを実行することができ
なかった。
【0010】また、UNIXのシグナル機構は、割り込
みレベル制御を行わないフリーネスティング割り込みモ
デルに従う。従って、機器組込みプログラムのターゲッ
トシステムの割り込みコントローラが割り込みレベル制
御による割り込みネスティングモデルに従うとき、シミ
ュレータ上でのデバッグ実行時と、実際のターゲット上
での実行時とでは、多重割り込みのシーケンスが異なっ
たものとなってしまうという問題があった。
【0011】本発明は上述した問題点を解決するために
成されたものであり、割り込み処理を含む機器組込みプ
ログラムの忠実なシミュレーションを汎用OS上で高速
に実行可能とする割り込みシミュレーション方法及び装
置を提供することを目的とする。
【0012】
【課題を解決するための手段】上記目的を達成するため
の一手法として、本発明の割り込みシミュレーション方
法は以下の工程を備える。
【0013】即ち、CPU及び割り込みコントローラに
よって実行されることによってメイン処理及び複数レベ
ルの割り込み処理を実現する機器組み込みプログラムを
擬似する割り込みシミュレーション方法であって、前記
メイン処理に対してメインスレッド及び同期セマフォを
割り当て、前記複数レベル毎の割り込み処理に対して割
り込みスレッド及び同期セマフォを割り当て、前記メイ
ンスレッド及び前記割り込みスレッドのうち、現在実行
中でないスレッドに対してサスペンド状態又は対応する
同期セマフォの待ち状態のいずれかを保証する、ことを
特徴とする。
【0014】
【発明の実施の形態】本発明に係る一実施形態を詳細に
説明するに先立って、本発明の理解を容易とするため
に、まず本発明の概要を説明する。
【0015】<本発明の概要>一般に機器組込みプログ
ラムはC言語で記述される場合が多く、C言語の範囲で
シミュレーション実行できれば通常の用途には、十分で
ある。
【0016】従って本発明においては、C言語で記述さ
れた機器組込みプログラムを、ホストコンピュータのネ
イティブのコンパイラによってコンパイルした、ネイテ
ィブのバイナリコードをホストコンピュータ上でデバッ
グ実行させることにより、シミュレーション実行のスピ
ードの問題を解決することができる。
【0017】本発明においては、ホストコンピュータ上
では一般にユーザの使用が認められていない、割り込み
機構をシミュレーションすることで、機器組込みプログ
ラムをホストコンピュータの汎用OS上でシミュレーシ
ョン実行可能とする。
【0018】また、ターゲットのCPUと割り込みコン
トローラが提供する割り込みモデルを忠実にシミュレー
ションすることで、ターゲット上で実行した場合と同様
の割り込みシーケンスを、ホストコンピュータ上の汎用
OS上で再現することを可能とする。
【0019】また、機器組込みプログラムを構成する要
素である、メイン処理と、各割り込みレベルの割込み込
み処理それぞれに、汎用OSまたはスレッドライブラリ
が提供するスレッドと同期セマフォを1つずつ用意し、
そして、現在実行中のスレッド以外のスレッドは、サス
ペンド状態であるか、自身に割り当てられた同期セマフ
ォを待っているかのいずれかの状態であることを保証す
ることによって、CPUの逐次実行性を実現する。
【0020】また、前記メイン処理にスレッド(メイン
処理スレッドと呼ぶ)を割り当てることにより、メイン
処理が実行中に割り込み処理が割込むことを可能とし、
そして、割り込み処理が終了したときに、メイン処理
は、メイン処理スレッドに保存されたコンテキスト情報
に基づき、割り込み処理に割込まれた場所から処理を再
開することを可能とする。
【0021】また、前記、割り込みレベル毎にスレッド
(割り込み処理スレッドと呼ぶ)を割り当てることによ
り、低優先の割り込み処理が実行中に、高優先の割り込
み処理が割込むことを可能とし、そして、高優先の割り
込み処理が終了したときに、低優先の割り込み処理は、
割り込み処理スレッドに保存されたコンテキスト情報に
基づき、高優先の割り込み処理に割込まれた状態から処
理を再開することを可能とする。
【0022】また、機器組込みプログラムのターゲット
環境における周辺デバイスの動作をシミュレーションす
る周辺デバイスシミュレータを、機器組込みプログラム
のメイン処理及び割り込み処理とは独立した周辺デバイ
ススレッド上で動作させることにより、周辺デバイスの
並行動作と、周辺デバイスからの非同期な割り込み発生
を可能とする。
【0023】また、割り込みコントローラ回路が、周辺
デバイスからの割込み要求をレベル制御し、そして、C
PUの割り込みレベルよりも高い割込み要求を割込みコ
ントローラ回路が保持している場合に限り、割り込みコ
ントローラ回路が、CPUに割り込み起動をトリガする
のと同様な方法で、割り込みコントローラシミュレータ
が周辺デバイススレッドからの割込み要求をレベル制御
し、そして、CPUの現在の割り込みレベルを保持する
変数よりも高い割込み要求を割り込みコントローラシミ
ュレータが保持している場合に限り、割り込み起動をト
リガすることにより、機器組込み状態と同様の割り込み
シーケンスを汎用OS上で実現する。
【0024】また、機器組込みプログラムのターゲット
システムが、インテル8259割り込みコントローラ互
換の割込み制御を行っている場合、インテル8259割
り込みコントローラと同様に割り込みレベル制御を実現
する、インテル8259割り込みコントローラシミュレ
ータを、デバッグ対象の機器組込みプログラムにリンク
することで、機器組込み状態と同様な割り込みシーケン
スを汎用OS上で実現する。
【0025】また、メイン処理が割込み処理に割込まれ
た場合、または、低優先の割込み処理が高優先の割り込
み処理によって割込まれた場合に、この割り込みの発生
が、割り込み処理に割込まれたメイン処理の流れ、ある
いは、高優先の割り込み処理に割込まれた低優先の割り
込み処理の流れとは無関係に発生したならば、つまり、
周辺デバイスからの非同期的な割込み要求によって割込
みが起動したならば、前記割込まれたスレッドを強制的
にサスペンドし、割り込み処理が終了するときに、前記
割込まれたスレッドをレジュームすることによって、非
同期的な割り込み発生と非同期的な割込みからの復帰
を、機器組込み状態と同様のセマンティックスで疑似可
能とする。
【0026】また、メイン処理が割込み処理に割込まれ
た場合、または、低優先の割込み処理が、高優先の割り
込み処理によって割込まれた場合に、この割り込みの発
生が、割り込み処理に割込まれたメイン処理自身の、あ
るいは、高優先の割り込み処理に割込まれた低優先の割
り込み処理自身の命令実行(例えば、割り込み許可フラ
グのセット、割り込みレベル変更)の結果であるなら
ば、前記割込まれたスレッドは、対応する同期セマフォ
を待つことによってブロックし、そして、割り込み処理
が終了するときに、前記同期セマフォにシグナルを送る
ことによって、割込まれたスレッドの処理を再開するこ
とで、同期的な割り込み発生と同期的な割り込みからの
復帰を、機器組込み状態と同様のセマンティックスで疑
似可能とする。
【0027】また、CPUが割り込み処理を起動すると
き、割り込み処理に割込まれた状態を割り込みスタック
に保存し、そして、割り込み処理が割込みからの復帰命
令を実行したときに、割り込みスタックに保存された状
態をCPUに復元することで、多重割り込みを実現して
いるのと同様に、割り込みシミュレータにおいても、割
り込み処理を起動するとき、現在実行中のスレッドを特
定するスレッドハンドルと、それに付随する同期セマフ
ォハンドルと、割り込み発生が同期的であるか非同期的
であるかを示すフラグを、擬似的な割り込みスタックに
プッシュし、そして、割り込み処理スレッドが、割り込
みからの復帰命令を疑似する割り込みからの復帰関数を
コールするとき、擬似割り込みスタックから、スレッド
ハンドルと、同期セマフォハンドルと、割り込み発生が
同期的であったか非同期的であったかを特定するフラグ
をポップし、そして、ポップされたスレッドハンドルと
同期セマフォハンドルを、現在実行中のスレッドハンド
ルと、同同期セマフォハンドルに代入し、そしてもし、
ポップされたフラグが1であるならば、ポップされたス
レッドハンドルをレジュームし、そしてもし、ポップさ
れたフラグが0であるならば、ポップされた同期セマフ
ォハンドルにシグナルを送ることで、割り込み処理に割
込まれたスレッドの実行を再開するとともに、多重割り
込みを、機器組込み状態と同様のセマンティックスで、
疑似可能とする。
【0028】また、割り込みシミュレータが管理するグ
ローバル変数をメイン処理スレッド、各レベルの割り込
み処理スレッド、各種周辺デバイススレッドが共有する
ことになるので、ジャイアントロックセマフォを用意
し、そして、同グローバル変数へのアクセスに先立っ
て、ジャイアントロックセマフォの獲得を行うことで、
各スレッドからのグローバル変数アクセスを直列化させ
る。
【0029】また、割り込み処理が起動されることによ
って、あるいは、割り込みからの復帰によって、実行ス
レッドが切り換える際、スレッド切り換えの原因を作っ
たスレッドが獲得しているジャイアントロックセマフォ
を、スレッド切り換え先のスレッドに引き渡すことによ
り、同ジャイアントロックセマフォの保護の下で、スレ
ッド切り換えを他の処理に邪魔されることなくアトミッ
クに行うことを可能にする。
【0030】また、非同期的な割り込み起動処理におい
て、現在実行中のスレッドをサスペンドする前に、サス
ペンドする側のスレッドがジャイアントロックセマフォ
を獲得することによって、サスペンドされるスレッドが
ジャイアントロックを持っていないことを保証すること
で、デッドロック状態を回避する。
【0031】また、スレッドをサスペンド及びレジュー
ムする機能を備えない汎用OSまたはスレッドライブラ
リ(例えば、POSIXスレッドライブラリ)におい
て、サスペンドの代わりにスレッド優先度を極端に下げ
る、または、レジュームの代わりにスレッド優先度を通
常のレベルに戻すことによって、非同期的な割り込みを
疑似可能とする。
【0032】以上が、本発明の概要である。
【0033】以下、本発明に係る一実施形態について、
図面を参照して詳細に説明する。 <第1実施形態> [1.1. システム構成]図1は、本実施形態におけ
る、割り込みシミュレータを用いた組込み系ソフトウェ
アのデバッグ環境を示す。全ての構成要素は、汎用PC
用の汎用OS(Windows等)上で動作するもので
あり、組込み系ソフトウェアのデバッグのために、特別
なハードウェアを用意する必要はない。
【0034】同図において、110は、デバッグ対象の
メイン処理プログラムが実行するコンテキストを提供す
る、メイン処理スレッドである。本実施形態において
は、割り込み処理を含むシングルタスクプログラムのデ
バッグ方法についてのみ説明するが、割り込みシミュレ
ータ上にリアルタイムOSのシミュレータを構築するこ
とで、マルチタスクプログラムのデバッグ手段に容易に
拡張することができる。
【0035】120,121,122は、割り込みハン
ドラが実行するコンテキストを提供する、割り込み処理
スレッドであり、割り込みレベル毎に異なるスレッドを
用意する。同図においては、3つの割り込み処理スレッ
ド(#0,#1,#2)が存在する場合を例として示し
ているが、割り込みシミュレータは、割り込みレベルの
個数に制約を設けるものではない。
【0036】130は、本発明の特徴である、割り込み
シミュレータであり、CPUの割り込み起動と、割り込
みからの復帰、及び割り込みコントローラ(CPUに内
蔵、あるいはインテル8259割り込みコントローラチ
ップのようにCPU外部に備えられるもの)の動作をシ
ミュレーションすることによって、組込み系ソフトウェ
アが実際に動作するハードウェア環境と同様の割り込み
処理環境を提供する。
【0037】140,141,142は周辺デバイスス
レッドであり、組込み系ソフトウェアが対象とするター
ゲットシステムに存在する、周辺デバイス(ペリフェラ
ルI/O、シリアルI/O、各種タイマ、A/Dコンバ
ータ、D/Aコンバータ、アウトプットコンペア、イン
プットキャプチャ、等)の動作を疑似する周辺デバイス
シミュレータの実行コンテキストを提供する。
【0038】周辺デバイスシミュレータは、デバッグ対
象のソフトウェア(メイン処理、割り込み処理を含む)
とは独立したスレッド上で動作し、ハードウェアの並行
処理を汎用OS上で実現する。
【0039】150は、メイン処理スレッド110が割
り込みコントローラ(割り込みシミュレータ300に含
まれる)に対して発行する、割込みの許可及び禁止、割
り込みレベルの変更などの割込み制御信号を示す。
【0040】160,161,162は、メイン処理ス
レッド100が周辺デバイススレッド140,141,
142に対して発行する、デバイス制御信号を示す。
尚、割り込みハンドラもデバイスを制御することができ
るが、図1では省略する。
【0041】170は、周辺デバイス140,141,
142が割り込みコントローラに対して発行する、割り
込みを要求信号を示す。
【0042】割り込みシミュレータ130は、デバイス
からの割込み要求をレベル制御し、割り込みを起動する
条件が整ったときに、割り込み処理スレッドに割り込み
起動シグナル180を送ることで、割り込みハンドラを
起動させる。
【0043】逆に、割り込みハンドラの実行が終了した
割り込み処理スレッド120,121,122は、割り
込みシミュレータ300に対して、割り込みからの復帰
処理要求信号190,191,192を発行する。
【0044】割り込みシミュレータ130は、割り込み
からの復帰処理において再度割り込みレベル制御を行
い、必要であれば、保留されていた割込み要求を受理す
る。 [1.2. CPUと割り込みコントローラによる割り
込み処理概要]割り込みシミュレータ130についての
詳細な説明に先立って、そのモデルとして、CPUによ
る割り込み処理について予め説明する。
【0045】CPUが割り込み処理を行う場合、以下の
3つが重要な役割を果たす。
【0046】 割り込みコントローラと称される回路 CPUによる割り込み起動シーケンス 割り込みハンドラの最後に実行される、割り込みか
らの復帰命令 [1.2.1. 割り込みコントローラ]図2は、割り
込みコントローラの構成を示す図である。同図におい
て、270,271,272は周辺デバイスであり、例
えば、信号変化検出回路、アウトプットコンペア、イン
プットキャプチャ、A/Dコンバータ、各種タイマ、D
MAコントローラ等である。
【0047】周辺デバイスは、デバイス内に興味のある
イベントが発生した際に、その旨をソフトウェアに通知
するための割込み要因フラグを保持するフリップフロッ
プ(F/F)250,251,252をセットする。以
下、これらF/Fに保持された割り込み要因フラグその
ものを、250,251,252の番号で参照するとす
る。
【0048】ソフトウェアは逆に、割り込み要因フラグ
250,251,252をクリアすることができる。特
に割り込みハンドラは、割り込み処理から復帰する前に
該当する割り込み要因フラグをクリアせねばならない。
これにより、割り込み処理が無限に繰り返されることが
回避される。
【0049】260,261,262は、割り込み許可
フラグを保持するフリップフロップ(F/F)であり、
ソフトウェアがこのフラグをセット/クリアすることに
よって、周辺デバイスが要求する割り込みを、割り込み
要因発生毎に許可あるいは保留することができる。以
下、これらF/Fに保持された割り込み許可フラグその
ものを、260,261,262の番号で参照するとす
る。
【0050】240,241,242はAND回路であ
り、割り込み要因フラグ250,251,252と、割
り込み許可フラグ260,261,262の論理積をと
る。この出力信号(以下、割込み要求信号)282,2
83,284がハイ(H)レベルであれば即ち、デバイ
ス内部に興味あるイベントが発生しており(割り込み要
因フラグがセットされている)、且つ、ソフトウェアが
それを受信する用意がある(割り込み許可フラグがセッ
トされている)ことを示す。
【0051】230はプライオリティエンコーダであ
り、アサート状態にある(Hレベルの)割り込み要求信
号282,283,284の中で最大のレベル値を、割
込み要求レベル281として出力する。これは、周辺デ
バイス全体における割込み要求レベルを示すものであ
る。例えば、割込み要求信号irq#1(282)、irq#2
(283)、irq#3(284)のレベル値がそれぞれ
1,2,3であり、割り込み要求信号irq#1(282)
とirq#3(284)がアサートされた状態では、プライ
オリティエンコーダ230から出力される割り込み要求
レベル281は、3となる。
【0052】各割り込み要因にレベル値を割り当てる方
法の一例として、単純なものでは、割込み要求信号28
2,283,284がプライオリティエンコーダ230
に結線された順に、レベル値を定める方法がある。この
場合には、出力された割込み要求レベル281により、
処理すべき割り込み要因を一意に特定することができ
る。
【0053】あるいは、より複雑なものとしては、プラ
イオリティエンコーダ230内に、割込み要求線毎にレ
ベル値を保持する割り込みレベルレジスタを備える方法
がある。この方法においては、出力された割込み要求レ
ベル281からは起動すべき割り込み要因を特定できな
いため、通常、CPUが割り込み起動処理の一環とし
て、割り込みコントローラに処理すべき割り込み番号を
尋ねる。具体的には、CPUが割り込み肯定応答サイク
ルと呼ばれるリードサイクルを発行する。すると割り込
みコントローラは、割り込み肯定応答サイクルに応答し
て、処理すべき割込みの番号288をCPUに渡す。
【0054】220はCPUの現在の割り込みレベルで
あり、CPUは、このレベル以下の割込み要求を受理し
ないが、このレベルより大きい割込み要求は直ちに受理
し、即ち、割り込み処理が起動される。この割り込みレ
ベル220はCPUによって変更されうるが、ソフトウ
ェアの命令によっても変更可能である。
【0055】210は割り込みレベル220と割込み要
求レベル281を比較するコンパレータであり、割込み
要求レベル281が割り込みレベル220を上回った場
合に、割り込み起動信号280としてHレベルを出力す
る。
【0056】CPUは、命令の実行毎にこの割り込み起
動信号280をサンプリングし、Hレベルを検出すると
割り込み処理を起動する。
【0057】図2においては、3つの周辺デバイス(2
70,271,272)が割込み要求を行う例を示した
が、このデバイスの数は実際のシステム毎に様々であ
り、また、周辺デバイスが発生する割込み要求をCPU
の割り込みレベルに対応づける方法も、ハードワイヤさ
れる場合と、ソフトウェアによって割り込みレベルレジ
スタを設定する場合がある。
【0058】割り込み起動信号280がLレベルからH
レベルに変化(割り込み起動)する状況としては、以下
の3つの場合がある。
【0059】 割り込み許可フラグ260,261,
262がセットされている状態で、割り込み要因フラグ
250,251,252が周辺デバイス270,27
1,272によってセットされる。
【0060】 割り込み要因フラグ250,251,
252がセットされている状態で、割り込み許可フラグ
260,261,262がソフトウェアの処理によって
セットされる。
【0061】 割込み要求レベル281が正の値を持
つ状態で、ソフトウェアあるいはCPUによって、割り
込みレベル220がそれより低い値に設定される。
【0062】これら3つの場合に対応した割り込みシー
ケンスを図5、図6、図7に示し、後述する。 [1.2.2. CPUによる割り込み起動シーケン
ス]図3は、CPUが割込みを起動する場合の処理概要
を示す図である。同図において、310は次に実行され
る命令のアドレスを指すプログラムカウンタレジスタで
あり、320はCPUの現在の割り込みレベルを保持す
るレジスタ(図2に示す220に同じ)であり、330
は、割り込み処理のネスティングを管理する(RAM上
に構成される)割り込みスタックである。尚、CPUは
割り込みスタックポインタレジスタによって割り込みス
タックの状態を管理するが、ここでは詳細な説明を省略
する。
【0063】CPUが割り込み処理を起動する際、まず
ステップS301において、割り込みレベル320を割
り込みスタック330にプッシュする。より具体的に
は、割り込みレベル320を含むプログラムステータス
ワードレジスタを割り込みスタック330にプッシュす
るが、本実施形態では割り込みレベルのみについて説明
する。
【0064】そしてステップS302において、プログ
ラムカウンタ310を割り込みスタック330にプッシ
ュすることによって、割り込みが起動される直前のCP
Uの状態を割り込みスタック330上に待避する。尚、
割り込みスタック300上に待避された情報である復帰
割り込みレベル331及びリターンアドレス332は、
後述する図4に示すように、割り込みハンドラからリタ
ーンする際にCPU状態としてリストアされる。
【0065】そしてステップS303において、割込み
要求レベル(図2の281)を割り込みレベル320に
コピーし、CPUの割り込みレベルを割込み要求レベル
まで上昇させる。
【0066】そしてステップS304において、割り込
みハンドラのアドレスをプログラムカウンタ310に設
定し、次の命令実行フローを割り込みハンドラに切り換
える。ここで、割り込みレベルが割り込み要求線にハー
ドワイヤされていれば、割り込みレベルから割り込みハ
ンドラアドレスを特定することができる(オートベクタ
方式)。また、割り込みコントローラが割り込み要因毎
に割り込みレベルレジスタを保持する場合には、CPU
は割り込み応答サイクルを起動して、割り込みコントロ
ーラから起動すべき割込みの番号(図2の288)を取
得し、対応する割り込みハンドラのアドレスを得る。 [1.2.3. CPUによる割り込みからの復帰シー
ケンス]図4は、割り込みハンドラがリターンする際の
処理概要を示す図である。但し、同図において上述した
図3と同様の構成には同一番号(310,320,33
0,331,332)を付す。
【0067】割り込みハンドラが割り込みからの復帰命
令(reti命令;CPU命令の一つ)を実行した際、CP
UはまずステップS401において、割り込みスタック
330からリターンアドレス332(割り込み起動時に
次に実行すべきであった命令アドレス)をポップし、プ
ログラムカウンタ310に設定する。これにより、割り
込みからの復帰命令(reti)の次には、割込まれた処理フ
ローが再開されることになる。
【0068】そしてステップS402において、割り込
みスタック330から復帰割り込みレベル331(割り
込み起動時の割り込みレベル)をポップし、割り込みレ
ベル320に設定(復元)する。
【0069】ここで注意すべきは、割り込みからの復帰
命令(reti)自体もCPU命令の一つであり、CPUは、
この命令の実行後にも割り込み起動信号(図2の28
0)をサンプリングすることである。
【0070】割り込みからの復帰命令のステップS40
2は、割り込みレベル320を低下させるため、これに
より割り込み起動信号がアサートされる場合がある。こ
の場合のシーケンスについては図9に示し、後述する。 [1.2.4. 割り込みシーケンス例]図5、図6、
図7、図8、図9は、割り込みの起動と復帰の全てのパ
ターンを網羅した、代表的な割り込みシーケンスを示す
図である。以下、シーケンス毎に説明する。 [1.2.4.1. 周辺デバイスからの割込み要求に
よる割り込みシーケンス]図5は、周辺デバイス♯1
(図2の270)からの割り込み要求によって非同期的
に割り込みが発生する、最も一般的な割り込みシーケン
スを示す図である。但し、周辺デバイス♯1に割り当て
られた割り込みレベル値は1とする。
【0071】同図において、510はCPUで実行され
るメイン処理のシーケンスを示し、511はレベル1の
割り込み処理のシーケンスを示し、530は、周辺デバ
イス#1の処理シーケンスを示す。
【0072】520は割り込みコントローラから出力さ
れる割り込み起動信号(図2の280)、521はCP
Uの現在の割り込みレベル(図2の220、図3の32
0)、522は周辺デバイスを総合した割込み要求レベ
ル(図2の281)、523は割り込み許可フリップフ
ロップ#1(図2の260)の状態、524は割り込み
要因フリップフロップ#1(図2の250)の状態、を
示す。
【0073】まずメイン処理510においては、割り込
みを受信する準備として、ステップS501で割り込み
許可フラグ#1(523)をセットする。これにより、
以降、周辺デバイス#1(530)が割り込みを要求し
た際に該割り込みを受け付け可能となる。
【0074】その後、周辺デバイス♯1(530)はス
テップS502において、デバイス内部に興味あるイベ
ントが発生したことをCPUに通知するために、割り込
み要因フラグ#1(524)をセットする。これによ
り、割込み要求信号#1(図2の282)がLレベルか
らHレベルに変化し、プライオリティエンコーダ(図2
の230)は、割込み要求レベル522(図2の28
1)の値を0から1に変化させる(ステップS50
3)。
【0075】そしてこれにより、割込み要求レベル(値
は1)が、割り込みレベル521(図2の220、値は
0)より大となるので、割り込みレベルコンパレータ
(図2の210)は、割り込み起動信号520(図2の
280)をアサートする(ステップS504)。
【0076】そしてこれにより、CPUによって上述し
た割り込み起動処理(図3)が開始され、割り込みレベ
ル521(図2の220、値は0)とプログラムカウン
タ(メイン処理の割込まれた位置を指す)の値を割り込
みスタックにプッシュする(図3のS301,S30
2)。
【0077】更にCPUは、割込み要求レベル(値は
1)を割り込みレベルにコピーする(S505,図3の
S303)。これにより、割込み要求レベルと割り込み
レベルの値が等しくなるので、割り込み起動信号はネゲ
ートされる。
【0078】そしてさらに、レベル1の割り込みハンド
ラのアドレスをプログラムカウンタに設定し(S50
6,図3のS304)、CPUの命令実行フローを割り
込みハンドラ511に切り換える。
【0079】その後、レベル1の割り込みハンドラ51
1は、必要な割り込み処理を実行した後、割り込み要因
を取り除くため、割り込み要因フラグ♯1(524)を
クリアする(ステップS507)。
【0080】そしてこれにより、割込み要求信号♯1
(図2の282)がHレベルからLレベルに変化し、割
込み要求レベルの値が1から0に変化する(S50
8)。この時点で、割り込み要求レベル(値は0)は、
割込みレベル(値は1)より小さいため、割り込み起動
信号はネゲートされたままである。
【0081】その後、レベル1の割り込みハンドラは、
割り込みからの復帰命令(reti)を実行する(S50
9)。割り込みからの復帰命令は、割り込みスタックか
らリターンアドレスと復帰割り込みレベルをポップし、
それぞれ、プログラムカウンタと割り込みレベルに設定
する(図4のS401,S402)。この結果、割り込
みレベルは割り込みが起動した時点の値である0に復元
される(S509)。この時点で、割り込みレベル(値
は0)と割込み要求レベル(値は0)が等しいので、割
り込み起動信号はネゲートされたままである割り込みか
らの復帰命令の終了後、次に実行する命令は、割り込み
スタックからポップされたリターンアドレスが指す命
令、つまり、割込まれたメイン処理内の命令である(S
510)。 [1.2.4.2. ソフトウェアによる割り込み許可
フラグセットによる割り込みシーケンス]図6は、周辺
デバイス#1(図2の270)からの割り込み要求が保
留された状態で、ソフトウェアによって割り込み許可フ
ラグ#1(図2の260)がセットされたために、割り
込みが発生するシーケンスを示す図である。同図におい
て、上述した図5と同様の信号については同一番号(5
10,511,520,521,522,523,52
4,530)を付す。また、周辺デバイス♯1に割り当
てられた割り込みレベルは1とする。
【0082】まず周辺デバイス#1は、割り込み要因フ
ラグ♯1(524,図2の250)をセットすること
で、デバイス内部にイベントが発生したことをソフトウ
ェアに通知する(S601)。但しこの時点では、割り
込み許可フラグ♯1(523)はクリアされているの
で、割込み要求信号♯1(図2の282)はネゲートさ
れたままであり、割込み要求レベル(522,図2の2
81)は変化しない。
【0083】その後、メイン処理510は、割り込みを
受信する準備ができたので、割り込み許可フラグ♯1
(523)をセットする(S602)。これにより、割
込み要求信号#1(図2の282)がLレベルからHレ
ベルに変化し、プライオリティエンコーダ(図2の23
0)は、割込み要求レベル522(図2の281)の値
を0から1に変化させる(S603)。
【0084】そしてこれにより、割り込みレベルコンパ
レータ(図2の210)は、割込み要求レベル522
(図2の281、値は1)が割り込みレベル521(図
2の220、値は0)より大となるので、割り込み起動
信号520(図2の280)をアサートする(S60
4)。
【0085】これにより、CPUは割り込み起動処理
(図3)を開始する。これ以降のシーケンスは、上述し
た図5と同様である。 [1.2.4.3. ソフトウェアによる割り込みレベ
ル変更による割り込みシーケンス]図7は、メイン処理
が割り込みレベルを一定時間上げておくことで周辺デバ
イス#1(図2の270)からの割り込み要求を保留さ
せ、その期間中に周辺デバイス#1が割り込みを要求
し、その後メイン処理が割り込みレベルを元に戻したこ
とにより、割り込みが発生するシーケンスを示す。同図
において、上述した図5と同様の信号には同一番号(5
10,511,520,521,522,523,52
4,530)を付す。また、周辺デバイス#1に割り当
てられた割り込みレベルは1とする。
【0086】まずメイン処理510は、割り込みを受信
する準備ができたので、割り込み許可フラグ#1(52
3,図2の260)をセットする(S701)。
【0087】その後メイン処理510は、割り込みレベ
ル521(図2の220)を1に設定し(S702)、
レベル1以下の割り込みは保留させる。
【0088】周辺デバイス#1(530,図2の27
0)は、割り込み要因フラグ♯1(524,図2の25
0)をセットすることで、デバイス内部にイベントが発
生したことをソフトウェアに通知する(S703)。
【0089】これにより、割込み要求信号♯1(図2の
282)がLレベルからHレベルに変化し、プライオリ
ティエンコーダ(図2の230)は割込み要求レベル
(522,図2の281)の値を0から1に変化させる
(S704)。しかしこの時点では、割込み要求レベル
522と割り込みレベル521の値がいずれも1であり
等しいため、割り込み起動信号(520,図2の28
0)はネゲート状態のままである。これが即ち、割り込
みレベルの操作による割り込み保留のメカニズムであ
る。
【0090】その後メイン処理510は、割り込みを受
け付ける準備ができると割り込みレベルを0に戻す(S
705)。これにより、割込み要求レベル522(値は
1)が割り込みレベル521(値は0)より大きくなる
ので、割り込み起動信号520がアサートされ(S70
6)、割り込み起動処理が発生する。これ以降のシーケ
ンスは、上述した図5のS504、又は図6のS604
以降のシーケンスと同様である。 [1.2.4.4. 低優先→高優先割込み要求による
多重割り込みシーケンス]図8は、周辺デバイス#1
(図2の270)からの割り込み処理中に、周辺デバイ
ス♯2(図2の271)からの割込み要求が受け付けら
れた、多重割込みのシーケンスを示す図である。同図に
おいて、上述した図5と同様の信号には同一番号(51
0,511,520,521,522,523,52
4,530)を付す。但し、周辺デバイス#1に割り付
けられた割り込みレベルは1であり、周辺デバイス♯2
に割り付けられた割り込みレベルは3であるとする。
【0091】同図において、512はレベル3の割り込
みハンドラ(周辺デバイス♯2の割り込みを処理する)
の処理シーケンスを示し、531は、周辺デバイス♯2
の処理シーケンスを示す。また、525は割りみ許可フ
リップフロップ#2(図2の261)の状態を示し、5
26は割り込み要因フリップフロップ#2(図2の25
1)の状態を示す。
【0092】図8において、まずメイン処理510は割
り込みを受信する準備として、S801で割り込み許可
フラグ#1(523)をセットし、S802で割り込み
許可フラグ#2(525)をセットする。これにより、
以降、周辺デバイス♯1(530)、周辺デバイス#2
(531)からの割込み要求が受理可能となる。
【0093】その後、周辺デバイス#1(530)は、
割り込み要因フラグ♯1(524)をセットすること
で、デバイス内部にイベントが発生したことをソフトウ
ェアに通知する(S803)。これにより、割込み要求
信号#1(図2の282)がLレベルからHレベルに変
化し、プライオリティエンコーダ(図2の230)は、
割込み要求レベル(522)の値を0から1に変化させ
る(S804)。
【0094】これにより、割り込みレベルコンパレータ
(図2の210)は、割込み要求レベル522(値は
1)が割り込みレベル521(値は0)より大となるの
で、割り込み起動信号520をアサートする(S80
5)。これにより、割り込み起動処理(図3)が発生
し、割り込みレベル521(値は0)とプログラムカウ
ンタ(メイン処理の割込まれた位置を指す)の値を割り
込みスタックにプッシュする(図3のS301,S30
2)。
【0095】そしてさらに、割込み要求レベル522の
値(1)を割り込みレベル521にコピーする(S80
6,図3のS303)。これにより、割込み要求レベル
522と割り込みレベル521の値がいずれも1で等し
くなるため、割り込み起動信号520はネゲートされ
る。
【0096】そしてさらに、レベル1の割り込みハンド
ラ511のアドレスをプログラムカウンタに設定し(図
3のS304)、CPUの命令実行フローをレベル1の
割り込みハンドラに切り換える(S807)。
【0097】その後、レベル1の割り込みハンドラ51
1の実行中に、周辺デバイス♯2(531,図2の27
1)は、デバイス内部にイベントが発生したことをソフ
トウェアに通知する(S808)。これにより、割込み
要求信号#2(図2の283)がLレベルからHレベル
に変化し、プライオリティエンコーダ(図2の230)
は、割込み要求レベルの値を1から3に変化させる(S
809)。尚、プライオリティエンコーダは、割込み要
求レベル1と3のうち、大きいほうの値を出力する。
【0098】そしてこれにより、割込み要求レベル52
2(値は3)が割り込みレベル521(値は1)より大
となるので、割り込みレベルコンパレータ(図2の21
0)は、割り込み起動信号520をアサートする(S8
10)。これにより、CPUは割り込み起動処理(図
3)を開始し、割り込みレベル(値は1)とプログラム
カウンタ(レベル1の割り込み処理の割込まれた位置を
指す)を割り込みスタックにプッシュする(図3のS3
01,S302)。
【0099】これにより、割り込みスタックのフレーム
は2つとなる。
【0100】さらにCPUは、割込み要求レベル522
の値(3)を割り込みレベル521にコピーする(S8
11、図3のS303)。これにより、割込み要求レベ
ル522と割り込みレベル521の値はいずれも3で等
しくなるため、割り込み起動信号520はネゲートされ
る。
【0101】そして、レベル3の割り込みハンドラ51
2のアドレスをプログラムカウンタに設定し(S81
2,図3のS304)、CPUの命令実行フローをレベ
ル3の割り込みハンドラ512に切り換える。
【0102】その後、レベル3の割り込みハンドラ51
2は、必要な割り込み処理を行った後、割り込み要因を
取り除くため、割り込み要因フラグ#2(525,図2
の251)をクリアする(S813)。これにより、割
込み要求信号♯2(図2の282)がHレベルからLレ
ベルに変化し、割込み要求レベル522の値が3から1
に変化する(S814)。この時点で、割込み要求信号
#1(図2の282)はまだアサートされている。但
し、割り込み要求レベル522(値は1)は、割込みレ
ベル521(値は3)より小さいので、割り込み起動信
号520はネゲートされたままである。
【0103】その後、レベル3の割り込みハンドラ51
2は、割り込みからの復帰命令(reti)を実行する。割り
込みからの復帰命令は、割り込みスタックからリターン
アドレスと復帰割り込みレベルをポップし、それぞれ、
プログラムカウンタと割り込みレベルに設定する(図4
のS401,S402)。この結果、割り込みレベル5
21は、レベル3の割り込みが起動する直前の値である
1に復元する(S815)。
【0104】この時点で、割り込みレベル521と割込
み要求レベル522の値がいずれも1であり等しいた
め、割り込み起動信号520はネゲートされたままであ
る。また、割り込みスタックのフレーム数は、2から1
に変化する(メイン処理のコンテキストのみが保存され
ている状態)。
【0105】割り込みからの復帰命令の終了後、次に実
行する命令は、割り込みスタックからポップされたリタ
ーンアドレスが指す命令、つまり、レベル3の割り込み
に割込まれた、レベル1の割り込み処理内の命令である
(S816)。
【0106】その後、レベル1の割り込みハンドラ51
1は、必要な割り込み処理を行った後、割り込み要因を
取り除くため、割り込み要因フラグ♯1(824)をク
リアする(S817)。これにより、割込み要求信号#
1(図2の282)がHレベルからLレベルに変化し、
割込み要求レベル522の値が1から0に変化する(S
818)。これにより、全ての割込み要求信号はネゲー
トされたことになる。尚、この時点で割り込み要求レベ
ル522の値(0)は、割込みレベル521(値1)よ
りも小さいため、割り込み起動信号520はネゲートさ
れたままである。
【0107】その後、レベル1の割り込みハンドラ51
1は、割り込みからの復帰命令(reti)を実行する。割り
込みからの復帰命令は、割り込みスタックからリターン
アドレスと復帰割り込みレベルをポップし、それぞれ、
プログラムカウンタと割り込みレベルに設定する(図4
のS401,S402)。この結果、割り込みレベル5
21は、レベル1の割り込みが起動する直前の値である
0に復元する(S819)。
【0108】この時点で、割り込みレベル521と割込
み要求レベル522の値がいずれも0で等しいため、割
り込み起動信号520はネゲートされたままである。
【0109】また、割り込みスタックのフレーム数は、
1から0に変化する割り込みからの復帰命令の終了後、
次に実行する命令は、割り込みスタックからポップされ
たリターンアドレスが指す命令、つまり、レベル1の割
り込み511に割込まれたメイン処理510内の命令で
ある(S820)。 [1.2.4.5. 高優先→低優先割込みよるシーケ
ンシャルな割り込みシーケンス]図9は、周辺デバイス
♯2(図2の271)からの割り込み処理中に、周辺デ
バイス♯1(図2の270)からの割込み要求があった
が、周辺デバイス#1の割り込みレベルが周辺デバイス
#2の割り込みレベル以下であるため、周辺デバイス#
2の割り込みハンドラが終了するまで、周辺デバイス#
1が要求した割り込みが保留されるシーケンスを示す図
である。同図において、上述した図8と同様の信号には
同一番号(510,511,512,520,521,
522,523,524,525,526,530,5
31)を付す。但し、周辺デバイス#1に割り付けられ
た割り込みレベルは1であり、周辺デバイス♯2に割り
付けられた割り込みレベルは3であるとする。
【0110】まず、メイン処理510は、割り込みを受
信する準備として、割り込み許可フラグ#1(523)
をセットし(S901)、次いで割り込み許可フラグ♯
2(525)をセットする(S902)。これにより、
以降、周辺デバイス♯1及び周辺デバイス♯2からの割
込み要求が受理可能となる。
【0111】その後、周辺デバイス#2(531)は、
割り込み要因フラグ#2(526)をセットすること
で、デバイス内部にイベントが発生したことをソフトウ
ェアに通知する(S903)。これにより、割込み要求
信号#2(図2の283)がLレベルからHレベルに変
化し、プライオリティエンコーダ(図2の230)は、
割込み要求レベルの値を0から3に変化させる(S90
4)。
【0112】これにより、割込み要求レベル522の値
(3)が割り込みレベル521(値は0)より大となる
ので、割り込みレベルコンパレータ(図2の210)
は、割り込み起動信号520をアサートする(S90
5)これにより、CPUは割り込み起動処理(図3)を
開始し、割り込みレベル(値は0)とプログラムカウン
タ(メイン処理の割込まれた位置を指す)を割り込みス
タックにプッシュする(図3のS301,S302)。
【0113】さらにCPUは、割込み要求レベル522
の値(3)を割り込みレベル521にコピーする(S9
06,図3のS303)。これにより、割込み要求レベ
ル522と割り込みレベル521の値がいずれも3で等
しくなるため、割り込み起動信号520はネゲートされ
る。
【0114】そしてさらにCPUは、レベル3の割り込
みハンドラ512のアドレスをプログラムカウンタに設
定し(図3のS304)、CPUの命令実行フローをレ
ベル3の割り込みハンドラ512に切り換える(S90
7)。
【0115】その後、レベル3の割り込みハンドラ51
2の実行中に、周辺デバイス♯1(530)は、割り込
み要因フラグ♯1(524)をセットすることで、デバ
イス内部にイベントが発生したことをソフトウェアに通
知する(S908)。これにより、割込み要求信号#1
(図2の282)がLレベルからHレベルに変化する
が、プライオリティエンコーダ(図2の230)は、割
込み要求レベル522の出力レベルを変化させない。
尚、プライオリティエンコーダは、割込み要求レベル1
と3のうち、大きいほうの値を出力する。
【0116】その後、レベル3の割り込みハンドラ51
2は、割り込み要因を取り除くため、割り込み要因フラ
グ#2(525)をクリアする(S909)。これによ
り、割込み要求信号#2(図2の283)がHレベルか
らLレベルに変化し、割込み要求レベルの値が3から1
に変化する(S910)。この時点で、割込み要求信号
#1(図2の282)がアサートされているが、割り込
み要求レベル522の値(1)は、割り込みレベル52
1の値(3)よりも小さいため、割り込み起動信号52
0はネゲートされたままである。
【0117】その後、レベル3の割り込みハンドラ51
2は、割り込みからの復帰命令(reti)を実行する。割り
込みからの復帰命令は、割り込みスタックからリターン
アドレスと復帰割り込みレベルをポップし、それぞれ、
プログラムカウンタと割り込みレベルに設定する(図4
のS401,S402)。この結果、割り込みレベル5
21は、レベル3の割り込みが起動する直前の値である
0に復元する(S911)。これにより、割り込み要求
レベル522の値(1)が割込みレベルの値(0)より
大となるので、割り込み起動信号520がアサートされ
る(S912)。
【0118】割り込みからの復帰命令の終了時、CPU
は割り込み起動信号520をサンプリングし、この信号
がアサートされているため、割り込み起動処理(図3)
を開始する。割り込み起動処理(図3)においては、割
り込みレベル521(値は0)とプログラムカウンタ
(メイン処理の割込まれた位置を指す)を再び割り込み
スタックにプッシュする(図3のS301,S30
2)。
【0119】そしてさらにCPUは、割込み要求レベル
522の値(1)を割り込みレベル521にコピーする
(S913,図3のS303)。これにより、割込み要
求レベル522と割り込みレベル521の値がいずれも
1で等しくなるため、割り込み起動信号520はネゲー
トされる。
【0120】そしてさらに、レベル1の割り込みハンド
ラ511のアドレスをプログラムカウンタに設定し(図
3のS304)、CPUの命令実行フローをレベル1の
割り込みハンドラ511に切り換える(S914)。
【0121】この後、レベル1の割り込みハンドラ51
1は、必要な割り込み処理を実行した後、割り込み要因
フラグ#1(526)をクリアし(S915)、割り込
みからの復帰命令を実行する(S917、S918)。
このシーケンスについては、上述した処理と同様であ
る。 [1.3. 割り込みコントローラのシミュレータ]図
10は、図2に示した割り込みコントローラの動作をソ
フトウェアによってシミュレートする、割り込みコント
ローラシミュレータの構成を示す図である。尚、同図に
おいて、図2に示した構成に対応する処理については、
図2に示した構成要素の番号を下3桁とした、1000
番台の番号を付す。
【0122】図10において、1270,1271,1
272は、信号変化検出回路、各種タイマ、アウトプッ
トコンペア、インプットキャプチャ、A/Dコンバー
タ、DMAコントローラ等の周辺デバイスの動作を疑似
する周辺デバイススレッドであり、デバッグ対象のソフ
トウェアとは別のスレッド上で動作する。周辺デバイス
スレッドは、興味のあるイベントが発生した際に、その
旨をソフトウェアに通知するために、割り込み要因フラ
グ変数1250,1251,1252をセットする。
【0123】逆に、メイン処理、割り込みハンドラなど
のデバッグ対象のソフトウェア処理は、クリア信号12
91,1292,1293によって、割り込み要因フラ
グ1250,1251,1252をクリアすることがで
きる。特に、割り込みハンドラは、割り込みからの復帰
命令を実行する前に、対応する割り込み要因フラグをク
リアしなければならない。こうすることにより、割り込
み処理が無限に繰り返されてしまうことが回避される。
【0124】1260,1261,1262は、割り込
み許可フラグの状態を保持する変数であり、ソフトウェ
アがこのフラグをセット/クリア信号1294、129
5,1296によってセット/クリアすることにより、
割り込みを要因毎に許可あるいは、保留することができ
る。
【0125】1240,1241,1242は、割り込
み要因フラグ1250,1251,1252と、割り込
み許可フラグ1260,1261,1262のブール積
(AND)を計算する処理を示す。
【0126】ソフトウェアによる処理は、ハードウェア
の場合とは異なり、時間的に連続して入力信号を監視
し、即座にそれに応答するような処理は実現できない。
従って、入力(この場合、割り込み要因フラグまたは割
り込み許可フラグ)が変化したときだけ必要な計算を実
行し、その結果を割り込み要求状態として変数128
2,1283,1284に保存する。
【0127】1230は、図2に示すプライオリティエ
ンコーダ230と同様の演算を行う処理であり、アサー
ト状態にある(ハイレベルの)割り込み要求状態128
2,1283,1284の中で、最大のレベル値とそれ
に該当する割り込み番号を計算し、それぞれを割込み要
求レベル変数1281と割り込み番号変数1288に格
納する。
【0128】1210は割り込みレベル変数1220と
割込み要求レベル変数1281を比較する、図2に示す
コンパレータ210と同様の演算を行う処理であり、割
込み要求レベル1281が割り込みレベル1220を上
回った場合に、割り込み起動処理1280を実行する。
この計算処理もまた、入力である割り込みレベル122
0及び割込み要求レベル1281のいずれかが変化する
ときのみ、行う。
【0129】1200は、割り込みコントローラシミュ
レータの状態を管理する変数(1250,1251,1
252,1260,1261,1262,1282,1
283,1284,1220,1281,1288)の
排他アクセス権を保証する、ジャイアントロックセマフ
ォである。
【0130】周辺デバイススレッド1270,127
1,1272及び、メイン処理、割り込み処理などのソ
フトウェア処理は、割り込みコントローラシミュレータ
を操作する際、このジャイアントロックセマフォ120
0を獲得しなければならない。
【0131】割り込みコントローラシミュレータへの操
作をまとめると、以下のようになる。
【0132】 ソフトウェアが割り込み要因フラグを
クリアする(1291,1292,1293)。
【0133】 ソフトウェアが割り込み許可フラグを
セットする(1294,1295,1296)。
【0134】 ソフトウェアが割り込み許可フラグを
クリアする(1294,1295,1296)。
【0135】 ソフトウェアが割り込みレベルを変更
する(1290)。
【0136】 周辺デバイススレッドが割り込み要因
フラグをセットする(1285、1286,128
7)。
【0137】上記各操作に対する処理シーケンスを、図
11、図12、図13、図14、図15に示し、以下に
説明する。尚、これらの操作のうち、割り込みが起動さ
れる可能性があるのは、、、である。 [1.3.1. 割り込み要因フラグクリア操作]図1
1は、割り込みハンドラなどのソフトウェア処理が、割
り込み要因フラグ(図10の1250,1251,12
52)をクリアしたときの割り込みコントローラシミュ
レータの処理手順を示す。但し同関数は、割り込み要因
フラグを特定するために、引数として割り込み番号をと
る。
【0138】割り込み要因フラグクリア関数は、まずス
テップS1101でジャイアントロックセマフォ120
0を獲得する。これにより、以下の処理は、他のスレッ
ドから邪魔されることなく、割り込みコントローラシミ
ュレータが管理する情報を操作することが可能となる。
【0139】そしてステップS1102で、割り込み要
因フラグ(図10の1250,1251,1252)が
既にクリアされているかどうかを調べ、もしクリアされ
ていたならば、それ以上の処理は必要ないので、S11
07に進んで、ジャイアントロックセマフォ1200を
開放し、リターンする。一方、割り込み要因フラグがO
N状態であったならば、ステップS1103で、引数で
指定された割り込み番号の割り込み要因フラグをクリア
する。
【0140】そしてステップS1104で、割込み要求
状態(図10の1282,1283,1284)を更新
すべきか否かを調査するために、該当する割り込み許可
フラグ(図10の1260,1261,1262)をテ
ストする。そして割り込み許可フラグがOFFであるな
らば、割込み要求状態の値に変化は生じないため、ステ
ップS1107に進んでジャイアントロックセマフォ1
200を開放し、リターンする。一方、割り込み許可フ
ラグがONであるならば、割込み要求状態の値が変化す
るので、ステップS1105で割込み要求状態をクリア
し、ステップS1106で割込み要求レベル計算関数を
コールして、割込み要求レベル(図10の1281)
と、該当する割り込み番号(図10の1288)を再計
算する(但し、割込み要求レベルが0の時、割り込み番
号は不定の値となる)。
【0141】そしてステップS1107でジャイアント
ロックセマフォ1200を開放し、リターンする。
【0142】尚、割り込み要因フラグのクリア関数で
は、新たな割り込みが起動されることはない。[1.
3.2. 割り込み許可フラグセット操作]図12は、
メイン処理などのソフトウェアが、割り込み許可フラグ
(図10の1260,1261,1262)をセットし
た時の割り込みコントローラシミュレータの処理手順を
示す。但し同関数は、割り込み要因フラグ、割り込み許
可フラグ、割込み要求状態変数を特定するための引数と
して割り込み番号をとる。
【0143】まずステップS1201でジャイアントロ
ックセマフォ1200を獲得する。これにより、以下の
処理は、他のスレッドから邪魔されることなく、割り込
みコントローラシミュレータが管理する情報を操作する
ことが可能となる。
【0144】そしてステップS1202で、割り込み許
可フラグが既にセットされているかどうかを調べ、もし
セットされていたならば、それ以上の処理は必要ないの
でステップS1209に進んで、ジャイアントロックセ
マフォ1200を開放し、リターンする。一方、割り込
み許可フラグがOFF状態であったならば、ステップS
1203で、引数で指定された割り込み番号の割り込み
許可フラグをセットする。
【0145】そしてステップS1204で、割込み要求
状態(図10の1282,1283,1284)を更新
すべきか否かを調査するために、該当する割り込み要因
フラグ(図10の1250,1251,1252)をテ
ストする。割り込み要因フラグがOFFであるならば、
割込み要求状態の値に変化は生じないため、ステップS
1209に進んでジャイアントロックセマフォを開放
し、リ1200ターンする。一方、割り込み要因フラグ
がONであるならば、割込み要求状態の値が変化するの
で、ステップS1205で割込み要求状態をセットし、
ステップS1206で割込み要求レベル計算関数をコー
ルして、割込み要求レベル(図10の1201)と、該
当する割り込み番号(図10の1288)を再計算す
る。
【0146】そしてステップS1207で、割込み要求
レベルが割り込みレベルを上回ったどうかをテストし、
割込み要求レベルが割り込みレベル以下ならば、それ以
上の処理は必要ないためステップS1209に進み、ジ
ャイアントロックセマフォ1200を開放し、リターン
する。一方、割込み要求レベルが割り込みレベルを上回
っているならば、ステップS1208で、後述する同期
割り込み起動関数(図21)をコールして、割り込み要
求レベルに対応する割り込み処理を起動する。
【0147】同期割り込み処理関数は、内部的に、それ
を呼び出したスレッドを待ち状態に遷移させるが、待ち
状態から戻った状態では、ジャイアントロックセマフォ
1200を獲得している(より正確には、他のスレッド
から管理情報への排他アクセス権を引き継ぐ)ので、ス
テップS1209でジャイアントロックセマフォ120
0を開放し、リターンする。 [1.3.3. 割り込み許可フラグクリア操作]図1
3は、メイン処理などのソフトウェアが、割り込み許可
フラグ(図10の1260,1261,1262)をク
リアしたときの割り込みコントローラシミュレータの処
理手順を示す。但し同関数は、割り込み許可フラグ、割
り込み要因フラグ、割込み要求状態変数を特定するため
の引数として割り込み番号をとる。
【0148】まずステップS1301でジャイアントロ
ックセマフォを獲得する。これにより、以下の処理は、
他のスレッドから邪魔されることなく、割り込みコント
ローラシミュレータが管理する情報を操作することが可
能となる。
【0149】そしてステップS1302で、割り込み許
可フラグが既にクリアされているかどうかを調べ、もし
クリアされていたならばそれ以上の処理は必要ないの
で、ステップS1307に進んでジャイアントロックセ
マフォ1200を開放し、リターンする。一方、割り込
み許可フラグがON状態であったならば、ステップS1
303で、引数で指定された割り込み番号の割り込み許
可フラグをクリアする。
【0150】そしてステップS1304で、割込み要求
状態(図10の1282,1283,1284)を更新
すべきか否かを調査するために、該当する割り込み要因
フラグ(図10の1250,1251,1252)をテ
ストする。割り込み要因フラグがOFFであるならば、
割込み要求状態の値に変化は生じないため、ステップS
1307に進んでジャイアントロックセマフォ1200
を開放し、リターンする。一方、割り込み要因フラグが
ONであるならば、割込み要求状態の値が変化するの
で、ステップS1305で割込み要求状態をクリアし、
ステップS1306で割込み要求レベル計算関数をコー
ルして、割込み要求レベル(図10の1281)と、該
当する割り込み番号(図10の1288)を再計算する
(割込み要求レベルが0の時、割り込み番号は不定の値
となる)。
【0151】そしてステップS1307でジャイアント
ロックセマフォ1200を開放し、リターンする。
【0152】尚、割り込み許可フラグクリア関数では、
新たな割り込みが起動されることはない。 [1.3.4. 割り込みレベル変更操作]図14は、
メイン処理などのソフトウェアが、割り込みレベル(図
10の1220)を変更したときの、割り込みコントロ
ーラシミュレータの処理手順を示す。但し、同関数は、
引数として新しいレベル値をとる。
【0153】まずステップS1401でジャイアントロ
ックセマフォを獲得する。これにより、以下の処理は、
他のスレッドから邪魔されることなく、割り込みコント
ローラシミュレータが管理する情報を操作することが可
能となる。
【0154】そしてステップS1402で、割り込みレ
ベルに引数で指定された新しいレベルを代入し、ステッ
プS1403で割込み要求レベルが割り込みレベルを上
回ったどうかをテストする。
【0155】割込み要求レベルが割り込みレベル以下な
らば、それ以上の処理は必要ないのでステップS140
5に進み、ジャイアントロックセマフォ1200を開放
してリターンする。一方、割込み要求レベルが割り込み
レベルを上回っているならば、ステップS1404で後
述する同期割り込み起動関数をコールして、割り込み要
求レベルに対応する割り込み処理を起動する。
【0156】同期割り込み処理関数は、内部的に、それ
を呼び出したスレッドを待ち状態に遷移させるが、待ち
状態から戻った状態では、ジャイアントロックセマフォ
1200を獲得している(より正確には、他のスレッド
から管理情報への排他アクセス権を引き継ぐ)ので、ス
テップS1405でジャイアントロックセマフォ120
0を開放し、リターンする。 [1.3.5. 割り込み要因フラグセット操作]図1
5は、周辺デバイススレッド(図10の1270,12
71,1272)が、割り込み要因フラグ(図10の1
250,1251,1252)をセットしたときの割り
込みコントローラシミュレータの処理手順を示す。但し
同関数は、割り込み要因フラグ、割り込み許可フラグ、
割込み要求状態変数を特定するための引数として割り込
み番号をとる。
【0157】割り込み要因フラグセット関数は、周辺デ
バイススレッドのみがコールすることができるように調
整されている(メイン処理や、割り込みハンドラはこの
関数をコールできない)。特に、同関数をコールする前
に、周辺デバイススレッドは、ジャイアントロックセマ
フォを獲得済みでなければならない。更に、同関数から
リターンしたとき、ジャイアントロックセマフォは開放
状態となっている。
【0158】同関数は、まずステップS1501で割り
込み要因フラグ(図10の1250,1251,125
2)が既にセットされているかどうかを調べ、セットさ
れていたならばそれ以上の処理は必要ないので、ステッ
プS1508に進んでジャイアントロックセマフォ12
00を開放し、リターンする。一方、割り込み要因フラ
グがOFF状態であったならば、ステップS1502で
引数で指定された割り込み番号の割り込み要因フラグを
セットする。
【0159】そしてステップS1503で、割込み要求
状態(図10の1282,1283,1284)を更新
すべきか否かを調査するために、該当する割り込み許可
フラグ(図10の1260,1261,1262)をテ
ストする。割り込み許可フラグがOFFであるならば、
割込み要求状態の備に変化は生じないため、ステップS
1508に進んでジャイアントロックセマフォ1200
を開放し、リターンする。一方、割り込み許可フラグが
ONであるならば、割込み要求状態の値が変化するの
で、ステップS1504で割込み要求状態をセットし、
ステップS1505で割込み要求レベル計算関数をコー
ルして割込み要求レベル(図10の1281)と、該当
する割り込み番号(図10の1288)を再計算する。
【0160】そしてステップS1506で、割込み要求
レベルが割り込みレベルを上回ったどうかをテストし、
割込み要求レベルが割り込みレベル以下ならば、それ以
上の処理は必要ないためステップS1508に進み、ジ
ャイアントロックセマフォ1200を開放し、リターン
する。一方、割込み要求レベルが割り込みレベルを上回
っているならば、ステップS1507で後述する非同期
割り込み起動関数(図20)をコールして、割り込み要
求レベルに対応する割り込み処理を起動する。
【0161】非同期割り込み処理関数は、内部的にジャ
イアントロックセマフォを手放す(より正確には、他の
スレッドに管理情報への排他アクセス権を引き渡す)の
で、ジャイアントロックセマフォ1200を操作するこ
となく、割り込み要因フラグセット関数からリターンす
る。 [1.4. 割り込みシミュレータ]図16は、CPU
の割込み動作を疑似する、割り込みシミュレータの構成
を示す(割り込みコントローラシミュレータ部分は除
く)。
【0162】同図において、1610はデバッグ対象ソ
フトウェアのメイン処理が走るメイン処理スレッドであ
り、1630は同スレッドを指す、Windows等の
OSが管理するスレッドハンドルである。
【0163】1611,1612,1613は、それぞ
れ、割り込みレベル1,2,3の割り込みハンドラが走
るスレッドであり、1631,1632,1633は、
それぞれ対応する割り込みスレッドを指すハンドルであ
る。図16においては、割り込みレベルが1から3まで
存在する場合を示しているが、割り込みシミュレータは
割り込みレベル数を制限するものではない。
【0164】同図において、割り込み処理はメイン処理
に割込むことができること、及び、より優先度の高い割
り込み処理は、優先度の低い割り込み処理に割込むこと
ができるため、割り込みレベル毎にスレッドを用意する
ことで、割込みのネスティングを実現している。
【0165】また逆に、複数の割り込み処理が同一の割
り込みレベルに割り当てられている場合は、これら同一
レベルの異なる割り込み処理はネスティングすることは
ないため、同一のスレッド上で走らせることができる。
つまり、割り込みレベル分の実行スレッドを用意すれば
十分である。
【0166】1620は、メイン処理が、割り込み許可
フラグをセットすることにより同期的に割り込みが発生
した場合(図6のS602に相当)、または、割り込み
レベルを減少させることにより同期的に割り込みが発生
した場合(図7のS705に相当)に、割り込み処理の
終了を待つための同期セマフォであり、また、1640
は、同セマフォを指すハンドルである。
【0167】1621,1622,1623は、それぞ
れ、レベル1,2,3の割り込み処理が、割り込み処理
の起動を待つためのセマフォであり、1641,164
2,1643は、それぞれ対応するセマフォを指すハン
ドルである。すべの割込みの起動は、この割り込み同期
セマフォにシグナル送ることで、起動される。
【0168】1650は、現在実行中の処理(メイン処
理、あるいは割り込み処理)スレッドを指すカレント実
行スレッドハンドルであり、CPUの逐次実行をメイン
処理、割り込み処理といった粒度でトラッキングする
(スレッド内の逐次実行のトラッキングは、スレッドを
通じてOSが管理する)。
【0169】1651は、現在実行中の処理(メイン処
理、あるいは割り込み処理)が、CPUを獲得するため
に待つための、同期セマフォを指すハンドルである。
【0170】このカレント同期セマフォハンドル165
1は、カレント実行スレッドハンドル1650がメイン
処理スレッド1610を指すときには、それに対応する
同期セマフォ1620を指し、そして、カレント実行ス
レッドハンドル1650が割り込みスレッド1611,
1612,1613を指すとき、対応する割り込み同期
セマフォ1621,1622,1623を指す。つま
り、カレント実行スレッドハンドル1650とカレント
同期セマフォハンドル1651は、一体として変更され
る。
【0171】図16においては、例として、カレント実
行スレッドハンドル1650がレベル3の割り込みスレ
ッドを指し、カレント同期セマフォハンドル1650が
レベル3の割り込み同期セマフォを指している状態を示
している。もちろん、この状態は時々刻々と変化してい
く。
【0172】1652は、現在の割り込みレベル(図1
0の1220に同じ)であり、1653は、割り込み番
号(図10の1288に同じ)である。この2つの変数
の意味は、図10で説明したとおりである。
【0173】1660は、割り込みスタックを疑似し
た、RAM上の変数域であり、割込みのネスティングを
管理する。割り込みスタックは、いくつかの割り込みフ
レームから構成されており、そして更に、割り込みフレ
ームは、非同期フラグ601a,b、復帰割り込みレベ
ル602a,b、復帰セマフォハンドル603a,b、
復帰スレッドハンドル604a,bから構成される。
【0174】割り込み処理が起動するとき、現在のコン
テキストが割り込みスタックにプッシュされ、割り込み
フレームが作成される。
【0175】現在のコンテキストとは、カレント実行ス
レッドハンドル1650と、カレント同期セマフォハン
ドル1651、割り込みレベル1652であり、これら
はそれぞれ、復帰スレッドハンドル604a,b、復帰
セマフォハンドル603a,b、復帰割り込みレベル6
02a,bとして、割り込みスタック上にプッシュされ
る。
【0176】さらに割り込みフレームには、現在実行中
のスレッドがどのように割り込み処理に割込まれたかを
示す、非同期フラグ601a,bが保存される。
【0177】割り込みフレーム上の非同期フラグが1の
とき、割り込みフレームの復帰スレッドは、周辺デバイ
ス(図10の1270,1271,1272)が割り込
み要因フラグ(図10の1250,1251,125
2)をセットすることによって、CPU内のソフトウェ
アの処理の流れとは無関係に(非同期に)割り込み処理
によって割込みまれたことを示す(図5のS502、図
8のS803,S808、図9のS903に相当す
る)。
【0178】逆に、非同期フラグが0のとき、割り込み
フレームの復帰スレッドは、CPU内のソフトウェア自
身の処理(割り込み許可フラグをセットする、割り込み
レベルを低下させる、割り込みからの復帰命令を実行す
る)によって同期的に割り込み処理によって割込まれた
ことを示す(図6のS602、図7のS705、図9の
S911に相当)。
【0179】図16においては、例として、2つの割り
込みフレームが割り込みスタック上に作成されており、
そして、最初の割り込みフレームは、メイン処理スレッ
ド1610がソフトウェアの処理の結果として(例え
ば、割り込み許可フラグをセットするなどして)、同期
的に割り込み処理に割込まれたこと、そして、2番目の
割り込みフレームは、レベル1の割り込み処理スレッド
1611が高優先の割り込みレベルを持つ周辺デバイス
によって非同期的に割込まれた状態を示している。
【0180】1200は、割り込みコントローラシミュ
レータを含む、割り込みシミュレータが管理する情報を
一括して、排他アクセスさせるためのジャイアントロッ
クセマフォであり、1201は、同セマフォを指すハン
ドラである。同ジャイアントロックセマフォ1200
は、図16に示す全ての変数と、図10に示す全ての変
数へのアクセスを保護する。 [1.4.1. コンテキスト切り換え]図17は、割
り込みシミュレータが、割り込み処理を起動するため
に、コンテキストを切り換える処理の概要(図3に示す
割り込み起動処理に相当)を示す図である。
【0181】図18は、図17におけるの前半処理部分
である、コンテキスト保存処理の手順を示す図であり、
図19は、図17における後半処理部分である、コンテ
キストスイッチ処理の手順を示す図である。 [1.4.1.1. コンテキスト保存]図18に示す
コンテキスト保存関数は、現在のコンテキストが周辺デ
バイススレッドによって非同期的に割込まれようとして
いるのか、ソフトウェア処理によって同期的に割り込み
処理が起動しようとしているかを示す、非同期フラグを
引数にとる(図16の601a,b、図17の601
n)。
【0182】図18において、コンテキスト保存関数
は、まずステップS1801で、引数で渡された非同期
フラグを割り込みスタックにプッシュする(図17のS
1701)。
【0183】そしてステップS1802で、割り込みレ
ベル(図17の1652)を割り込みスタックにプッシ
ュする(図17のS1702)。
【0184】そしてステップS1803で、カレント同
期セマフォハンドル(図17の1651)を割り込みス
タックにプッシュする(図17のS1703)。
【0185】そしてステップS1804で、カレント実
行スレッドハンドル(図17の1650)を割り込みス
タックにプッシュする(図17のS1704)。
【0186】これらの手順によって、現在のコンテキス
ト情報をすべて割り込みスタックに保存することができ
たので、コンテキスト保存関数はリターンする。 [1.4.1.2. コンテキストスイッチ]図19に
おいて、コンテキストスイッチ関数は、まずステップS
1901で、割込み要求レベル(図17の1281)を
割り込みレベル(図17の1652)に代入する(図1
7のS1711)。
【0187】そしてステップS1902で、割込み要求
レベルに対応する割り込み同期セマフォハンドル(図1
7の164n)をカレント同期セマフォハンドル(図1
7の1651)にコピーする(図17のS1712)。
【0188】そしてステップS1903で、割込み要求
レベルに対応する割り込みスレッドハンドル(図17の
163n)を、カレント実行スレッドハンドル(図17
の1650)にコピーする(図17のS1713)。
【0189】以上の手順により、カレントのコンテキス
トを全て設定し終わったので、ステップS1904で、
カレント同期セマフォにシグナルを送り、カレント実行
スレッドハンドルが指す割り込みスレッドをセマフォ待
ちから開放する。 [1.4.2. 非同期割り込み起動]図20は、周辺
デバイススレッド(図10の1270,1271,12
72)が、割り込み要因フラグをセットする処理(図1
5)において、割り込み要因レベルが割込みレベルを上
回ったときにコールする(図15のS1507)、非同
期割り込み起動関数の処理の手順を示す。
【0190】非同期割り込み起動関数は、ジャイアント
ロックセマフォを既に獲得している状態でコールしなけ
ればならない。そして、同関数からリターンしたとき
は、ジャイアントロックを失っている(より正確には、
起動された割り込みスレッドにジャイアントロックを引
き渡している)。
【0191】非同期割り込み起動関数は、まずステップ
S2001で、カレント実行スレッドハンドル(図16
の1650)が指すカレント実行スレッドをサスペンド
する。これにより、現在実行中であったスレッド(メイ
ン処理スレッドあるいは、これから起動する割り込みよ
りも低優先の割り込みスレッド)は強制的に停止させら
れる。
【0192】そしてステップS2002で、コンテキス
ト保存関数を引数1でコールし、現在のコンテキストと
現在のスレッドが非同期に割込まれたことを割り込みス
タックに保存する(図17、図18)。
【0193】そしてステップS2003で、コンテキス
トスイッチ関数をコールし、割込み要求レベルに対応す
る割り込み処理スレッドを同期セマフォ待ち状態から開
放する(図17、図19)。
【0194】同期セマフォ待ち状態から開放された割り
込みスレッドは、非同期割り込み起動関数が持っていた
ジャイアントロックセマフォの保護の下、継続して、割
り込みシミュレータが管理する情報にアクセスすること
ができる。
【0195】逆に、非同期割り込み起動関数をコールし
た周辺デバイススレッドは、これ以降、割り込みシミュ
レータが管理する情報にアクセスしてはならない(ま
た、ジャイアントロックセマフォを開放してもならな
い)。
【0196】以上の手順で、目的の割り込みスレッドが
活性化されたため、非同期割り込み起動関数はリターン
する。 [1.4.3. 同期割り込み起動]図21は、メイン
処理スレッドあるいは、割り込みスレッドが割り込み許
可フラグをセットする(図12)、あるいは、割り込み
レベルを変更する(図14)などの処理の一部として、
割込み要求レベルが割り込みレベルを上回った場合にコ
ールしなければならない(図12のS1208、図14
のS1404)、同期割り込み起動関数の処理の手順を
示す。
【0197】同期割り込み起動関数は、ジャイアントロ
ックセマフォを獲得した状態でコールしなければなら
ず、そして、同関数からリターンしたとき、再び、ジャ
イアントロックセマフォを獲得している。
【0198】同期割り込み起動関数は、まずステップS
2101で、カレント同期セマフォハンドル(図16の
1651)をローカル変数hOldSyncに待避する。
【0199】そしてステップS2102で、コンテキス
ト保存関数(図18)を引数0でコールし、現在のコン
テキストと、実行中のスレッドがそれ自身の処理によっ
て同期的に割り込み処理を発生させたことを、割り込み
スタックにプッシュする(図17、図18)。
【0200】そしてステップS2103で、コンテキス
トスイッチ関数(図19)をコールし、割込み要求レベ
ルに対応した割り込みスレッドを、同期セマフォ待ちか
ら開放させる。
【0201】そしてステップS2104で、ローカル変
数に待避したhOldSyncを通じて、同期割り込み起動関数
をコールしたスレッドに関連した同期セマフォを待つ
(これにより、同期割り込み起動関数をコールしたスレ
ッドは待ち状態に入る)。
【0202】ステップS2103において同期セマフォ
待ち状態から開放された割り込みスレッドは、同期割り
込み起動関数が持っていたジャイアントロックセマフォ
の保護の下、継続して、割り込みシミュレータが管理す
る情報にアクセスすることができる。
【0203】そして、同割り込みスレッドが、後述する
割り込みからの復帰関数(図25)を実行したとき、同
期割り込み起動関数をコールしたスレッドが待っている
同期セマフォにシグナルを送り、その結果、同期割り込
み起動関数をコールしたスレッドは待ち状態から開放さ
れる。
【0204】この時、割り込みからの復帰関数をコール
した割り込みスレッドが取得していたジャイアントロッ
クセマフォは、同期割り込み起動関数をコールしたスレ
ッドに引き渡される。
【0205】そして、同期割り込み起動関数は、このよ
うにして、割り込み処理の終了を確認した後で、呼び出
し元にリターンする。 [1.4.4. 割り込みスレッドの処理シーケンス]
図22は、各種レベルの割り込みスレッド(図16の1
611,1612,1613)の処理手順を示す(全て
の割り込みスレッドは同一のコードを実行する。但し、
スレッド毎に固有のスタックを持つため、各スレッドの
処理は、ローカル変数にアクセスしている限り、お互い
の動作を妨げることはないことに注意)。
【0206】割り込みスレッド関数は、スレッドを作成
するときのスレッド引数として、割り込みレベルをと
る。
【0207】割り込みスレッド関数は、まずステップS
2201で、OSが管理するスレッドの優先順位を標準
のものより高くする。これは、割り込み処理が、メイン
処理や割り込みハンドラに、速やかに割込めるようにす
るためである。
【0208】そしてステップS2202で、スレッド引
数として渡された割り込みレベルに対応した割り込み同
期セマフォ(図16の1621,1622,1623)
を待つ。
【0209】そして、メイン処理スレッド、低優先の割
り込みスレッド、周辺デバイススレッドが、コンテキス
トスイッチ関数(図19)をコールしたとき、割込み要
求レベルに対応した割り込み同期セマフォにシグナルを
送る(図19のS1904)。
【0210】この結果、同割込み要求レベルに対応した
割り込みスレッドは、ステップS2202の待ち状態か
ら開放され、そして、ジャイアントロックセマフォをコ
ンテキストスイッチ関数(図19)をコールしたスレッ
ドから引き継ぐ。
【0211】そして割り込みスレッド関数はステップS
2203で、ジャイアントロックセマフォを獲得した状
態で、割り込み番号(図16の1288)をローカル変
数noに待避する。
【0212】以上で、割り込みシミュレータが管理する
情報へのアクセスは終了したので、ステップS2204
でジャイアントロックセマフォを開放する。
【0213】そしてステップS2205で、スレッド優
先度を通常レベルに下げ、ステップS2206で、ロー
カル変数noに待避した割り込み番号に対応した割り込
みハンドラをコールし、そしてステップS2207で再
び、スレッド優先度を、ステップS2201と同一のレ
ベルまで上げる。
【0214】ここで、スレッド優先度を通常レベルに下
げた状態で、割り込みハンドラをコールするのは、割り
込みハンドラは、デバッグ対象プログラムの一部であ
り、当然バグを含むと考えるべきであり、このような信
頼性の低いコードを、高いスレッド優先度で実行する
と、システム自体を不安定にする危険性があるためであ
る。
【0215】そして割り込みスレッド関数はステップS
2208で、割り込みからの復帰関数(図25)をコー
ルして割り込み処理を終了させ、再びステップS220
2に戻り、ループを繰り返す。 [1.4.5. コンテキスト復元]図23、図24
は、コンテキスト保存処理(図18)の逆の操作を行
う、コンテキスト復元処理及び、同処理手順を示す。
【0216】図24のコンテキスト保存関数は、まずス
テップS2401で、割り込みスタックから復帰実行ス
レッドハンドルをポップし、カレント実行スレッドハン
ドルにコピーする(図23のS2301)。
【0217】割り込みスタックの復帰スレッドハンドル
は、割り込み起動時に、コンテキスト保存処理によっ
て、カレント実行スレッドハンドルが割り込みスタック
にプッシュされていたものである(図18のS180
4)。つまり、コンテキスト保存関数におけるステップ
S2401は、割り込みによって割込まれたスレッドを
カレントに復元する。
【0218】コンテキスト復元関数は更にステップS2
402で、割り込みスタックから復帰同期セマフォハン
ドルをポップし、カレント同期セマフォハンドルにコピ
ーする(図23のS2302、図18のS1803の逆
操作)。
【0219】そしてさらにステップS2403で、割り
込みスタックから復帰割り込みレベルをポップし、割り
込みレベル(図16の1652)にコピーする(図23
のS1303、図18のS1802の逆操作)。
【0220】そしてさらにステップS1404で、割り
込みスタックから非同期フラグをポップし、その値をコ
ンテキスト保存関数の呼び出し元にリターンする。
【0221】以上の手順によって、割り込みスタックに
保存されたコンテキスト情報が、カレントのコンテキス
トとして復元される。 [1.4.6. 割り込みからの復帰]図25は、割り
込みスレッド関数(図22)のステップS2208でコ
ールされる、割り込みからの復帰関数の処理の手順を示
した図である。
【0222】同図において、割り込みからの復帰関数
は、まずステップS2501でジャイアントロックセマ
フォを獲得し、割り込みシミュレータが管理する情報へ
の排他アクセス権を得る。
【0223】そしてステップS2502で、コンテキス
ト復元関数(図24)をコールし、割り込みスタックか
らコンテキストを復元する。そして、同関数の戻り値
を、ローカル変数fAsyncに待避する。
【0224】そして、復帰したコンテキストを再開する
ための処理、あるいは、低優先の保留された割り込み処
理を起動するための手続き実行する。
【0225】まず、以下の3つの場合を考えなければな
らない。
【0226】 ステップS2502のコンテキスト復元関数は、割
り込みレベルを低下させるが、これによって、割込み要
求レベルが、割り込みレベルを上回る場合(図9のS9
11に相当) 割り込みスタックからポップした非同期フラグが1
であった場合(図5のS509、図8のS815,S8
19、図9のS917に相当) 割り込みスタックからポップした非同期フラグが0
であった場合(図6のS608、図7のS711に相
当) 上記の場合は、割り込み処理を実行中に、それ以下の
優先度の割り込み要求が発生したが、コンパレータ(図
10の1210)によって、低優先の割込み要求が保留
されている。
【0227】そして上記の場合は、周辺デバイススレ
ッドが割り込み要因フラグをセットした結果、割込み要
求レベルが割り込みレベルを上回ったため、非同期に発
生した割り込み(図15のS1507)から、復帰しよ
うとしている。
【0228】この場合、割り込みスタックから復元され
たカレント実行スレッド(割込まれたスレッド)は、周
辺デバイススレッドからゴールされた非同期割り込み関
数(図20)の処理S2001によって強制的にサスペ
ンドされている。
【0229】そして上記の場合は、割り込みスタック
から復元されたカレント実行スレッド(割込まれたスレ
ッド)は、割込み許可フラグセット関数(図12)また
は、割り込みレベル変更関数(図14)の結果、割込み
要求レベルが割り込みレベルを上回ったため(図12の
S1207、または、図14のS1403)、同期割り
込み起動関数(図21)をコールし(図12のS120
8、または、図14のS1404)、そして、同スレッ
ドに対応した同期セマフォを待っている(図21のS2
104)。
【0230】以上のことから、割り込み復帰関数は、ま
ずステップS2503で、割込み要求レベルが割り込み
レベルを上回ったかどうかを調べる。
【0231】そしてもし、割込み要求レベルが割り込み
レベルを上回ったならば(上記、の場合)ステップS
2508に進み、割り込みスタックからポップしたばか
りの非同期フラグ(S2502でローカル変数fAsyncに
待避している)を引数として、コンテキスト保存処理を
コールする。即ち、割り込みスタックから復元したばか
りのコンテキストを再び、割り込みスタックにプッシュ
する。
【0232】そしてステップS2509で、コンテキス
トスイッチ関数をコールし、割り込み要求レベルに対応
した割り込み同期セマフォにシグナルを送り(図19の
S1904)、リターンする。
【0233】割込み要求レベルが割り込みレベル以下で
あるならば(上記、またはの場合)、ステップS2
502でポップした非同期フラグ(S2502でローカ
ル変数fAsyncに待避している)をテストする。
【0234】そして非同期フラグfAsyncが1であるなら
ば(上記の場合)、ステップS2505に進み、カレ
ント実行スレッド(割込まれたスレッド)をレジューム
して強制停止状態を解除し、そして、S2506でジャ
イアントロックセマフォを開放し、リターンする。
【0235】一方、非同期フラグfAsyncが0であるなら
ば(上記の場合)、ステップS2507に進み、カレ
ント同期セマフォにシグナルを送り、カレント実行スレ
ッド(割込まれたスレッド)を同期セマフォ待ち状態か
ら開放してリターンする。
【0236】上記、、の場合は、ステップS250
1で獲得したジャイアンロックセマフォは、新たにアク
ティブ化されたスレッドに引き渡す。
【0237】の場合は、アクティブ化されたスレッド
は、非同期に割込み込まれているので、排他アクセス権
は引き渡さない(割込まれたスレッドのコードは、割り
込み処理に割込まれたことすら知らない)。 [1.4.7. 周辺デバイススレッドのシーケンス]
図26は、周辺デバイススレッド(図10の1270,
1271,1272)の標準的な制御フローを示す(詳
細のフローは、周辺デバイスの仕様毎に異なる)。
【0238】周辺デバイススレッド関数は、周辺デバイ
スがセットすべき割り込み要因フラグを特定するための
割り込み番号をスレッド引数にとる。
【0239】周辺デバイススレッド関数は、まずステッ
プS2601で、スレッドの優先度を上げ、割込み要求
が速やかに応答されるようにする。
【0240】そしてステップS2602で、デバイス内
部のイベント発生を待ち、イベントが発生したならば、
ステップS2603でジャイアントロックセマフォを獲
得し、ステップS2604で発生したイベント毎の具体
的な処理を実行する。
【0241】そしてステップS2605で、割り込み要
因が発生したかどうかを調べ、割り込み要因が発生した
ならば、ステップS2606で割り込み要因フラグをセ
ットする関数(図15)をコールし、ステップS260
2に進んでループを繰り返す。割り込み要因セット関数
は内部的に、ジャイアントロックセマフォを他のスレッ
ドに引き渡すので、明示的に、ロックを開放する必要は
ない(してはならない)。
【0242】一方、割り込み要因が発生していなけれ
ば、ステップS2607で明示的にジャイアントロック
セマフォを開放し、ステップS2602に進んでループ
を繰り返す。
【0243】尚、ステップS2603でジャイアントロ
ックセマフォを獲得しているのは、ステップS260
4,S2605,S2606の一連の処理を、他の周辺
デバイススレッドに邪魔されたくないためである。 [1.5. 割り込みシミュレータが処理する、割り込
みシーケンス例]図27、図28、図29、図30A,
B、図31A,Bは、上述した図5、図6、図7、図
8、図9で示した代表的な割り込みシーケンスを、割り
込みシミュレータがどのように処理するかを示す図であ
る。以下、これら各処理について説明する。 [1.5.1. 周辺デバイスからの非同期割り込みシ
ーケンス]まず図27は、周辺デバイスからの割込み要
求によって非同期に発生した割り込みシーケンスを、割
り込みシミュレータがどのように処理するかを示す図で
あり、上述した図5に示すシーケンスに対応する。
【0244】図27において、2710はメイン処理ス
レッド(図16の1610)の処理、2711は、レベ
ル1の割り込み処理スレッド(図16の1611)の処
理(図22)、2730は、周辺デバイススレッド(図
10の1270)の処理(図26)を示し、それぞれ図
5の510,511,530に対応する。
【0245】また、2740は、メイン処理スレッドの
同期セマフォハンドル(図16の1640)、2741
は、レベル1の割り込み処理スレッドの同期セマフォハ
ンドル(図16の1641)、2750は、ジャイアン
トロックセマフォ(図10,図16の1200)の処理
を示す。
【0246】また、2720は、プライオリティエンコ
ーダが計算する割り込み番号変数(図10の1288)
の値、2721は、CPUの割り込みレベル変数(図1
0の1220)の値、2722は、プライオリティエン
コーダが計算する割込み要求レベル変数(図10の12
81)の値、2723は、割り込み許可フラグ変数#1
(図10の1260)の値、2724は、割り込み要因
フラグ変数♯1(図10の1250)の値を示し、それ
ぞれ、図5の520,521,522,523,524
に対応する。 [1.5.1.1. レベル1の割り込みスレッドのシ
ーケンス]図27において、レベル1の割り込みスレ
ッド2711は、まずステップS2701で、レベル1
の割り込み同期セマフォ2741を待ち(図22のS2
202)、割り込み発生の待ち状態に入る。 [1.5.1.2. 周辺デバイススレッド#1のシー
ケンス]また図27において、周辺デバイススレッド
♯1(2730)は、周辺デバイススレッド関数(図2
6)に、スレッド引数として割り込み番号(値1)を渡
すことにより、処理を開始する。
【0247】周辺デバイススレッド関数(図26)は、
まず、割込みの応答性をよくするため、自身のスレッド
優先度を通常よりも高くする(図26のS2601)。
そして、デバイス内部のイベント待ち状態に入る(図2
6のS3602)。 [1.5.1.3. メイン処理スレッドのシーケンス
]図27において、メイン処理スレッド2710は、
まず、割り込みを受け付ける準備ができたため、割り込
み許可フラグセット関数(図12)を引数1でコールす
る。
【0248】メイン処理スレッドのコンテキストでコー
ルされた、割り込み許可フラグセット関数(図12)
は、まず、割り込みシミュレータが管理する情報への排
他アクセス権を得るため、ジャイアントロックセマフォ
を獲得する(図12のS1201、図27のS270
1)。
【0249】そしてさらに同関数は、既に割り込み許可
フラグ#1(図10の1260、#1は関数引数)がO
N状態であるかどうかを調べ(図12のS1202)、
そして、ここでは同フラグがOFFであるので、実際に
割り込み許可フラグ#1をセットする(図12のS12
03、図27のS2703)。
【0250】そして更に、割込み要求状態変数#1(図
10の1282)を変更すべきか否かを調べるために、
割り込み要因フラグ#1(図10の1250)をテスト
する(図12のS1204)が、ここでは同フラグがO
FFであり、それ以上の処理は必要ないので、ジャイア
ントロックセマフォを開放し(図12のS1203、図
27のS2704)、リターンする。 [1.5.1.4. 周辺デバイススレッド♯1のシー
ケンス]このタイミングで、周辺デバイス#1に内部
イベント発生し、周辺デバイススレッド♯1が待ち状態
から開放されたとする。
【0251】周辺デバイススレッド#1は、周辺デバイ
ススレッド関数(図26)において、ジャイアントロッ
クセマフォを獲得し(図26のS2603、図27のS
2705)、発生した内部イベントを処理し(図26の
S2604)、割り込み要因が発生したどうかを調べる
(図26のS2605)。ここでは、割り込み要因が発
生した場合を想定している。
【0252】そしてさらに、周辺デバイススレッド関数
は、割り込み要因フラグ#1をセットするために、割り
込み番号(値は1)を引数として割り込み要因フラグセ
ット関数(図15)をコールする(図26のS260
6)。
【0253】周辺デバイススレッド#1のコンテキスト
でコールされた、割り込み要因フラグセット関数(図1
5)は、既に割り込み要因フラグ#1(図10の125
0、#1は関数引数)がセットされているかを調べるが
(図15のS1501)、ここではクリアされているの
で、割り込み要因フラグ♯1を実際にセットする(図1
5のS1502、図27のS2706)。
【0254】そして、更に割り込み要因セット関数は、
割込み要求レベルを変更する必要があるかどうかを調べ
るため、割り込み許可フラグ♯1をテストする。ここで
は、割り込み許可フラグ#1は、メイン処理スレッドに
よって既にセットされているので(図17のS170
2)、割り込み要求状態変数#1(図10の1282)
をセットする(図15のS1504)。
【0255】そして更に、同関数は、割込み要求レベル
(図10の1281)と、該当する割り込み番号(図1
0の1288)を再計算するために、割り込みレベル計
算関数をコールする(図15のS1505)。
【0256】割り込みレベル計算関数は、アサートされ
ている割込み要求状態変数の中で最大の割り込みレベル
値を計算し、その値を割込み要求レベル変数(図10の
1281)にセットし、対応する割り込みを要求してい
る割込みの番号を、割り込み番号変数(図10の128
8)にセットする。ここでは、割込み要求状態変数#1
(図10の1282)のみがセット状態にあると仮定し
ている。従って、割込み要求レベル変数(図10の12
81)は値1となり、割り込み番号(図10の128
8)は値1となる(図27のS2707)。
【0257】割り込みレベル計算関数からリターンした
割り込み要因フラグセット関数は、さらに割り込みを起
動する必要があるかどうかを調べるため、割込み要求レ
ベル(図10の1281)と割り込みレベル(図10の
1220)を比較する(図15のS1506)。ここで
は、割込み要求レベルは値1であり、割り込みレベルは
値0であるため、非同期割り込み起動関数をコールする
(図15のS1507)。
【0258】周辺デバイススレッド#1のコンテキスト
でコールされた非同期割り込み起動関数(図20)は、
まず、カレント実行スレッド、即ちここではメイン処理
スレッドをサスペンドし(図20のS2001、図27
のS2708)、そして、コンテキスト保存関数(図1
8)を引数1でコールする(図20のS2002)。
【0259】非同期割り込み起動関数からコールされた
コンテキスト保存関数(図18)は、まず、引数で渡さ
れた非同期フラグ(ここでは、値1)を割り込みスタッ
クにプッシュし(図18のS1801)、割り込みレベ
ル(値は0)を割り込みスタックにプッシュし(図18
のS1802)、カレント同期セマフォハンドル(メイ
ン処理の同期セマフォを指す)を割り込みスタックにプ
ッシュし(図18のS1803)、カレント実行スレッ
ドハンドル(メイン処理スレッドを指す)を割り込みス
タックにプッシュし、リターンする。
【0260】以上により、割り込みスタックにはメイン
処理スレッドのコンテキストが、非同期に割込まれたと
いう事実とともに保存される。
【0261】コンテキスト保存関数からリターンした、
非同期割り込み起動関数(図20)は、割込み要求レベ
ル(値は1)に対応する割り込みハンドラを活性化する
ために、コンテキストスイッチ関数(図19)をコール
する(図20のS2003)。
【0262】コンテキストスイッチ関数(図19)は、
まず、割込み要求レベル(ここでは値1)を割り込みレ
ベルにコピーし(図19のS1901)、割り込みレベ
ルを値1に上昇させる(図27のS2709)。これに
より、以降、レベル1以下の割込み要求は保留される。
【0263】そしてさらに、割込み要求レベル(値1)
に対応した割り込み同期セマフォハンドルをカレント同
期セマフォハンドルにコピーし(図19のS190
2)、割込み要求レベル(値1)に対応した割り込みス
レッドハンドルをカレント実行スレッドハンドルハンド
ルにコピーする(図19のS1903)。
【0264】そしてさらに、新たにカレントとなった同
期セマフォハンドル、つまり、レベル1の割り込み同期
セマフォハンドル(図27の2741)にシグナルを送
り(図27のS2710)、リターンする。
【0265】コンテキストスイッチ関数からリターンし
た非同期割り込み起動関数は、割り込み要因フラグセッ
ト関数にリターンし、そして、割り込み要因フラグセッ
ト関数も直ちにリターンする。
【0266】割り込み要因フラグセット関数からリター
ンした、周辺デバイススレッド関数(図26)は、デバ
イスの内部イベント待ちループに戻る(図26のS26
02)。 [1.5.1.5. レベル1の割り込み処理スレッド
のシーケンス]割り込みスレッド関数の割り込み同期
セマフォ待ち処理(図22のS2202)でブロックし
ていた、レベル1の割り込みスレッド(図27の271
1)は、周辺デバイススレッド♯1が同セマフォにシグ
ナルを送ったため(図27のS2710)、待ち状態か
ら解除される(図27のS2711)。
【0267】そして、レベル1の割り込みスレッドはさ
らに、割り込み番号(図27の2720、値は1)をロ
ーカル変数noに待避する(図22のS2203、図2
7のS2712)。
【0268】この時点で、割り込みシミュレータが管理
する情報へのアクセスは終了したので、ジャイアントロ
ックを開放する(図22のS2204、図27のS27
13)。
【0269】そして更に、レベル1の割り込みスレッド
は、自身のスレッド優先度を通常のレベルまで下げた
(図22のS2205)後、ローカル変数noが指す割
り込みハンドラ、つまり、割り込み番号1の割り込みハ
ンドラをコールする。
【0270】レベル1の割り込みスレッドのコンテキス
トでコールされた、割り込み番号1の割り込みハンドラ
は、割り込み発生時に必要な処理を行った後、割り込み
要因を取り下げるため、割り込み番号引数を1として、
割り込み要因クリア関数(図11)をコールする。
【0271】割り込み要因クリア関数(図11)は、ま
ず、割り込みシミュレータが管理する情報への排他アク
セス権を得るため、ジャイアントロックセマフォを獲得
する(図11のS1101、図27のS2714)。
【0272】そして更に、既に割り込み要因フラグ♯1
がクリア済みであるかどうかを調べ(図11のS110
2)、セット状態であるので、実際に同要求フラグをク
リアする(図11のS1103、図27のS271
5)。
【0273】そして更に、割込み要求状態♯1(図10
の1282)を変更すべきか否かを調べるため、割り込
み許可フラグ#1(図10の1260)をテストする
(図11のS1104)。
【0274】ここでは、割り込み許可フラグ#1がセッ
トされているので、割込み要求状態変数♯1をクリア
し、割込み要求レベル(図10の1281)と割り込み
番号(図10の1288)を再計算するために、割り込
みレベル計算関数をコールする(図11のS110
6)。
【0275】割り込みレベル計算関数は、全ての割込み
要求状態変数(図10の1282,1283,128
4)がクリアされていることを検出し、割込み要求レベ
ル(図10の1281)に値0をセットし、割り込み番
号(図10の1288)を不定の値とする(図27のS
2716)。
【0276】割り込みレベル計算関数からリターンし
た、割り込み要因フラグクリア関数(図11)は、この
時点で割り込みシミュレータが管理する情報へのアクセ
スが終了したので、ジャイアントロックセマフォを開放
し(図11のS1107、図27のS2717)、リタ
ーンする。
【0277】割り込み要因フラグクリア関数からリター
ンした、割り込み番号1の割り込みハンドラは、更に他
の処理を行った後、リターンする。
【0278】割り込みハンドラからリターンした割り込
みスレッド関数(図22)は、自身のスレッド優先度を
再び上昇させた後、割り込み処理を終了させるため、割
り込みからの復帰関数(図25)をコールする(図22
のS2208)。
【0279】割り込みからの復帰関数(図25)は、ま
ず、割り込みシミュレータが管理する情報への排他アク
セス権を獲得するため、ジャイアントロックセマフォを
獲得する(図25のS2501、図27のS271
8)。
【0280】そして更に、割り込みスタックから復帰コ
ンテキストを復元するため、コンテキスト復元関数(図
24)をコールする(図25のS2502)。
【0281】コンテキスト復元関数(図24)は、ま
ず、割り込みスタックから復帰実行スレッドハンドルを
ポップし、カレント実行スレッドハンドルに設定する
(図24のS2401)。この値は、メイン処理スレッ
ドハンドルである。
【0282】そしてさらに、割り込みスタックから復帰
同期セマフォハンドルをポップし、カレント同期セマフ
ォハンドルに設定する(図24のS2402)。この値
は、メイン処理の同期セマフォハンドルである。
【0283】そしてさらに、割込みスタックから復帰割
り込みレベルをポップし、現在の割り込みレベルとする
(図24のS2403、図27のS2719)。この値
は、0である。
【0284】そしてさらに、割り込みスタックから非同
期フラグをポップし(図24のS2404)、その値を
呼び出し元にリターンする。この値は、メイン処理が非
同期に制御を失ったことを示す値1である。
【0285】コンテキスト復元関数からリターンした、
割り込みからの復帰関数(図25)は、さらに、このタ
イミングで新たな割り込みを起動する必要があるかどう
かを調べるため、割込み要求レベルと割り込みレベルを
比較する(図25のS2503)。ここでは、割込み要
求レベルと割り込みレベルはともに値0であるため、新
たな割り込みを起動する必要はない。
【0286】割り込みからの復帰関数は、さらに、コン
テキスト復元関数のリターン値を調べ、割込まれたスレ
ッドの復帰の方法を知る。ここでは同非同期フラグの値
は1であるため、復帰するスレッドは、強制的にサスペ
ンドされている。従って、カレント実行スレッドハンド
ルが指す復帰スレッド(メイン処理スレッド)をレジュ
ームし、強制サスペンド状態を解除する(図25のS2
505、図27のS2720)。
【0287】以上で、割り込みシミュレータが管理する
情報へのアクセスは終了し、且つ、この場合は排他アク
セス権を復帰スレッドには引き渡さないので、ジャイア
ントロックセマフォを開放し(図25のS2506、図
27のS2721)、リターンする。
【0288】割り込みからの復帰関数からリターンし
た、割り込み処理スレッド関数(図22)は再び、割り
込み同期セマフォ待ちループに入る(図22のS220
2、図27のS2722)。 [1.5.2. 割り込み許可フラグのセットによる、
同期割り込みシーケンス]図28は、ソフトウェアによ
って割り込み許可フラグをセットしたタイミングで割り
込みが発生したシーケンスを、割り込みシミュレータが
どのように処理するかを示す図であり、上述した図6に
示すシーケンスに対応する。図28において、上述した
図27と同様の処理については同一番号(2710,2
711,2720,2721,2722,2723,2
724,2730,2740,2741,2750)を
付す。また、周辺デバイススレッド#1の発生する割込
みのレベルは1とする。 [1.5.2.1. レベル1の割り込みスレッドのシ
ーケンス]図28において、レベル1の割り込みスレ
ッド2711は、割り込みスレッド簡数(図22)に、
スレッド引数として、割り込みレベル1を渡すことで処
理を開始する。
【0289】そして、レベル1の割り込みスレッド(図
28の2711)のコンテキストで実行する、割り込み
スレッド関数(図22)は、まず、割込みの応答性をよ
くするため、自身のスレッド優先度をメイン処理スレッ
ド(図28の2710)よりも高くする(図22のS2
201)。
【0290】そして、割り込みスレッド関数は、割り込
みレベル値(値1)に対応した割り込み起動が発生する
まで、対応した同期セマフォ(図28の2741)の待
ち状態に入る(図28のS2801、図22のS220
2)。 [1.5.2.2. 周辺デバイススレッド#1のシー
ケンス]図28において、周辺デバイススレッド♯1
(2130)は、周辺デバイススレッド関数(図26)
に、スレッド引数として、割り込み番号(値1)を渡す
ことにより、処理を開始する。
【0291】周辺デバイススレッド関数(図26)は、
まず、割込みの応答性をよくするため、自身のスレッド
優先度を通常よりも高くする(図26のS2601)。
そして、デバイス内部のイベント待ち状態に入る(図2
6のS2602)。 [1.5.2.3. 周辺デバイススレッド#1のシー
ケンス]このタイミングで、図26の周辺デバイスス
レッド関数のS2602において、待ち状態にあった周
辺デバイススレッド♯1(図28の2730)に内部イ
ベントが発生したとする。
【0292】同スレッドは、ジャイアントロックセマフ
ォを獲得し(図26のS2603、図28のS280
2)、発生した内部イベントを処理し(図26のS26
04)、割り込み要因が発生したかどうかを調べる(図
26のS005)。ここでは、割り込み要因が発生した
場合を想定している。
【0293】そしてさらに、周辺デバイススレッド関数
(図26)は、割り込み要因フラグ#1をセットするた
めに、割り込み番号(値は1)を引数として、割り込み
要因フラグセット関数(図15)をコールする(図26
のS2606)。
【0294】周辺デバイススレッド♯1のコンテキスト
でコールされた、割り込み要因フラグセット関数(図1
5)は、まず、既に割り込み要因がセットされているか
を調べるが(図15のS1501)、ここではクリアさ
れているので、割り込み要因フラグ#1(図28の27
24)をセットする(図28のS2803、図15のS
1502)。
【0295】そして、更に割り込み要因セット関数は、
割込み要求レベルを変更すべきか否かを調べるため、割
り込み許可フラグ#1(図28の2723)をテストす
る。ここでは、割り込み許可フラグ#1(図28の27
23)はセットされていないため、それ以上の処理は必
要ない。従って、ジャイアントロックセマフォを開放し
(図15のS1508、図28のS2804)、リター
ンする。
【0296】割り込み要因セット関数からリターンした
周辺デバイススレッド関数(図26)は、再び、デバイ
スの内部イベント待ち状態に入る(図26のS260
2)。 [1.5.2.4. メイン処理スレッドのシーケンス
]ここで、メイン処理スレッドにおいて割り込みを受
け付ける準備が整い、割り込み許可フラグ#1をセット
するために、割り込み許可フラグセット関数をコールし
た場合を考える。
【0297】割り込み許可フラグセット関数(図12)
は、まず、割り込みシミュレータが管理する情報への排
他アクセス権を得るため、ジャイアントロックセマフォ
を獲得する(図12のS1201、図28のS280
5)。
【0298】そしてさらに、割り込み許可フラグ#1が
既にセットされていないかを調べる(図12のS120
2)が、ここでは同フラグはクリアされているので、実
際に割り込み許可フラグ#1をセットする(図12のS
1203、図28のS2806)。
【0299】そしてさらに、割込み要求状態変数♯1を
変更すべきか否かを調べるため、割り込み要因フラグ#
1をテストする(図12のS1204)。そして、同フ
ラグがONであるため、割込み要求状態変数♯1をセッ
トし(図12のS1205)、割込み要求レベルと該当
する割り込み番号を再計算するために、割込み要求レベ
ル計算関数をコールする。
【0300】割込み要求レベル計算関数は、アサートさ
れている割込み要求状態変数の中で最大の割り込みレベ
ルを計算し、その値を割込み要求レベル変数(図10の
1281)にセットし、対応する割り込みを要求してい
る割込みの番号を、割り込み番号変数(図10の128
8)にセットする。ここでは、割込み要求状態変数#1
(図10の1282)のみがセット状態にあるため、割
込み要求レベル変数(図10の1281)は値1とな
り、割り込み番号(図10の1288)は値1となる
(図28のS2807)。
【0301】割り込みレベル計算関数からリターンし
た、割り込み許可フラグセット関数(図12)は、さら
に、割り込みを起動する必要があるかどうかを調べるた
め、割込み要求レベル(図28の2722、図10の1
281)と割り込みレベル(図28の2721、図10
の1220)を比較する(図12のS1207)。ここ
では、割込み要求レベルは値1であり、割り込みレベル
は値0であるため、同期割り込み起動関数をコールする
(図12のS1208)。
【0302】同期割り込み起動関数(図21)は、ま
ず、カレント同期セマフォハンドル(ここではメイン処
理の同期セマフォを指す)をローカル変数hOldSyncに待
避し(図21のS2101)、非同期フラグ引数を0と
して、コンテキスト保存関数をコールする(図21のS
2102)。
【0303】コンテキスト保存関数(図18)は、ま
ず、引数で渡された非同期フラグ(ここでは値0)を割
り込みスタックにプッシュし(図18のS1801)、
割り込みレベル(値は0)を割り込みスタックにプッシ
ュし(図18のS1802)、カレント同期セマフォハ
ンドル(メイン処理の同期セマフォを指す)を割り込み
スタックにプッシュし(図18のS1803)、カレン
ト実行スレッドハンドル(メイン処理スレッドを指す)
を割り込みスタックにプッシュし、呼び出し元の、同期
割り込み起動関数(図21)にリターンする。
【0304】以上により割り込みスタックには、メイン
処理スレッドのコンテキストと、メイン処理スレッドは
自らの処理によって同期的にCPUを開放したという事
実が保存される。
【0305】コンテキスト保存関数からリターンした同
期割り込み起動関数(図21)は、更にコンテキストス
イッチ関数(図19)をコールする(図21のS210
3)。
【0306】コンテキストスイッチ関数(図19)は、
まず、割込み要求レベル(ここでは値1)を割り込みレ
ベルにコピーし(図19のS1901)、割り込みレベ
ルを値1に上昇させる(図28のS2808)。これに
より、以降、レベル1以下の割込み要求は保留される。
【0307】そしてさらに、割込み要求レベル(値1)
に対応した割り込み同期セマフォハンドルをカレント同
期セマフォハンドルにコピーし(図19のS190
2)、そして、割込み要求レベル(値1)に対応した割
り込みスレッドハンドルをカレント実行スレッドハンド
ルハンドルにコピーする(図19のS1903)。
【0308】そしてさらに、新たにカレントとなった同
期セマフォハンドル、つまり、レベル1の割り込み同期
セマフォハンドル(図28の2741)にシグナルを送
り(図28のS2809)、リターンする。
【0309】コンテキストスイッチ関数からリターンし
た同期割り込み起動関数(図21)は更に、ローカル変
数の保存していたhOldSync、ここではメイン処理に対応
する同期セマフォに対する待ち状態に入る(図21のS
2104、図28のS2810)。この時、ジャイアン
トロックセマフォによる、割り込みシミュレータが管理
する情報への排他アクセス権は、コンテキストスイッチ
関数が活性化したスレッド(ここではレベル1の割り込
みスレッド)に引き渡される。 [1.5.2.5. レベル1の割り込み処理スレッド
のシーケンス]割り込みスレッド関数(図22)で、
割り込み同期セマフォを待ってブロックしていたレベル
1の割り込みスレッド(図28の2711)は、メイン
処理スレッドが同セマフォにシグナルを送信したため、
ブロック状態から開放される(図28のS2811)。
【0310】するとレベル1の割り込みスレッドは、割
り込み番号(値は1)をローカル変数noに待避し(図
22のS2203、図28のS2812)、ジャイアン
トロックセマフォを開放する(図22のS2204、図
28のS2813)。
【0311】そして割り込みスレッド関数は更に、自身
のスレッド優先度を通常のレベルまで下げ(図22のS
2205)、割り込み番号no(値は1)に対応する割
り込みハンドラをコールする(図22のS2206)。
【0312】レベル1の割り込みスレッドのコンテキス
トでコールされた割り込みハンドラは、割り込み発生時
に必要な処理を行った後、割り込み要因を取り下げるた
め、割り込み要因クリア関数(図11)をコールする。
【0313】割り込み要因クリア関数(図11)は、ま
ず、割り込みシミュレータが管理する情報への排他アク
セス権を得るため、ジャイアントロックセマフォを獲得
する(図11のS1101、図28のS2814)。
【0314】そして更に、既に割り込み要因フラグ#1
がクリア済みであるかどうかを調べ(図11のS110
2)、セット状態であるので、実際に同要求フラグをク
リアする(図11のS1103、図28のS281
5)。
【0315】そして更に、割込み要求状態#1(図10
の1282)を変更すべきか否かを調べるため、割り込
み許可フラグ#1(図10の1260)をテストする
(図11のS1104)。
【0316】ここでは割り込み許可フラグ#1がセット
されているので、割込み要求状態変数#1をクリアし、
割込み要求レベル(図10の1281)と割り込み番号
(図10の1288)を再計算するために、割り込みレ
ベル計算関数をコールする(図11のS1106)。
【0317】割り込みレベル計算関数は、全ての割込み
要求状態変数(図10の1282,1283,128
4)がクリアされていることを検出し、割込み要求レベ
ル(図10の1281)に値0をセットし、割り込み番
号(図10の1288)を不定の値とする(図28のS
2816)。
【0318】割り込みレベル計算関数からリターンした
割り込み要因フラグクリア関数(図11)は、これ以上
の処理を必要としないので、ジャイアントロックセマフ
ォを開放し(図11のS1107、図28のS281
7)、リターンする。
【0319】割り込み要因フラグクリア関数からリター
ンした、割り込み番号1の割り込みハンドラは、更に他
の処理を行った後、リターンする。
【0320】割り込みハンドラからリターンした割り込
みスレッド関数(図22)は、自身のスレッド優先度を
再び上昇させた後、割り込み処理を終了させるため、割
り込みからの復帰関数(図25)をコールする(図22
のS2208)。
【0321】割り込みからの復帰関数(図25)は、ま
ず、割り込みシミュレータが管理する情報への排他アク
セス権を獲得するため、ジャイアントロックセマフォを
獲得する(図25のS2501、図28のS281
8)。
【0322】そして更に、割り込みスタックから復帰コ
ンテキストを復元するため、コンテキスト復元関数(図
24)をコールする(図25のS2502)。
【0323】コンテキスト復元関数(図24)は、ま
ず、割り込みスタックから復帰実行スレッドハンドルを
ポップし、カレント実行スレッドハンドルに設定する
(図25のS2501)。この値は、メイン処理スレッ
ドハンドルである。
【0324】そしてさらに、割り込みスタックから復帰
同期セマフォハンドルをポップし、カレント同期セマフ
ォハンドルに設定する(図25のS2502)。この値
は、メイン処理の同期セマフォハンドルである。
【0325】そしてさらに、割込みスタックから復帰割
り込みレベルをポップし、現在の割り込みレベルとする
(図25のS2503、図28のS2819)。この値
は、0である。
【0326】そしてさらに、割り込みスタックから非同
期フラグをポップし(図25のS2504)、その値を
呼び出し元にリターンする。この値は、メイン処理が同
期的に制御を失ったことを示す値0である。
【0327】コンテキスト復元関数からリターンした、
割り込みからの復帰関数(図25)は、さらに、このタ
イミングで新たな割り込みを起動する必要があるかどう
かを調べるため、割込み要求レベルと割り込みレベルを
比較する(図25のS2503)。ここでは、割込み要
求レベルと割り込みレベルはともに値0であるため、新
たな割り込みを起動する必要はない。
【0328】割り込みからの復帰関数はさらに、コンテ
キスト復元関数のリターン値を調べ、割込まれたスレッ
ドの復帰の方法を知る。ここでは、非同期フラグの値は
0であるため、復帰するスレッドは同期セマフォを待っ
ている。従って、カレント同期セマフォにシグナルを送
り、メインタスクを待ち状態から解除する(図25のS
2507、図28のS2820)。
【0329】以上で、割り込みシミュレータが管理する
情報へのアクセスは終了したが、この場合は排他アクセ
ス権を復帰スレッド(メイン処理スレッド)には引き渡
すので、ジャイアントロックセマフォを操作することな
く、単純にリターンする。
【0330】割り込みからの復帰関数からリターンした
割り込み処理スレッド関数(図22)は、再び割り込み
同期セマフォ待ちループに入る(図22のS2202、
図28のS2821)。 [1.5.2.6. メイン処理スレッドのシーケンス
]同期割り込み起動関数でメイン処理の同期セマフォ
を待っていた(図21のS2104)メイン処理スレッ
ドは、待ち状態から解除され(図28のS2822)、
同期割り込み起動関数からリターンする。
【0331】同期割り込み起動関数からリターンした割
り込み許可フラグセット関数(図12)は、このタイミ
ングで、レベル1の割り込みスレッドから引き渡された
ジャイアントロックセマフォを開放し(図12のS12
09、図28のS2823)、リターンする。 [1.5.3 割り込みレベル変更による、同期割り込
みシーケンス]図29は、ソフトウェアによって一定期
間割り込みレベルを上げることで、そのレベル以下の割
り込みを一時的に保留させた場合に、同期間内に割込み
要求が発生し、ソフトウェアが割り込みレベルを元に戻
した瞬間に割り込みが受け付けられたシーケンスを、割
り込みシミュレータがどのように処理するかを示す図で
あり、上述した図7に示すシーケンスに対応する。図2
9において、上述した図27と同様の処理については同
一番号(2710,2711,2720,2721,2
722,2723,2724,2730,2740,2
741,2750)を付す。また、周辺デバイススレッ
ド#1の発生する割込みのレベルは1とする。 [1.5.3.1. レベル1の割り込みスレッドのシ
ーケンス]図29において、レベル1の割り込みスレ
ッド2711は、割り込みスレッド関数(図22)に、
スレッド引数として、割り込みレベル値1を渡すことで
処理を開始する。
【0332】そして、レベル1の割り込みスレッド(図
29の2711)のコンテキスト上で実行される割り込
みスレッド関数(図22)は、まず、割込みの応答性を
よくするため、自身のスレッド優先度をメイン処理スレ
ッド(図29の2710)よりも高くする(図22のS
2201)。
【0333】そして割り込みスレッド関数は、割り込み
レベル値(値1)に対応した割り込み起動が発生するま
で、対応した同期セマフォ(図29の2741)の待ち
状態に入る(図29のS2901、図22のS220
2)。 [1.5.3.2. 周辺デバイス#1スレッドのシー
ケンス]図29において、周辺デバイススレッド#1
(2730)は、周辺デバイススレッド関数(図26)
に、スレッド引数として割り込み番号(値1)を渡すこ
とにより、処理を開始する。
【0334】周辺デバイススレッド関数(図26)は、
まず、割込みの応答性をよくするため、自身のスレッド
優先度を通常よりも高くする(図26のS2601)。
【0335】そして、デバイス内部のイベント待ち状態
に入る(図26のS2602)。 [1.5.3.3. メイン処理スレッドのシーケンス
]このタイミングで、メイン処理スレッドが割り込み
を受信する準備ができ、割り込み許可フラグ#1をセッ
トするために、割り込み許可フラグセット関数をコール
する。
【0336】割り込み許可フラグセット関数(図12)
は、まず最初に、割り込みシミュレータが管理する情報
への排他アクセス権を獲得するため、ジャイアントロッ
クセマフォを獲得する(図12のS1201,図29の
S2902)。
【0337】そしてさらに、既に割り込み許可フラグ#
1がセットされているかどうかを調べ(図12のS12
02)、クリアされているので、実際に同フラグをセッ
トする(図12のS1203、図29のS2903)。
【0338】そしてさらに、割込み要求状態変数#1を
変更すべきか否かを調べるため、割り込み要因フラグ#
1をテストする(図12のS1204)。ここでは同フ
ラグがクリアされているため、それ以上の処理は必要な
く、ジャイアントロックを開放し(図12のS120
7、図29のS2904)、リターンする。
【0339】割り込み許可フラグセット関数からリター
ンしたメイン処理スレッドは、さらに、これから一定期
間の間、レベル1以下の割り込みを保留したいため、割
り込みレベル変更関数を引数1でコールする。
【0340】割り込みレベル変更関数(図14)は、ま
ず、割り込みシミュレータが管理する情報への排他アク
セス権を獲得するため、ジャイアントロックセマフォを
獲得する(図14のS1401,図29のS290
5)。
【0341】そしてさらに、割り込みレベルに引数で渡
された値1を代入する(図14のS1402、図29の
S2906)。
【0342】そしてさらに、割り込みを起動しなければ
ならないかどうかを調べるため、割込み要求レベルと割
り込みレベルを比較する(図14のS1403)。ここ
では、割込み要求レベル(値は0)が割り込みレベル
(値は1)以下であるので、それ以上の処理は必要な
く、ジャイアントロックセマフォを開放し(図14のS
1405、図29のS2907)、リターンする。 [1.5.3.4. 周辺デバイススレッド#1のシー
ケンス]メイン処理スレッドが割り込みレベルを1に
引き上げているタイミングで、周辺デバイス#1に内部
イベントが発生し、周辺デバイススレッド#1が待ち状
態から開放されたとする。
【0343】周辺デバイススレッド#1は、周辺デバイ
ススレッド関数(図26)において、ジャイアントロッ
クセマフォを獲得し(図26のS2603、図29のS
2908)、発生した内部イベントを処理し(図26の
S2604)、割り込み要因が発生したかどうかを調べ
る(図26のS2605)。ここでは、割り込み要因が
発生した場合を想定している。
【0344】そしてさらに周辺デバイススレッド関数
(図26)は、割り込み要因フラグ#1をセットするた
めに、割り込み番号(値は1)を引数として、割り込み
要因フラグセット関数(図15)をコールする(図26
のS2606)。
【0345】周辺デバイススレッド♯1のコンテキスト
でコールされた割り込み要因フラグセット関数(図1
5)はまず、既に割り込み要因がセットされているかを
調べるが(図15のS1501)、ここではクリアされ
ているので、割り込み要因フラグ#1(図29の272
4)をセットする(図29のS2909、図15のS1
502)。
【0346】更に割り込み要因セット関数は、割込み要
求状態変数#1を変更する必要があるかどうかを調べる
ため、割り込み許可フラグ♯1(図29の2723)を
テストする。ここでは、割り込み許可フラグ#1(図2
9の2723)はセットされているため、割込み要求状
態変数#1をセットし(図15のS1504)、割込み
要求レベルと該当する割り込み番号を再計算するため
に、割込み要求レベル計算関数をコールする(図15の
S1505)。
【0347】割込み要求レベル計算関数は、割込み要求
状態変数#1のみがセットされていることを検出し、割
込み要求レベルに値1を、割り込み番号に値1を設定す
る(図29のS2910)。
【0348】割込み要求レベル計算関数からリターンし
た割り込み要領フラグセット関数(図15)は、割り込
みを起動する必要があるかどうかを調べるため、割込み
要求レベルと割り込みレベルを比較する(図15のS1
506)。ここでは、割込み要求レベル(値は1)と割
り込みレベル(値は1、メイン処理スレッドにより設
定)が等しいため、それ以上の処理は必要なく、ジャイ
アントロックセマフォを開放し(図15のS1508、
図29のS2911)、リターンする。
【0349】割り込み要因セット関数からリターンした
周辺デバイススレッド関数(図26)は再び、デバイス
の内部イベント待ち状態に入る(図26のS260
2)。 [1.5.3.5. メイン処理スレッドのシーケンス
]ここで、メイン処理スレッドがきわどいコード領域
を脱出したため、割り込みレベルを元に戻したとする。
この場合、割り込みレベル変更関数を引数0でコールす
る。
【0350】割り込みレベル変更関数(図14)は、ま
ず、割り込みシミュレータが管理する情報への排他アク
セス権を獲得するため、ジャイアントロックセマフォを
獲得する(図14のS1401、図29のS291
2)。
【0351】そしてさらに、割り込みレベルに引数で指
定された値(0)を代入する(図29のS2913)。
そして新たな割り込みを起動する必要があるかどうか調
べるため、割込み要求レベルと割り込みレベルを比較す
る(図14のS1403)。ここでは、割込み要求レベ
ル(値は1)が割り込みレベル(値は0)より大きいの
で、同期割り込み起動関数をコールする(図14のS1
404)。
【0352】同期割り込み起動関数(図21)は、まず
最初に、カレント同期セマフォハンドル(メイン処理の
同期セマフォを指す)をローカルのhOldSync変数に待避
し(図21のS2101)、そして非同期フラグ引数を
0として、コンテキスト保存関数をコールする。
【0353】コンテキスト保存関数(図18)は、引数
で渡された非同期フラグ(値は0)を割り込みスタック
にプッシュし(図18のS1801)、割り込みレベル
(値は0)を割り込みスタックにプッシュし(図18の
S1802)、カレント同期セマフォハンドル(メイン
処理の同期セマフォを指す)を割り込みスタックにプッ
シュし(図18のS1803)、カレント実行スレッド
ハンドル(メイン処理スレッドを指す)を割り込みスタ
ックにプッシュし(図18のS1804)、リターンす
る。
【0354】以上でメイン処理のコンテキストが割り込
みスタックに保存されたコンテキスト保存関数からリタ
ーンした、同期割り込み起動関数(図21)は、さら
に、割り込みレベルに対応する割り込みを起動するた
め、コンテキストスイッチ関数(図19)をコールす
る。
【0355】コンテキストスイッチ関数(図19)は、
まず最初に、割込み要求レベル(値は1)を割り込みレ
ベルにコピーし(図19のS1901、図29のS29
14)、以降、レベル1以下の割込み要求を保留させ
る。
【0356】そしてさらに、割込み要求レベル(値1)
の割り込み同期セマフォハンドルをカレント同期セマフ
ォハンドルにコピーし(図19のS1902)、割込み
要求レベル(値1)の割り込みスレッドハンドルをカレ
ント実行スレッドハンドルにコピーする(図19のS1
903)。
【0357】そしてさらに、新規のカレント同期セマフ
ォハンドル(レベル1の割り込み同期セマフォを指す)
にシグナルを送り(図19のS1904、図29のS2
915)、リターンする。
【0358】コンテキストスイッチ関数からリターンし
た同期割り込み起動関数(図21)は、さらに、ローカ
ル変数に待避したhOldSync変数(メイン処理の同期セマ
フォを指す)に対する待ち状態に入る(図21のS21
04、図29のS2916)。この時、ジャイアントロ
ックセマフォによる排他アクセス権は、コンテキストス
イッチ関数が活性化したスレッド(ここではレベル1の
割り込みスレッド)に引き渡す。 [1.5.3.6. レベル1の割り込みスレッドのシ
ーケンス]割り込みスレッド関数(図22)で、割り
込み同期セマフォを待ってブロックしていたレベル1の
割り込みスレッド(図29の101)は、メイン処理ス
レッドが同セマフォにシグナルを送信したため、ブロッ
ク状態から開放される(図29のS2917)。
【0359】以降のシーケンスは、図28に示したS2
811以降のシーケンスと同様であるため、説明を省略
する。 [1.5.4 低優先→高優先の割込み要求による、多
重割り込みシーケンス]図30A,Bは、低優先の割り
込み処理の実行中に、高優先の割り込み処理が割込んだ
場合のシーケンスを、割り込みシミュレータがどのよう
に処理するかを示す図であり、上述した図8に示すシー
ケンスに対応する。
【0360】図30A,Bにおいて、2710はメイン
処理スレッドの処理、2711はレベル1の割り込みス
レッドの処理、2712はレベル3の割り込みスレッド
の処理、2730は周辺デバイススレッド♯1の処理、
2731は周辺デバイススレッド#2の処理、をそれぞ
れ示す。
【0361】また、2720は割り込み番号の履歴、2
721は割り込みレベルの履歴、22722は割込み要
求レベルの履歴を、2723は割り込み許可フラグ#1
の履歴を、2724は割り込み要因フラグ♯1の履歴
を、2725は割り込み許可フラグ#2の履歴を、27
26は割り込み要因フラグ#1の履歴を、それぞれ示
す。
【0362】また、2740,2741,2742はそ
れぞれ、メイン処理の同期セマフォ、レベル1の割り込
み同期セマフォ、レベル3の割り込み同期セマフォの状
態変化を示す(太線はシグナル状態を示す)。また、2
750はジャイアントロックセマフォの状態変化を示す
(太線はジャイアントロックが獲得されている状態、即
ちセマフォカウントが0であることを示す)。
【0363】また、周辺デバイススレッド#1及び周辺
デバイススレッド#2の発生する割込みのレベルは、そ
れぞれ1及び3とする。 [1.5.4.1. レベル1の割り込みスレッドのシ
ーケンス]図30Aにおいて、レベル1の割り込みス
レッド2711は、割り込みスレッド関数(図22)
に、スレッド引数として割り込みレベル1を渡すことで
処理を開始する。
【0364】そして、レベル1の割り込みスレッド(図
30Aの2711)のコンテキスト上で実行する、割り
込みスレッド関数(図22)は、まず割込みの応答性を
よくするため、自身のスレッド優先度をメイン処理スレ
ッド(図30Aの2710)よりも高くする(図22の
S2201)。
【0365】そして割り込みスレッド関数は、割り込み
レベル値(値1)に対応した割り込み起動が発生するま
で、対応した同期セマフォ(図30Aの2741)の待
ち状態に入る(図30AのS3001、図22のS22
02)。 [1.5.4.2. レベル3の割り込みスレッドのシ
ーケンス]また、レベル3の割り込みスレッド(図3
0Aの2712)は、割り込みスレッド関数(図22)
に、スレッド引数として割り込みレベル3を渡すことで
処理を開始する。
【0366】そして、レベル3の割り込みスレッド(図
30Aの2712)のコンテキスト上で実行する割り込
みスレッド関数(図22)は、まず割込みの応答性をよ
くするため、自身のスレッド優先度をメイン処理スレッ
ド(図30Aの2710)よりも高くする(図22のS
2201)。
【0367】そして割り込みスレッド関数は、割り込み
レベル値(値3)に対応した割り込み起動が発生するま
で、レベル3の割り込み同期セマフォ(図30Aの27
42)の待ち状態に入る(図30AのS3002、図2
2のS2202)。 [1.5.4.3. 周辺デバイススレッド♯1のシー
ケンス]また図30Aにおいて、周辺デバイススレッ
ド#1(2730)は、周辺デバイススレッド関数(図
26)に、スレッド引数として割り込み番号(値1)を
渡すことにより、処理を開始する。
【0368】周辺デバイススレッド関数(図26)は、
まず割込みの応答性をよくするため、自身のスレッド優
先度を通常よりも高くする(図26のS2601)。そ
して、デバイスの内部イベント待ち状態に入る(図26
のS2602)。 [1.5.4.4. 周辺デバイススレッド♯2のシー
ケンス]また、周辺デバイススレッド♯2(273
1)は、周辺デバイススレッド関数(図26)に、スレ
ッド引数として割り込み番号(値2)を渡すことによ
り、処理を開始する。
【0369】周辺デバイススレッド関数(図26)は、
まず割込みの応答性をよくするため、自身のスレッド優
先度を通常よりも高くする(図26のS2601)。そ
して、デバイスの内部イベント待ち状態に入る(図26
のS2602)。 [1.5.4.5 メイン処理スレッドのシーケンス
]このタイミングで、メイン処理スレッドが割り込み
を受信する準備ができ、割り込み許可フラグ#1をセッ
トするために、割り込み許可フラグセット関数(図1
2)をコールしたとする。
【0370】割り込み許可フラグセット関数(図12)
は、まず最初に、割り込みシミュレータが管理する情報
への排他アクセス権を獲得するため、ジャイアントロッ
クセマフォを獲得する(図12のS1201、図30A
のS3003)。
【0371】そしてさらに、既に割り込み許可フラグ♯
1がセットされているかどうかを調べ(図12のS12
02)、クリアされているので、実際に同フラグをセッ
トする(図12のS1203、図30AのS300
4)。
【0372】そしてさらに、割込み要求状態変数♯1を
変更すべきか否かを調べるため、割り込み要因フラグ#
1をテストする(図12のS1204)。ここでは同フ
ラグがクリアされているため、それ以上の処理は必要な
く、ジャイアントロックセマフォを開放し(図12のS
1207、図30AのS3005)、リターンする。
【0373】割り込み許可フラグセット関数からリター
ンしたメイン処理スレッドは、さらに割り込み許可フラ
グ#2をセットするために、引数2で割り込み許可フラ
グセット関数をコールする。
【0374】割り込み許可フラグセット関数は、同様
に、ジャイアントロックセマフォを獲得し(図30Aの
S3006)、割り込み許可フラグ#2をセットし(図
30AのS3007)、ジャイアントロックセマフォを
開放し(図30のS3008)、リターンする。 [1.5.4.6. 周辺デバイススレッド♯1のシー
ケンス]このタイミングで、周辺デバイス#1に内部
イベントが発生し、周辺デバイススレッド♯1が待ち状
態から開放されたとする。
【0375】周辺デバイススレッド#1は、周辺デバイ
ススレッド関数(図26)においてジャイアントロック
セマフォを獲得し(図26のS2603、図30AのS
3009)、発生した内部イベントを処理し(図26の
S2604)、割り込み要因が発生したかどうかを調べ
る(図26のS2605)。ここでは、割り込み要因が
発生した場合を想定している。
【0376】そしてさらに、周辺デバイススレッド関数
(図26)は、割り込み要因フラグ#1をセットするた
めに、割り込み番号(値は1)を引数として割り込み要
因フラグセット関数(図15)をコールする(図26の
S2606)。
【0377】周辺デバイススレッド#1のコンテキスト
でコールされた割り込み要因フラグセット関数(図1
5)は、まず、既に割り込み要因がセットされているか
を調べるが(図15のS1501)、ここではクリアさ
れているので、割り込み要因フラグ#1(図30Aの2
724)をセットする(図30AのS3010、図15
のS1502)。
【0378】そして、更に割り込み要因セット関数は、
割込み要求状態変数#1を変更する必要があるかどうか
を調べるため、割り込み許可フラグ♯1をテストする
(図15のS1503)。ここでは、割り込み許可フラ
グ#1はセットされているため、割込み要求状態変数#
1をセットし(図15のS1504)、割込み要求レベ
ルと該当する割り込み番号を再計算するために、割込み
要求レベル計算関数をコールする(図15のS150
5)。
【0379】割込み要求レベル計算関数は、割込み要求
状態変数♯1のみがセットされていることを検出し、割
込み要求レベルに値1を、割り込み番号に値1を設定す
る(図30AのS3011)。
【0380】割込み要求レベル計算関数からリターンし
た割り込み要因フラグセット関数(図15)は、割り込
みを起動する必要があるかどうかを調べるため、割込み
要求レベルと割り込みレベルを比較する(図15のS1
506)。ここでは、割込み要求レベル(値は1)が割
り込みレベル(値は0)より大きいため、非同期割り込
み起動関数(図20)をコールする(図15のS150
7)。
【0381】非同期割り込み起動関数(図20)は、ま
ず最初に、カレント実行スレッド(メイン処理スレッ
ド)をサスペンドし、メイン処理の実行を強制的に停止
させる(図20のS2001、図30AのS301
2)。
【0382】そしてさらに、非同期フラグ引数の値を1
として、コンテキスト保存処理関数(図18)をコール
する(図20のS2002)。
【0383】コンテキスト保存処理関数(図18)は、
まず最初に、引数で渡された非同期フラグ(値は1)を
割り込みスタックにプッシュし(図18のS180
1)、割り込みレベル(値は0)を割り込みスタックに
プッシュし(図18のS1802)、カレント同期セマ
フォハンドル(メイン処理の同期セマフォを指す)を割
り込みスタックにプッシュし(図18のS1803)、
カレント実行スレッドハンドル(メイン処理スレッドを
指す)を割り込みスタックにプッシュし(図18のS1
804)、呼び出し元にリターンする。
【0384】コンテキスト保存処理関数からリターンし
た、非同期割り込み起動関数(図20)は更に、コンテ
キストスイッチ関数(図19)をコールして(図20の
S2003)、割込み要求レベルの割り込み処理を起動
する。
【0385】コンテキストスイッチ関数(図19)は、
まず最初に、割込み要求レベル(値は1)を割り込みレ
ベルにコピーする(図19のS1901、図30AのS
3013)。
【0386】そしてさらに、割込み要求レベル(値は
1)の割り込み同期セマフォハンドルをカレントの同期
セマフォハンドルにコピーし(図19のS1902)、
割込み要求レベル(値は1)の割り込みスレッドハンド
ルをカレントの実行スレッドハンドルにコピーする(図
19のS1903)。
【0387】そしてさらに、新しいカレント同期セマフ
ォハンドル(レベル1の割り込み同期セマフォを指す)
にシグナルを送る(図19のS1904、図30AのS
3014)。
【0388】コンテキストスイッチ関数からリターンし
た非同期割り込み起動関数(図20)は、割り込み要因
フラグセット関数(図15)にリターンし、割り込み要
因フラグセット関数は、周辺デバイススレッド関数(図
26)にリターンする。
【0389】周辺デバイススレッド関数(図26)はさ
らに、周辺デバイス#1の内部イベントの待ちループに
入る(図26のS2602)。このとき、周辺デバイス
スレッド#1が獲得したジャイアントロックセマフォ
は、割込み起動したレベル1の割り込みスレッドに引き
渡す。 [1.5.4.7. レベル1の割り込みスレッドのシ
ーケンス]割り込みスレッド関数(図22)で、割り
込み同期セマフォを待ってブロックしていた(図22の
S2202)、レベル1の割り込みスレッド(図30A
の2711)は、周辺デバイススレッド#1が同セマフ
ォにシグナルを送信したため(図30AのS301
4)、ブロック状態から開放される(図30AのS30
15)。
【0390】レベル1の割り込みスレッドは、割り込み
スレッド関数(図22)においてさらに、割り込み番号
(値は1)をローカル変数noに待避し(図22のS2
203、図30AのS3016)、それ以上割り込みシ
ミュレータが管理する情報にアクセスする必要がないの
で、ジャイアントロックセマフォを開放する(図22の
S2204、図30のS3017)。
【0391】そしてさらに、レベル1の割り込みスレッ
ドは、自身のスレッド優先度を通常のレベルまで下げ
(図22のS2205)、割り込み番号1に対応する割
り込みハンドラをコールする(図22のS2206)。 [1.5.4.8. 周辺デバイススレッド#2のシー
ケンス]このタイミングで、割り込み番号1の割り込
みハンドラが実行中に、周辺デバイス#2に内部イベン
トが発生し、周辺デバイススレッド#2が待ち状態から
開放されたとする。
【0392】周辺デバイススレッド#2は、周辺デバイ
ススレッド関数(図26)においてジャイアントロック
セマフォを獲得し(図26のS2603、図30AのS
3018)、発生した内部イベントを処理し(図26の
S2604)、割り込み要因が発生したかどうかを調べ
る(図26のS2605)。ここでは、割り込み要因が
発生した場合を想定している。
【0393】そしてさらに、周辺デバイススレッド関数
(図26)は、割り込み要因フラグ#2をセットするた
めに、割り込み番号(値は2)を引数として割り込み要
因フラグセット関数(図15)をコールする(図26の
S2606)。
【0394】周辺デバイススレッド♯2のコンテキスト
でコールされた、割り込み要因フラグセット関数(図1
5)は、まず、既に割り込み要因がセットされているか
を調べるが(図15のS1501)、ここではクリアさ
れているので、割り込み要因フラグ#2をセットする
(図30AのS3019、図15のS1502)。
【0395】そして更に割り込み要因セット関数は、割
込み要求状態変数♯2を変更する必要があるかどうかを
調べるため、割り込み許可フラグ#2をテストする(図
15のS1503)。ここでは、割り込み許可フラグ#
2はセットされているため、割込み要求状態変数#2を
セットし(図15のS1504)、割込み要求レベルと
該当する割り込み番号を再計算するために、割込み要求
レベル計算関数をコールする(図15のS1505)。
【0396】割込み要求レベル計算関数は、割込み要求
状態変数♯1(割り込みレベルは1)と割込み要求状態
変数#2(割り込みレベルは3)がセットされているこ
とを検出し、割込み要求レベルに値3を、割り込み番号
に値2を設定する(図30AのS3020)。
【0397】割込み要求レベル計算関数からリターンし
た割り込み要因フラグセット関数(図15)は、割り込
みを起動する必要があるかどうかを調べるため、割込み
要求レベルと割り込みレベルを比較する(図15のS1
506)。ここでは、割込み要求レベル(値は3)が割
り込みレベル(値は1)より大きいため、非同期割り込
み起動関数(図20)をコールする(図15のS150
7)。
【0398】非同期割り込み起動関数(図20)は、ま
ず最初に、カレント実行スレッド(レベル1の割り込み
スレッド)をサスペンドし、レベル1の割り込みスレッ
ドの実行を強制的に停止させる(図20のS2001、
図30AのS3021)。
【0399】そしてさらに、非同期フラグ引数の値を1
として、コンテキスト保存処理関数(図18)をコール
する(図20のS2002)。
【0400】コンテキスト保存処理関数(図18)は、
まず最初に、引数で渡された非同期フラグ(値は1)を
割り込みスタックにプッシュし(図18のS180
1)、割り込みレベル(値は1)を割り込みスタックに
プッシュし(図18のS1802)、カレント同期セマ
フォハンドル(レベル1の割り込み同期セマフォを指
す)を割り込みスタックにプッシュし(図18のS18
03)、カレント実行スレッドハンドル(レベル1の割
り込みスレッドを指す)を割り込みスタックにプッシュ
し(図18のS1804)、呼び出し元にリターンす
る。
【0401】コンテキスト保存処理関数からりターシし
た非同期割り込み起動関数(図20)は更に、コンテキ
ストスイッチ関数(図19)をコールして(図20のS
2003)、割込み要求レベル(値は3)の割り込み処
理を起動する。
【0402】コンテキストスイッチ関数(図19)は、
まず最初に、割込み要求レベル(値は3)を割り込みレ
ベルにコピーする(図19のS1901、図30AのS
3022)。
【0403】そしてさらに、割込み要求レベル(値は
3)に対応する割り込み同期セマフォハンドルをカレン
トの同期セマフォハンドルにコピーし(図19のS19
02)、割込み要求レベル(値は3)に対応する割り込
みスレッドハンドルをカレントの実行スレッドハンドル
にコピーする(図19のS1903)。
【0404】そしてさらに、新しいカレント同期セマフ
ォハンドル(レベル3の割り込み同期セマフォを指す)
にシグナルを送る(図19のS1904、図30AのS
3023)。
【0405】コンテキストスイッチ関数からリターンし
た非同期割り込み起動関数(図20)は、割り込み要因
フラグセット関数(図15)にリターンし、割り込み要
因フラグセット関数は周辺デバイススレッド関数(図2
6)にリターンする。
【0406】周辺デバイススレッド関数(図26)はさ
らに、周辺デバイス#2の内部イベントの待ちループに
入る(図26のS2602)。このとき、周辺デバイス
スレッド#2が獲得したジャイアントロックセマフォ
は、割込み起動したレベル3の割り込みスレッドに引き
渡す。 [1.5.4.9. レベル3の割り込みスレッドのシ
ーケンス]割り込みスレッド関数(図22)で、割り
込み同期セマフォを待ってブロックしていた(図22の
S2202)、レベル3の割り込みスレッド(図30A
の2712)は、周辺デバイススレッド#2が同セマフ
ォにシグナルを送信したため(図30AのS302
3)、ブロック状態から開放される(図30AのS30
24)。
【0407】レベル3の割り込みスレッドは、割り込み
スレッド関数(図22)において、さらに、割り込み番
号(値は2)をローカル変数noに待避し(図22のS
2203、図30AのS3025)、それ以上割り込み
シミュレータが管理する情報にアクセスする必要がない
ので、ジャイアントロックセマフォを開放する(図22
のS2204、図30AのS3026)。
【0408】そしてさらに、レベル3の割り込みスレッ
ドは、自身のスレッド優先度を通常のレベルまで下げ
(図22のS2205)、割り込み番号2の割り込みハ
ンドラをコールする(図22のS2206)。
【0409】レベル3の割り込みスレッドのコンテキス
トでコールされた、割り込み番号2の割り込みハンドラ
は、必要な割り込み処理を実行した後、割り込み要因を
取り除くため、割り込み番号引数2で割り込み要因クリ
ア関数(図11)をコールする。
【0410】割り込み要因クリア関数(図11)は、ま
ず最初に、割り込みシミュレータが管理する情報への排
他アクセス権を得るため、ジャイアントロックセマフォ
を獲得する(図11のS1101、図30BのS302
7)。
【0411】そしてさらに、割り込み要因フラグ#2が
既にクリアされていないかを調べるが(図11のS11
02)、ここではセットされているので、実際に割り込
み要因フラグ#2をクリアする(図11のS1103、
図30BのS3028)。
【0412】そしてさらに、割込み要求状態#2を更新
すべきか否かを調べるため、割り込み許可フラグ♯2を
テストするが(図11のS1104)、同フラグがON
であるため、割込み要求状態#2を実際にクリアし(図
11のS1105)、割込み要求レベルと該当する割り
込み番号を再計算するため、割込み要求レベル計算関数
をコールする。
【0413】割込み要求レベル計算関数は、割込み要求
状態#1のみがセットされていることを検出し、割込み
要求レベルに値1を、割り込み番号に値1を設定する
(図30BのS3029)。
【0414】割込み要求レベル計算関数からリターンし
た割り込み要因フラグクリア関数(図11)は、これ以
上割り込みシミュレータが管理する情報にアクセスする
必要がないため、ジャイアントロックセマフォを開放し
(図11のS1107、図30BのS3030)、リタ
ーンする。
【0415】割り込み要因フラグクリア関数からリター
ンした割り込み番号2の割り込みハンドラは、更に必要
な処理を行ってリターンする。
【0416】割り込み番号2の割り込みハンドラからリ
ターンした割り込みスレッド関数(図22)は、さらに
スレッド優先度を上げ(図22のS2207)、割り込
みからの復帰関数をコールする。
【0417】割り込みからの復帰関数(図25)は、ま
ず最初に、割り込みシミュレータが管理する情報にアク
セスするためにジャイアントロックセマフォを獲得し
(図25のS2501、図30BのS3031)し、そ
してさらに、コンテキスト復元関数(図24)をコール
する(図25のS2502)。
【0418】コンテキスト復元関数(図24)は、まず
最初に、割り込みスタックから復帰実行スレッドハンド
ル(レベル1の割り込みスレッドを指す)をポップし、
カレント実行スレッドハンドルにコピーする(図24の
S2401)。
【0419】そしてさらに、割り込みスタックから復帰
同期セマフォハンドル(レベル1の割り込み同期セマフ
ォを指す)をポップし、カレント同期セマフォハンドル
にコピーする(図24のS2402)。
【0420】そしてさらに、割込みスタックから復帰割
り込みレベル(値は1)をポップし、割り込みレベルに
コピーする(図24のS2403、図30BのS303
2)。
【0421】そしてさらに、割り込みスタックから非同
期フラグ(値は1)をポップし(図24のS240
4)、その値を呼び出し元にリターンする。
【0422】コンテキスト復元関数からリターンした、
割り込みからの復帰関数(図25)は、リターン値(値
1)をローカル変数hfASyncに待避する(図25のS2
502)。
【0423】そしてさらに、新たな割り込みを起動する
必要があるかどうかを調べるため、割込み要求レベルと
割り込みレベルを比較する(図25のS2503)。こ
こでは、割込み要求レベル(値は1)と割り込みレベル
(値は1)が等しいので、新たな割り込みを起動する必
要はない。
【0424】そしてさらに、復帰スレッド(カレント実
行スレッドハンドルが指す、レベル1の割り込みスレッ
ド)の実行を再開させる方法を調べるために、ローカル
変数fAsyncをテストする(図25のS2504)。ここ
では、この値は1であり、復帰スレッド(レベル1の割
り込みスレッド)は非同期的に(強制的に)サスペンド
させられている。
【0425】従って、カレント実行スレッドハンドルが
指すスレッド(レベル1の割り込みスレッド)をレジュ
ームし、強制サスペンド状態から解除する(図25のS
2505、図30BのS3033)。
【0426】そしてさらに、これ以上割り込みシミュレ
ータが管理する情報にアクセスする必要がなく、実行再
開したスレッド(レベル1の割り込みスレッド)に排他
アクセス権を引き渡さないので、このタイミングで、ジ
ャイアントロックセマフォを開放し(図25のS250
6、図30BのS3034)、リターンする。
【0427】割り込みからの復帰関数からリターンした
割り込みスレッド関数(図22)は、引数で指定された
レベル(ここではレベル3)の、割り込み同期セマフォ
に対する待ち状態に入る(図22のS2202、図30
BのS3035)。 [1.5.4.10. レベル1の割り込みスレッドの
シーケンス]実行中に、非同期に強制サスペンド状態
にさせられた(図30AのS3021)、割り込み番号
1の割り込みハンドラは、レベル3の割り込みスレッド
が割込みからの復帰関数を実行することによって、再び
実行を再開する(図30BのS3033)。
【0428】実行を再開した割り込み番号1の割り込み
ハンドラは、割り込み要因を取り下げるため、割り込み
要因フラグクリア関数(図11)を実行後(図30Bの
S3036,S3037,S3038,S3039)、
リターンする。そして、割り込み番号1の割り込みハン
ドラからリターンしたレベル1の割り込みスレッド関数
(図22)は、割り込み復帰関数(図25)をコールし
(図30BのS3040,S3041,S3042,S
3043)、レベル1の割り込み同期セマフォに対する
待ち状態に入る(図22のS2202、図30BのS3
044)。これらの処理フローは、単一の割り込みから
の復帰のシナリオ(図27のS2714,S2715,
S2716,S2717,S2718,S2719,S
2720,S2721,S2722)と同様である。 [1.5.5. 高優先→低優先割込みによる、シーケ
ンシャルな割り込みシーケンス]図31A,Bは、高優
先の割り込み処理の実行中に、低優先の割り込み要求が
発生したものの高優先の割り込み処理が終了するまで待
たされ、高優先の割り込み処理が終了した途端に低優先
の割り込み処理が起動されるシーケンスを、割り込みシ
ミュレータがどのように処理するかを示す図であり、上
述した図9に示すシーケンスに対応する。
【0429】図31A,Bにおいて、上述した図30
A,Bと同様の処理には同一番号(2710,271
1,2712,2720,2721,2722,272
3,2724,2725,2730,2731,274
0,2741,2742,2750)を付す。また、周
辺デバイススレッド#1及び周辺デバイススレッド#2
の発生する割込みのレベルは、それぞれ1及び3とす
る。 [1.5.5.1. レベル1の割り込みスレッドのシ
ーケンス]図31Aにおいて、レベル1の割り込みス
レッド2711は、割り込みスレッド関数(図22)に
スレッド引数として割り込みレベル1を渡すことで処理
を開始する。
【0430】そして、レベル1の割り込みスレッド(図
31Aの2711)のコンテキスト上で実行する割り込
みスレッド関数(図22)は、まず割込みの応答性をよ
くするため、自身のスレッド優先度をメイン処理スレッ
ド(図31Aの2710)よりも高くする(図22のS
2201)。
【0431】そして、割り込みスレッド関数は、割り込
みレベル値(値1)に対応した割り込み起動が発生する
まで、対応した同期セマフォ(図31Aの2741)の
待ち状態に入る(図31AのS3101、図22のS2
202)。 [1.5.5.2. レベル3の割り込みスレッドのシ
ーケンス]また、レベル3の割り込みスレッド(図3
1Aの2712)は、割り込みスレッド関数(図22)
に、スレッド引数として割り込みレベル3を渡すことで
処理を開始する。
【0432】そして、レベル3の割り込みスレッド(図
31Aの2712)のコンテキスト上で実行する割り込
みスレッド関数(図22)は、まず割込みの応答性をよ
くするため、白身のスレッド優先度をメイン処理スレッ
ド(図31Aの2710)よりも高くする(図22のS
2201)。
【0433】そして、割り込みスレッド関数は、割り込
みレベル値(値3)に対応した割り込み起動が発生する
まで、レベル3の割り込み同期セマフォ(図31Aの2
742)の待ち状態に入る(図31AのS3102、図
22のS2202)。 [1.5.5.3. 周辺デバイススレッド#1のシー
ケンス]また、図31Aにおいて、周辺デバイススレ
ッド♯1(2730)は、周辺デバイススレッド関数
(図26)に、スレッド引数として割り込み番号(値
2)を渡すことにより、処理を開始する。
【0434】周辺デバイススレッド関数(図26)は、
まず割込みの応答性をよくするため、自身のスレッド優
先度を通常よりも高くする(図26のS2601)。そ
して、デバイス内部のイベント待ち状態に入る(図26
のS2602)。 [1.5.5.4. 周辺デバイススレッド#2のシー
ケンス]また、周辺デバイススレッド#2(図31A
の2731)は、周辺デバイススレッド関数(図26)
に、スレッド引数として割り込み番号(値2)を渡すこ
とにより、処理を開始する。
【0435】周辺デバイススレッド関数(図26)は、
まず割込みの応答性をよくするため、自身のスレッド優
先度を通常よりも高くする(図26のS2601)。そ
して、デバイス内部のイベント待ち状態に入る(図26
のS2602)。 [1.5.5.5. メイン処理スレッドのシーケンス
]このタイミングで、メイン処理スレッドが割り込み
を受信する準備ができ、割り込み許可フラグ#1をセッ
トするために、割り込み番号引数を1として割り込み許
可フラグセット関数(図12)を実行する(図31Aの
S3103,S3104,S3105)。この詳細な処
理内容は、上述した図30Aに示したS3003,S3
004,S3005と同様である。
【0436】そしてさらに、割り込み許可フラグ#2を
セットするために、割り込み番号引数を2として割り込
み許可フラグセット関数を実行する(図31AのS31
06,S3107,S3108)。この詳細な処理内容
は、図30Aに示したS3006,S3007,S30
08と同様である。 [1.5.5.6. 周辺デバイススレッド#2のシー
ケンス]このタイミングで、周辺デバイス#2に内部
イベントが発生し、周辺デバイススレッド#2が待ち状
態から開放されたとする。
【0437】周辺デバイススレッド#2は、周辺デバイ
ススレッド関数(図26)においてジャイアントロック
セマフォを獲得し(図26のS2603、図31AのS
3109)、発生した内部イベントを処理し(図26の
S2604)、割り込み要因が発生したかどうかを調べ
る(図26のS2605)。ここでは、割り込み要因が
発生した場合を想定している。
【0438】そしてさらに、周辺デバイススレッド関数
(図26)は、割り込み要因フラグ#2をセットするた
めに、割り込み番号(値は2)を引数として割り込み要
因フラグセット関数(図15)をコールする(図26の
S2606)。
【0439】周辺デバイススレッド♯2のコンテキスト
でコールされた、割り込み要因フラグセット関数(図1
5)は、まず、既に割り込み要因がセットされているか
を調べるが(図15のS1501)、ここではクリアさ
れているので、割り込み要因フラグ#2(図31Aの2
726)をセットする(図31AのS3110、図15
のS1502)。
【0440】そして、更に割り込み要因セット関数は、
割込み要求状態変数#2を変更する必要があるかどうか
を調べるため、割り込み許可フラグ♯2をテストする
(図15のS1503)。ここでは、割り込み許可フラ
グ#2はセットされているため、割込み要求状態変数#
2をセットし(図15のS1504)、割込み要求レベ
ルと該当する割り込み番号を再計算するために、割込み
要求レベル計算関数をコールする(図15のS150
5)。
【0441】割込み要求レベル計算関数は、割込み要求
状態変数♯2のみがセットされていることを検出し、割
込み要求レベルに値3を、割り込み番号に値2を設定す
る(図31AのS3111)。
【0442】割込み要求レベル計算関数からリターンし
た割り込み要因フラグセット関数(図15)は、割り込
みを起動する必要があるかどうかを調べるため、割込み
要求レベルと割り込みレベルを比較する(図15のS1
506)。ここでは、割込み要求レベル(値は3)が割
り込みレベル(値は0)より大きいため、非同期割り込
み起動関数(図20)をコールする(図15のS150
7)。
【0443】非同期割り込み起動関数(図20)は、ま
ず最初に、カレント実行スレッド(メイン処理スレッ
ド)をサスペンドし、メイン処理の実行を強制的に停止
させる(図20のS2001、図31AのS311
2)。
【0444】そしてさらに、非同期フラグ引数の値を1
として、コンテキスト保存処理関数(図18)をコール
する(図20のS2002)。
【0445】コンテキスト保存処理関数(図18)は、
まず最初に、引数で渡された非同期フラグ(値は1)を
割り込みスタックにプッシュし(図18のS180
1)、割り込みレベル(値は0)を割り込みスタックに
プッシュし(図18のS1802)、カレント同期セマ
フォハンドル(メイン処理の同期セマフォを指す)を割
り込みスタックにプッシュし(図18のS1803)、
カレント実行スレッドハンドル(メイン処理スレッドを
指す)を割り込みスタックにプッシュし(図18のS1
804)、呼び出し元にリターンする。
【0446】コンテキスト保存処理関数からリターンし
た非同期割り込み起動関数(図20)は、更に、コンテ
キストスイッチ関数(図19)をコールして(図20の
S2003)、割込み要求レベル(値3)に対応した割
り込み処理を起動する。
【0447】コンテキストスイッチ関数(図19)は、
まず最初に、割込み要求レベル(値は3)を割り込みレ
ベルにコピーする(図19のS1901、図31AのS
3113)。
【0448】そしてさらに、割込み要求レベル(値は
3)の割り込み同期セマフォハンドルをカレントの同期
セマフォハンドルにコピーし(図19のS1902)、
割込み要求レベル(値は3)の割り込みスレッドハンド
ルをカレントの実行スレッドハンドルにコピーする(図
19のS1903)。
【0449】そしてさらに、新しいカレント同期セマフ
ォハンドル(レベル3の割り込み同期セマフォを指す)
にシグナルを送る(図19のS1904、図31AのS
3114)。
【0450】コンテキストスイッチ関数からリターンし
た非同期割り込み起動関数(図20)は、割り込み要因
フラグセット関数(図15)にリターンし、割り込み要
因フラグセット関数は周辺デバイススレッド関数(図2
6)にリターンする。
【0451】周辺デバイススレッド関数(図26)は、
さらに、周辺デバイス#2の内部イベントの待ちループ
に入る(図26のS2602)。このとき、周辺デバイ
ススレッド#2が獲得したジャイアントロックセマフォ
は、割込み起動したレベル3の割り込みスレッドに引き
渡す。 [1.5.5.7. レベル3の割り込みスレッドのシ
ーケンス]割り込みスレッド関数(図22)で、割り
込み同期セマフォを待ってブロックしていた(図22の
S2202)レベル3の割り込みスレッド(図31Aの
2712)は、周辺デバイススレッド#2が同セマフォ
にシグナルを送信したため(図31AのS3114)、
ブロック状態から開放される(図31AのS311
5)。
【0452】レベル3の割り込みスレッドは、割り込み
スレッド関数(図22)において、さらに、割り込み番
号(値は2)をローカル変数noに待避し(図22のS
2203、図31AのS3116)、それ以上割り込み
シミュレータが管理する情報にアクセスする必要がない
ので、ジャイアントロックセマフォを開放する(図22
のS2204、図31AのS3117)。
【0453】そしてさらに、レベル3の割り込みスレッ
ドは、自身のスレッド優先度を通常のレベルまで下げ
(図22のS2205)、割り込み番号2に対応する割
り込みハンドラをコールする(図22のS2206)。 [1.5.5.8. 周辺デバイス#1スレッドのシー
ケンス]割り込み番号2の割り込みハンドラが実行中
に、周辺デバイス#1に内部イベントが発生し、周辺デ
バイススレッド♯1が待ち状態から開放されたとする。
【0454】周辺デバイススレッド#1は、周辺デバイ
ススレッド関数(図26)においてジャイアントロック
セマフォを獲得し(図26のS2603、図31AのS
3118)、発生した内部イベントを処理し(図26の
S2604)、割り込み要因が発生したかどうかを調べ
る(図26のS2605)。ここでは、割り込み要因が
発生した場合を想定している。
【0455】そしてさらに、周辺デバイススレッド関数
(図26)は、割り込み要因フラグ♯1をセットするた
めに、割り込み番号(値は1)を引数として割り込み要
因フラグセット関数(図15)をコールする(図26の
S2606)。
【0456】周辺デバイススレッド♯1のコンテキスト
でコールされた割り込み要因フラグセット関数(図1
5)は、まず、既に割り込み要因がセットされているか
を調べるが(図15のS1501)、ここではクリアさ
れているので、割り込み要因フラグ#1をセットする
(図31AのS3119、図15のS1502)。
【0457】そして、更に割り込み要因セット関数は、
割込み要求状態変数#1を変更する必要があるかどうか
を調べるため、割り込み許可フラグ#1をテストする
(図15のS1503)。ここでは、割り込み許可フラ
グ#1はセットされているため、割込み要求状態変数#
1をセットし(図15のS1504)、割込み要求レベ
ルと該当する割り込み番号を再計算するために、割込み
要求レベル計算関数をコールする(図15のS150
5)。
【0458】割込み要求レベル計算関数は、割込み要求
状態変数♯1(割り込みレベルは1)と割込み要求状態
変数#2(割り込みレベルは3)がともにセットされて
いることを検出し、割込み要求レベルに値3を、割り込
み番号に値2を設定する(つまり、値は変更されな
い)。
【0459】割込み要求レベル計算関数からリターンし
た割り込み要因フラグセット関数(図15)は、割り込
みを起動する必要があるかどうかを調べるため、割込み
要求レベルと割り込みレベルを比較する(図15のS1
506)。ここでは、割込み要求レベル(値は3)と割
り込みレベル(値は3)が等しいため、それ以上の処理
は必要なく、ジャイアントロックセマフォを開放し(図
15のS1508、図31AのS3120)、リターン
する。
【0460】割り込み要因セット関数からリターンし
た、周辺デバイススレッド関数(図26)はさらに、周
辺デバイス#1の内部イベントの待ちループに入る(図
26のS2602)。 [1.5.5.9. レベル3の割り込みスレッドのシ
ーケンス]レベル3の割り込みスレッドのコンテキス
トでコールされた、割り込み番号2の割り込みハンドラ
は、必要な割り込み処理を行った後、割り込み要因を取
り下げるために、割り込み要因クリア関数を引数2でコ
ールする。
【0461】割り込み要因クリア関数(図11)は、ま
ず最初に、割り込みコントローラが管理する情報への排
他アクセス権を得るため、ジャイアントロックセマフォ
を獲得する(図11のS1101、図31AのS312
1)。
【0462】そしてさらに、割り込み要因フラグ#2が
既にクリアされていないかを調べるが(図11のS11
02)、ここではセットされているので、実際に割り込
み要因フラグ#2をクリアする(図11のS1103、
図31AのS3122)。
【0463】そしてさらに、割込み要求状態#2を更新
すべきか否かを調べるため、割り込み許可フラグ#2を
テストするが(図11のS1104)、同フラグがON
であるため割込み要求状態#2をクリアし(図11のS
1105)、割込み要求レベルと該当する割り込み番号
を再計算するため、割込み要求レベル計算関数をコール
する(図11のS1106)。
【0464】割込み要求レベル計算関数は、割込み要求
状態#1のみがセットされていることを検出し、割込み
要求レベルに値1を、割り込み番号に値1を設定する
(図31AのS3123)。
【0465】割込み要求レベル計算関数からリターンし
た、割り込み要因フラグクリア関数(図11)は、これ
以上割り込みシミュレータが管理する情報にアクセスす
る必要がないため、ジャイアントロックセマフォを開放
し(図11のS1107、図31AのS3124)、リ
ターンする。
【0466】割り込み要因フラグクリア関数からリター
ンした、割り込み番号2の割り込みハンドラは、更に必
要な処理を行い、リターンする。
【0467】割り込み番号2の割り込みハンドラからリ
ターンした、割り込みスレッド関数(図22)は、さら
にスレッド優先度を上げ(図22のS2207)、割り
込みからの復帰関数をコールする(図22のS220
8)。
【0468】割り込みからの復帰関数(図25)は、ま
ず最初に、割り込みシミュレータが管理する情報にアク
セスするために、ジャイアントロックセマフォを獲得し
(図25のS2501、図31BのS3125)、そし
てさらに、コンテキスト復元関数(図24)をコールす
る(図25のS2502)。
【0469】コンテキスト復元関数(図24)は、まず
最初に、割り込みスタックから復帰実行スレッドハンド
ル(メイン処理スレッドを指す)をポップし、カレント
実行スレッドハンドルにコピーする(図24のS240
1)。
【0470】そしてさらに、割り込みスタックから復帰
同期セマフォハンドル(メイン処理の同期セマフォを指
す)をポップし、カレント同期セマフォハンドルにコピ
ーする(図24のS2402)。
【0471】そしてさらに、割込みスタックから復帰割
り込みレベル(値は0)をポップし、割り込みレベルに
コピーする(図24のS2403、図31BのS312
6)。
【0472】そしてさらに、割り込みスタックから非同
期フラグ(値は1)をポップし(図24のS240
4)、その値を呼び出し元にリターンする。
【0473】割り込み復元関数からリターンした、割り
込みからの復帰関数(図25)は、リターン値(値1)
をローカル変数fAsyncに待避する(図25のS250
2)。
【0474】そしてさらに、新たな割り込みを起動する
必要があるかどうかを調べるため、割込み要求レベルと
割り込みレベルを比較する(図25のS2503)。こ
こでは、割込み要求レベル(値は1)が割り込みレベル
(値は0)より大きいので、新たな割り込みを起動する
する必要がある。従ってさらに、コンテキスト保存関数
を、割り込みスタックからポップしたばかりの非同期フ
ラグの値(ローカル変数fAsync、値は1)を引数とし
て、コンテキスト保存関数(図18)をコールする(図
25のS2508)。
【0475】コンテキスト保存処理関数(図18)は、
まず最初に、引数で渡された非同期フラグ(値は1)を
割り込みスタックにプッシュし(図18のS180
1)、割り込みレベル(値は0)を割り込みスタックに
プッシュし(図18のS1802)、カレント同期セマ
フォハンドル(メイン処理の同期セマフォを指す)を割
り込みスタックにプッシュし(図18のS1803)、
カレント実行スレッドハンドル(メイン処理スレッドを
指す)を割り込みスタックにプッシュし(図18のS1
804)、呼び出し元にリターンする。つまり、コンテ
キスト復元関数が割り込みスタックからポップしたばか
りのメイン処理スレッドのコンテキストを、再度割り込
みスタックにプッシュする。
【0476】コンテキスト保存関数からリターンした、
割り込みからの復帰関数(図25)は、コンテキストス
イッチ関数(図19)をコールする(図25のS250
9)。
【0477】コンテキストスイッチ関数(図19)は、
まず最初に、割込み要求レベル(値は1)を割り込みレ
ベルにコピーする(図19のS1901、図31BのS
3127)。
【0478】そしてさらに、割込み要求レベル(値は
1)に対応する割り込み同期セマフォハンドルをカレン
トの同期セマフォハンドルにコピーし(図19のS19
02)、割込み要求レベル(値は1)の割り込みスレッ
ドハンドルをカレントの実行スレッドハンドルにコピー
する(図19のS1903)。
【0479】そしてさらに、新しいカレント同期セマフ
ォハンドル(レベル1の割り込み同期セマフォを指す)
にシグナルを送る(図19のS1904、図31BのS
3128)。
【0480】コンテキストスイッチ関数からリターンし
た割り込みからの復帰関数(図25)は、割り込みスレ
ッド関数にリターンする。
【0481】割り込みからの復帰関数からリターンした
割り込みスレッド関数(図22)は、引数で指定された
レベル(ここではレベル3)の割り込み同期セマフォに
対する待ち状態に入る(図22のS2202、図31B
のS3129)。 [1.5.5.10. レベル1の割り込みスレッドの
シーケンス]割り込みスレッド関数(図22)で、割
り込み同期セマフォを待ってブロックしていた(図22
のS2202)、レベル1の割り込みスレッド(図31
Bの2712)は、レベル3の割り込みスレッドが同セ
マフォにシグナルを送信したため(図31BのS312
8)、ブロック状態から開放される(図31BのS31
30)。
【0482】レベル1の割り込みスレッドは、割り込み
スレッド関数(図22)において、さらに、割り込み番
号(値は1)をローカル変数noに待避し(図22のS
2203、図31BのS3131)、それ以上割り込み
シミュレータが管理する情報にアクセスする必要がない
ので、ジャイアントロックセマフォを開放する(図22
のS2204、図31BのS3132)。
【0483】そしてさらに、レベル1の割り込みスレッ
ドは、自身のスレッド優先度を通常のレベルまで下げ
(図22のS2205)、割り込み番号1の割り込みハ
ンドラをコールする(図22のS2206)。
【0484】図31Bにおけるこれ以降のシーケンス
(S3133〜S3140)は、図30Bに示したシー
ケンス(S3036〜S3043)と同様であるため、
説明を省略する。 [1.6. 考察]以下、本実施形態における割り込み
シミュレータの実装に当たっての重要なポイントをまと
める。 [1.6.1. スレッドをまたがるロックの受け渡
し]割り込みコントローラシミュレータが同期割り込み
起動関数(図21)または、非同期割り込み起動関数
(図20)をコールして、割り込み処理を起動すると
き、または、割り込みからの復帰関数(図25)におい
て、保留されていた割込み要求を受け付けたとき(図2
5のS2508、S2509)、これらの関数を実行す
るスレッドは、ジャイアントロックセマフォを開放しな
い。
【0485】この場合には、ジャイアントロックセマフ
ォは、割り込み処理スレッドが、割り込みスレッド関数
(図22)において割り込み番号を読み出した(図22
のS2203)後で、開放される(図22のS220
4)。
【0486】これは、割り込みシミュレータが設定した
割り込み番号(図16の1288)を割り込みスレッド
関数が読み出して(図22のS2203)正しい割り込
みハンドラをコールする(図22のS2206)前に、
他の割り込み起動処理によって壊されてしまうことを防
ぐ。
【0487】つまり、割り込みスイッチ関数(図19)
が、割り込みスレッド関数(図22)が待っている同期
セマフォにシグナルを送ってから(図19のS190
4)、割り込みスレッド関数が割り込み番号を無事読み
出してジャイアントロックを開放する(図22のS22
04)までの期間、周辺デバイススレッドを含む他のス
レッドは、ジャイアントロックセマフォを獲得すること
ができないので、新たな割り込み処理を起動することが
できない。
【0488】このパターンによる、ジャイアントロック
セマフォのスレッドをまたがる受け渡しは、例示した5
つの割り込みシーケンス(図27、図28、図29、図
30A,B、図31A,B)において、図27のS27
05,S2710,S2711,S2713、及び、図
28のS2805,S2809,S2811,S281
3、及び、図29のS2912,S2915,S291
7,S2919、及び、図30A,BのS3009,S
3014、S3015,S3017、S3018,S3
023、S3024,S3026、及び、図31A,B
のS3109,S3114、S3115,S3117、
S3125,S3128,S3130,S3132、に
見ることができる。
【0489】また同様に、割り込み処理スレッドがコー
ルした割り込みからの復帰関数(図25)において、同
期的に割込まれたスレッドを再開する場合(図25のS
2507)も、割り込み処理スレッドは、ジャイアント
ロックセマフォを開放しない。
【0490】この場合、ジャイアントロックセマフォ
は、割り込み許可フラグセット関数(図12)、あるい
は、割り込みレベル変更関数(図14)をコールしたス
レッドが、同関数からコールした同期割り込み起動関数
(図21)からリターンした後、ジャイアントロックセ
マフォを開放することによって(図12のS1209、
図14のS1405)、開放される。
【0491】このパターンによるジャイアントロックセ
マフォの、スレッドをまたがる受け渡しは、例示した5
つの割り込みシーケンス(図27、図28、図29、図
30A,B、図31A,B)において、図28のS28
18,S2820,S2822,S2823、及び、図
29のS2924,S2926,S2928,S292
9、において見ることができる。
【0492】このような、スレッドをまたがってジャイ
アントロックセマフォを受け渡す手法によって、他のス
レッドに継続して処理を引き継がせようとしているコー
ドは、その他のスレッドから邪魔されることなく、スレ
ッドをまたがるの処理の継続をアトミックなやり方で実
現することができる。 [1.6.2. スレッドをサスペンドすることによっ
て生じる非同期問題の解決]本実施形態においては、周
辺デバイススレッドが割り込み要因フラグをセットする
ことにより、その時実行中であったソフトウェアの処理
とは無関係に(非同期に)割り込み処理が起動したと
き、実行中のスレッドをサスペンドすることで、この非
同期性を実現している(これとは逆に、ソフトウェアの
処理の結果として割込み処理が起動したときは、同期セ
マフォを待つという同期的な方法を採用している)。
【0493】ところが、スレッドを外部から強制的にサ
スペンドすると、様々なタイミングの問題が発生しがち
である。
【0494】例えば、スレッドが他のスレッドと共有
しているデータにアクセスするために、そのデータの排
他アクセスセマフォAを獲得して、共有データを更新し
ていたとする。
【0495】このタイミングで、スレッドがスレッド
をサスペンドしたとすると、スレッドはセマフォA
を抱えたまま強制停止させられるので、他のスレッド
が上記共有データをアクセスすることができなくなる
(共有データにアクセスするためのセマフォAを獲得す
ることができない)。
【0496】本実施形態においては、このような状況を
避けるために、スレッドがスレッドをサスペンドす
る前に、セマフォAを獲得しなければならないという約
束を設けている。
【0497】これにより、上記状況においてスレッド
がスレッドをサスペンドしたい場合に、そのためのセ
マフォAを要求した時点でスレッドはブロックする。
そして、スレッドが共有データのアクセスを終了して
セマフォAを開放した時点で(即ち、きわどいコード領
域から脱出した時点で)、スレッドはセマフォAを獲
得することができ、スレッドを安全にサスペンドする
ことができる。
【0498】そしてスレッドは、スレッドをサスペ
ンドした後でセマフォAを開放し、スレッドが共有デ
ータにアクセスできるようにする。
【0499】他のスレッドをサスペンドするスレッド
は、サスペンドさせられるスレッドが獲得しているかも
しれないセマフォを獲得してからでないと、他のスレッ
ドをサスペンドしてはならない、という手法は、非同期
割り込み起動関数(図20)をコールするスレッドは、
同関数をコールする前にジャイアントロックセマフォを
獲得しておかなければならない、という規則で表現でき
る。
【0500】周辺デバイススレッド関数(図26)は、
非同期割り込み起動関数(図20)をコールする可能性
のある割り込み要因フラグセット関数(図15)をコー
ルする(図26のS2606)前に、ジャイアントロッ
クセマフォを獲得している(図26のS2603)。
【0501】以上説明したように本実施形態によれば、
CPU及び割り込みコントローラによって実現される割
り込み機構を汎用OS上で忠実に再現することが可能で
あるため、割り込みハンドラを含む機器組込みプログラ
ムのデバッグ作業が容易となる。
【0502】<第2実施形態>以下、本発明に係る第2
実施形態について説明する。
【0503】上述した第1実施形態においては、図2に
示す割り込みコントローラのシミュレーションを行う例
について説明したが、第2実施形態においては割り込み
コントローラのもう一つのバリエーションである、イン
テル8259割り込みコントローラのシミュレーション
を行う方法について説明する。 [2.1. インテル8259割り込みコントローラ]
図32は、インテル8259割り込みコントローラ(以
下、インテル8259と称する)の構成を示す図であ
る。インテル8259は8入力の割り込み入力をレベル
制御するが、同図においては説明の簡便のために、4つ
の割り込み入力のみを示す。
【0504】図32において、1100,1101,1
102,1103は、インテル8259への割り込み入
力信号であり、エッジ検出回路3280,3281,3
282,3283が割り込み入力信号の立ち上がりエッ
ジを検出したとき、割り込み要因フラグ(フリップフロ
ップ)3270,3271,3272,3273をセッ
トする。
【0505】デバイスが割込みを要求しているが、CP
Uがまだそれを受け付けてないときに、割り込み要因フ
ラグ3270,3271,3272,3273はセット
状態となる。
【0506】また、3260,3261,3262,3
263は割り込みマスクフラグ(フリッププロップ)で
あり、ソフトウェアによってこのフラグをセットあるい
はクリアすることができる。割り込みマスクフラグ32
60,3261,3262,3263をセットすれば、
デバイスからの割込み要求を個別に保留させることがで
きる。
【0507】3250,3251,3252,3253
は、割り込み要因フラグ3270,3271,327
2,3273と、割り込みマスクフラグ3260,32
61,3262,3263の否定(NOT)の論理積
(AND)回路であり、この出力信号である、割込み要
求信号1000,1001,1002,1003は、プ
ライオリティコンパレータ3230に接続されている。
【0508】3240,3241,3242,3243
はサービス中フラグ(フリップフロップ)であり、CP
Uによって割り込みが処理中であるときに、該当するフ
ラグがセット状態となる。
【0509】割り込みハンドラは、割り込みからの復帰
命令によって割り込み処理からリターンする前に、EO
Iコマンド1300を発行して、サービス中フラグをク
リアしなければならない。これにより、インテル825
9は割り込みサービスの終了を検知することができる。
【0510】EOIコマンド1300は、セット状態に
あるサービス中フラグ3240,3241,3242,
3243の内、最も優先度の高いフラグをクリアする。
【0511】3230は、割込み要求信号の状態とサー
ビス中フラグの状態を優先度を考慮して大小比較するた
めの回路であり、アサート状態にある割込み要求信号1
000,1001,1002,1003の中で最大の割
り込み優先度を持つものが、セット状態にあるサービス
中フラグ3240,3241,3242,3243の中
で最大の割り込み優先度もつものよりも優先度が高いと
きに、CPUへの割込み要求信号3291をアサートす
る。
【0512】つまり、CPUへの割込み要求信号329
1がアサート状態にあるのは、CPUによってサービス
中の割り込みよりも優先度の高い割込み要求が、まだC
PUによって受理されてない時である。
【0513】3220は、CPU内のプログラムステー
タスワードレジスタに含まれる、割り込み許可フラグで
あり、このフラグがセット状態にある時、CPUは割り
込みを受理することができる。逆に、割り込み許可フラ
グ3220がクリア状態にある時、CPUは割り込みを
受理しない。
【0514】3210は、割り込み許可フラグ3220
と、割り込みコントローラからの割込み要求信号329
1の論理積(AND)回路である。この論理積回路32
10の出力信号3290はCPU命令の実行毎にサンプ
リングされ、アサート状態を検出したならならば、CP
Uによって割り込み起動シーケンスが開始される。
【0515】CPUによる割り込み起動シーケンスは、
以下の手順で実行される。
【0516】 インテル8259に対して割り込み肯定応答サイク
ルを発行して、割り込み番号3292を読み出す 割り込み許可フラグ3220を含む、プログラムス
テータスワードレジスタを割り込みスタックにプッシュ
する プログラムカウンタレジスタを割り込みスタックに
プッシュする 割り込み許可フラグ3220をクリアする 割り込み番号3292に対応した割り込みベクタか
ら割り込みハンドラアドレスを読み出し、プログラムカ
ウンタレジスタに設定する(割り込みハンドラにジャン
プする) 上記手順によって、割り込み起動シーケンスは割り込
み許可フラグ3220をクリアするため、低優先の割り
込み処理が実行中に、高優先の割込み要求が発生して
も、そのままでは多重割り込みは発生しない点に注意さ
れたい。多重にネストした割り込みを受け付けるために
は、低優先の割り込みハンドラの中で、割り込み許可フ
ラグ3220をセットしなければならない。
【0517】インテル8259は、割り込み肯定応答サ
イクルに応答して以下のように動作する。
【0518】 割込み要求信号1000,1001,1002,1
003の中で最大の優先度をもつものを求める(この番
号をnoとする) no番目の割り込み要因フラグをクリアし、no番
目のサービス中フラグをセットする noを割り込み番号3292として出力する 上記手順によって、プライオリティコンパレータ32
30は、CPUへの割込み要求信号3291をネゲート
することに注意されたい。また、割り込み肯定応答サイ
クルにおいて、割り込み要因フラグがクリアされてサー
ビス中フラグがセットされることは、同割込み要求が保
留状態からサービス状態へ推移したことを示している。 [2.2. インテル8259割り込みコントローラシ
ミュレータ]図33は、図32に示したインテル826
9の動作をソフトウェアによってシミュレートする、イ
ンテル8259のシミュレータの構成を示す図である。
尚、同図において、図32に示した構成に対応する処理
については、図32に示した構成要素の番号の第1桁を
「4」に置換した、4000番台の番号を付す。
【0519】同図において、4280,4281,42
82,4283は、タイマ等の周辺デバイスの動作を疑
似する周辺デバイススレッドであり、デバイス内部に興
味あるイベントが発生したとき、そのことをソフトウェ
アに通知するために、割り込み要因フラグ変数427
0,4271,4272,4273をセットする。
【0520】また、4260,4261,4262,4
263は割り込みマスクフラグ変数であり、ソフトウェ
アによってこのフラグをセットあるいはクリアすること
ができる。割り込みマスクフラグ4260,4261,
4262,4263をセットすれば、デバイスからの割
込み要求を個別に保留させることができる。
【0521】4250,4251,4252,4253
は、割り込み要因フラグ4270,4271,427
2,4273と、割り込みマスクフラグ4260,42
61,4262,4263の否定(NOT)の論理積
(AND)回路と同様の計算をする論理積処理であり、
この計算値は、割込み要求フラグ変数4000,400
1,4002,4003に格納される。この計算処理
は、入力値が変更されたときのみ実行される。
【0522】4240,4241,4242,4243
はサービス中フラグ変数であり、割り込みが処理中であ
るときに該当するフラグがセット状態となる。
【0523】割り込みハンドラは、割り込みからの復帰
命令によって割り込み処理からリターンする前に、EO
Iコマンド処理4300を発行してサービス中フラグを
クリアしなければならない。これにより、インテル82
59シミュレータは割り込みサービスの終了を検知する
ことができる。
【0524】EOIコマンド処理4300は、セット状
態にあるサービス中フラグの内、最も優先度の高いフラ
グをクリアする。
【0525】4230は、割込み要求フラグ変数の状態
とサービス中フラグ変数の状態を、優先度を考慮して大
小比較するための処理であり、セット状態にある割込み
要求フラグ変数4000,4001,4002,400
3の中で最大の割り込み優先度を持つものが、セット状
態にあるサービス中フラグ4240,4241,424
2,4243の中で最大の割り込み優先度もつものより
も優先度が高いときに、CPUへの割込み要求変数42
91に値1を、そうでなければ、値0を書き込む。つま
り、CPUへの割込み要求変数4291がセット状態に
あるのは、サービス中の割り込みよりも優先度の高い割
込み要求が、まだ受理されてない時である。
【0526】このプライオリティーコンパレータ423
0の計算処理も、入力値が変更されたときのみ実行す
る。
【0527】4220は割り込み許可フラグ変数であ
り、4210は割り込み許可フラグ4220と、割り込
みコントローラからの割込み要求変数4291の論理積
(AND)を計算する処理である。この計算結果が値1
であったならば、割り込み起動処理900(非同期割り
込み起動または同期割り込み起動)を実行する。
【0528】インテル8259シミュレータに対して外
部からできる操作は、以下に示すうちのいずれかであ
る。
【0529】 周辺デバイススレッドが割り込み要因フラグをセッ
トする ソフトウェアによって割り込みマスクフラグをクリ
アする ソフトウェアによって割り込みマスクフラグをセッ
トする ソフトウェアによって割り込み許可フラグをクリア
する ソフトウェアによって割り込み許可フラグをセット
する ソフトウェアによってEOエコマンドを発行する この内、割り込み処理を起動するのは、、、、
である。但し、の場合に割り込み処理が起動されるの
は、EOIコマンドによって割り込みコントローラに高
優先の割り込み処理の終了を通知した際に低優先の割込
み要求が保留されていて、該低優先の割込み要求が受理
された場合である。この場合は、高優先の割り込み処理
のハンドラでは、EOIコマンドの後の命令の実行は低
優先の割り込み処理に割込まれてしまう。
【0530】このようなことが起こるのは不都合なの
で、通常、割り込みハンドラの中で割り込み許可フラグ
をセットする場合(割り込み許可フラグは、割り込み処
理が起動された際に自動的にクリアされていることに注
意されたい)、EOIコマンドを実行する前に割り込み
許可フラグをクリアしておくことが、プログラミング上
のルールとなる。
【0531】上記6つの操作に対応したインテル829
5シミュレータの処理は、上述した第1実施形態に示し
たシミュレータの場合とほぼ同様である。
【0532】例えば、ソフトウェア処理によって割り込
みマスクフラグをクリアする場合は、まず割り込みマス
クフラグをクリアし、その結果、割込み要求フラグの状
態に変化が生じるかどうかを評価し、変化が生じるなら
ばCPUへの割込み要求を再計算する、というように、
連鎖的に各処理が実行される。
【0533】ここでは代表例として、ソフトウェアが割
り込みマスクフラグをクリアする処理と、周辺デバイス
スレッドが割り込み要因フラグをセットする処理、につ
いて詳細に説明する。 [2.2.1. 割り込みマスクフラグクリア操作]図
34は、メイン処理などのソフトウェアが、割り込みマ
スクフラグ(図33の4260,4261,4262,
4263)をクリアした時の、インテル8259シミュ
レータにおいて実行される処理関数の手順を示すフロー
チャートである。但し同関数は、割り込み要因フラグ、
割り込みマスクフラグ、割込み要求フラグ、サービス中
フラグを特定するための引数として、割り込み番号をと
る。
【0534】まず最初に、ステップS3401でジャイ
アントロックセマフォを獲得する。これにより、以下の
処理は他のスレッドから邪魔されることなく、インテル
8259シミュレータが管理する情報を操作することが
可能となるそしてステップS3402において、割り込
みマスクフラグが既にクリアされているかどうかを調
べ、クリアされていたならばそれ以上の処理は必要ない
ので、ステップS3411に進んでジャイアントロック
セマフォを開放し、リターンする。一方、割り込みマス
クフラグがON状態であったならば、ステップS340
3で引数で指定された割り込み番号の割り込みマスクフ
ラグをクリアする。
【0535】そしてステップS3404で、割込み要求
フラグ(図33の4000,4001,4002,40
03)を更新すべきか否かを調査するために、該当する
割り込み要因フラグ(図33の4270,4271,4
272,4273)をテストする。割り込み要因フラグ
がOFFであるならば、割込み要求フラグの値に変化は
生じないため、ステップS3411に進んでジャイアン
トロックセマフォを開放し、リターンする。一方、割り
込み要因フラグがONであるならば、割込み要求フラグ
の値が変化するので、ステップS3405で割込み要求
フラグをセットし、ステップS3406でCPUへの割
込み要求フラグ計算関数をコールして、CPUへの割込
み要求フラグ(図33の4291)を再計算する。
【0536】CPUへの割込み要求フラグ計算関数は、
プライオリティコンパレータ(図33の4230)と同
様の計算を行う処理であり、セット状態にある割込み要
求フラグ(図33の4000,4001,4002,4
003)の中で最大の割り込みレベルが、セット状態に
あるサービス中フラグ(図33の4240,4241,
4242,4243)の中の最大の割り込みレベルを上
回った場合に、CPUへの割込み要求フラグ(図33の
4291)をセットし、そうでなければ同フラグをクリ
アする。
【0537】割り込みマスクフラグクリア関数は、さら
にステップS3407でCPUへの割込み要求フラグ
(図33の4291)をテストし、OFFであればそれ
以上の処理は必要ないので、ステップS3411へ進ん
でジャイアントロックセマフォを開放し、リターンす
る。
【0538】一方ONであれば、ステップS3408で
割り込みを起動する必要があるかどうかを調べるため、
割り込み許可フラグ(図33の4220)をテストし、
OFFであるならばそれ以上の処理は必要ないので、ス
テップS3411へ進んでジャイアントロックセマフォ
を開放し、リターンする。
【0539】一方ONであれば、割り込み処理を起動す
る必要がある。この場合、まずステップS3409で割
り込み肯定応答関数をコールし、ステップS3410で
同期割り込み起動関数(図21)をコールして、割り込
み番号(図33の4292)に対応する割り込み処理を
起動する。
【0540】ステップS3409で実行される割り込み
肯定応答関数は、セット状態にある割込み要求フラグ
(図33の4000,4001,4002,4003)
の内、最大の優先度を持つものを求め、その値を割り込
み番号変数(図33の4292)に格納する。
【0541】そしてさらに同関数は、割り込み番号変数
に対応する割り込み要因フラグ(図33の4270,4
271,4272,4273のいずれか)をクリアし、
対応するサービス中フラグ(図33の4240,424
1,4242,4243のいずれか)をセットし、CP
Uへの割込み要求フラグ(図33の4291)をクリア
する。
【0542】同期割り込み処理関数(図21)は内部的
に、それを呼び出したスレッドを待ち状態に遷移させる
が、待ち状態から戻った状態では、ジャイアントロック
セマフォを獲得している(より正確には、他のスレッド
から管理情報への排他アクセス権を引き継ぐ)ので、ス
テップS3411でジャイアントロックセマフォを開放
し、リターンする。 [2.2.2. 割り込み要因フラグセット操作]図3
5は、周辺デバイススレッド(図33の4280,42
81,4282,4283)が、割り込み要因フラグ
(図33の4270,4271,4272,4273)
をセットしたときの、インテル8259シミュレータに
おいて実行される処理関数の手順を示すフローチャート
である。但し同関数は、割り込み要因フラグ、割り込み
マスクフラグ、割込み要求フラグ、サービス中フラグを
特定するための引数として割り込み番号をとる。
【0543】割り込み要因フラグセット関数は、周辺デ
バイススレッドのみがコールすることができるように調
整されている(メイン処理や、割り込みハンドラはこの
関数をコールできない)。
【0544】特に、同関数をコールする前に、周辺デバ
イススレッドはジャイアントロックセマフォを獲得済み
でなければならない。更に、同関数からリターンしたと
き、ジャイアントロックセマフォは開放状態となってい
る。
【0545】同関数はまず最初に、ステップS3501
で割り込み要因フラグ(図33の4270,4271,
4272,4273)が既にセットされているかどうか
を調べ、セットされていればそれ以上の処理は必要ない
ので、ステップS3510に進んでジャイアントロック
セマフォを開放し、リターンする。一方、割り込み要因
フラグがOFF状態であったならば、ステップS350
2で引数で指定された割り込み番号の割り込み要因フラ
グをセットする。
【0546】そしてステップS3503で、割込み要求
フラグ(図33の4000,4001,4002,40
03)を更新すべきか否かを調査するために、該当する
割り込みマスクフラグ(図33の4260,4261,
4262,4263)をテストする。割り込みマスクフ
ラグがONであるならば、割込み要求フラグの値に変化
は生じないため、ステップS3510に進んでジャイア
ントロックセマフォを開放し、リターンする。一方、割
り込みマスクフラグがOFFであるならば、割込み要求
フラグの値が変化するので、ステップS3504で割込
み要求状態をセットし、ステップS3505でCPUへ
の割込み要求フラグ計算関数をコールして、CPUへの
割込み要求フラグ(図33の4291)を再計算する。
【0547】そしてさらに、割り込み要因フラグセット
関数は、ステップS3506でCPUへの割込み要求フ
ラグ(図33の4291)をテストし、OFFであれば
それ以上の処理は必要ないため、ステップS3510に
進んでジャイアントロックセマフォを開放し、リターン
する。
【0548】一方、同フラグがONであるならば、割り
込み処理を起動する必要があるかどうかを調べるため、
ステップS3507で割り込み許可フラグ(図33の4
220)をテストする。割り込み許可フラグOFFであ
るならばそれ以上の処理は必要ないため、ステップS3
510に進んでジャイアントロックセマフォを開放し、
リターンする。一方、同フラグがONであるならば、ス
テップS3508で割り込み肯定応答関数をコールして
割り込み番号変数を更新し、該当する割り込み要因フラ
グをサービス中フラグに移動させる。
【0549】そしてさらにステップS3509で、非同
期割り込み起動関数(図20)をコールし、割り込み番
号に対応する割り込み処理を起動する。
【0550】非同期割り込み処理関数(図20)は、内
部的にジャイアントロックセマフォを手放す(より正確
には、他のスレッドに管理情報への排他アクセス権を引
き渡す)ので、ジャイアントロックセマフォには手を触
れずに、割り込み要因フラグセット関数からリターンす
る。 [2.3. インテル8259対応の割り込みシミュレ
ータ]インテル8259割り込みコントローラ(図3
2)に対応した割り込みシミュレータの構成(割り込み
コントローラ部分は除く)は、上述した第1実施形態で
示した図16とほぼ同様である。異なるのは、割り込み
レベル(図16の1652)が割り込み許可フラグ(図
33の4220)に変わること、及び割込み要求レベル
(図16の1281)が不要となること、のみである。
これは、割込みレベルと割り込み番号との対応は1対1
であるために割込み要求レベルは不要となり、割り込み
番号が割込み要求レベルの役割も果たすためである。
【0551】コンテキスト保存関数(図18)、コンテ
キスト復元関数(図23)の処理手順については、割り
込みレベル(図16の1652)が割り込み許可フラグ
(図33の4220)に変わること、及び割り込みスタ
ック内の復帰割り込みレベルが復帰割り込み許可フラグ
に変わる(レベル数値がフラグに変わる)こと、を除い
て、第1実施形態と同様である。
【0552】また、非同期割り込み起動関数(図2
0)、同期割り込み起動関数(図21)についても、処
理手順の変更は不要である。
【0553】また、割り込みスレッド関数(図22)に
ついては、割り込みレベルと割り込み番号が1対1に対
応するので、スレッド引数として割り込み番号をとるこ
とで、割り込み番号を読み出す手順(図22のS220
3)を省略することができる。
【0554】コンテキストスイッチ関数(図19)につ
いては、割込み要求レベル(図16の1281)を割り
込みレベル(図16の1652)にコピーする(図19
のS1901)代わりに、割り込み許可フラグ(図33
の4220)をクリアしなければならない。
【0555】図36は、インテル8259対応のコンテ
キストスイッチ関数の処理手順を示すフローチャートで
ある。
【0556】コンテキストスイッチ関数は、まずステッ
プS3601で、割り込み許可フラグ(図35の20
0)をクリアする。
【0557】そしてステップS3602で、割り込み番
号(図33の4292)に対応した割り込み同期セマフ
ォハンドルを、カレント同期セマフォハンドルにコピー
する。
【0558】そしてステップS3603で、割り込み番
号(図33の4292)に対応した割り込みスレッドハ
ンドルを、カレント実行スレッドハンドルにコピーす
る。
【0559】そしてステップS3604で、新たにカレ
ントとなった同期セマフォにシグナルを送り、割り込み
処理スレッドをセマフォ待ち状態から開放する。
【0560】以上説明したように第2実施形態によれ
ば、割り込みコントローラとしてインテル8259を適
用した場合に対応した割り込みシミュレータを提供する
ことができるため、インテル8259を介した割り込み
動作を行うプログラムのデバッグ作業が容易となる。
【他の実施形態】なお、本発明は、複数の機器(例えば
ホストコンピュータ、インタフェイス機器、リーダ、プ
リンタなど)から構成されるシステムに適用しても、一
つの機器からなる装置(例えば、複写機、ファクシミリ
装置など)に適用してもよい。
【0561】また、本発明の目的は、前述した実施形態
の機能を実現するソフトウェアのプログラムコードを記
録した記憶媒体(または記録媒体)を、システムあるい
は装置に供給し、そのシステムあるいは装置のコンピュ
ータ(またはCPUやMPU)が記憶媒体に格納された
プログラムコードを読み出し実行することによっても、
達成されることは言うまでもない。この場合、記憶媒体
から読み出されたプログラムコード自体が前述した実施
形態の機能を実現することになり、そのプログラムコー
ドを記憶した記憶媒体は本発明を構成することになる。
また、コンピュータが読み出したプログラムコードを実
行することにより、前述した実施形態の機能が実現され
るだけでなく、そのプログラムコードの指示に基づき、
コンピュータ上で稼働しているオペレーティングシステ
ム(OS)などが実際の処理の一部または全部を行い、
その処理によって前述した実施形態の機能が実現される
場合も含まれることは言うまでもない。
【0562】さらに、記憶媒体から読み出されたプログ
ラムコードが、コンピュータに挿入された機能拡張カー
ドやコンピュータに接続された機能拡張ユニットに備わ
るメモリに書込まれた後、そのプログラムコードの指示
に基づき、その機能拡張カードや機能拡張ユニットに備
わるCPUなどが実際の処理の一部または全部を行い、
その処理によって前述した実施形態の機能が実現される
場合も含まれることは言うまでもない。
【0563】
【発明の効果】以上説明したように本発明によれば、割
り込み処理を含む機器組込みプログラムの忠実なシミュ
レーションを汎用OS上で高速に実行することが可能と
なる。
【図面の簡単な説明】
【図1】割り込みシミュレータを用いた、機器組込みプ
ログラムのシミュレーション実行環境を示す図である。
【図2】ターゲット上の割り込みコントローラの構成を
示す図である。
【図3】ターゲットCPUによる割り込み起動シーケン
スを示す図である。
【図4】ターゲットCPUによる割り込みからの復帰シ
ーケンスを示す図である。
【図5】周辺デバイスによる割り込み要求によって非同
期的に発生した割り込みのシーケンスを示す図である。
【図6】機器組込みプログラムが割り込み許可フラグを
セットしたことによって同期的に発生した割込みのシー
ケンスを示す図である。
【図7】機器組込みプログラムが割り込みレベルを低下
させたことによって同期的に発生した割込みのシーケン
スを示す図である。
【図8】周辺デバイスからの割込み要求が、低優先→高
優先の順に発生したことによる、多重割込みのシーケン
スを示す図である。
【図9】周辺デバイスからの割込み要求が、高優先→低
優先の順に発生したことによる、シーケンシャルな割り
込みのシーケンスを示す図である。
【図10】割り込みコントローラシミュレータの構成を
示す図である。
【図11】割り込みコントローラシミュレータにおい
て、機器組込みプログラムが割り込み要因フラグをクリ
アする処理の手順を示す図である。
【図12】割り込みコントローラシミュレータにおい
て、機器組込みプログラムが割り込み許可フラグをセッ
トする処理の手順を示す図である。
【図13】割り込みコントローラシミュレータにおい
て、機器組込みプログラムが割り込み許可フラグをクリ
アする処理の手一頃を示す図である。
【図14】割り込みコントローラシミュレータにおい
て、機器組込みプログラムが割り込みレベルを変更する
処理の手順を示す図である。
【図15】割り込みコントローラシミュレータにおい
て、周辺デバイススレッドが割り込み要因フラグをセッ
トする処理の手順を示す図である。
【図16】割り込みシミュレータの構成を示す図であ
る。
【図17】割り込みシミュレータがカレントコンテキス
トの保存と、コンテキストスイッチを行う操作の概略を
示す図である。
【図18】割り込みシミュレータがカレントコンテキス
トを保存する処理の手順を示す図である。
【図19】割り込みシミュレータがコンテキストスイッ
チを実行する処理の手順を示す図である。
【図20】割り込みシミュレータが非同期的に割り込み
を起動する処理の手順を示す図である。
【図21】割り込みシミュレータが同期的に割り込みを
起動する処理の手順を示す図である。
【図22】割り込みスレッド関数の処理の手順を示す図
である。
【図23】割り込みシミュレータがコンテキストを復元
する処理の概要を示す図である。
【図24】割り込みシミュレータがコンテキストを復元
する処理の手順を示す図である。
【図25】割り込みシミュレータにおいて、割り込み処
理スレッドが割込み込みから復帰する処理の手順を示す
図である。
【図26】周辺デバイススレッド関数の処理の手順を示
す図である。
【図27】割り込みシミュレータにおいて、周辺デバイ
ススレッドが割込みを要求したことによって、非同期的
に発生した割込みのシーケンスを示す図である。
【図28】割り込みシミュレータにおいて、機器組込み
プログラムが割り込み許可フラグをセットすることによ
って、同期的に発生した割込みのシーケンスを示す図で
ある。
【図29】割り込みシミュレータにおいて、機器組込み
プログラムが割り込みレベルを低下させたことによっ
て、同期的に発生した割込みのシーケンスを示す図であ
る。
【図30A】割り込みシミュレータにおいて、周辺デバ
イススレッドが、低優先→高優先の割り込みを要求した
ことによって発生した多重割込みのシーケンスを示す図
である。
【図30B】割り込みシミュレータにおいて、周辺デバ
イススレッドが、低優先→高優先の割り込みを要求した
ことによって発生した多重割込みのシーケンスを示す図
である。
【図31A】割り込みシミュレータにおいて、周辺デバ
イススレッドが、高優先→低優先の割り込みを要求した
ことによって発生した、シーケンシャルに処理される割
り込みシーケンスを示す図である。
【図31B】割り込みシミュレータにおいて、周辺デバ
イススレッドが、高優先→低優先の割り込みを要求した
ことによって発生した、シーケンシャルに処理される割
り込みシーケンスを示す図である。
【図32】インテル8259割り込みコントローラの構
成を示す図である。
【図33】インテル8259割り込みコントローラのシ
ミュレータの構成を示す図である。
【図34】インテル8259割り込みコントローラシミ
ュレータにおいて、機器組込みプログラムが割り込みマ
スクフラグをクリアする処理の手噸を示す図である。
【図35】インテル8259割り込みコントローラシミ
ュレータにおいて、周辺デバイススレッドが割り込み要
因フラグをセットする処理の手順を示す図である。
【図36】インテル8259割り込みコントローラ対応
の割り込みシミュレータが、コンテキストをスイッチす
る処理の手順を示す図である。
───────────────────────────────────────────────────── フロントページの続き (72)発明者 矢部 俊夫 東京都大田区下丸子3丁目30番2号 キヤ ノン株式会社内 (72)発明者 大河原 将広 東京都大田区下丸子3丁目30番2号 キヤ ノン株式会社内 Fターム(参考) 5B042 GA23 GB05 HH07 5B098 BA05 BA17 BB05 GA05 GD16 JJ06

Claims (20)

    【特許請求の範囲】
  1. 【請求項1】 CPU及び割り込みコントローラによっ
    て実行されることによってメイン処理及び複数レベルの
    割り込み処理を実現する機器組み込みプログラムを擬似
    する割り込みシミュレーション方法であって、 前記メイン処理に対してメインスレッド及び同期セマフ
    ォを割り当て、 前記複数レベル毎の割り込み処理に対して割り込みスレ
    ッド及び同期セマフォを割り当て、 前記メインスレッド及び前記割り込みスレッドのうち、
    現在実行中でないスレッドに対してサスペンド状態又は
    対応する同期セマフォの待ち状態のいずれかを保証する
    ことを特徴とする割り込みシミュレーション方法。
  2. 【請求項2】 前記メイン処理は、自身に対する割込み
    処理が終了した際に、前記メインスレッドに保存された
    コンテキスト情報に基づいて、前記割り込み処理によっ
    て中断された処理を再開することを特徴とする請求項1
    記載の割り込みシミュレーション方法。
  3. 【請求項3】 前記割り込み処理は、自身に対するより
    高レベルの割込み処理が終了した際に、自身の割り込み
    スレッドに保存されたコンテキスト情報に基づいて、前
    記より高レベルの割り込み処理によって中断された処理
    を再開することを特徴とする請求項1記載の割り込みシ
    ミュレーション方法。
  4. 【請求項4】 前記機器組込みプログラムの動作環境に
    おける周辺デバイスの動作を擬似する周辺デバイスシミ
    ュレータを、前記メイン処理及び前記割込み処理とは独
    立した周辺デバイススレッド上で動作させることを特徴
    とする請求項1記載の割り込みシミュレーション方法。
  5. 【請求項5】 前記割り込みモデルは、前記CPU内部
    で割込みレベルを管理し、前記割込みコントローラが割
    込み要求レベルを提供し、 該割り込みモデルにおける該割り込みコントローラによ
    るレベル制御及び、該CPUの割り込み起動及び割込み
    からの復帰のシーケンスを忠実に擬似することを特徴と
    する請求項1記載の割り込みシミュレーション方法。
  6. 【請求項6】 前記割り込みモデルは、前記CPU内部
    で割込み許可フラグを管理し、前記割り込みコントロー
    ラがインテル8259割り込みコントローラまたはその
    互換器であることを特徴とする請求項5記載の割り込み
    シミュレーション方法。
  7. 【請求項7】 前記メイン処理又は前記割り込み処理に
    対して、より高レベルの割り込み処理が非同期的に発生
    した場合に、 割込まれたスレッドを強制的にサスペンドし、 前記より高レベルの割り込み処理が終了する際に、該割
    込まれたスレッドをレジュームすることを特徴とする請
    求項1記載の割り込みシミュレーション方法。
  8. 【請求項8】 前記より高レベルの割り込み処理は、前
    記メイン処理又は前記割り込み処理とは無関係に発生す
    ることを特徴とする請求項7記載の割り込みシミュレー
    ション方法。
  9. 【請求項9】 前記メイン処理又は前記割り込み処理に
    対して、より高レベルの割り込み処理が同期的に発生し
    た場合に、 割込まれたスレッドを対応する同期セマフォの待ち状態
    とし、 前記より高レベルの割り込み処理が終了する際に、前記
    同期セマフォに対してシグナルを送ることによって、該
    割込まれたスレッドの処理を再開することを特徴とする
    請求項1記載の割り込みシミュレーション方法。
  10. 【請求項10】 前記より高レベルの割り込み処理は、
    前記メイン処理又は前記割り込み処理に基づいて必然的
    に発生することを特徴とする請求項9記載の割り込みシ
    ミュレーション方法。
  11. 【請求項11】 前記割り込み処理を起動する際に、実
    行中であるスレッドを特定するスレッドハンドル、及び
    該スレッドハンドルに付随する同期セマフォハンドル、
    及び割り込み発生が非同期的であるか否かを示す非同期
    フラグを擬似スタックに格納し、 前記割り込み処理の割り込みスレッドが割り込みからの
    復帰命令を疑似する復帰関数をコールする際に、前記擬
    似スタックに格納された前記スレッドハンドル及び同期
    セマフォハンドル及び非同期フラグを取得し、 該取得した前記スレッドハンドル及び同期セマフォハン
    ドルを、実行中であるスレッドハンドル及び同期セマフ
    ォハンドルに代入し、 前記非同期フラグが非同期である旨を示す場合には該取
    得したスレッドハンドルをレジュームし、非同期でない
    旨を示す場合には該取得した同期セマフォハンドルに対
    してシグナルを送ることを特徴とする請求項1記載の割
    り込みシミュレーション方法。
  12. 【請求項12】 複数のスレッドによって共有されるグ
    ローバル変数をジャイアントロックセマフォによって保
    護し、 実行スレッドが切り換わる際に、旧の実行スレッドが獲
    得していたジャイアントロックセマフォを新の実行スレ
    ッドに引き渡すことを特徴とする請求項1記載の割り込
    みシミュレーション方法。
  13. 【請求項13】 複数のスレッドによって共有されるグ
    ローバル変数をジャイアントロックセマフォによって保
    護し、 前記より高レベルの割り込み処理が非同期的に発生した
    場合に、 該より高レベルの割り込み処理のスレッドが前記ジャイ
    アントロックセマフォを獲得した後に、該割り込まれた
    スレッドをサスペンドすることを特徴とする請求項7記
    載の割り込みシミュレーション方法。
  14. 【請求項14】 前記メイン処理又は前記割り込み処
    理に対して、より高レベルの割り込み処理が非同期的に
    発生した場合に、 割込まれたスレッドの優先度を下げることによってサス
    ペンドし、 前記より高レベルの割り込み処理が終了する際に、該サ
    スペンドされたスレッドの優先度を前記サスペンド前の
    値に戻すことによってレジュームすることを特徴とする
    請求項7記載の割り込みシミュレーション方法。
  15. 【請求項15】 前記機器組み込みプログラムの擬似
    は、汎用OS上で実行されることを特徴とする請求項1
    記載の割り込みシミュレーション方法。
  16. 【請求項16】 前記機器組み込みプログラムを汎用O
    Sを搭載したコンピュータによってコンパイルすること
    によって、該機器組み込みプログラムによる割り込み処
    理のみを擬似することを特徴とする請求項15記載の割
    り込みシミュレーション方法。
  17. 【請求項17】 CPU及び割り込みコントローラによ
    って実行されることによってメイン処理及び複数レベル
    の割り込み処理を実現する機器組み込みプログラムを擬
    似する割り込みシミュレーション装置であって、 前記メイン処理に対してメインスレッド及び同期セマフ
    ォを割り当てる手段と、 前記複数レベル毎の割り込み処理に対して割り込みスレ
    ッド及び同期セマフォを割り当てる手段と、 前記メインスレッド及び前記割り込みスレッドのうち、
    現在実行中でないスレッドに対してサスペンド状態又は
    対応する同期セマフォの待ち状態のいずれかを保証する
    手段と、を有することを特徴とする割り込みシミュレー
    ション装置。
  18. 【請求項18】 前記割り込みシミュレーション装置は
    汎用OSを搭載したコンピュータであって、 該コンピュータにおいて前記機器組み込みプログラムを
    コンパイルすることによって、該機器組み込みプログラ
    ムによる割り込み処理のみを擬似することを特徴とする
    請求項17記載の割り込みシミュレーション装置。
  19. 【請求項19】 CPU及び割り込みコントローラによ
    って実行されることによってメイン処理及び複数レベル
    の割り込み処理を実現する機器組み込みプログラムを擬
    似する、汎用OSを搭載したコンピュータによって実行
    可能な割り込みシミュレーションプログラムであって、 前記メイン処理に対してメインスレッド及び同期セマフ
    ォを割り当てるコードと、 前記複数レベル毎の割り込み処理に対して割り込みスレ
    ッド及び同期セマフォを割り当てるコードと、 前記メインスレッド及び前記割り込みスレッドのうち、
    現在実行中でないスレッドに対してサスペンド状態又は
    対応する同期セマフォの待ち状態のいずれかを保証する
    コードと、を有することを特徴とする割り込みシミュレ
    ーションプログラム。
  20. 【請求項20】 請求項19記載のシミュレーションプ
    ログラムを記録した記録媒体。
JP2000261614A 2000-08-30 2000-08-30 割り込みシミュレーション方法及び装置 Withdrawn JP2002073374A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2000261614A JP2002073374A (ja) 2000-08-30 2000-08-30 割り込みシミュレーション方法及び装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2000261614A JP2002073374A (ja) 2000-08-30 2000-08-30 割り込みシミュレーション方法及び装置

Publications (1)

Publication Number Publication Date
JP2002073374A true JP2002073374A (ja) 2002-03-12

Family

ID=18749425

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000261614A Withdrawn JP2002073374A (ja) 2000-08-30 2000-08-30 割り込みシミュレーション方法及び装置

Country Status (1)

Country Link
JP (1) JP2002073374A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011507109A (ja) * 2007-12-12 2011-03-03 クゥアルコム・インコーポレイテッド マルチスレッド・プロセッサのための共有割込みコントローラ
US9147016B2 (en) 2010-08-20 2015-09-29 International Business Machines Corporation Multi-ECU simulation by using 2-layer peripherals with look-ahead time
JP2016206817A (ja) * 2015-04-20 2016-12-08 株式会社デンソー 電子制御装置
JP2019109935A (ja) * 2009-03-06 2019-07-04 ビージーシー パートナーズ インコーポレイテッド 取引所のイベントおよび動作に関連するメッセージを使用するプログラム間通信

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011507109A (ja) * 2007-12-12 2011-03-03 クゥアルコム・インコーポレイテッド マルチスレッド・プロセッサのための共有割込みコントローラ
JP2019109935A (ja) * 2009-03-06 2019-07-04 ビージーシー パートナーズ インコーポレイテッド 取引所のイベントおよび動作に関連するメッセージを使用するプログラム間通信
JP2021170387A (ja) * 2009-03-06 2021-10-28 ビージーシー パートナーズ インコーポレイテッド 取引所のイベントおよび動作に関連するメッセージを使用するプログラム間通信
US9147016B2 (en) 2010-08-20 2015-09-29 International Business Machines Corporation Multi-ECU simulation by using 2-layer peripherals with look-ahead time
JP2016206817A (ja) * 2015-04-20 2016-12-08 株式会社デンソー 電子制御装置

Similar Documents

Publication Publication Date Title
JP4529063B2 (ja) システムシミュレータ、シミュレーション方法及びシミュレーションプログラム
Rostedt et al. Internals of the RT Patch
US6117181A (en) Synchronization mechanism for distributed hardware simulation
US20060268967A1 (en) Supplying instruction to operational stations
Wang et al. Enhancing the real-time capability of the Linux kernel
CA2386658A1 (en) System of reusable software parts for implementing concurrency and hardware access, and methods of use
JP2004288162A (ja) 同期タスクを利用したオペレーティングシステムアーキテクチャ
JP2002073374A (ja) 割り込みシミュレーション方法及び装置
JPH1021094A (ja) リアルタイム制御方式
Stoyenko et al. Extending Pearl for industrial real-time applications
Wang et al. Synthesizing operating system based device drivers in embedded systems
JP5510258B2 (ja) シミュレーション装置
Dietrich et al. Back to the roots: implementing the RTOS as a specialized state machine
Ando et al. Full Hardware implementation of RTOS-based systems using general high-level synthesizer
Bletsas Worst-case and best-case timing analysis for real-time embedded systems with limited parallelism
Colnari et al. Implementation of hard real-time embedded control systems
Sager et al. System 75: The Oryx/Pecos Operating System
Michelotti Development of a real-time application based on Xenomai
Foughali et al. Scalable Computation of Inter-Core Bounds Through Exact Abstractions
Colnaric State of the art review paper: advances in embedded hard real-time systems design
Yu et al. A Generic and Accurate RTOS-centric Embedded System Modelling and Simulation Framework
Calvez et al. Real-time behavior monitoring for multi-processor systems
Colnarič et al. Computer techniques and applications for real-time embedded control in mechatronic systems
Aswathanarayana Integrating concurrency control and proxy execution support and provide a framework for deterministic concurrency testing under the KURT-Linux group scheduling model
CN115756664A (zh) 插件通用化方法、装置、计算机设备及存储介质

Legal Events

Date Code Title Description
A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20071106