(57)【要約】      （修正有）【課題】リアルタイムＯＳを用いることなく、割込み処理のみで同期排他制御を実現するリアルタイム組込み簡易モニタプログラムを得ること。【解決手段】定常状態を含む複数のＩＳＲ８０〜８７の割込みレベルに対応付けられ各ＩＳＲ８０〜８７の状態に関する情報を保持するＩＣＢ４０〜４７がＩＳＲの割込みレベルの優先順位が高いものから順に接続したＩＣＢ配列に基づいてＩＳＲをスケジューリングする際に、ＩＳＲ起動タスク９２が、割込み発生時にＩＣＢのコンテキスト保存領域に格納するとともに、発生した割込みに対応するＩＣＢ４０〜４７に実行待ち状態であることを設定し、ディスパッチャ７がＩＣＢ４０〜４７の中で最も優先順位の高いＩＣＢ４０〜４７を選択し、選択したコンテキスト保存領域に格納されているプロセッサコンテキストをスタック領域に格納して割込み復帰命令によって選択したＩＣＢ４０〜４７に対応するＩＳＲを実行させる。【選択図】図２
2007047866.tif 000002
【特許請求の範囲】
【請求項１】
定常状態を含む複数の割込みサービスルーチン（ＩＳＲ）で構成される組込みソフトウェアに適用され、前記複数のＩＳＲで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、
前記複数のＩＳＲの割込みレベルに対応付けられ各ＩＳＲの状態に関する情報を保持する割込み制御ブロック（ＩＣＢ）を有し、該ＩＣＢを前記ＩＳＲの割込みレベルの優先順位が高いものから順に接続したＩＣＢ配列と、
に基づいて前記ＩＳＲをスケジューリングするリアルタイム組込み簡易モニタプログラムであって、
割込みが発生すると、割込み発生時にスタック領域に格納されたプログラムカウンタの値、スタックレジスタの値であるスタックポインタ、およびコンテキストを割込まれたＩＳＲに対応するＩＣＢのコンテキスト保存領域に格納するとともに、前記発生した割込みのＩＳＲに対応するＩＣＢに実行待ち状態であることを設定するＩＳＲ起動ステップと、
実行待ち状態が設定されているＩＣＢの中で最も優先順位の高いＩＣＢを選択し、選択したＩＣＢのコンテキスト保存領域に格納されているプログラムカウンタの値、スタックポインタ、およびコンテキストを前記スタック領域に格納して割込み復帰命令によって選択したＩＳＲを実行させるスケジューリングステップと、
前記スケジューリングステップによって実行されたＩＳＲの処理を終了する際に、終了するＩＳＲに対応付けられたＩＣＢに割込み待ち状態であることを設定するＩＳＲ終了ステップと、
を備えることを特徴とするリアルタイム組込み簡易モニタプログラム。
【請求項２】
前記スケジューリングステップによって実行されたＩＳＲが要求するセマフォに対応付けられたセマフォ構造体が保持している使用情報に基づいて要求するセマフォを使用可能であるか否かを判定し、前記要求するセマフォが使用可能であると判定した場合には、セマフォを要求したＩＳＲに関する情報に基づいて前記使用情報のうち使用可能なセマフォ数およびセマフォを取得したＩＳＲに関する情報を更新して実行されたＩＳＲにセマフォを取得させ、前記要求するセマフォが使用不可であると判定した場合には、セマフォを要求したＩＳＲに関する情報に基づいて前記使用情報のうちセマフォ待ちのＩＳＲに関する情報を更新するとともに、前記セマフォを要求したＩＳＲに対応付けられたＩＣＢにセマフォ待ち状態であることを設定するセマフォ取得ステップと、
前記スケジューリングステップによって実行されたＩＳＲが開放するセマフォに対応付けられたセマフォ構造体が保持している使用情報に基づいて開放するセマフォを待っているＩＳＲが存在するか否かを判定し、前記開放するセマフォを待っているＩＳＲが存在すると判定した場合には、セマフォを開放するＩＳＲに関する情報およびセマフォを待っているＩＳＲに関する情報に基づいて、前記使用情報のうちセマフォを取得したＩＳＲに関する情報およびセマフォを待っているＩＳＲに関する情報を更新して実行されたＩＳＲからセマフォを開放し、前記セマフォを待っているＩＳＲに開放したセマフォを取得させるとともに、新たにセマフォを取得したＩＳＲに対応付けられたＩＣＢに実行待ち状態であることを設定し、前記開放するセマフォを待っているＩＳＲが存在しないと判定した場合には、前記セマフォを開放するＩＳＲに関する情報に基づいて前記使用情報のうち使用可能なセマフォ数およびセマフォを取得したＩＳＲに関する情報を更新してセマフォを開放するセマフォ開放ステップと、
をさらに備えることを特徴とする請求項１に記載のリアルタイム組込み簡易モニタプログラム。
【請求項３】
前記セマフォ構造体の使用情報は、使用可能なセマフォの数が設定されるセマフォ数と、セマフォを取得しているＩＳＲを識別するＩＳＲ識別子が設定される所有ＩＳＲと、セマフォの取得を待っているセマフォ待ち状態のＩＳＲのＩＳＲ識別子が設定される待ちＩＳＲとを含み、
前記セマフォ取得ステップは、
前記スケジューリングステップによって実行されたＩＳＲが要求するセマフォに対応付けられたセマフォ構造体のセマフォ数の値が１以上の場合、当該セマフォ数の値をデクリメントするとともに、セマフォを要求するＩＳＲのＩＳＲ識別子を当該所有ＩＳＲに設定してセマフォを取得し、前記要求するセマフォに対応付けられたセマフォ構造体のセマフォ数が１より小さい場合、前記セマフォを要求するＩＳＲのＩＳＲ識別子を当該待ちＩＳＲに設定して、前記セマフォを要求したＩＳＲに対応付けられたＩＣＢにセマフォ待ち状態を設定し、
前記セマフォ開放ステップは、
前記スケジューリングステップによって実行されたＩＳＲが開放するセマフォに対応付けられたセマフォ構造体のセマフォ数をインクリメントするとともに当該所有ＩＳＲに設定されているセマフォを開放するＩＳＲのＩＳＲ識別子を削除し、当該待ちＩＳＲにＩＳＲ識別子が設定されている場合には、当該セマフォ数をデクリメントするとともに当該待ちＩＳＲに設定されているＩＳＲ識別子を当該所有ＩＳＲに設定し、当該待ちＩＳＲに設定されているＩＳＲ識別子を削除し、新たにセマフォを取得したＩＳＲに対応付けられたＩＣＢに実行待ち状態を設定すること、
を特徴とする請求項２に記載のリアルタイム組込み簡易モニタプログラム。
【請求項４】
前記ＩＳＲ起動ステップは、
割込みが発生するごとに、発生した割込みの処理を行なうＩＳＲに対応付けられたＩＣＢの実行カウンタの値をインクリメントしてＩＣＢに割込み回数を保持させ、
前記スケジューリングステップは、
前記実行カウンタが保持する割込み回数だけ当該ＩＣＢを選択対象とし前記割込み回数だけ自身が対応づけられたＩＳＲを実行させ、
前記ＩＳＲ終了ステップは、
前記実行カウンタの値をデクリメントすること、
を特徴とする請求項１〜３の何れか一つに記載のリアルタイム組込み簡易モニタプログラム。
【請求項５】
前記ＩＳＲ起動ステップは、
前記発生した割込みの処理を行なうＩＳＲに対応付けられたＩＣＢの実行カウンタの値が、当該ＩＣＢに予め登録されている実行回数上限値以下の場合に、前記実行カウンタの値をインクリメントすること、
を特徴とする請求項４に記載のリアルタイム組込み簡易モニタプログラム。
【請求項６】
前記セマフォ取得ステップは、
前記要求するセマフォが使用不可であると判定した場合に、前記要求するセマフォを取得しているＩＳＲの優先順位と前記セマフォを要求したＩＳＲの優先順位とを比較して、前記要求するセマフォを取得しているＩＳＲの優先順位が前記セマフォを要求したＩＳＲの優先順位よりも低い場合には、前記要求するセマフォを取得しているＩＳＲの優先順位と前記セマフォを要求したＩＳＲの優先順位とを交換するようにＩＣＢ配列の接続を変更するとともに、優先順位を交換したＩＳＲに対応付けられたＩＣＢに優先順位を変更したことを示す情報を設定し、
前記セマフォ開放ステップは、
前記セマフォを開放するＩＳＲに対応付けられたＩＣＢに優先順位が変更されたことを示す情報が設定されている場合には、前記セマフォを開放するＩＳＲの現在の優先順位と、該セマフォを開放するＩＳＲと優先順位を交換したＩＳＲの現在の優先順位とを交換するようにＩＣＢ配列の接続を変更するとともに、優先順位を交換したＩＳＲに対応付けられたＩＣＢに優先順位の変更がないことを示す情報を設定すること、
を特徴とする請求項２〜５の何れか一つに記載のリアルタイム組込み簡易モニタプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、組込みソフトウェアの割込み処理、および割込み処理を利用した同期排他制御を行なうリアルタイム組込み簡易モニタプログラムに関するものである。
【背景技術】
【０００２】
組込みソフトウェアは、外部事象の変化に対して速やかに応答するために、割込み処理を利用してリアルタイム性を確保している。また、組込みソフトウェアでは、μＩＴＲＯＮなどの組込み制御用のリアルタイムＯＳ（Operating System）を用いてセマフォやイベントフラグ、メイルボックスなどの同期排他制御を実現している。
【０００３】
同期排他制御を実現する従来技術として、たとえば、特許文献１がある。特許文献１には、タスクに実行するための条件を持たせ、その実行順序を制御することで同期排他制御を実現することで、組込みシステムに適用されるマルチプログラムング・システムのＯＳ使用による記憶領域並びにプログラム・ステップを削減し、資源の効率を高めるとともに生産性並びに保守性を向上させる技術が開示されている。
【０００４】
具体的には、事象成立条件記憶手段に、プログラムを細分化したベクタごとに設定されるタスクの実行可能な条件の種別（イベント待ち、メッセージ待ち、時間待ち、起床待ちなど）、ならびに、状態（事象待ち中、事象成立済みなど）の成立条件を格納し、条件記憶手段に、事象成立条件記憶手段に格納されている事象が成立した時点に対応する事象待ち解除条件を格納し、タスクブロックは、タスクを制御するための制御情報を格納する。
【０００５】
タスク付属事象管理手段は、事象成立条件記憶手段に格納されている事象成立条件と、発生した事象とを比較照合し、タスク付属事象待ち管理手段は、タスクブロックに格納されている制御情報に基づいてタスク付属事象管理手段の検出機能によって事象待ちの状態となったタスクを事象待ち状態に遷移させるとともに、事象待ちタスク記憶手段に事象待ち状態に遷移させたタスクを格納する。そして、タスク付属事象待ち管理手段は、事象待ち状態のタスクに対する事象待ち解除条件が成立した時点において、当該タスクを実行待ち状態に遷移させ、実行待ちタスク記憶手段に実行待ち状態に遷移させたタスクを格納する。タスク管理手段は、実行中タスク記憶手段に格納されている現在ＣＰＵが実行中のタスク、および実行待ちタスク記憶手段に格納されている実行待ちタスクの中から、１つのタスクを選択して実行状態に遷移させる。
【０００６】
【特許文献１】特開平７−２９５８４０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
上記特許文献１に記載の従来技術では、マルチプログラムング・システムのＯＳ（リアルタイムＯＳ）を使用する際に、タスクに実行するための条件を持たせ、その実行順序を制御することで同期排他制御を実現している。
【０００８】
しかしながら、組込みソフトウェアが搭載される製品のメモリ容量には限りがある。そのため、上記特許文献１に記載の従来技術のように同期排他制御を実現するためにリアルタイムＯＳを搭載すると、実際に必要なプログラムに用いることができるメモリ容量が少なくなってしまうという問題があった。この問題は、組込みソフトウェアを実行するプロセッサや、組込みソフトウェアを格納するメモリであるＲＯＭ、組込みソフトウェアを実行する際に必要なデータを一時保持するメモリであるＲＡＭなどを１チップで実現する製品においては顕著となる。
【０００９】
また、リアルタイムＯＳでは、タスクに待ち状態を持たせることでセマフォなどの同期排他制御を実現する。しかしながら、異なる優先度のタスクがセマフォを共有する場合、優先度の逆転が生じてしまうという問題があった。
【００１０】
具体的には、優先度の低いタスクがセマフォを取得している場合、優先度の高いタスクは待ち状態となる。このときに優先度の低いタスクより優先度が高く、セマフォ待ちのタスクより優先度が低い優先度が中のタスクが発生すると、セマフォを取得しているタスクより先に優先度が中のタスクが実行され、つぎにセマフォを取得しているタスクが実行され、最後に優先度の高いタスクが実行される。すなわち、予め定められた優先度とは異なる順番でタスクが処理されてしまうという問題があった。
【００１１】
これらの問題を解決するために、リアルタイムＯＳを用いることなく、割込み処理だけで組込みソフトウェアを開発することが考えられる。しかしながら、リアルタイムＯＳを用いることなく、割込み処理だけで組込みソフトウェアを開発した場合、同期排他制御を行なうことができないという問題が生じる。また、割込みが発生したことは認識できるが、何回割込みが発生したかを認識することはできないという問題が生じる。さらに、割込みが発生した場合にはその状態をスタック領域に保持しなければならず、状態をスタック領域に保持する間すべての割込みが禁止状態になるため、リアルタイム性が悪くなるという問題も生じる。
【００１２】
本発明は、上記に鑑みてなされたものであって、リアルタイムＯＳを用いることなく、割込み処理のみで同期排他制御を実現するリアルタイム組込み簡易モニタプログラムを得ることを第１の目的とする。
【００１３】
第２の目的は、リアルタイムＯＳを用いることなく、割込み処理のみで同期排他制御を実現する際に、それぞれの割込み処理の優先度の逆転を回避するリアルタイム組込み簡易モニタプログラムを得ることである。
【課題を解決するための手段】
【００１４】
上述した課題を解決し、目的を達成するために、本発明は、定常状態を含む複数の割込みサービスルーチン（ＩＳＲ）で構成される組込みソフトウェアに適用され、前記複数のＩＳＲで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、前記複数のＩＳＲの割込みレベルに対応付けられ各ＩＳＲの状態に関する情報を保持する割込み制御ブロック（ＩＣＢ）を有し、該ＩＣＢを前記ＩＳＲの割込みレベルの優先順位が高いものから順に接続したＩＣＢ配列と、に基づいて前記ＩＳＲをスケジューリングするリアルタイム組込み簡易モニタプログラムであって、割込みが発生すると、割込み発生時にスタック領域に格納されたプログラムカウンタの値、スタックレジスタの値であるスタックポインタ、およびコンテキストを割込まれたＩＳＲに対応するＩＣＢのコンテキスト保存領域に格納するとともに、前記発生した割込みのＩＳＲに対応するＩＣＢに実行待ち状態であることを設定するＩＳＲ起動ステップと、実行待ち状態が設定されているＩＣＢの中で最も優先順位の高いＩＣＢを選択し、選択したＩＣＢのコンテキスト保存領域に格納されているプログラムカウンタの値、スタックポインタ、およびコンテキストを前記スタック領域に格納して割込み復帰命令によって選択したＩＳＲを実行させるスケジューリングステップと、前記スケジューリングステップによって実行されたＩＳＲの処理を終了する際に、終了するＩＳＲに対応付けられたＩＣＢに割込み待ち状態であることを設定するＩＳＲ終了ステップと、を備えることを特徴とする。
【発明の効果】
【００１５】
この発明によれば、定常状態を含む複数の割込みサービスルーチン（ＩＳＲ）で構成される組込みソフトウェアに適用され、複数のＩＳＲで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、複数のＩＳＲの割込みレベルに対応付けられ各ＩＳＲの状態に関する情報を保持する割込み制御ブロック（ＩＣＢ）を有し、複数のＩＣＢをＩＳＲの割込みレベルの優先順位が高いものから順に接続したＩＣＢ配列と、に基づいてＩＳＲをスケジューリングする際に、ＩＳＲ起動タスクが、割込み発生時にスタック領域に格納されたプロセッサコンテキスト（プログラムカウンタの値、スタックポインタ、およびコンテキスト）を割込まれたＩＳＲに対応するＩＣＢのコンテキスト保存領域に格納するとともに、発生した割込みのＩＳＲに対応するＩＣＢに実行待ち状態であることを設定し、スケジューラおよびディスパッチャがＩＳＲのスケジューリング処理として、実行待ち状態が設定されているＩＣＢの中で最も優先順位の高いＩＣＢを選択し、選択したＩＣＢのコンテキスト保存領域に格納されているプロセッサコンテキストをスタック領域に格納して割込み復帰命令によって選択したＩＣＢに対応するＩＳＲを実行させるようにしているため、リアルタイムＯＳを用いることなく、割込み処理のみで同期排他制御を実現するリアルタイム組込み簡易モニタプログラムを得ることができるという効果を奏する。
【発明を実施するための最良の形態】
【００１６】
以下に、この発明におけるリアルタイム組込み簡易モニタプログラムの実施の形態を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
【００１７】
この発明におけるリアルタイム組込み簡易モニタプログラムは、割込み処理にタスクのような待ち状態となる状態を持たせることで、リアルタイムＯＳを用いることなく同期排他制御を実現するものであるが、説明を簡単にするために、以下の実施の形態においては、現在一般的に用いられているリアルタイムＯＳの１つであるμＩＴＲＯＮの仕様の用語を用いて説明する。
【００１８】
実施の形態１．
図１〜図１６を用いてこの発明の実施の形態１を説明する。図１は、この発明におけるリアルタイム組込み簡易モニタプログラムが適用される装置の構成の一例を示す図である。図１において、リアルタイム組込み簡易モニタプログラムを適用した装置は、プロセッサ１と、プログラム格納部２と、データ格納部３と、制御対象装置１０とを備えている。
【００１９】
プログラム格納部２は、たとえば、ＲＯＭ（Read Only Memory）などの記憶媒体で構成され、プロセッサ１によって実行されるユーザプログラムや、ユーザプログラムに必要な固定データなどを格納する。この発明におけるリアルタイム組込み簡易モニタプログラムは、ユーザプログラム内で用いられ同期排他制御を実現する。
【００２０】
データ格納部３は、ＲＡＭ（Random Access Memory）などの書き込み可能な記憶媒体によって構成され、スタック領域や、ユーザプログラムにおいて必要なデータバッファ、リアルタイム組込み簡易モニタプログラムにおいて必要な情報を格納する。
【００２１】
プロセッサ１は、ＣＰＵ（Control Processing Unit）１１と、プログラムカウンタ１２と、演算処理に用いる汎用レジスタやスタックポインタを格納するスタックレジスタなどを有するレジスタ群１３と、割込み信号の制御情報を格納するコントロールレジスタ１４とを備えている。
【００２２】
ＣＰＵ１１は、プログラム格納部２のプログラムカウンタ１２が示すアドレスに格納されているプログラムコードを読み出し、読み出したプログラムコードに従ってレジスタ群１３の汎用レジスタを用いて所定の演算処理を実行して制御対象装置１０を制御する。
【００２３】
ＣＰＵ１１に入力される複数（この場合は７つ）の割込み信号は、制御対象装置１０または外部から入力される。コントロールレジスタ１４は、割込み信号毎に、割込み信号が発生したこと（割込み信号がアサートになったこと）を示す割込みフラグや、割込み信号をマスクするか否かが設定されるマスクフラグなどで構成される。
【００２４】
ＣＰＵ１１は、コントロールレジスタ１４のマスクフラグがＯＦＦの場合（マスクされていない場合）に割込み信号がアサートになると、現在実行しているプログラムカウンタ１２の値、およびスタックレジスタの値（スタックポインタ）を、スタックレジスタに格納されるスタックポインタが示すスタック領域に格納して、プログラム格納部２の予め定められたアドレスが示す領域に格納されているプログラムを実行する。
【００２５】
ＣＰＵ１１は、コントロールレジスタ１４のマスクフラグがＯＮ（割込みがマスクされており割込み禁止状態）の場合には、割込み信号がアサートになっても現在実行しているプログラムを継続する。この場合には、ユーザプログラムにおいてコントロールレジスタ１４の割込みフラグを確認して所定の割込み処理を行なうか、マスクフラグがＯＦＦになった時に割込みを受け付ける。以下は、コントロールレジスタ１４のマスクフラグにはＯＦＦが設定されているものとして説明する。
【００２６】
図２は、この発明におけるリアルタイム組込み簡易モニタプログラムの実施の形態１の構成を示す概略図である。図２において、リアルタイム組込み簡易モニタプログラムは、複数（この場合は７つ）の割込みサービスルーチン（ＩＳＲ）８１〜８７および定常状態プログラム８０と、ＩＳＲ８１〜８７および定常状態プログラム８０の各種情報が設定される割込み制御ブロック（ＩＣＢ：Interrupt Control Block）４０〜４７を有する割込み制御ブロック配列（ＩＣＢ配列）４と、ＩＣＢ配列４に基づいてＩＳＲ８１〜８７および定常状態プログラム８０のスケジューリング（実行順序を決定して実行すべきＩＳＲ８１〜８７，および定常状態プログラム８０を選択する）を行なうスケジューラ６およびディスパッチャ７と、ＩＳＲ８１〜８７および定常状態プログラム８０で用いるセマフォの状態が設定されるセマフォ構造体群５と、ＩＳＲ８１〜８７および定常状態プログラム８０の状態制御を行なう状態処理プログラム９を備えている。
【００２７】
ＩＳＲ８１〜８７、定常状態プログラム８０、状態処理プログラム９、スケジューラ６およびディスパッチャ７の機能を実現するプログラムは、先の図１に示したプログラム格納部２に格納される。また、ＩＣＢ配列４およびセマフォ構造体群５は、先の図１に示したデータ格納部３に格納される。
【００２８】
ＩＳＲ８１〜８７は、ＣＰＵ１１に入力される各割込み信号による割込み処理のプログラムである。ここでは、ＩＳＲ８１がＩＳＲ８１〜８７の中で最も割込みレベルが低い（優先順位が低い）レベル１の割込み処理プログラムであり、ＩＳＲ８７がＩＳＲ８１〜８７の中で最も割込みレベルが高い（優先順位が高い）レベル７の割込み処理プログラムである。すなわち、ＩＳＲ８１、ＩＳＲ８２、ＩＳＲ８３、ＩＳＲ８４、ＩＳＲ８５、ＩＳＲ８６、ＩＳＲ８７の順に優先順位が高くなっている。
【００２９】
定常状態プログラム８０は、割込み信号による割込み処理とは異なる処理、すなわち非割込み状態（定常状態）時に実行される処理プログラムであり、コントロールレジスタ１４やＩＣＢ配列４、セマフォ構造体群５などの初期値を設定する処理、およびＩＳＲ８１〜８７の生成処理が含まれている。装置の起動時（電源投入時やシステムリセット時）には、まず定常状態プログラム８０が実行される。
【００３０】
ＩＣＢ配列４は、定常状態プログラム８０およびＩＳＲ８１〜８７に対応付けられたＩＣＢ４０〜４７を備えている。この発明におけるリアルタイム組込み簡易モニタプログラムは、ＩＣＢ４０〜４７に基づいて同期排他制御（スケジューリング）を実現する。そのため、非割込み状態において実行される定常状態プログラム８０も、最も割込みレベルの低いＩＳＲ８１よりもさらにレベルの低い（レベル０）ＩＳＲとして扱ってＩＣＢ４０を対応付ける。すなわち、ＩＣＢ配列４は、「割込みレベルの数＋１」個のＩＣＢを備えている。なお、以下、定常状態プログラム８０をＩＳＲ８０と呼ぶことがある。
【００３１】
ＩＣＢ４０〜４７は配列として繋がる構造を有し、この配列の繋がりの順番がＩＳＲ８０〜８７のスケジューリングの優先順位を示している。ここでは、割込みレベルがＩＳＲ８７、ＩＳＲ８６、ＩＳＲ８５、ＩＳＲ８４、ＩＳＲ８３、ＩＳＲ８２、ＩＳＲ８１、ＩＳＲ８０の順に低くなっているので、ＩＣＢ４７、ＩＣＢ４６、ＩＣＢ４５、ＩＣＢ４４、ＩＣＢ４３、ＩＣＢ４２、ＩＣＢ４１、ＩＣＢ４０の順に繋がれる。この繋がりが、ＩＳＲ８０〜８７の優先順位（ディスパッチャ７のＩＣＢ４０〜４７の検索順序）を示しており、繋がりに関する情報はデータ格納部３に格納される。
【００３２】
ＩＣＢ４０〜４７はすべて同じ構成を備えている。図３に示したＩＣＢ４７の構成を示す図を参照してＩＣＢの構成について説明する。
【００３３】
図３において、ＩＣＢ４７は、状態フラグ１７１、実行カウンタ１７２、セマフォ待ちインデックス１７３、実行回数上限値１７４、ＩＳＲ先頭アドレス１７５、スタックボトムアドレス１７６、スタックサイズ１７７、要求割込みレベル１７８、遅延時間カウンタ１７９、ＩＣＢ位置変更対象１８０、およびコンテキスト保存領域１８１で構成される。
【００３４】
状態フラグ１７１は、ＩＣＢ４７の状態を示すフラグの集合であり、有効／無効フラグ１７１１、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２、セマフォ取得中フラグ１７１３、セマフォ待ちフラグ１７１４、割込みレベル変更要求フラグ１７１５、実行回数上限指定フラグ１７１６、スタックオーバーフローチェック要求フラグ１７１７、遅延中フラグ１７１８、およびＩＣＢ位置変更フラグ１７１９で構成される。
【００３５】
有効／無効フラグ１７１１には、ＩＳＲ８７を使用可能であるか否か、すなわちスケジューリングの対象とするか否かの情報が設定される。ＩＳＲ８７が使用可能である場合、有効／無効フラグ１７１１にはＯＮ（この場合は「１」）が設定され、ＩＣＢ４７が使用不可である場合、有効／無効フラグ１７１１にはＯＦＦ（この場合は「０」）が設定される。
【００３６】
ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２には、ＩＳＲ８７が割込み待ち状態であるか否かの情報が設定される。ＩＳＲ８７が割込み待ち状態である場合、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２にはＯＦＦ（この場合は「０」）が設定され、ＩＳＲ８７が割込み待ち状態ではない場合、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２にはＯＮ（この場合は「１」）が設定される。
【００３７】
セマフォ取得中フラグ１７１３には、ＩＳＲ８７が任意のセマフォを取得しているか否かの情報が設定される。ＩＳＲ８７が任意のセマフォを取得している場合、セマフォ取得中フラグ１７１３にはＯＮ（この場合は「１」）が設定され、ＩＳＲ８７がセマフォを取得していない場合、セマフォ取得中フラグ１７１３にはＯＦＦ（この場合は「０」）が設定される。
【００３８】
セマフォ待ちフラグ１７１４には、ＩＳＲ８７が任意のセマフォの待ち状態であるか否かの情報が設定される。ＩＳＲ８７が任意のセマフォ待ち状態である場合、セマフォ待ちフラグ１７１４にはＯＮ（この場合は「１」）が設定され、ＩＳＲ８７がセマフォの待ち状態ではない場合、セマフォ待ちフラグ１７１４にはＯＦＦ（この場合は「０」）が設定される。
【００３９】
割込みレベル変更要求フラグ１７１５には、予め定められている割込みレベルを変更するか否かの情報が設定される。予め定められている割込みレベルで動作する場合（自身より優先度の高い割込みのみ受け付ける場合）、割込みレベル変更要求フラグ１７１５にはＯＦＦ（この場合は「０」）が設定され、要求割込みレベル１７８に設定されている割込みレベルで動作する場合、割込みレベル変更要求フラグ１７１５にはＯＮ（この場合は「１」）が設定される。
【００４０】
実行回数上限指定フラグ１７１６には、複数回ＩＳＲ８７が処理する割込みが発生した場合にＩＳＲ８７の実行回数を制限するか否かの情報が設定される。実効回数を制限しない場合（割込みが発生した回数だけＩＳＲ８７を実行する場合）、実行回数上限指定フラグ１７１６にはＯＦＦ（この場合は「０」）が設定され、実行回数を制限する場合、実行回数上限指定フラグ１７１６にはＯＮ（この場合は「１」）が設定される。
【００４１】
スタックオーバーフローチェック要求フラグ１７１７には、コンテキスト保存領域１８１にオーバーフローが発生したか否かの情報が設定される。コンテキスト保存領域１８１にオーバーフローが発生していない（正常な）場合、スタックオーバーフローチェック要求フラグ１７１７にはＯＦＦ（この場合は「０」）が設定され、コンテキスト保存領域１８１にオーバーフローが発生した（異常な）場合、スタックオーバーフローチェック要求フラグ１７１７にはＯＮ（この場合は「１」）が設定される。
【００４２】
遅延中フラグ１７１８には、ＩＳＲ８７が実行停止状態（遅延実施状態）であるか否かの情報が設定される。ＩＳＲ８７が実行停止状態の場合、遅延中フラグ１７１８にはＯＮ（この場合は「１」）が設定され、ＩＳＲ８７が実行停止状態ではない場合、遅延中フラグ１７１８にはＯＦＦ（この場合は「０」）が設定される。
【００４３】
ＩＣＢ位置変更フラグ１７１９には、ＩＣＢ４７の位置を変更したか否かの情報が設定される。上述したように、ＩＣＢ４０〜４７は、予め定められた割込みレベルにしたがって繋がれている。ＩＣＢ位置変更フラグ１７１９には、この繋がりの位置を優先度の逆転を回避などの処理のために変更したか否か、すなわちスケジューリングの優先順位を割込みレベルとは異なる順番に変更したか否かの情報が設定される。位置を変更していない場合、ＩＣＢ位置変更フラグ１７１９にはＯＦＦ（この場合は「０」）が設定され、位置を変更した場合、ＩＣＢ位置変更フラグ１７１９にはＯＮ（この場合は「１」）が設定される。
【００４４】
実行カウンタ１７２には、ＩＳＲ８７を実行すべき回数、すなわちＩＳＲ８７を起動する割込みハンドラの発生回数が設定される。実行カウンタ１７２に設定される値は、実行回数上限値１７４フラグがＯＮの場合には実行回数上限値１７４に設定された値以内となる。
【００４５】
セマフォ待ちインデックス１７３には、ＩＳＲ８７が取得待ちのセマフォへのインデックス（取得待ちのセマフォを識別するためのセマフォ識別子）が設定される。セマフォ待ちインデックス１７３の値は、セマフォ待ちフラグ１７１４がＯＮの場合のみ有効となる。
【００４６】
実行回数上限値１７４には、ＩＳＲ８７を実行すべき回数の上限値、すなわち実行カウンタ１７２に設定する上限値が設定される。実行回数上限値１７４の値は、実行回数上限指定フラグ１７１６がＯＮの場合のみ有効となる。
【００４７】
ＩＳＲ先頭アドレス１７５には、プログラム格納部２のＩＳＲ８７が格納される領域の先頭アドレスが設定される。
【００４８】
スタックボトムアドレス１７６には、コンテキスト保存領域１８１の初期値（データ格納部３のコンテキスト保存領域１８１に最初にデータを格納するアドレス）が設定される。スタックサイズ１７７には、コンテキスト保存領域１８１のサイズ、すなわちデータ格納部３のコンテキスト保存領域１８１のメモリサイズが設定される。
【００４９】
スタックボトムアドレス１７６、およびスタックサイズ１７７に設定されている情報は、コンテキスト保存領域１８１がオーバーフローしているか否かをチェックする際に利用され、オーバーフローを検出した際にスタックオーバーフローチェック要求フラグ１７１７に「ＯＮ」を設定する。オーバーフローをチェックするタスクは、ＩＳＲ８０〜８７内で起動される。
【００５０】
要求割込みレベル１７８には、ＩＳＲ８７が実行状態の時に割込みを許可する割込みレベルを示す値が設定される。要求割込みレベル１７８の値は、割込みレベル変更要求フラグ１７１５がＯＮの場合のみ有効となる。
【００５１】
たとえば、ＩＳＲ８７は割込みレベル７であるので、割込みレベル変更要求フラグ１７１５が「ＯＦＦ」の場合にはＩＳＲ８０〜８６は割込むことはできない。しかし、割込みレベル変更要求フラグ１７１５が「ＯＮ」であって、かつ要求割込みレベル１７８が「３」の場合、割込みレベル３〜６のＩＳＲ８３〜８６の割込みが許可される。
【００５２】
遅延時間カウンタ１７９には、ＩＳＲ８７が遅延すべき残りの時間、すなわち実行停止状態から復帰するまでの時間が設定される。遅延時間カウンタ１７９の値は、遅延中フラグ１７１８がＯＮの場合のみ有効となる。
【００５３】
ＩＣＢ位置変更対象１８０は、ＩＣＢ４７の位置を変更した場合に、変更対象としたＩＳＲ８７〜８０の情報が設定される。ＩＣＢ位置変更対象１８０の値は、ＩＣＢ位置変更フラグ１７１９がＯＮの場合のみ有効となる。
【００５４】
コンテキスト保存領域１８１には、割込みが発生した時の状態、すなわちプログラムカウンタ１２やレジスタ群１３などＩＳＲ８７から割込みが発生した時の状態に復帰するために必要なコンテキストが設定される。
【００５５】
図２に戻って、セマフォ構造体群５は、ＩＳＲ８０〜８７が使用するセマフォの数（この場合は３つ）のセマフォ構造体２１〜２３で構成される。セマフォ構造体２１〜２３は、すべて同じ構成を有している。図４に示したセマフォ構造体２１の構成を示す図を参照して、セマフォ構造体の構成について説明する。
【００５６】
図４において、セマフォ構造体２１は、セマフォ値２１１と、所有ＩＳＲ２１２と、待ちＩＳＲ２１３とで構成される。セマフォ値２１１には、セマフォ構造体２１に対応するセマフォの残り数が設定される。セマフォ値２１１の初期値が「３」の場合（自身が管理するセマフォの数が３つの場合）、セマフォ値２１１の値が「３」であれば、自身が管理するセマフォはＩＳＲ８０〜８７に取得されていないことを示しており、セマフォ値２１１の値が「２」であれば、ＩＳＲ８０〜８７の何れかに自身が管理するセマフォが１つ取得されていることを示しており、セマフォ値２１１の値が「１」であれば、ＩＳＲ８０〜８７の何れかに自身が管理するセマフォが２つ取得されていることを示している。セマフォ値２１１の値が「０」あれば、ＩＳＲ８０〜８７の何れかに自身が管理するセマフォがすべて取得されている（セマフォの残りが無い）こと、すなわちＩＳＲ８０〜８７がセマフォを取得することはできないことを示している。
【００５７】
所有ＩＳＲ２１２には、セマフォ構造体２１が管理するセマフォを取得しているＩＳＲ８０〜８７を識別するためのＩＳＲ識別子が設定される。ＩＳＲ識別子は、ＩＳＲ８０〜８７に予め付与しておいてもよいし、プログラム格納部２がＩＳＲ８０〜８７を格納する先頭アドレス、または予め定められている割込みレベルを用いるようにしてもよい。
【００５８】
所有ＩＳＲ２１２とセマフォ値２１１とは連動しており、セマフォ値２１１の値と、所有ＩＳＲ２１２に設定されているＩＳＲ８０〜８７の数との合計が、セマフォ構造体２１が管理するセマフォの数と等しくなる。具体的には、セマフォ値２１１の値が「初期値−１」の場合、所有ＩＳＲ２１２にはＩＳＲ識別子が１つ設定されている。
【００５９】
待ちＩＳＲ２１３には、セマフォ構造体２１が管理するセマフォの取得待ちのＩＳＲ識別子が設定される。待ちＩＳＲ２１３にＩＳＲ識別子が設定されている場合には、セマフォ値２１１が「０」であり、所有ＩＳＲ２１２には、セマフォ構造体２１が管理するセマフォの数分のＩＳＲ識別子が設定されている。
【００６０】
この発明におけるリアルタイム組込み簡易モニタプログラムは、ＩＣＢ配列４およびセマフォ構造体群５を用いてＩＳＲ８０〜８７にタスクのような待ちになる状態を持たせることで同期排他制御を実現するものであり、ＩＳＲ８０〜８７は複数の状態を有している。状態処理プログラム９は、ＩＳＲ８０〜８７の状態を遷移させるためのプログラムであり、ＩＳＲ生成タスク９１、ＩＳＲ起動タスク９２、セマフォ取得タスク９３ａ、セマフォ取得タスク９３ｂ、セマフォ解放タスク９４、ＩＳＲ遅延タスク９５、ＩＳＲ復帰タスク９６、ＩＳＲ終了タスク９７、およびタイマ割込みハンドラ９８で構成される。
【００６１】
各タスク９１〜９７およびタイマ割込みハンドラ９８は、ユーザによって作成されるＩＳＲ８０〜８７で用いられ、スケジューラ６およびディスパッチャ７とともに当該タスクの状態を遷移させる。図５を参照して、各タスク９１〜９７、タイマ割込みハンドラ９８、スケジューラ６、およびディスパッチャ７の機能と、ＩＳＲ８０〜８７の状態について説明する。
【００６２】
ＩＳＲ８０〜８７は、ドーマント（ｄｏｒｍｎｔ）状態４０１、割込み待ち（ｎｏｔ  ｒｅａｄｙ）状態４０２、実行待ち（ｒｅａｄｙ）状態４０３、実行（ｒｕｎｎｉｎｇ）状態４０４、セマフォ待ち（ｓｅｍ＿ｗａｉｔ）状態４０５、および実行停止（ｓｌｅｅｐ）状態４０６の６つの状態をそれぞれ有している。
【００６３】
ドーマント状態４０１とは、プログラム格納部２にＩＳＲ８０〜８７が存在しているだけの状態、すなわちプログラム格納部２にＩＳＲ８０〜８７が命令コードとして存在するだけで使用不可の状態である。ＩＳＲ８０〜８７がドーマント状態４０１の場合、ＩＳＲ８０〜８７は使用することができないので、ＩＣＢ４０〜４７の有効／無効フラグ１７１１（図３参照）には「０」が設定され、ＩＳＲ８０〜８７に対応する割込みが発生した場合にはエラーとなる。ドーマント状態４０１においては、ＩＳＲ生成タスク（ｃｒｅ＿ｔｓｋ）９１のみ実行可能となる。
【００６４】
ＩＳＲ生成タスク９１は、作成すべきＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の有効／無効フラグ１７１１に「１」を設定して作成すべきＩＳＲ８０〜８７をドーマント状態４０１から割込み待ち状態４０２に遷移させる。また、ＩＳＲ生成タスク９１は、ＩＣＢ４０〜４７の初期設定を行なってユーザが所望の機能を実現するために必要なＩＳＲ８０〜８７を使用可能とする。
【００６５】
割込み待ち状態４０２とは、ドーマント状態４０１から遷移した（ＩＳＲ生成タスク９１を実行した）状態、または割込みが発生していない状態であり、ＩＳＲ８０〜８７を実行しない状態である。割込み待ち状態４０２には、ドーマント状態４０１、実行状態４０４、セマフォ待ち状態４０５、または実行停止状態４０６から遷移する。ＩＳＲ８０〜８７が割込み待ち状態４０２の場合、ＩＣＢ４０〜４７のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２（図３参照）には「０」が設定される。
【００６６】
ＩＳＲ起動タスク（ｓｔａ＿ｔｓｋ）９２は、ＩＳＲ８０〜８７をドーマント状態４０１から割込み待ち状態４０２に遷移させる。ＩＳＲ起動タスク９２は、ＩＳＲ８０〜８７に対応する割込みが発生した際にＣＰＵ１１が実行する割込みハンドラであり、発生した割込みに対応するＩＣＢ４０〜４７のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２を「１」にするとともに、ＩＣＢ４０〜４７を初期化する。
【００６７】
割込み待ち状態４０２とは、ＩＳＲ８０〜８７に対応する割込みが発生したことにより、割込み処理、すなわちＩＳＲ８０〜８７の実行を待ちの状態である。ＩＳＲ８０〜８７が割込み待ち状態４０２の場合、ＩＣＢ４０〜４７のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２には「１」が設定される。
【００６８】
スケジューラ６およびディスパッチャ７は、ＩＣＢ４０〜４７に基づいて割込み待ち状態４０２のＩＳＲ８０〜８７の中から実行すべきＩＳＲ８０〜８７、すなわち優先順位の最も高いＩＳＲ８０〜８７を選択し、選択したＩＳＲ８０〜８７に処理を移行することで実行状態４０４に遷移させる。
【００６９】
具体的には、スケジューラ６は、ＩＳＲ起動タスク９２、セマフォ取得タスク９３ａ、セマフォ解放タスク９４、ＩＳＲ遅延タスク９５、ＩＳＲ復帰タスク９６、ＩＳＲ終了タスク９７、またはタイマ割込みハンドラ９８から処理を移行（起動）されると、これらのタスク９２，９３ａ、９４〜９７、またはタイマ割込みハンドラ９８を実行したＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の実行カウンタ１７２（図３参照）に基づいてＩＳＲ８０〜８７を実行すべきか否かを判定する。スケジューラ６は、実行すべきであると判定した場合にディスパッチャ７に処理を移行する。
【００７０】
ディスパッチャ７は、ＩＣＢ４０〜４７の繋がりの先頭から順番にｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「１」が設定されているか否かを判定し、最初にｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「１」が設定されているＩＣＢ４０〜４７に対応するＩＳＲ８０〜８７を選択し、選択したＩＳＲ８０〜８７に処理を移行することで実行状態４０４に遷移させる。実行状態４０４とは、ＩＳＲ８０〜８７の処理が実行されている状態である。
【００７１】
セマフォ取得タスク（ｗａｉ＿ｓｅｍ，ｐｏｌ＿ｓｅｍ）９３ａ，９３ｂは、実行状態４０４のＩＳＲ８０〜８７が任意のセマフォを取得する際に起動され、セマフォ構造体２１〜２３に基づいてセマフォを取得する。セマフォ取得タスク９３ａは、セマフォが取得できた場合には起動元（呼び出し元のつぎのアドレス）に復帰し、セマフォが取得できなかった場合にはＩＳＲ８０〜８７をセマフォ待ち状態４０５に遷移させる。セマフォ取得タスク９３ｂは、ＩＳＲ８０〜８７をセマフォ待ち状態４０５に遷移させることなく、セマフォが取得できたか否かの情報を持って呼び出し元のつぎのアドレスに復帰する。
【００７２】
セマフォ待ち状態４０５とは、ＩＳＲ８０〜８７がセマフォ取得タスク９３ａを用いてセマフォを取得しようとした際にセマフォを取得できなかった場合、すなわち、取得しようとしたセマフォに対応するセマフォ構造体２１〜２３（図４参照）のセマフォ値２１１に「０」が設定され、所有ＩＳＲ２１２にセマフォの数のＩＳＲ識別子が設定され、待ちＩＳＲ２１３に少なくとも１つのＩＳＲ識別子が設定されている状態である。
【００７３】
セマフォ開放タスク（ｓｉｇ＿ｓｅｍ）９４は、ＩＳＲ８０〜８７が実行状態４０４であって、セマフォ取得タスク９３ａ,９３ｂによって取得したセマフォを開放する際に用いられ、セマフォ待ち状態４０５のＩＳＲ８０〜８７を実行待ち状態４０３に遷移させる。セマフォ開放タスク９４は、セマフォ待ち状態４０５のＩＳＲ８０〜８７を実行待ち状態４０３に遷移させる際には、遷移させるＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ待ちフラグ１７１４を「０」にする。
【００７４】
ＩＳＲ遅延タスク（ｄｌｙ＿ｔａｋ）９５は、ＩＳＲ８０〜８７が実行状態４０４にある場合に、実行を中断したいときに起動されるタスクであり、ＩＳＲ８０〜８７を実行状態４０４から実行停止状態４０６に遷移させる。
【００７５】
実行停止状態４０６とは、ＩＳＲ８０〜８７の実行を停止されている状態であり、ＩＣＢ４０〜４７の遅延中フラグ１７１８には「１」が設定される。実行停止状態４０６は、ＩＳＲ復帰タスク９６または所定時間の経過（タイマ割込みハンドラ９８）によって実行待ち状態４０３に遷移する。
【００７６】
ＩＳＲ復帰タスク９６は、復帰対象のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の遅延中フラグ１７１８に「ＯＦＦ」を設定し、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＮ」を設定し、遅延時間カウンタ１７９の値を初期化することで、遅延させるべき時間が経過する前に、強制的に復帰対象のＩＳＲ８０〜８７を実行停止状態４０６から実行待ち状態４０３に遷移させる。
【００７７】
タイマ割込みハンドラ９８は、プロセッサ１内のタイマ（図示せず）のカウント値が変化する毎に起動され、ＩＣＢ４０〜４７の遅延時間カウンタ１７９の値を変更する。タイマ割込みハンドラ９８は、ＩＣＢ４０〜４７の遅延時間カウンタ１７９の値が「０」になると、当該ＩＣＢ４０〜４７の状態フラグ１７１の遅延中フラグ１７１８に「０」を設定するとともに、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「１」を設定してＩＳＲ８０〜８７を実行停止状態４０６から実行待ち状態４０３に遷移させる。
【００７８】
ＩＳＲ終了タスク（ｅｘｔ＿ｔｓｋ）９７は、ＩＳＲ８０〜８７の終了時に起動され、起動したＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の実行カウンタ１７２の値に基づいてＩＳＲ８０〜８７を終了させてＩＳＲ８０〜８７を実行状態４０４から割込み待ち状態４０２に遷移させる。
【００７９】
つぎに、図６〜図１６のフローチャートを参照して、この発明のリアルタイム組込み簡易モニタプログラムの動作を説明する。なお、各タスク９１〜９７、およびタイマ割込みハンドラ９８を実行する際にＣＰＵ１１は、プログラムカウンタ１２の値およびレジスタ群１３内のスタックレジスタの値であるスタックポインタをスタック領域に格納しているものとする。また、呼び出し元（起動元）のつぎのアドレスに戻る際に割込み禁止状態は解除されるものとする。さらに、電源投入時、または外部からのシステムリセットによって、ＩＣＢ４０〜４７は初期化されているものとする。
【００８０】
まず、図６のフローチャートを参照して、図５に示したドーマント状態４０１から割込み待ち状態４０２にＩＳＲ８０〜８７を遷移させるＩＳＲ生成タスク９１のＩＳＲ生成処理の動作について説明する。
【００８１】
ＩＳＲ生成タスク９１は、ＣＰＵ１１の動作モードを割込み禁止状態にする（ステップＳ１００）。具体的には、ＩＳＲ生成タスク９１は、上述したコントロールレジスタ１４の割込み信号毎のマスクフラグをすべてＯＮにする。
【００８２】
ＩＳＲ生成タスク９１は、コンテキストをスタック領域に保存（格納）する（ステップＳ１０１）。ＩＳＲ生成タスク９１は、定常状態プログラム８０から起動されるため、定常状態プログラム８０に復帰して（呼び出し元のつぎのアドレスに戻って）ＩＳＲ生成タスク９１起動前の処理を継続するために必要な汎用レジスタの値などのコンテキストをスタック領域に保存する。スタック領域のどこにコンテキストを格納するかは、一般的なプログラムと同様にスタックポインタの値を用いて決定する。
【００８３】
以下、スタック領域に格納されているコンテキストと、ＩＳＲ８０〜８７が各タスク９１〜９７またはタイマ割込みハンドラ９８を起動する際にＣＰＵ１１がスタック領域に格納するプログラムカウンタ１２の値およびレジスタ群１３内のスタックレジスタの値であるスタックポインタとをプロセッサコンテキストと呼び、スタックレジスタを除くレジスタ群１３と、プログラムカウンタ１２の値を除くプログラムの復帰に必要なデータをコンテキストと呼ぶ。
【００８４】
ＩＳＲ生成タスク９１は、生成すべきＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の状態フラグ１７１の有効／無効フラグ１７１１がＯＮ（この場合は「１」）であるか否かを確認する（ステップＳ１０２）。
【００８５】
有効／無効フラグ１７１１が「ＯＮ」の場合、作成すべきＩＳＲ８０〜８７がすでに作成されていることを示している。ＩＳＲ生成タスク９１は作成すべきＩＳＲ８０〜８７を生成するために起動されるタスクであり、すでにＩＳＲ８０〜８７が作成されている（有効／無効フラグ１７１１がＯＮである）のはプログラムに異常が発生している場合である。したがって、ＩＳＲ生成タスク９１はエラー（ＩＳＲ生成異常を示すコード）を返して呼び出し元のつぎのアドレスに戻る（ステップＳ１０３）。
【００８６】
一方、有効／無効フラグ１７１１が「ＯＦＦ」（この場合は「０」）の場合、ＩＳＲ生成タスク９１は、作成すべきＩＳＲ８０〜８０７に対応するＩＣＢ４０〜４７の有効／無効フラグ１７１１に「ＯＮ」を設定するとともに、ＩＣＢ４０〜４７を初期化する（ステップＳ１０４，Ｓ１０５）。
【００８７】
具体的には、ＩＳＲ生成タスク９１は、作成すべきＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の有効／無効フラグ１７１１に「１」を設定し、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２、セマフォ取得中フラグ１７１３、セマフォ待ちフラグ１７１４、割込みレベル変更要求フラグ１７１５、遅延中フラグ１７１８、およびＩＣＢ位置変更フラグ１７１９に「０」を設定する。
【００８８】
ＩＳＲ生成タスク９１は、予め定められている割込みレベルを変更する場合には、割込みレベル変更要求フラグ１７１５に「１」を設定するとともに、要求割込みレベル１７８に要求を受け付ける割込みレベルを設定し、割込みレベルを変更しない場合には、割込みレベル変更要求フラグ１７１５に「０」を設定する。
【００８９】
ＩＳＲ生成タスク９１は、実行回数の上限値を設定する場合には、実行回数上限指定フラグ１７１６に「１」を設定するとともに、実行回数上限値１７４に実行回数の上限値を設定し、実行回数の上限値を設定しない場合（割込み発生の数だけ対応するＩＳＲ８０〜８７を実行する場合）には、実行回数上限指定フラグ１７１６に「０」を設定する。
【００９０】
また、ＩＳＲ生成タスク９１は、スタックオーバーフローチェックを行う場合にはスタックオーバーフローチェック要求フラグ１７１７スタックオーバーフローチェック要求フラグ１７１７に「１」を設定し、スタックオーバーフローチェックを行わない場合にはスタックオーバーフローチェック要求フラグ１７１７に「０」を設定する。
【００９１】
ＩＳＲ生成タスク９１は、ＩＳＲ先頭アドレス１７５には、ＩＣＢ４０〜４７に対応するＩＳＲ８０〜８７の先頭コードが格納されているプログラム格納部２のアドレスを設定し、スタックボトムアドレス１７６にはコンテキスト保存領域１８１の初期値を設定し、スタックサイズ１７７にはコンテキスト保存領域１８１のサイズを設定する。
【００９２】
また、ＩＳＲ生成タスク９１は、コンテキスト保存領域１８１にプログラムアドレスに設定した値と、コンテキスト保存領域１８１のスタックポインタの値とを設定する。
【００９３】
作成すべきＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７を初期化した後に、生成フラグは、スタック領域に保存したコンテキストを復帰して（汎用レジスタなどの値を作成タスク起動前の状態に戻して）呼び出し元のつぎのアドレスに戻る（ステップＳ１０６，Ｓ１０７）。
【００９４】
つぎに、図７のフローチャートを参照して、ＩＳＲ起動タスク９２のＩＳＲ起動処理の動作について説明する。ＩＳＲ起動タスク９２は、ＣＰＵ１１の動作モードを割込み禁止状態にして、コンテキストをスタック領域に保存する（ステップＳ２００，Ｓ２０１）。
【００９５】
ＩＳＲ起動タスク９２は、ＩＳＲ起動タスク９２を起動した（割込みが発生した）割込みに対応するＩＣＢ４０〜４７の有効／無効フラグ１７１１が「ＯＮ」であるか否かを確認する（ステップＳ２０２）。
【００９６】
有効／無効フラグ１７１１が「ＯＦＦ」の場合、ＩＳＲ起動タスク９２は、発生した割込みに対応するＩＳＲ８０〜８７が生成されていないので、例外（対応するＩＳＲ８０〜８７が生成されていないがＩＳＲ起動タスク９２が起動されたことを示すコード）を返して呼び出し元のつぎのアドレスに戻る（ステップＳ２０３）。
【００９７】
発生した割込みに対応するＩＣＢ４０〜４７の有効／無効フラグ１７１１が「ＯＮ」の場合、起動フラグは実行回数上限指定フラグ１７１６が「ＯＮ」であるか否かを判定する（ステップＳ２０４）。
【００９８】
実行回数上限指定フラグ１７１６が「ＯＮ」の場合、ＩＳＲ起動タスク９２は、発生した割込みに対応するＩＣＢ４０〜４７の実行カウンタ１７２に設定されている値と実行回数上限値１７４に設定されている値とを比較する（ステップＳ２０５）。
【００９９】
実行カウンタ１７２に設定されている値が実行回数上限値１７４に設定されている値より大きい場合、ＩＳＲ起動タスク９２は、例外（実行回数上限値を越えてＩＳＲ起動タスク９２が起動されたことを示すコード）を返して呼び出し元のつぎのアドレスに戻る（ステップＳ２０３）。
【０１００】
実行カウンタ１７２に設定されている値が実行回数上限値１７４に設定されている値以下の場合、または実行回数上限指定フラグ１７１６が「ＯＦＦ」の場合、ＩＳＲ起動タスク９２は、割り込まれた（ＩＳＲ起動タスク９２を実行する前に実行していた）ＩＳＲ８０〜８７の優先順位を取得する（ステップＳ２０６）。
【０１０１】
割り込まれた（ＩＳＲ起動タスク９２を実行する前に実行していた）ＩＳＲ８０〜８７の優先順位は、後述するディスパッチャ７の処理によってデータ格納部３の割込みタスクメモの領域に設定されている。ＩＳＲ起動タスク９２は、割込みタスクメモの領域からデータを読み出すことで、割り込まれた（ＩＳＲ起動タスク９２を実行する前に実行していた）ＩＳＲ８０〜８７の優先順位を取得する。割込みタスクメモとは、現在実行中のＩＳＲ８０〜８７の情報を保持するデータ格納部３の領域であり、後述するが、ディスパッチャ７によって現在実行中のＩＳＲ８０〜８７の情報が格納される。
【０１０２】
ＩＳＲ起動タスク９２は、スタック領域に保存されているプロセッサコンテキストを割り込まれたＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１に保存する（ステップＳ２０７）。すなわち、ＩＳＲ起動タスク９２は、自タスクが起動された際にＣＰＵ１１がスタック領域に保存したプログラムカウンタ１２の値およびスタックポインタと、ステップＳ２０１において自タスクがスタック領域に保存したコンテキストとを、自タスクが起動される前に実行していたＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１にコピーして保存する。
【０１０３】
ＩＳＲ起動タスク９２は、発生した割込みに対応するＩＣＢ４０〜４７の実行カウンタ１７２の値に１を加算（実行カウンタ１７２をインクリメント）する（ステップＳ２０８）。また、ＩＳＲ起動タスク９２は、発生した割込みに対応するＩＣＢ４０〜４７のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＮ」（この場合は「１」）を設定してスケジューラ６に処理を移行する（ステップＳ２０９，Ｓ２１０）。
【０１０４】
つぎに、図８のフローチャートを参照してスケジューラ６の動作を説明する。スケジューラ６は、発生した割込みに対応するＩＣＢ４０〜４７の実行カウンタ１７２の値が「１」以上であるか否かを判定する（ステップＳ３００）。発生した割込みに対応するＩＣＢ４０〜４７の実行カウンタ１７２の値が「１」より小さい場合、スケジューラ６は、エラー処理を実行する（ステップＳ３０１）。発生した割込みに対応するＩＣＢ４０〜４７の実行カウンタ１７２の値が「１」以上の場合、スケジューラ６は、ディスパッチャ７に処理を移行する（ステップＳ３０２）。
【０１０５】
つぎに、図９のフローチャートを参照して、ディスパッチャ７の動作を説明する。ディスパッチャ７は、データ格納部３に格納されている検索順序に従って、ＩＣＢ配列４におけるＩＣＢ４０〜４７の繋がりの先頭から順にｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２を検索し、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２が「ＯＮ」になっているか最初のＩＣＢ４０〜４７を取得する（ステップＳ４００）。
【０１０６】
ディスパッチャ７は、取得したＩＣＢ４０〜４７のコンテキスト保存領域１８１に保存されているコンテキストをスタック領域にコピーする（ステップＳ４０１）。ディスパッチャ７は、取得したＩＣＢ４０〜４７の優先順位を割込みタスクメモに格納する（ステップＳ４０２）。
【０１０７】
ディスパッチャ７は、割込みから復帰すべきアドレスおよびスタックポインタをスタック領域にコピーする（ステップＳ４０３）。具体的には、取得したＩＣＢ４０〜４７のコンテキスト保存領域１８１に保存されているアドレスおよびスタックポインタの値をスタック領域にコピーする。すなわち、復帰命令を実行したときに、取得したＩＣＢ４０〜４７に対応するＩＳＲ８０〜８７の処理を実行するようにプログラムカウンタ１２およびスタックレジスタが設定されるように、スタック領域のデータを書き換える。
【０１０８】
ディスパッチャ７は、取得したＩＣＢ４０〜４７の割込みレベル変更要求フラグ１７１５が「ＯＮ」であるか否かを判定する（ステップＳ４０４）。取得したＩＣＢ４０〜４７の割込みレベル変更要求フラグ１７１５が「ＯＮ」の場合、ディスパッチャ７は、取得したＩＣＢ４０〜４７の要求割込みレベル１７８に設定されている値をスタック領域にコピーする（ステップＳ４０５）。これにより、復帰命令によって割込みから復帰した際に、要求割込みレベル１７８に設定されている値の割込みレベルとなる。
【０１０９】
要求割込みレベル１７８に設定されている値をスタック領域にコピーした後、または割込みレベル変更要求フラグ１７１５が「ＯＦＦ」の場合、ディスパッチャ７は、割込みからの復帰命令を実行して、取得したＩＣＢ４０〜４７に対応するＩＳＲ８０〜８７を実行させる（ステップＳ４０６、Ｓ４０７）。
【０１１０】
つぎに、図１０のフローチャートを参照して、セマフォ取得タスク９３ａのセマフォ取得処理（セマフォを取得できない場合にはセマフォ待ち状態４０５に遷移する処理）の動作について説明する。
【０１１１】
セマフォ取得タスク９３ａは、ＣＰＵ１１の動作モードを割込み禁止状態にして、自タスクを起動した（実行中の）ＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１にプロセッサコンテキストを保存する（ステップＳ５００，Ｓ５０１）。
【０１１２】
セマフォ取得タスク９３ａは、要求するセマフォ（要求セマフォ）が存在するか否かを確認する（ステップＳ５０２）。具体的には、セマフォ取得タスク９３ａは、対象セマフォに対応するセマフォ構造体２１〜２３のセマフォ値２１１の値が「１」以上であるか否かを判定し、セマフォ値２１１の値が「１」以上である場合には要求するセマフォが存在すると認識し、セマフォ値２１１が「０」の場合には要求するセマフォが存在しないと認識する。
【０１１３】
要求セマフォが存在する場合、セマフォ取得タスク９３ａは、要求セマフォに対応するセマフォ構造体２１〜２３の所有ＩＳＲ２１２に実行中のＩＳＲ８０〜８７のＩＳＲ識別子を設定する（ステップＳ５０３）。
【０１１４】
セマフォ取得タスク９３ａは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ取得中フラグ１７１３に「ＯＮ」を設定する（ステップＳ５０４）。また、セマフォ取得タスク９３ａは、要求セマフォに対応するセマフォ構造体２１〜２３のセマフォ値２１１の値から１減算（デクリメント）して、呼び出し元のつぎのアドレスに戻る（ステップＳ５０５，Ｓ５０６）。
【０１１５】
一方、要求セマフォが存在しない場合、セマフォ取得タスク９３ａは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ待ちインデックス１７３に要求するセマフォのインデックスを設定する（ステップＳ５０７）。
【０１１６】
セマフォ取得タスク９３ａは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ待ちフラグ１７１４に「ＯＮ」を設定するとともにｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＦＦ」を設定する。（ステップＳ５０８）。これにより、実行中のＩＳＲ８０〜８７は、実行状態４０４からセマフォ待ち状態４０５に遷移する。
【０１１７】
セマフォ取得タスク９３ａは、要求セマフォに対応するセマフォ構造体２１〜２３の待ちＩＳＲ２１３に実行中のＩＳＲ８０〜８７のＩＳＲ識別子を設定して、スケジューラ６に処理を移行する（ステップＳ５０９，Ｓ５１０）。
【０１１８】
つぎに、図１１のフローチャートを参照して、セマフォ解放タスク９４のセマフォ解放処理の動作について説明する。セマフォ解放タスク９４は、ＣＰＵ１１の動作モードを割込み禁止状態にして、セマフォを解放する（セマフォ解放タスク９４を起動した）ＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１にプロセッサコンテキストを格納する（ステップＳ６００，Ｓ６０１）。
【０１１９】
セマフォ解放タスク９４は、セマフォを解放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ取得中フラグ１７１３に「ＯＦＦ」を設定する（ステップＳ６０２）。セマフォ解放タスク９４は、解放したセマフォを待つＩＳＲ８０〜８７が存在するか否かを判定する（ステップＳ６０３）。具体的には、セマフォ解放タスク９４は、解放したセマフォに対応するセマフォ構造体２１〜２３の待ちＩＳＲ２１３にＩＳＲ識別子が設定されているか否かを判定する。
【０１２０】
解放したセマフォを待つＩＳＲ８０〜８７が存在しない場合、セマフォ解放タスク９４は、解放したセマフォに対応するセマフォ構造体２１〜２３のセマフォ値２１１の値をインクリメントする（ステップＳ６０４）。
【０１２１】
セマフォ解放タスク９４は、ステップＳ６０１においてセマフォを解放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１に格納したプロセッサコンテキストを復帰（スタック領域にコピー）して、セマフォ解放タスク９４を起動した呼び出し元のつぎのアドレスに戻る（ステップＳ６０５，Ｓ６０６）。
【０１２２】
一方、解放したセマフォを待つＩＳＲ８０〜８７が存在する場合、セマフォ解放タスク９４は、セマフォ待ちしているＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ待ちインデックス１７３をクリアするとともに、セマフォ待ちフラグ１７１４に「ＯＦＦ」を設定し、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＮ」を設定する（ステップＳ６０７）。
【０１２３】
セマフォ解放タスク９４は、解放したセマフォに対応するセマフォ構造体２１〜２３の待ちＩＳＲ２１３をクリアする（ステップＳ６０８）。待ちＩＳＲ２１３には、解放したセマフォを待っているＩＳＲ８０〜８７のＩＳＲ識別子が設定されている。待ちＩＳＲ２１３に複数のＩＳＲ識別子が設定されている場合、セマフォ解放タスク９４は、予め定められた順番でつぎにセマフォを取得するＩＳＲ８０〜８７を選択する。たとえば、一番先に待ちＩＳＲ２１３に設定されたＩＳＲ８０〜８７を選択してもよいし、待ちＩＳＲ２１３に設定されているＩＳＲ８０〜８７の中で最も優先順位の高いＩＳＲ８０〜８７を選択するようにしてもよい。
【０１２４】
セマフォ解放タスク９４は、開放したセマフォに対応するセマフォ構造体２１〜２３の所有ＩＳＲ２１２に選択したＩＳＲ８０〜８７のＩＳＲ識別子を設定する（ステップＳ６０９）。すなわち、所有ＩＳＲ２１２の設定を、セマフォ待ちしていたＩＳＲ８０〜８７に変更する。その後、セマフォ解放タスク９４は、スケジューラ６に処理を移行する（ステップＳ６１０）。
【０１２５】
つぎに、図１２のフローチャートを参照して、セマフォ取得タスク９３ｂのセマフォ取得処理（セマフォを取得できない場合でもセマフォ取得待ち状態に遷移しない処理）の動作を説明する。なお、要求するセマフォが存在しておりセマフォを取得するステップＳ７００〜Ｓ７０６については、先の図１０のフローチャートを参照して説明したセマフォ取得タスク９３ａのセマフォ取得処理のステップＳ５００〜５０６の動作と同じであるので詳細な説明は省略する。
【０１２６】
セマフォ取得タスク９３ｂは、ＣＰＵ１１の動作モードを割込み禁止状態にして、セマフォ取得タスク９３ｂを起動した（現在実行中の）ＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１にプロセッサコンテキストを格納し、要求するセマフォ（対象セマフォ）が存在するか否かを確認する（ステップＳ７００〜Ｓ７０２）。
【０１２７】
要求するセマフォ（要求セマフォ）が存在する場合、セマフォ取得タスク９３ｂは、要求するセマフォ構造体２１〜２３の所有ＩＳＲ２１２に現在実行中のＩＳＲ８０〜８７のＩＳＲ識別子を設定する（ステップＳ７０３）。
【０１２８】
セマフォ取得タスク９３ｂは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ取得中フラグ１７１３に「ＯＮ」を設定するとともに、開放したセマフォに対応するセマフォ構造体２１〜２３のセマフォ値２１１の値をデクリメントして、呼び出し元のつぎのアドレスに戻る（ステップＳ７０４〜Ｓ７０６）。
【０１２９】
一方、要求セマフォが存在しない場合、セマフォ取得タスク９３ｂは、エラー（セマフォが取得できなかったことを示すコード）を返して、呼び出し元のつぎのアドレスに戻る（ステップＳ７０７）。
【０１３０】
つぎに、図１３のフローチャートを参照して、ＩＳＲ遅延タスク９５の遅延処理の動作について説明する。ＩＳＲ遅延タスク９５は、ＣＰＵ１１の動作モードを割込み禁止状態にして、コンテキストをスタック領域に保存する（ステップＳ８００，Ｓ８０１）。
【０１３１】
ＩＳＲ遅延タスク９５は、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の状態フラグ１７１のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＦＦ」を設定し、遅延中フラグ１７１８に「ＯＮ」を設定する（ステップＳ８０２，Ｓ８０３）。これにより、実行中のＩＳＲ８０〜８７は、実行状態４０４から実行停止状態４０６に遷移する。
【０１３２】
ＩＳＲ遅延タスク９５は、実行停止状態４０６に留まる時間、すなわちＩＳＲ遅延タスク９５を起動したＩＳＲ８０〜８７を遅延させる時間を対応するＩＣＢ４０〜４７の遅延時間カウンタ１７９に設定してスケジューラ６に処理を移行する（ステップＳ８０４，Ｓ８０５）。
【０１３３】
遅延時間カウンタ１７９の値は、後述するタイマ割込みハンドラ９８によってデクリメントされる。したがって、遅延時間カウンタ１７９に設定する値は、「遅延させる時間／タイマ割込みハンドラ９８が起動する時間」となる。ここで、タイマ割込みハンドラ９８が起動する時間とは、プロセッサ１内のタイマ（図示せず）による割込み時間のことである。
【０１３４】
つぎに、図１４のフローチャートを参照して、ＩＳＲ復帰タスク９６の遅延復帰処理の動作について説明する。ＩＳＲ復帰タスク９６は、ＣＰＵ１１の動作モードを割込み禁止状態にして、コンテキストをスタック領域に保存する（ステップＳ９００，Ｓ９０１）。
【０１３５】
ＩＳＲ復帰タスク９６は、実行停止状態４０６から復帰させる（復帰対象）ＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の状態フラグ１７１のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＮ」を設定し、遅延中フラグ１７１８に「ＯＦＦ」を設定する（ステップＳ９０２，Ｓ９０３）。これにより、復帰対象のＩＳＲ８０〜８７は、実行停止状態４０６から実行待ち状態４０３に遷移する。
【０１３６】
ＩＳＲ復帰タスク９６は、復帰対象のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の遅延時間カウンタ１７９の値を初期化（たとえば、「ｎｕｌｌ」を設定）して、スケジューラ６に処理を移行する（ステップＳ９０４，Ｓ９０５）。
【０１３７】
つぎに、図１５のフローチャートを参照して、タイマ割込みハンドラ９８のタイマ割込み処理の動作を説明する。タイマ割込みハンドラ９８は、コンテキストをスタック領域に保存する（ステップＳ１０００）。
【０１３８】
タイマ割込みハンドラ９８は、ＩＣＢ４０〜４７の繋がりの先頭のＩＣＢ４０〜４７を処理対象ＩＣＢとし、処理対象ＩＣＢの遅延中フラグ１７１８がＯＮ（「１」）であるか否かを判定する（ステップＳ１００１）。処理対象ＩＣＢの遅延中フラグ１７１８がＯＮの場合、タイマ割込みハンドラ９８は、処理対象ＩＣＢの遅延時間カウンタ１７９の値をデクリメントする（ステップＳ１００２）。
【０１３９】
タイマ割込みハンドラ９８は、処理対象ＩＣＢの遅延時間カウンタ１７９の値が「０」であるか否かを判定する（ステップＳ１００３）。処理対象ＩＣＢの遅延時間カウンタ１７９の値が「０」の場合、タイマ割込みハンドラ９８は、処理対象ＩＣＢのｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＮ」を設定するとともに、遅延中フラグ１７１８に「ＯＦＦ」を設定する（ステップＳ１００４，Ｓ１００５）。また、タイマ割込みハンドラ９８は、処理対象ＩＣＢの遅延時間カウンタ１７９を初期化（たとえば、「ｎｕｌｌ」を設定）する（ステップＳ１００６）。
【０１４０】
タイマ割込みハンドラ９８は、処理対象ＩＣＢがＩＣＢ配列４の最後尾のＩＣＢになるまで、ＩＣＢ配列４の繋がりに基づいて現在の処理対象ＩＣＢのつぎに繋がっているＩＣＢ４０〜４７を新たな処理対象ＩＣＢとして、処理対象ＩＣＢの遅延中フラグ１７１８がＯＮの場合には遅延時間カウンタ１７９の値をデクリメントし、デクリメント後の遅延時間カウンタ１７９の値が「０」の場合には処理対象ＩＣＢのｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２を「ＯＮ」にし、遅延中フラグ１７１８を「ＯＦＦ」にして自演時間カウンタを初期化する動作を繰り返す（ステップＳ１００１〜Ｓ１００８）。
【０１４１】
タイマ割込みハンドラ９８は、処理対象ＩＣＢがＩＣＢ配列４の最後尾のＩＣＢになるとスケジューラ６に処理を移行する（ステップＳ１００９）。
【０１４２】
つぎに、図１６のフローチャートを参照して、ＩＳＲ終了タスク９７のＩＳＲ終了処理の動作について説明する。ＩＳＲ終了タスク９７は、ＣＰＵ１１の動作モードを割込み禁止状態にする（ステップＳ１１００）。
【０１４３】
ＩＳＲ終了タスク９７は、自タスクを起動した（実行中の）ＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の実行カウンタ１７２の値をデクリメントする（ステップＳ１１０１）。ＩＳＲ終了タスク９７は、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の実行カウンタ１７２の値が「０」であるか否かを判定する（ステップＳ１１０２）。
【０１４４】
実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の実行カウンタ１７２の値が「０」の場合、ＩＳＲ終了タスク９７は、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＦＦ」を設定する（ステップＳ１１０３）。これにより、実行中のＩＳＲ８０〜８７は、実行状態４０４から割込み待ち状態４０２に遷移する。
【０１４５】
実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２を「ＯＦＦ」にした後、または実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７の実行カウンタ１７２の値が「０」ではない場合、ＩＳＲ終了タスク９７は、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７を初期化する（ステップＳ１１０４）。
【０１４６】
実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のスタックボトムアドレス１７６およびコンテキスト保存領域１８１を初期化した後に、ＩＳＲ終了タスク９７はスケジューラ６に処理を移行する（ステップＳ１１０５）。
【０１４７】
このようにこの実施の形態１においては、定常状態を含む複数のＩＳＲで構成される組込みソフトウェアに適用され、複数のＩＳＲで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、複数のＩＳＲの割込みレベルに対応付けられ各ＩＳＲの状態に関する情報を保持する割込み制御ブロック（ＩＣＢ）を有し、複数のＩＣＢをＩＳＲの割込みレベルの優先順位が高いものから順に接続したＩＣＢ配列と、に基づいてＩＳＲをスケジューリングする際に、ＩＳＲ起動タスクが、割込み発生時にスタック領域に格納されたプロセッサコンテキストを割込まれたＩＳＲに対応するＩＣＢのコンテキスト保存領域に格納するとともに、発生した割込みのＩＳＲに対応するＩＣＢに実行待ち状態であることを設定し、スケジューラおよびディスパッチャがＩＳＲのスケジューリング処理として、実行待ち状態が設定されているＩＣＢの中で最も優先順位の高いＩＣＢを選択し、選択したＩＣＢのコンテキスト保存領域に格納されているプロセッサコンテキストをスタック領域に格納して割込み復帰命令によって選択したＩＣＢに対応するＩＳＲを実行させる。
【０１４８】
すなわち、割込み発生時にスタック領域に格納されているプロセッサコンテキストを割込まれたＩＳＲに対応するＩＣＢのコンテキスト保存領域に格納するとともに、発生した割込みのＩＳＲを実行待ち状態に遷移させ、実行待ち状態のＩＳＲの中で最も優先順位の高いＩＳＲのＩＣＢのコンテキスト保存領域に格納されているプロセッサコンテキストをスタック領域に格納して、割込み復帰命令によって復帰する戻りアドレスを差し替えることで、実行待ち状態のＩＳＲの中で最も優先順位の高いＩＳＲを実行させるようにしている。これにより、リアルタイムＯＳを用いることなく、同期排他制御を実現する最小限の構造（ＩＳＲのみ）で、リアルタイムＯＳを用いた場合と比較して製品に必要なメモリ容量を減らすことができる。
【０１４９】
また、この実施の形態１においては、セマフォ取得タスクが、実行中のＩＳＲが要求するセマフォに対応付けられたセマフォ構造体のセマフォ数の値が１以上の場合、当該セマフォ数の値をデクリメントするとともに、セマフォを要求するＩＳＲのＩＳＲ識別子を当該所有ＩＳＲに設定してセマフォを取得し、要求するセマフォに対応付けられたセマフォ構造体のセマフォ数が１より小さい場合、セマフォを要求するＩＳＲのＩＳＲ識別子を当該待ちＩＳＲに設定して、セマフォを要求したＩＳＲに対応付けられたＩＣＢにセマフォ待ち状態を設定し、セマフォ解放タスクが、実行中のＩＳＲが開放するセマフォに対応付けられたセマフォ構造体のセマフォ数をインクリメントするとともに当該所有ＩＳＲに設定されているセマフォを開放するＩＳＲのＩＳＲ識別子を削除し、当該待ちＩＳＲにＩＳＲ識別子が設定されている場合には、当該セマフォ数をデクリメントするとともに当該待ちＩＳＲに設定されているＩＳＲ識別子を当該所有ＩＳＲに設定し、当該待ちＩＳＲに設定されているＩＳＲ識別子を削除し、新たにセマフォを取得したＩＳＲに対応付けられたＩＣＢに実行待ち状態を設定するようにしている。
【０１５０】
すなわち、要求するセマフォを取得できない場合には、セマフォを要求したＩＳＲをセマフォ待ち状態に遷移させて処理を一時停止させ、要求したセマフォを取得しているＩＳＲがセマフォを開放したときに、開放したセマフォをセマフォ待ち状態のＩＳＲに取得させて実行待ち状態に遷移させるようにしている。これにより、リアルタイムＯＳを用いることなく、ＩＳＲのみで同期排他制御を実行する場合でも、セマフォを利用した同期排他制御を実現することができる。
【０１５１】
また、この実施の形態１では、ＩＳＲ起動タスクが、割込みが発生するごとに、発生した割込みの処理を行なうＩＳＲに対応付けられたＩＣＢの実行カウンタの値をインクリメントしてＩＣＢに割込み回数を保持させ、ディスパッチャが、実行カウンタが保持する割込み回数だけ当該ＩＣＢを選択対象とし前記割込み回数だけ自身が対応づけられたＩＳＲを実行させ、ＩＳＲ終了タスクが、実行カウンタの値をデクリメントするようにしているため、リアルタイムＯＳを用いることなくＩＳＲのみで同期排他制御を実現する場合でも、何回割込みが発生したかを認識して、割込み発生回数だけ処理を実行することができる。
【０１５２】
実施の形態２．
図１７〜図２１（図２１−１、図２１−２を示す）を用いてこの発明の実施の形態２を説明する。この実施の形態２では、セマフォを利用する際に発生する優先度（割込みレベルの優先順位）の逆転を回避するものである。
【０１５３】
まず、図５および図１７を参照して優先度の逆転について説明する。なお、説明を簡単にするために、ここではセマフォの数は１つとし、１つのＩＳＲがセマフォを取得していると他のタスクはセマフォを取得することができないものとする。
【０１５４】
図１７において、左軸１６０１は優先順位を示し、下軸１６０２は時間軸（時間経過）を示しており、ＩＳＲ１６０３はＩＳＲ１６０３〜１６０６の中で最も優先順位が高く（優先度４）、ＩＳＲ１６０４はＩＳＲ１６０３のつぎに優先順位が高く（優先度３）、ＩＳＲ１６０５はＩＳＲ１６０４のつぎに優先順位が高く（優先度２）、ＩＳＲ１６０６はＩＳＲ１６０３〜１６０６の中で最も優先順位が低い（優先度１）タスクである。
【０１５５】
時刻ｔ１においてＩＳＲ１６０６が起動される。時刻ｔ１においては、ＩＳＲ１６０６のみが起動されているので、ＩＳＲ１６０６が実行状態４０４となりセマフォを取得する。
【０１５６】
時刻ｔ２においてＩＳＲ１６０３が起動される。ＩＳＲ１６０３は優先度４であり、実行状態のＩＳＲ１６０６は優先度１であるので、ＩＳＲ１６０６は実行待ち状態４０３とりＩＳＲ１６０３が実行状態４０４となる。
【０１５７】
時刻ｔ３において、実行状態４０４のＩＳＲ１６０３がセマフォを取得しようとするが、ＩＳＲ１６０６が共有するセマフォを取得しているため、ＩＳＲ１６０３はセマフォ待ち状態４０５となる。そのため、ＩＳＲ１６０３よりも優先度は低いがセマフォを取得しているＩＳＲ１６０６が実行状態４０４となる。
【０１５８】
時刻ｔ４においてＩＳＲ１６０４、１６０５が起動される。ＩＳＲ１６０４は優先度３であり、ＩＳＲ１６０５は優先度２であるので、実行状態４０４のＩＳＲ１６０６が実行待ち状態４０３となり、ＩＳＲ１６０４が実行状態４０４となる。すなわち、最も優先度の高い優先度４のＩＳＲ１６０３よりも先に優先度の低いＩＳＲ１６０４が実行状態４０４となる。
【０１５９】
時刻ｔ５においてＩＳＲ１６０４が終了（割込み待ち状態４０２に遷移）する。時刻ｔ５においては、ＩＳＲ１６０３、１６０５、１６０６が待ち状態となっている。待ち状態（実行待ち状態４０３およびセマフォ待ち状態４０５）のＩＳＲ１６０３、１６０５、１６０６の中で、ＩＳＲ１６０３が優先度は最も高い。しかしながら、ＩＳＲ１６０３はＩＳＲ１６０６が取得しているセマフォが開放されるのを待つセマフォ待ち状態４０５であり、実行状態４０４に遷移することはできない。したがって、ＩＳＲ１６０３のつぎに優先度の高いＩＳＲ１６０５が実行状態４０４となる。
【０１６０】
時刻ｔ６においてＩＳＲ１６０５が終了する。時刻ｔ６においては、ＩＳＲ１６０３、１６０６が待ち状態となっている。ＩＳＲ１６０３は、ＩＳＲ１６０６よりも優先度は高いがＩＳＲ１６０６が取得しているセマフォを待っているセマフォ待ち状態４０５であるので、ＩＳＲ１６０６が実行状態４０４となる。
【０１６１】
時刻ｔ７においてＩＳＲ１６０６がセマフォを開放して処理を終了する。セマフォが開放されたため、セマフォ待ち状態４０５のＩＳＲ１６０３が実行待ち状態４０３を経て実行状態４０４となり、セマフォを取得して処理を再開する。
【０１６２】
このように、優先度１のＩＳＲ１６０６がセマフォを取得しているために、優先度４のＩＳＲ１６０３がセマフォ待ち状態４０５となった場合に、優先度２、３のＩＳＲ１６０４、１６０５が起動されると、セマフォを取得しているＩＳＲ１６０６よりも優先度の高いＩＳＲ１６０４、１６０５を実行した後にＩＳＲ１６０６を実行し、最も優先度の高いＩＳＲ１６０３が最後に実行される状態、すなわち優先度が逆転した形となりＩＳＲ１６０３〜１６０６の実行順序が変化することを優先度の逆転という。
【０１６３】
優先度の逆転を防止するためには、セマフォを取得しているＩＳＲと、ＩＳＲとセマフォを共有しておりかつセマフォ待ち状態になっているＩＳＲの優先度を交換すればよい。ただし、セマフォを取得しているＩＳＲの優先度が、このＩＳＲとセマフォを共有しておりかつセマフォ待ち状態になっているＩＳＲの優先度よりも高い場合には優先度の逆転は発生しないので、セマフォを取得しているＩＳＲの優先度が、このＩＳＲとセマフォを共有しておりかつセマフォ待ち状態になっているＩＳＲの優先度よりも低い場合のみ、ＩＳＲ間の優先度を交換する。
【０１６４】
具体的には、先の図１７の時刻ｔ３において、ＩＳＲ１６０３がセマフォ待ち状態４０５に遷移する際にＩＳＲ１６０６を優先度４とし、自身の優先度を優先度１とする優先度の交換を行なう。これにより、図１８に示すように、優先度３のＩＳＲ１６０４と優先度２のＩＳＲ１６０５とが起動されても、セマフォを取得しているＩＳＲ１６０６が実行状態４０４となる。
【０１６５】
時刻ｔ４ａにおいてＩＳＲ１６０６がセマフォを開放して処理を終了する。このときＩＳＲ１６０６は、セマフォ待ち状態４０５のＩＳＲ１６０３を優先度４とし、自身の優先度を優先度１とする優先度の交換、すなわち本来の優先度に戻して処理を終了する。これにより、図１９に示すように、ＩＳＲ１６０４、ＩＳＲ１６０５よりも先にＩＳＲ１６０３が実行状態４０４となり、ＩＳＲ１６０３、ＩＳＲ１６０４、ＩＳＲ１６０５という本来の優先順位にしたがって処理が行なわれ、セマフォを利用する際の優先度の逆転が回避される。
【０１６６】
つぎに、セマフォを利用する際の優先度の逆転を回避するこの実施の形態２のリアルタイム組込み簡易モニタプログラムについて説明する。この実施の形態２のリアルタイム組込み簡易モニタプログラムが適用される装置の構成は、先の図１に示した実施の形態１の装置の構成と同じであるので、ここではその説明を省略する。
【０１６７】
この発明における実施の形態２のリアルタイム組込み簡易モニタプログラムは、先の図２に示した実施の形態１のリアルタイム組込み簡易モニタプログラムのセマフォ取得タスク９３ａおよびセマフォ解放タスク９４の代わりに、セマフォ取得タスク９３ｃおよびセマフォ解放タスク９４ａを備えている。
【０１６８】
セマフォ取得タスク９３ｃは、セマフォ取得タスク９３ａの機能に加え、要求するセマフォを取得することができない（セマフォ待ち状態４０５に遷移する）場合に、要求するセマフォを取得しているＩＳＲ８０〜８７の優先度と実行中のＩＳＲ８０〜８７との優先度とを交換（変更）する機能を備えている。
【０１６９】
セマフォ解放タスク９４ａは、セマフォ解放タスク９４の機能に加え、自タスクを起動した（実行中の）ＩＳＲ８０〜８７の優先度が変更されている場合、変更されている優先度を予め定められた優先度に戻す機能を備えている。
【０１７０】
つぎに、この実施の形態２のリアルタイム組込み簡易モニタプログラムの動作を説明する。なお、この実施の形態２のリアルタイム組込み簡易モニタプログラムと先の実施の形態１のリアルタイム組込み簡易モニタプログラムとの相違点は、セマフォの取得処理およびセマフォ開放処理であるので、ここではセマフォの取得処理を実現するセマフォ取得タスク９３ｃ、およびセマフォの開放処理を実現するセマフォ解放タスク９４ａの動作のみを説明する。
【０１７１】
まず、図２０−１および図２０−２のフローチャートを参照して、セマフォ取得タスク９３ｃの動作を説明する。セマフォ取得タスク９３ｃは、ＣＰＵ１１の動作モードを割込み禁止状態にして、自タスクを起動した（実行中の）ＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１にプロセッサコンテキストを保存する（図２０−１のステップＳ１２００，Ｓ１２０１）。
【０１７２】
セマフォ取得タスク９３ｃは、要求するセマフォ（要求セマフォ）が存在するか否かを確認する（図２０−１のステップＳ１２０２）。要求セマフォが存在する場合、セマフォ取得タスク９３ｃは、要求セマフォに対応するセマフォ構造体２１〜２３の所有ＩＳＲ２１２に実行中のＩＳＲ８０〜８７のＩＳＲ識別子を設定する（図２０−１のステップＳ１２０３）。
【０１７３】
セマフォ取得タスク９３ｃは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ取得中フラグ１７１３に「ＯＮ」を設定する（図２０−１のステップＳ１２０４）。また、セマフォ取得タスク９３ｃは、要求セマフォに対応するセマフォ構造体２１〜２３のセマフォ値２１１の値をデクリメントして、呼び出し元のつぎのアドレスに戻る（図２０−１のステップＳ１２０５，Ｓ１２０６）。
【０１７４】
一方、要求セマフォが存在しない場合、セマフォ取得タスク９３ｃは、要求セマフォを取得しているＩＳＲ８０〜８７の優先順位が、実行中のＩＳＲ８０〜８７の優先順位よりも高いか否かを判定する（図２０−２のステップＳ１２０７）。
【０１７５】
具体的には、セマフォ取得タスク９３ｃは、要求セマフォに対応するセマフォ構造体２１〜２３の所有ＩＳＲ２１２に設定されているＩＳＲ識別子から、要求セマフォを取得しているＩＳＲ８０〜８７を認識する。また、セマフォ取得タスク９３ｃは、ディスパッチャ７によって実行中のＩＳＲ８０〜８７の優先順位が設定されている割込みタスクメモから、実行中のＩＳＲ８０〜８７の優先順位を取得する。セマフォ取得タスク９３ｃは、認識したＩＳＲ８０〜８７の優先順位と、割込みタスクメモから取得した優先順位とを比較して、要求セマフォを取得しているＩＳＲ８０〜８７の優先順位が、実行中のＩＳＲ８０〜８７の優先順位よりも高いか否かを判定する。
【０１７６】
実行中のＩＳＲ８０〜８７の優先順位が要求セマフォを取得しているＩＳＲ８０〜８７の優先順位よりも高い場合、セマフォ取得タスク９３ｃは、要求セマフォを取得しているＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更フラグ１７１９に「ＯＮ」を設定する（図２０−２のステップＳ１２０８）。
【０１７７】
また、セマフォ取得タスク９３ｃは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更フラグ１７１９に「ＯＮ」を設定する（図２０−２のステップＳ１２０９）。
【０１７８】
セマフォ取得タスク９３ｃは、要求セマフォを取得しているＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更対象１８０に実行中のＩＳＲ８０〜８７の情報（ＩＳＲ識別子）を設定する（図２０−２のステップＳ１２１０）。
【０１７９】
また、セマフォ取得タスク９３ｃは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更対象１８０に要求セマフォを取得しているＩＳＲ８０〜８７の情報（ＩＳＲ識別子）を設定する（図２０−２のステップＳ１２１１）。
【０１８０】
セマフォ取得タスク９３ｃは、ＩＣＢ４０〜４７の位置を変更する（図２０−２のステップＳ１２１２）。具体的には、セマフォ取得タスク９３ｃは、ＩＣＢ配列４におけるＩＣＢ４０〜４７の繋がりにおいて、要求セマフォを取得しているＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７と、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７とを入れ替える。これにより、ディスパッチャ７が実行すべきＩＳＲ８０〜８７を検索する順番が変更され優先順位が交換されたことになる。
【０１８１】
セマフォ取得タスク９３ｃは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ待ちインデックス１７３に要求するセマフォのインデックスを設定する（図２０−２のステップＳ１２１３）。
【０１８２】
セマフォ取得タスク９３ｃは、実行中のＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ待ちフラグ１７１４に「ＯＮ」を設定するとともにｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＦＦ」を設定する（図２０−２のステップＳ１２１４）。セマフォ取得タスク９３ｃは、要求セマフォに対応するセマフォ構造体２１〜２３の待ちＩＳＲ２１３に実行中のＩＳＲ８０〜８７のＩＳＲ識別子を設定して、スケジューラ６に処理を移行する（図２０−２のステップＳ１２１５，Ｓ１２１６）。
【０１８３】
つぎに、図２１のフローチャートを参照して、セマフォ解放タスク９４ａの動作を説明する。セマフォ解放タスク９４ａは、ＣＰＵ１１の動作モードを割込み禁止状態にして、セマフォを解放する（セマフォ解放タスク９４ａを起動した）ＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１にプロセッサコンテキストを格納する（図２１−１のステップＳ１３００，Ｓ１３０１）。
【０１８４】
セマフォ解放タスク９４ａは、セマフォを解放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ取得中フラグ１７１３に「ＯＦＦ」を設定する（図２１−１のステップＳ１３０２）。セマフォ解放タスク９４ａは、解放したセマフォを待つＩＳＲ８０〜８７が存在するか否かを判定する（図２１−１のステップＳ１３０３）。
【０１８５】
解放したセマフォを待つＩＳＲ８０〜８７が存在しない場合、セマフォ解放タスク９４ａは、解放したセマフォに対応するセマフォ構造体２１〜２３のセマフォ値２１１の値をインクリメントする（図２１−１のステップＳ１３０４）。
【０１８６】
セマフォ解放タスク９４は、ステップＳ１３０１においてセマフォを解放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のコンテキスト保存領域１８１に格納したプロセッサコンテキストを復帰（スタック領域にコピー）して、セマフォ解放タスク９４ａを起動した呼び出し元のつぎのアドレスに戻る（図２１−１のステップＳ１３０５，Ｓ１３０６）。
【０１８７】
一方、解放したセマフォを待つＩＳＲ８０〜８７が存在する場合、セマフォ解放タスク９４ａは、セマフォ待ちしているＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のセマフォ待ちインデックス１７３をクリアするとともに、セマフォ待ちフラグ１７１４に「ＯＦＦ」を設定し、ｒｅａｄｙ／ｎｏｔｒｅａｄｙフラグ１７１２に「ＯＮ」を設定する（図２１−１のステップＳ１３０７）。
【０１８８】
セマフォ解放タスク９４は、解放したセマフォに対応するセマフォ構造体２１〜２３の待ちＩＳＲ２１３をクリアする（図２１−１のステップＳ１３０８）。セマフォ解放タスク９４ａは、開放したセマフォに対応するセマフォ構造体２１〜２３の所有ＩＳＲ２１２に選択したＩＳＲ８０〜８７のＩＳＲ識別子を設定する（図２１−１のステップＳ１３０９）。
【０１８９】
セマフォ解放タスク９４ａは、セマフォを開放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更フラグ１７１９が「ＯＮ」であるか否かを判定する（図２１−２のステップＳ１３１０）。
【０１９０】
ＩＣＢ位置変更フラグ１７１９が「ＯＮ」の場合、セマフォ解放タスク９４ａは、セマフォを取得したＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更フラグ１７１９に「ＯＦＦ」を設定する（図２１−２のステップＳ１３１１）。また、セマフォ解放タスク９４ａは、セマフォを開放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更フラグ１７１９に「ＯＦＦ」を設定する（ステップＳ２２−２のステップＳ１３１２）。
【０１９１】
セマフォ解放タスク９４ａは、セマフォを獲得したＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更対象１８０を初期化する（図２１−２のステップＳ１３１３）。また、セマフォ解放タスク９４ａは、セマフォを開放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更対象１８０を初期化する（図２１−２のステップＳ１３１４）。
【０１９２】
セマフォ解放タスク９４ａは、ＩＣＢ配列４におけるＩＣＢ４０〜４７の位置を元に戻す（図２１−２のステップＳ１３１５）。具体的には、ＩＣＢ配列４におけるＩＣＢ４０〜４７の繋がりにおいて、セマフォを開放したＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７と、セマフォを取得したＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７とを入れ替える。これにより、セマフォを取得したＩＳＲ８０〜８７がセマフォ待ち状態４０５に遷移する際に変更したＩＣＢ配列４におけるＩＣＢ４０〜４７の繋がりが、本来の優先順位に基づいた繋がりに戻される。
【０１９３】
ＩＣＢ配列４におけるＩＣＢ４０〜４７の位置を元に戻した後、またはセマフォを開放するＩＳＲ８０〜８７に対応するＩＣＢ４０〜４７のＩＣＢ位置変更フラグ１７１９が「ＯＦＦ」であった場合、セマフォ解放タスク９４ａは、スケジューラ６に処理を移行する（図２１−２のステップＳ１３１６）。
【０１９４】
このようにこの実施の形態２においては、セマフォ取得タスクが、要求するセマフォが使用不可であると判定した場合に、要求するセマフォを取得しているＩＳＲの優先順位とセマフォを要求したＩＳＲの優先順位とを比較して、要求するセマフォを取得しているＩＳＲの優先順位がセマフォを要求したＩＳＲの優先順位よりも低い場合には、要求するセマフォを取得しているＩＳＲの優先順位とセマフォを要求したＩＳＲの優先順位とを交換するようにＩＣＢ配列の接続を変更するとともに、優先順位を交換したＩＳＲに対応付けられたＩＣＢに優先順位を変更したことを示す情報を設定し、セマフォ解放タスクが、セマフォを開放するＩＳＲに対応付けられたＩＣＢに優先順位が変更されたことを示す情報が設定されている場合には、セマフォを開放するＩＳＲの現在の優先順位と、該セマフォを開放するＩＳＲと優先順位を交換したＩＳＲの現在の優先順位とを交換するようにＩＣＢ配列の接続を変更するとともに、優先順位を交換したＩＳＲに対応付けられたＩＣＢに優先順位の変更がないことを示す情報を設定する。これにより、セマフォを利用する際に予め定められた優先度とは異なる順番でＩＳＲが実行される優先順位の逆転を回避することができる。
【産業上の利用可能性】
【０１９５】
以上のように、本発明にかかるリアルタイム組込み簡易モニタプログラムは、組込みソフトウェアの同期排他制御に有用であり、特に、組込みソフトウェアを格納するメモリ容量が少ない場合の同期排他制御に適している。
【図面の簡単な説明】
【０１９６】
【図１】この発明におけるリアルタイム組込み簡易モニタプログラムが適用される装置の構成の一例を示す図である。
【図２】この発明におけるリアルタイム組込み簡易モニタプログラムの実施の形態１の構成を示す概略図である。
【図３】図２に示したＩＣＢの構成を示す図である。
【図４】図２に示したセマフォ構造体の構成を示す図である。
【図５】図２に示したＩＳＲの状態の遷移を説明するための図である。
【図６】実施の形態１の起動ＩＳＲ生成タスクの動作を説明するためのフローチャートである。
【図７】実施の形態１のＩＳＲ起動タスクの動作を説明するためのフローチャートである。
【図８】実施の形態１のスケジューラの動作を説明するためのフローチャートである。
【図９】実施の形態１のディスパッチャの動作を説明するためのフローチャートである。
【図１０】実施の形態１のセマフォ待ち状態に遷移するセマフォ取得タスクの動作を説明するためのフローチャートである。
【図１１】実施の形態１のセマフォ解放タスクの動作を説明するためのフローチャートである。
【図１２】実施の形態１のセマフォ待ち状態に遷移しないセマフォ取得タスクの動作を説明するためのフローチャートである。
【図１３】実施の形態１のＩＳＲ遅延タスクの動作を説明するためのフローチャートである。
【図１４】実施の形態１のＩＳＲ復帰タスクの動作を説明するためのフローチャートである。
【図１５】実施の形態１のタイマ割込みハンドラの動作を説明するためのフローチャートである。
【図１６】実施の形態１のＩＳＲ終了タスクの動作を説明するためのフローチャートである。
【図１７】優先度の逆転を説明するための図である。
【図１８】優先度の逆転の回避を説明するための図である。
【図１９】優先度の逆転の回避を説明するための図である。
【図２０−１】実施の形態２のセマフォ待ち状態に遷移するセマフォ取得タスクの動作を説明するためのフローチャートである。
【図２０−２】実施の形態２のセマフォ待ち状態に遷移するセマフォ取得タスクの動作を説明するためのフローチャートである。
【図２１−１】実施の形態２のセマフォ解放タスクの動作を説明するためのフローチャートである。
【図２１−２】実施の形態２のセマフォ解放タスクの動作を説明するためのフローチャートである。
【符号の説明】
【０１９７】
１  プロセッサ
２  プログラム格納部
３  データ格納部
４  ＩＣＢ配列
５  セマフォ構造体群
６  スケジューラ
７  ディスパッチャ
９  状態処理プログラム
１０  制御対象装置
１１  ＣＰＵ
１２  プログラムカウンタ
１３  レジスタ群
１４  コントロールレジスタ
２１，２２，２３  セマフォ構造体
４０，４１，４２，４３，４４，４５，４６，４７  ＩＣＢ
８０，８１，８２，８３，８４，８５，８６，８７，１６０３，１６０４，１６０５，１６０６  ＩＳＲ
９１  ＩＳＲ生成タスク
９２  ＩＳＲ起動タスク
９３ａ，９３ｂ，９３ｃ  セマフォ取得タスク
９４，９４ａ  セマフォ解放タスク
９５  ＩＳＲ遅延タスク
９６  ＩＳＲ復帰タスク
９７  ＩＳＲ終了タスク
９８  タイマ割込みハンドラ
４０１  ドーマント状態
４０２  割込み待ち状態
４０３  実行待ち状態
４０４  実行状態
４０５  セマフォ待ち状態
４０６  実行停止状態
１６０１  優先順位
１６０２  時間軸
【図１】
2007047866.tif 000003
【図２】
2007047866.tif 000004
【図３】
2007047866.tif 000005
【図４】
2007047866.tif 000006
【図５】
2007047866.tif 000007
【図６】
2007047866.tif 000008
【図７】
2007047866.tif 000009
【図８】
2007047866.tif 000010
【図９】
2007047866.tif 000011
【図１０】
2007047866.tif 000012
【図１１】
2007047866.tif 000013
【図１２】
2007047866.tif 000014
【図１３】
2007047866.tif 000015
【図１４】
2007047866.tif 000016
【図１５】
2007047866.tif 000017
【図１６】
2007047866.tif 000018
【図１７】
2007047866.tif 000019
【図１８】
2007047866.tif 000020
【図１９】
2007047866.tif 000021
【図２０−１】
2007047866.tif 000022
【図２０−２】
2007047866.tif 000023
【図２１−１】
2007047866.tif 000024
【図２１−２】
2007047866.tif 000025