JP4068106B2 - リアルタイム組込み簡易モニタプログラム - Google Patents

リアルタイム組込み簡易モニタプログラム Download PDF

Info

Publication number
JP4068106B2
JP4068106B2 JP2005228523A JP2005228523A JP4068106B2 JP 4068106 B2 JP4068106 B2 JP 4068106B2 JP 2005228523 A JP2005228523 A JP 2005228523A JP 2005228523 A JP2005228523 A JP 2005228523A JP 4068106 B2 JP4068106 B2 JP 4068106B2
Authority
JP
Japan
Prior art keywords
isr
semaphore
icb
interrupt
waiting
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.)
Expired - Fee Related
Application number
JP2005228523A
Other languages
English (en)
Other versions
JP2007047866A (ja
Inventor
茂樹 南角
禎一郎 井上
正実 岩橋
敏弘 川上
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.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
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 Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Priority to JP2005228523A priority Critical patent/JP4068106B2/ja
Priority to TW094145827A priority patent/TWI306216B/zh
Priority to CNB2006100064140A priority patent/CN100429625C/zh
Priority to US11/350,068 priority patent/US7472214B2/en
Publication of JP2007047866A publication Critical patent/JP2007047866A/ja
Priority to HK07106107.0A priority patent/HK1101434A1/xx
Application granted granted Critical
Publication of JP4068106B2 publication Critical patent/JP4068106B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4812Task transfer initiation or dispatching by interrupt, e.g. masked

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Mobile Radio Communication Systems (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)
  • Bus Control (AREA)

Description

本発明は、組込みソフトウェアの割込み処理、および割込み処理を利用した同期排他制御を行なうリアルタイム組込み簡易モニタプログラムに関するものである。
組込みソフトウェアは、外部事象の変化に対して速やかに応答するために、割込み処理を利用してリアルタイム性を確保している。また、組込みソフトウェアでは、μITRONなどの組込み制御用のリアルタイムOS(Operating System)を用いてセマフォやイベントフラグ、メイルボックスなどの同期排他制御を実現している。
同期排他制御を実現する従来技術として、たとえば、特許文献1がある。特許文献1には、タスクに実行するための条件を持たせ、その実行順序を制御することで同期排他制御を実現することで、組込みシステムに適用されるマルチプログラムング・システムのOS使用による記憶領域並びにプログラム・ステップを削減し、資源の効率を高めるとともに生産性並びに保守性を向上させる技術が開示されている。
具体的には、事象成立条件記憶手段に、プログラムを細分化したベクタごとに設定されるタスクの実行可能な条件の種別(イベント待ち、メッセージ待ち、時間待ち、起床待ちなど)、ならびに、状態(事象待ち中、事象成立済みなど)の成立条件を格納し、条件記憶手段に、事象成立条件記憶手段に格納されている事象が成立した時点に対応する事象待ち解除条件を格納し、タスクブロックは、タスクを制御するための制御情報を格納する。
タスク付属事象管理手段は、事象成立条件記憶手段に格納されている事象成立条件と、発生した事象とを比較照合し、タスク付属事象待ち管理手段は、タスクブロックに格納されている制御情報に基づいてタスク付属事象管理手段の検出機能によって事象待ちの状態となったタスクを事象待ち状態に遷移させるとともに、事象待ちタスク記憶手段に事象待ち状態に遷移させたタスクを格納する。そして、タスク付属事象待ち管理手段は、事象待ち状態のタスクに対する事象待ち解除条件が成立した時点において、当該タスクを実行待ち状態に遷移させ、実行待ちタスク記憶手段に実行待ち状態に遷移させたタスクを格納する。タスク管理手段は、実行中タスク記憶手段に格納されている現在CPUが実行中のタスク、および実行待ちタスク記憶手段に格納されている実行待ちタスクの中から、1つのタスクを選択して実行状態に遷移させる。
特開平7−295840号公報
上記特許文献1に記載の従来技術では、マルチプログラムング・システムのOS(リアルタイムOS)を使用する際に、タスクに実行するための条件を持たせ、その実行順序を制御することで同期排他制御を実現している。
しかしながら、組込みソフトウェアが搭載される製品のメモリ容量には限りがある。そのため、上記特許文献1に記載の従来技術のように同期排他制御を実現するためにリアルタイムOSを搭載すると、実際に必要なプログラムに用いることができるメモリ容量が少なくなってしまうという問題があった。この問題は、組込みソフトウェアを実行するプロセッサや、組込みソフトウェアを格納するメモリであるROM、組込みソフトウェアを実行する際に必要なデータを一時保持するメモリであるRAMなどを1チップで実現する製品においては顕著となる。
また、リアルタイムOSでは、タスクに待ち状態を持たせることでセマフォなどの同期排他制御を実現する。しかしながら、異なる優先度のタスクがセマフォを共有する場合、優先度の逆転が生じてしまうという問題があった。
具体的には、優先度の低いタスクがセマフォを取得している場合、優先度の高いタスクは待ち状態となる。このときに優先度の低いタスクより優先度が高く、セマフォ待ちのタスクより優先度が低い優先度が中のタスクが発生すると、セマフォを取得しているタスクより先に優先度が中のタスクが実行され、つぎにセマフォを取得しているタスクが実行され、最後に優先度の高いタスクが実行される。すなわち、予め定められた優先度とは異なる順番でタスクが処理されてしまうという問題があった。
これらの問題を解決するために、リアルタイムOSを用いることなく、割込み処理だけで組込みソフトウェアを開発することが考えられる。しかしながら、リアルタイムOSを用いることなく、割込み処理だけで組込みソフトウェアを開発した場合、同期排他制御を行なうことができないという問題が生じる。また、割込みが発生したことは認識できるが、何回割込みが発生したかを認識することはできないという問題が生じる。さらに、割込みが発生した場合にはその状態をスタック領域に保持しなければならず、状態をスタック領域に保持する間すべての割込みが禁止状態になるため、リアルタイム性が悪くなるという問題も生じる。
本発明は、上記に鑑みてなされたものであって、リアルタイムOSを用いることなく、割込み処理のみで同期排他制御を実現するリアルタイム組込み簡易モニタプログラムを得ることを第1の目的とする。
第2の目的は、リアルタイムOSを用いることなく、割込み処理のみで同期排他制御を実現する際に、それぞれの割込み処理の優先度の逆転を回避するリアルタイム組込み簡易モニタプログラムを得ることである。
上述した課題を解決し、目的を達成するために、本発明は、定常状態を含む複数の割込みサービスルーチン(ISR)で構成される組込みソフトウェアに適用され、前記複数のISRで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、前記複数のISRの割込みレベルに対応付けられ各ISRの状態に関する情報を保持する割込み制御ブロック(ICB)を有し、該ICBを前記ISRの割込みレベルの優先順位が高いものから順に接続したICB配列と、に基づいて前記ISRをスケジューリングするリアルタイム組込み簡易モニタプログラムであって、割込みが発生すると、割込み発生時にスタック領域に格納されたプログラムカウンタの値、スタックレジスタの値であるスタックポインタ、およびコンテキストを割込まれたISRに対応するICBのコンテキスト保存領域に格納するとともに、前記発生した割込みのISRに対応するICBに実行待ち状態であることを設定するISR起動ステップと、実行待ち状態が設定されているICBの中で最も優先順位の高いICBを選択し、選択したICBのコンテキスト保存領域に格納されているプログラムカウンタの値、スタックポインタ、およびコンテキストを前記スタック領域に格納して割込み復帰命令によって選択したISRを実行させるスケジューリングステップと、前記スケジューリングステップによって実行されたISRの処理を終了する際に、終了するISRに対応付けられたICBに割込み待ち状態であることを設定するISR終了ステップと、を備えることを特徴とする。
この発明によれば、定常状態を含む複数の割込みサービスルーチン(ISR)で構成される組込みソフトウェアに適用され、複数のISRで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、複数のISRの割込みレベルに対応付けられ各ISRの状態に関する情報を保持する割込み制御ブロック(ICB)を有し、複数のICBをISRの割込みレベルの優先順位が高いものから順に接続したICB配列と、に基づいてISRをスケジューリングする際に、ISR起動タスクが、割込み発生時にスタック領域に格納されたプロセッサコンテキスト(プログラムカウンタの値、スタックポインタ、およびコンテキスト)を割込まれたISRに対応するICBのコンテキスト保存領域に格納するとともに、発生した割込みのISRに対応するICBに実行待ち状態であることを設定し、スケジューラおよびディスパッチャがISRのスケジューリング処理として、実行待ち状態が設定されているICBの中で最も優先順位の高いICBを選択し、選択したICBのコンテキスト保存領域に格納されているプロセッサコンテキストをスタック領域に格納して割込み復帰命令によって選択したICBに対応するISRを実行させるようにしているため、リアルタイムOSを用いることなく、割込み処理のみで同期排他制御を実現するリアルタイム組込み簡易モニタプログラムを得ることができるという効果を奏する。
以下に、この発明におけるリアルタイム組込み簡易モニタプログラムの実施の形態を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
この発明におけるリアルタイム組込み簡易モニタプログラムは、割込み処理にタスクのような待ち状態となる状態を持たせることで、リアルタイムOSを用いることなく同期排他制御を実現するものであるが、説明を簡単にするために、以下の実施の形態においては、現在一般的に用いられているリアルタイムOSの1つであるμITRONの仕様の用語を用いて説明する。
実施の形態1.
図1〜図16を用いてこの発明の実施の形態1を説明する。図1は、この発明におけるリアルタイム組込み簡易モニタプログラムが適用される装置の構成の一例を示す図である。図1において、リアルタイム組込み簡易モニタプログラムを適用した装置は、プロセッサ1と、プログラム格納部2と、データ格納部3と、制御対象装置10とを備えている。
プログラム格納部2は、たとえば、ROM(Read Only Memory)などの記憶媒体で構成され、プロセッサ1によって実行されるユーザプログラムや、ユーザプログラムに必要な固定データなどを格納する。この発明におけるリアルタイム組込み簡易モニタプログラムは、ユーザプログラム内で用いられ同期排他制御を実現する。
データ格納部3は、RAM(Random Access Memory)などの書き込み可能な記憶媒体によって構成され、スタック領域や、ユーザプログラムにおいて必要なデータバッファ、リアルタイム組込み簡易モニタプログラムにおいて必要な情報を格納する。
プロセッサ1は、CPU(Control Processing Unit)11と、プログラムカウンタ12と、演算処理に用いる汎用レジスタやスタックポインタを格納するスタックレジスタなどを有するレジスタ群13と、割込み信号の制御情報を格納するコントロールレジスタ14とを備えている。
CPU11は、プログラム格納部2のプログラムカウンタ12が示すアドレスに格納されているプログラムコードを読み出し、読み出したプログラムコードに従ってレジスタ群13の汎用レジスタを用いて所定の演算処理を実行して制御対象装置10を制御する。
CPU11に入力される複数(この場合は7つ)の割込み信号は、制御対象装置10または外部から入力される。コントロールレジスタ14は、割込み信号毎に、割込み信号が発生したこと(割込み信号がアサートになったこと)を示す割込みフラグや、割込み信号をマスクするか否かが設定されるマスクフラグなどで構成される。
CPU11は、コントロールレジスタ14のマスクフラグがOFFの場合(マスクされていない場合)に割込み信号がアサートになると、現在実行しているプログラムカウンタ12の値、およびスタックレジスタの値(スタックポインタ)を、スタックレジスタに格納されるスタックポインタが示すスタック領域に格納して、プログラム格納部2の予め定められたアドレスが示す領域に格納されているプログラムを実行する。
CPU11は、コントロールレジスタ14のマスクフラグがON(割込みがマスクされており割込み禁止状態)の場合には、割込み信号がアサートになっても現在実行しているプログラムを継続する。この場合には、ユーザプログラムにおいてコントロールレジスタ14の割込みフラグを確認して所定の割込み処理を行なうか、マスクフラグがOFFになった時に割込みを受け付ける。以下は、コントロールレジスタ14のマスクフラグにはOFFが設定されているものとして説明する。
図2は、この発明におけるリアルタイム組込み簡易モニタプログラムの実施の形態1の構成を示す概略図である。図2において、リアルタイム組込み簡易モニタプログラムは、複数(この場合は7つ)の割込みサービスルーチン(ISR)81〜87および定常状態プログラム80と、ISR81〜87および定常状態プログラム80の各種情報が設定される割込み制御ブロック(ICB:Interrupt Control Block)40〜47を有する割込み制御ブロック配列(ICB配列)4と、ICB配列4に基づいてISR81〜87および定常状態プログラム80のスケジューリング(実行順序を決定して実行すべきISR81〜87,および定常状態プログラム80を選択する)を行なうスケジューラ6およびディスパッチャ7と、ISR81〜87および定常状態プログラム80で用いるセマフォの状態が設定されるセマフォ構造体群5と、ISR81〜87および定常状態プログラム80の状態制御を行なう状態処理プログラム9を備えている。
ISR81〜87、定常状態プログラム80、状態処理プログラム9、スケジューラ6およびディスパッチャ7の機能を実現するプログラムは、先の図1に示したプログラム格納部2に格納される。また、ICB配列4およびセマフォ構造体群5は、先の図1に示したデータ格納部3に格納される。
ISR81〜87は、CPU11に入力される各割込み信号による割込み処理のプログラムである。ここでは、ISR81がISR81〜87の中で最も割込みレベルが低い(優先順位が低い)レベル1の割込み処理プログラムであり、ISR87がISR81〜87の中で最も割込みレベルが高い(優先順位が高い)レベル7の割込み処理プログラムである。すなわち、ISR81、ISR82、ISR83、ISR84、ISR85、ISR86、ISR87の順に優先順位が高くなっている。
定常状態プログラム80は、割込み信号による割込み処理とは異なる処理、すなわち非割込み状態(定常状態)時に実行される処理プログラムであり、コントロールレジスタ14やICB配列4、セマフォ構造体群5などの初期値を設定する処理、およびISR81〜87の生成処理が含まれている。装置の起動時(電源投入時やシステムリセット時)には、まず定常状態プログラム80が実行される。
ICB配列4は、定常状態プログラム80およびISR81〜87に対応付けられたICB40〜47を備えている。この発明におけるリアルタイム組込み簡易モニタプログラムは、ICB40〜47に基づいて同期排他制御(スケジューリング)を実現する。そのため、非割込み状態において実行される定常状態プログラム80も、最も割込みレベルの低いISR81よりもさらにレベルの低い(レベル0)ISRとして扱ってICB40を対応付ける。すなわち、ICB配列4は、「割込みレベルの数+1」個のICBを備えている。なお、以下、定常状態プログラム80をISR80と呼ぶことがある。
ICB40〜47は配列として繋がる構造を有し、この配列の繋がりの順番がISR80〜87のスケジューリングの優先順位を示している。ここでは、割込みレベルがISR87、ISR86、ISR85、ISR84、ISR83、ISR82、ISR81、ISR80の順に低くなっているので、ICB47、ICB46、ICB45、ICB44、ICB43、ICB42、ICB41、ICB40の順に繋がれる。この繋がりが、ISR80〜87の優先順位(ディスパッチャ7のICB40〜47の検索順序)を示しており、繋がりに関する情報はデータ格納部3に格納される。
ICB40〜47はすべて同じ構成を備えている。図3に示したICB47の構成を示す図を参照してICBの構成について説明する。
図3において、ICB47は、状態フラグ171、実行カウンタ172、セマフォ待ちインデックス173、実行回数上限値174、ISR先頭アドレス175、スタックボトムアドレス176、スタックサイズ177、要求割込みレベル178、遅延時間カウンタ179、ICB位置変更対象180、およびコンテキスト保存領域181で構成される。
状態フラグ171は、ICB47の状態を示すフラグの集合であり、有効/無効フラグ1711、ready/notreadyフラグ1712、セマフォ取得中フラグ1713、セマフォ待ちフラグ1714、割込みレベル変更要求フラグ1715、実行回数上限指定フラグ1716、スタックオーバーフローチェック要求フラグ1717、遅延中フラグ1718、およびICB位置変更フラグ1719で構成される。
有効/無効フラグ1711には、ISR87を使用可能であるか否か、すなわちスケジューリングの対象とするか否かの情報が設定される。ISR87が使用可能である場合、有効/無効フラグ1711にはON(この場合は「1」)が設定され、ICB47が使用不可である場合、有効/無効フラグ1711にはOFF(この場合は「0」)が設定される。
ready/notreadyフラグ1712には、ISR87が割込み待ち状態であるか否かの情報が設定される。ISR87が割込み待ち状態である場合、ready/notreadyフラグ1712にはOFF(この場合は「0」)が設定され、ISR87が割込み待ち状態ではない場合、ready/notreadyフラグ1712にはON(この場合は「1」)が設定される。
セマフォ取得中フラグ1713には、ISR87が任意のセマフォを取得しているか否かの情報が設定される。ISR87が任意のセマフォを取得している場合、セマフォ取得中フラグ1713にはON(この場合は「1」)が設定され、ISR87がセマフォを取得していない場合、セマフォ取得中フラグ1713にはOFF(この場合は「0」)が設定される。
セマフォ待ちフラグ1714には、ISR87が任意のセマフォの待ち状態であるか否かの情報が設定される。ISR87が任意のセマフォ待ち状態である場合、セマフォ待ちフラグ1714にはON(この場合は「1」)が設定され、ISR87がセマフォの待ち状態ではない場合、セマフォ待ちフラグ1714にはOFF(この場合は「0」)が設定される。
割込みレベル変更要求フラグ1715には、予め定められている割込みレベルを変更するか否かの情報が設定される。予め定められている割込みレベルで動作する場合(自身より優先度の高い割込みのみ受け付ける場合)、割込みレベル変更要求フラグ1715にはOFF(この場合は「0」)が設定され、要求割込みレベル178に設定されている割込みレベルで動作する場合、割込みレベル変更要求フラグ1715にはON(この場合は「1」)が設定される。
実行回数上限指定フラグ1716には、複数回ISR87が処理する割込みが発生した場合にISR87の実行回数を制限するか否かの情報が設定される。実効回数を制限しない場合(割込みが発生した回数だけISR87を実行する場合)、実行回数上限指定フラグ1716にはOFF(この場合は「0」)が設定され、実行回数を制限する場合、実行回数上限指定フラグ1716にはON(この場合は「1」)が設定される。
スタックオーバーフローチェック要求フラグ1717には、コンテキスト保存領域181にオーバーフローが発生したか否かの情報が設定される。コンテキスト保存領域181にオーバーフローが発生していない(正常な)場合、スタックオーバーフローチェック要求フラグ1717にはOFF(この場合は「0」)が設定され、コンテキスト保存領域181にオーバーフローが発生した(異常な)場合、スタックオーバーフローチェック要求フラグ1717にはON(この場合は「1」)が設定される。
遅延中フラグ1718には、ISR87が実行停止状態(遅延実施状態)であるか否かの情報が設定される。ISR87が実行停止状態の場合、遅延中フラグ1718にはON(この場合は「1」)が設定され、ISR87が実行停止状態ではない場合、遅延中フラグ1718にはOFF(この場合は「0」)が設定される。
ICB位置変更フラグ1719には、ICB47の位置を変更したか否かの情報が設定される。上述したように、ICB40〜47は、予め定められた割込みレベルにしたがって繋がれている。ICB位置変更フラグ1719には、この繋がりの位置を優先度の逆転を回避などの処理のために変更したか否か、すなわちスケジューリングの優先順位を割込みレベルとは異なる順番に変更したか否かの情報が設定される。位置を変更していない場合、ICB位置変更フラグ1719にはOFF(この場合は「0」)が設定され、位置を変更した場合、ICB位置変更フラグ1719にはON(この場合は「1」)が設定される。
実行カウンタ172には、ISR87を実行すべき回数、すなわちISR87を起動する割込みハンドラの発生回数が設定される。実行カウンタ172に設定される値は、実行回数上限値174フラグがONの場合には実行回数上限値174に設定された値以内となる。
セマフォ待ちインデックス173には、ISR87が取得待ちのセマフォへのインデックス(取得待ちのセマフォを識別するためのセマフォ識別子)が設定される。セマフォ待ちインデックス173の値は、セマフォ待ちフラグ1714がONの場合のみ有効となる。
実行回数上限値174には、ISR87を実行すべき回数の上限値、すなわち実行カウンタ172に設定する上限値が設定される。実行回数上限値174の値は、実行回数上限指定フラグ1716がONの場合のみ有効となる。
ISR先頭アドレス175には、プログラム格納部2のISR87が格納される領域の先頭アドレスが設定される。
スタックボトムアドレス176には、コンテキスト保存領域181の初期値(データ格納部3のコンテキスト保存領域181に最初にデータを格納するアドレス)が設定される。スタックサイズ177には、コンテキスト保存領域181のサイズ、すなわちデータ格納部3のコンテキスト保存領域181のメモリサイズが設定される。
スタックボトムアドレス176、およびスタックサイズ177に設定されている情報は、コンテキスト保存領域181がオーバーフローしているか否かをチェックする際に利用され、オーバーフローを検出した際にスタックオーバーフローチェック要求フラグ1717に「ON」を設定する。オーバーフローをチェックするタスクは、ISR80〜87内で起動される。
要求割込みレベル178には、ISR87が実行状態の時に割込みを許可する割込みレベルを示す値が設定される。要求割込みレベル178の値は、割込みレベル変更要求フラグ1715がONの場合のみ有効となる。
たとえば、ISR87は割込みレベル7であるので、割込みレベル変更要求フラグ1715が「OFF」の場合にはISR80〜86は割込むことはできない。しかし、割込みレベル変更要求フラグ1715が「ON」であって、かつ要求割込みレベル178が「3」の場合、割込みレベル3〜6のISR83〜86の割込みが許可される。
遅延時間カウンタ179には、ISR87が遅延すべき残りの時間、すなわち実行停止状態から復帰するまでの時間が設定される。遅延時間カウンタ179の値は、遅延中フラグ1718がONの場合のみ有効となる。
ICB位置変更対象180は、ICB47の位置を変更した場合に、変更対象としたISR87〜80の情報が設定される。ICB位置変更対象180の値は、ICB位置変更フラグ1719がONの場合のみ有効となる。
コンテキスト保存領域181には、割込みが発生した時の状態、すなわちプログラムカウンタ12やレジスタ群13などISR87から割込みが発生した時の状態に復帰するために必要なコンテキストが設定される。
図2に戻って、セマフォ構造体群5は、ISR80〜87が使用するセマフォの数(この場合は3つ)のセマフォ構造体21〜23で構成される。セマフォ構造体21〜23は、すべて同じ構成を有している。図4に示したセマフォ構造体21の構成を示す図を参照して、セマフォ構造体の構成について説明する。
図4において、セマフォ構造体21は、セマフォ値211と、所有ISR212と、待ちISR213とで構成される。セマフォ値211には、セマフォ構造体21に対応するセマフォの残り数が設定される。セマフォ値211の初期値が「3」の場合(自身が管理するセマフォの数が3つの場合)、セマフォ値211の値が「3」であれば、自身が管理するセマフォはISR80〜87に取得されていないことを示しており、セマフォ値211の値が「2」であれば、ISR80〜87の何れかに自身が管理するセマフォが1つ取得されていることを示しており、セマフォ値211の値が「1」であれば、ISR80〜87の何れかに自身が管理するセマフォが2つ取得されていることを示している。セマフォ値211の値が「0」あれば、ISR80〜87の何れかに自身が管理するセマフォがすべて取得されている(セマフォの残りが無い)こと、すなわちISR80〜87がセマフォを取得することはできないことを示している。
所有ISR212には、セマフォ構造体21が管理するセマフォを取得しているISR80〜87を識別するためのISR識別子が設定される。ISR識別子は、ISR80〜87に予め付与しておいてもよいし、プログラム格納部2がISR80〜87を格納する先頭アドレス、または予め定められている割込みレベルを用いるようにしてもよい。
所有ISR212とセマフォ値211とは連動しており、セマフォ値211の値と、所有ISR212に設定されているISR80〜87の数との合計が、セマフォ構造体21が管理するセマフォの数と等しくなる。具体的には、セマフォ値211の値が「初期値−1」の場合、所有ISR212にはISR識別子が1つ設定されている。
待ちISR213には、セマフォ構造体21が管理するセマフォの取得待ちのISR識別子が設定される。待ちISR213にISR識別子が設定されている場合には、セマフォ値211が「0」であり、所有ISR212には、セマフォ構造体21が管理するセマフォの数分のISR識別子が設定されている。
この発明におけるリアルタイム組込み簡易モニタプログラムは、ICB配列4およびセマフォ構造体群5を用いてISR80〜87にタスクのような待ちになる状態を持たせることで同期排他制御を実現するものであり、ISR80〜87は複数の状態を有している。状態処理プログラム9は、ISR80〜87の状態を遷移させるためのプログラムであり、ISR生成タスク91、ISR起動タスク92、セマフォ取得タスク93a、セマフォ取得タスク93b、セマフォ解放タスク94、ISR遅延タスク95、ISR復帰タスク96、ISR終了タスク97、およびタイマ割込みハンドラ98で構成される。
各タスク91〜97およびタイマ割込みハンドラ98は、ユーザによって作成されるISR80〜87で用いられ、スケジューラ6およびディスパッチャ7とともに当該タスクの状態を遷移させる。図5を参照して、各タスク91〜97、タイマ割込みハンドラ98、スケジューラ6、およびディスパッチャ7の機能と、ISR80〜87の状態について説明する。
ISR80〜87は、ドーマント(dormnt)状態401、割込み待ち(not ready)状態402、実行待ち(ready)状態403、実行(running)状態404、セマフォ待ち(sem_wait)状態405、および実行停止(sleep)状態406の6つの状態をそれぞれ有している。
ドーマント状態401とは、プログラム格納部2にISR80〜87が存在しているだけの状態、すなわちプログラム格納部2にISR80〜87が命令コードとして存在するだけで使用不可の状態である。ISR80〜87がドーマント状態401の場合、ISR80〜87は使用することができないので、ICB40〜47の有効/無効フラグ1711(図3参照)には「0」が設定され、ISR80〜87に対応する割込みが発生した場合にはエラーとなる。ドーマント状態401においては、ISR生成タスク(cre_tsk)91のみ実行可能となる。
ISR生成タスク91は、作成すべきISR80〜87に対応するICB40〜47の有効/無効フラグ1711に「1」を設定して作成すべきISR80〜87をドーマント状態401から割込み待ち状態402に遷移させる。また、ISR生成タスク91は、ICB40〜47の初期設定を行なってユーザが所望の機能を実現するために必要なISR80〜87を使用可能とする。
割込み待ち状態402とは、ドーマント状態401から遷移した(ISR生成タスク91を実行した)状態、または割込みが発生していない状態であり、ISR80〜87を実行しない状態である。割込み待ち状態402には、ドーマント状態401、実行状態404、セマフォ待ち状態405、または実行停止状態406から遷移する。ISR80〜87が割込み待ち状態402の場合、ICB40〜47のready/notreadyフラグ1712(図3参照)には「0」が設定される。
ISR起動タスク(sta_tsk)92は、ISR80〜87をドーマント状態401から割込み待ち状態402に遷移させる。ISR起動タスク92は、ISR80〜87に対応する割込みが発生した際にCPU11が実行する割込みハンドラであり、発生した割込みに対応するICB40〜47のready/notreadyフラグ1712を「1」にするとともに、ICB40〜47を初期化する。
割込み待ち状態402とは、ISR80〜87に対応する割込みが発生したことにより、割込み処理、すなわちISR80〜87の実行を待ちの状態である。ISR80〜87が割込み待ち状態402の場合、ICB40〜47のready/notreadyフラグ1712には「1」が設定される。
スケジューラ6およびディスパッチャ7は、ICB40〜47に基づいて割込み待ち状態402のISR80〜87の中から実行すべきISR80〜87、すなわち優先順位の最も高いISR80〜87を選択し、選択したISR80〜87に処理を移行することで実行状態404に遷移させる。
具体的には、スケジューラ6は、ISR起動タスク92、セマフォ取得タスク93a、セマフォ解放タスク94、ISR遅延タスク95、ISR復帰タスク96、ISR終了タスク97、またはタイマ割込みハンドラ98から処理を移行(起動)されると、これらのタスク92,93a、94〜97、またはタイマ割込みハンドラ98を実行したISR80〜87に対応するICB40〜47の実行カウンタ172(図3参照)に基づいてISR80〜87を実行すべきか否かを判定する。スケジューラ6は、実行すべきであると判定した場合にディスパッチャ7に処理を移行する。
ディスパッチャ7は、ICB40〜47の繋がりの先頭から順番にready/notreadyフラグ1712に「1」が設定されているか否かを判定し、最初にready/notreadyフラグ1712に「1」が設定されているICB40〜47に対応するISR80〜87を選択し、選択したISR80〜87に処理を移行することで実行状態404に遷移させる。実行状態404とは、ISR80〜87の処理が実行されている状態である。
セマフォ取得タスク(wai_sem,pol_sem)93a,93bは、実行状態404のISR80〜87が任意のセマフォを取得する際に起動され、セマフォ構造体21〜23に基づいてセマフォを取得する。セマフォ取得タスク93aは、セマフォが取得できた場合には起動元(呼び出し元のつぎのアドレス)に復帰し、セマフォが取得できなかった場合にはISR80〜87をセマフォ待ち状態405に遷移させる。セマフォ取得タスク93bは、ISR80〜87をセマフォ待ち状態405に遷移させることなく、セマフォが取得できたか否かの情報を持って呼び出し元のつぎのアドレスに復帰する。
セマフォ待ち状態405とは、ISR80〜87がセマフォ取得タスク93aを用いてセマフォを取得しようとした際にセマフォを取得できなかった場合、すなわち、取得しようとしたセマフォに対応するセマフォ構造体21〜23(図4参照)のセマフォ値211に「0」が設定され、所有ISR212にセマフォの数のISR識別子が設定され、待ちISR213に少なくとも1つのISR識別子が設定されている状態である。
セマフォ開放タスク(sig_sem)94は、ISR80〜87が実行状態404であって、セマフォ取得タスク93a,93bによって取得したセマフォを開放する際に用いられ、セマフォ待ち状態405のISR80〜87を実行待ち状態403に遷移させる。セマフォ開放タスク94は、セマフォ待ち状態405のISR80〜87を実行待ち状態403に遷移させる際には、遷移させるISR80〜87に対応するICB40〜47のセマフォ待ちフラグ1714を「0」にする。
ISR遅延タスク(dly_tak)95は、ISR80〜87が実行状態404にある場合に、実行を中断したいときに起動されるタスクであり、ISR80〜87を実行状態404から実行停止状態406に遷移させる。
実行停止状態406とは、ISR80〜87の実行を停止されている状態であり、ICB40〜47の遅延中フラグ1718には「1」が設定される。実行停止状態406は、ISR復帰タスク96または所定時間の経過(タイマ割込みハンドラ98)によって実行待ち状態403に遷移する。
ISR復帰タスク96は、復帰対象のISR80〜87に対応するICB40〜47の遅延中フラグ1718に「OFF」を設定し、ready/notreadyフラグ1712に「ON」を設定し、遅延時間カウンタ179の値を初期化することで、遅延させるべき時間が経過する前に、強制的に復帰対象のISR80〜87を実行停止状態406から実行待ち状態403に遷移させる。
タイマ割込みハンドラ98は、プロセッサ1内のタイマ(図示せず)のカウント値が変化する毎に起動され、ICB40〜47の遅延時間カウンタ179の値を変更する。タイマ割込みハンドラ98は、ICB40〜47の遅延時間カウンタ179の値が「0」になると、当該ICB40〜47の状態フラグ171の遅延中フラグ1718に「0」を設定するとともに、ready/notreadyフラグ1712に「1」を設定してISR80〜87を実行停止状態406から実行待ち状態403に遷移させる。
ISR終了タスク(ext_tsk)97は、ISR80〜87の終了時に起動され、起動したISR80〜87に対応するICB40〜47の実行カウンタ172の値に基づいてISR80〜87を終了させてISR80〜87を実行状態404から割込み待ち状態402に遷移させる。
つぎに、図6〜図16のフローチャートを参照して、この発明のリアルタイム組込み簡易モニタプログラムの動作を説明する。なお、各タスク91〜97、およびタイマ割込みハンドラ98を実行する際にCPU11は、プログラムカウンタ12の値およびレジスタ群13内のスタックレジスタの値であるスタックポインタをスタック領域に格納しているものとする。また、呼び出し元(起動元)のつぎのアドレスに戻る際に割込み禁止状態は解除されるものとする。さらに、電源投入時、または外部からのシステムリセットによって、ICB40〜47は初期化されているものとする。
まず、図6のフローチャートを参照して、図5に示したドーマント状態401から割込み待ち状態402にISR80〜87を遷移させるISR生成タスク91のISR生成処理の動作について説明する。
ISR生成タスク91は、CPU11の動作モードを割込み禁止状態にする(ステップS100)。具体的には、ISR生成タスク91は、上述したコントロールレジスタ14の割込み信号毎のマスクフラグをすべてONにする。
ISR生成タスク91は、コンテキストをスタック領域に保存(格納)する(ステップS101)。ISR生成タスク91は、定常状態プログラム80から起動されるため、定常状態プログラム80に復帰して(呼び出し元のつぎのアドレスに戻って)ISR生成タスク91起動前の処理を継続するために必要な汎用レジスタの値などのコンテキストをスタック領域に保存する。スタック領域のどこにコンテキストを格納するかは、一般的なプログラムと同様にスタックポインタの値を用いて決定する。
以下、スタック領域に格納されているコンテキストと、ISR80〜87が各タスク91〜97またはタイマ割込みハンドラ98を起動する際にCPU11がスタック領域に格納するプログラムカウンタ12の値およびレジスタ群13内のスタックレジスタの値であるスタックポインタとをプロセッサコンテキストと呼び、スタックレジスタを除くレジスタ群13と、プログラムカウンタ12の値を除くプログラムの復帰に必要なデータをコンテキストと呼ぶ。
ISR生成タスク91は、生成すべきISR80〜87に対応するICB40〜47の状態フラグ171の有効/無効フラグ1711がON(この場合は「1」)であるか否かを確認する(ステップS102)。
有効/無効フラグ1711が「ON」の場合、作成すべきISR80〜87がすでに作成されていることを示している。ISR生成タスク91は作成すべきISR80〜87を生成するために起動されるタスクであり、すでにISR80〜87が作成されている(有効/無効フラグ1711がONである)のはプログラムに異常が発生している場合である。したがって、ISR生成タスク91はエラー(ISR生成異常を示すコード)を返して呼び出し元のつぎのアドレスに戻る(ステップS103)。
一方、有効/無効フラグ1711が「OFF」(この場合は「0」)の場合、ISR生成タスク91は、作成すべきISR80〜807に対応するICB40〜47の有効/無効フラグ1711に「ON」を設定するとともに、ICB40〜47を初期化する(ステップS104,S105)。
具体的には、ISR生成タスク91は、作成すべきISR80〜87に対応するICB40〜47の有効/無効フラグ1711に「1」を設定し、ready/notreadyフラグ1712、セマフォ取得中フラグ1713、セマフォ待ちフラグ1714、割込みレベル変更要求フラグ1715、遅延中フラグ1718、およびICB位置変更フラグ1719に「0」を設定する。
ISR生成タスク91は、予め定められている割込みレベルを変更する場合には、割込みレベル変更要求フラグ1715に「1」を設定するとともに、要求割込みレベル178に要求を受け付ける割込みレベルを設定し、割込みレベルを変更しない場合には、割込みレベル変更要求フラグ1715に「0」を設定する。
ISR生成タスク91は、実行回数の上限値を設定する場合には、実行回数上限指定フラグ1716に「1」を設定するとともに、実行回数上限値174に実行回数の上限値を設定し、実行回数の上限値を設定しない場合(割込み発生の数だけ対応するISR80〜87を実行する場合)には、実行回数上限指定フラグ1716に「0」を設定する。
また、ISR生成タスク91は、スタックオーバーフローチェックを行う場合にはスタックオーバーフローチェック要求フラグ1717スタックオーバーフローチェック要求フラグ1717に「1」を設定し、スタックオーバーフローチェックを行わない場合にはスタックオーバーフローチェック要求フラグ1717に「0」を設定する。
ISR生成タスク91は、ISR先頭アドレス175には、ICB40〜47に対応するISR80〜87の先頭コードが格納されているプログラム格納部2のアドレスを設定し、スタックボトムアドレス176にはコンテキスト保存領域181の初期値を設定し、スタックサイズ177にはコンテキスト保存領域181のサイズを設定する。
また、ISR生成タスク91は、コンテキスト保存領域181にプログラムアドレスに設定した値と、コンテキスト保存領域181のスタックポインタの値とを設定する。
作成すべきISR80〜87に対応するICB40〜47を初期化した後に、生成フラグは、スタック領域に保存したコンテキストを復帰して(汎用レジスタなどの値を作成タスク起動前の状態に戻して)呼び出し元のつぎのアドレスに戻る(ステップS106,S107)。
つぎに、図7のフローチャートを参照して、ISR起動タスク92のISR起動処理の動作について説明する。ISR起動タスク92は、CPU11の動作モードを割込み禁止状態にして、コンテキストをスタック領域に保存する(ステップS200,S201)。
ISR起動タスク92は、ISR起動タスク92を起動した(割込みが発生した)割込みに対応するICB40〜47の有効/無効フラグ1711が「ON」であるか否かを確認する(ステップS202)。
有効/無効フラグ1711が「OFF」の場合、ISR起動タスク92は、発生した割込みに対応するISR80〜87が生成されていないので、例外(対応するISR80〜87が生成されていないがISR起動タスク92が起動されたことを示すコード)を返して呼び出し元のつぎのアドレスに戻る(ステップS203)。
発生した割込みに対応するICB40〜47の有効/無効フラグ1711が「ON」の場合、起動フラグは実行回数上限指定フラグ1716が「ON」であるか否かを判定する(ステップS204)。
実行回数上限指定フラグ1716が「ON」の場合、ISR起動タスク92は、発生した割込みに対応するICB40〜47の実行カウンタ172に設定されている値と実行回数上限値174に設定されている値とを比較する(ステップS205)。
実行カウンタ172に設定されている値が実行回数上限値174に設定されている値より大きい場合、ISR起動タスク92は、例外(実行回数上限値を越えてISR起動タスク92が起動されたことを示すコード)を返して呼び出し元のつぎのアドレスに戻る(ステップS203)。
実行カウンタ172に設定されている値が実行回数上限値174に設定されている値以下の場合、または実行回数上限指定フラグ1716が「OFF」の場合、ISR起動タスク92は、割り込まれた(ISR起動タスク92を実行する前に実行していた)ISR80〜87の優先順位を取得する(ステップS206)。
割り込まれた(ISR起動タスク92を実行する前に実行していた)ISR80〜87の優先順位は、後述するディスパッチャ7の処理によってデータ格納部3の割込みタスクメモの領域に設定されている。ISR起動タスク92は、割込みタスクメモの領域からデータを読み出すことで、割り込まれた(ISR起動タスク92を実行する前に実行していた)ISR80〜87の優先順位を取得する。割込みタスクメモとは、現在実行中のISR80〜87の情報を保持するデータ格納部3の領域であり、後述するが、ディスパッチャ7によって現在実行中のISR80〜87の情報が格納される。
ISR起動タスク92は、スタック領域に保存されているプロセッサコンテキストを割り込まれたISR80〜87に対応するICB40〜47のコンテキスト保存領域181に保存する(ステップS207)。すなわち、ISR起動タスク92は、自タスクが起動された際にCPU11がスタック領域に保存したプログラムカウンタ12の値およびスタックポインタと、ステップS201において自タスクがスタック領域に保存したコンテキストとを、自タスクが起動される前に実行していたISR80〜87に対応するICB40〜47のコンテキスト保存領域181にコピーして保存する。
ISR起動タスク92は、発生した割込みに対応するICB40〜47の実行カウンタ172の値に1を加算(実行カウンタ172をインクリメント)する(ステップS208)。また、ISR起動タスク92は、発生した割込みに対応するICB40〜47のready/notreadyフラグ1712に「ON」(この場合は「1」)を設定してスケジューラ6に処理を移行する(ステップS209,S210)。
つぎに、図8のフローチャートを参照してスケジューラ6の動作を説明する。スケジューラ6は、発生した割込みに対応するICB40〜47の実行カウンタ172の値が「1」以上であるか否かを判定する(ステップS300)。発生した割込みに対応するICB40〜47の実行カウンタ172の値が「1」より小さい場合、スケジューラ6は、エラー処理を実行する(ステップS301)。発生した割込みに対応するICB40〜47の実行カウンタ172の値が「1」以上の場合、スケジューラ6は、ディスパッチャ7に処理を移行する(ステップS302)。
つぎに、図9のフローチャートを参照して、ディスパッチャ7の動作を説明する。ディスパッチャ7は、データ格納部3に格納されている検索順序に従って、ICB配列4におけるICB40〜47の繋がりの先頭から順にready/notreadyフラグ1712を検索し、ready/notreadyフラグ1712が「ON」になっているか最初のICB40〜47を取得する(ステップS400)。
ディスパッチャ7は、取得したICB40〜47のコンテキスト保存領域181に保存されているコンテキストをスタック領域にコピーする(ステップS401)。ディスパッチャ7は、取得したICB40〜47の優先順位を割込みタスクメモに格納する(ステップS402)。
ディスパッチャ7は、割込みから復帰すべきアドレスおよびスタックポインタをスタック領域にコピーする(ステップS403)。具体的には、取得したICB40〜47のコンテキスト保存領域181に保存されているアドレスおよびスタックポインタの値をスタック領域にコピーする。すなわち、復帰命令を実行したときに、取得したICB40〜47に対応するISR80〜87の処理を実行するようにプログラムカウンタ12およびスタックレジスタが設定されるように、スタック領域のデータを書き換える。
ディスパッチャ7は、取得したICB40〜47の割込みレベル変更要求フラグ1715が「ON」であるか否かを判定する(ステップS404)。取得したICB40〜47の割込みレベル変更要求フラグ1715が「ON」の場合、ディスパッチャ7は、取得したICB40〜47の要求割込みレベル178に設定されている値をスタック領域にコピーする(ステップS405)。これにより、復帰命令によって割込みから復帰した際に、要求割込みレベル178に設定されている値の割込みレベルとなる。
要求割込みレベル178に設定されている値をスタック領域にコピーした後、または割込みレベル変更要求フラグ1715が「OFF」の場合、ディスパッチャ7は、割込みからの復帰命令を実行して、取得したICB40〜47に対応するISR80〜87を実行させる(ステップS406、S407)。
つぎに、図10のフローチャートを参照して、セマフォ取得タスク93aのセマフォ取得処理(セマフォを取得できない場合にはセマフォ待ち状態405に遷移する処理)の動作について説明する。
セマフォ取得タスク93aは、CPU11の動作モードを割込み禁止状態にして、自タスクを起動した(実行中の)ISR80〜87に対応するICB40〜47のコンテキスト保存領域181にプロセッサコンテキストを保存する(ステップS500,S501)。
セマフォ取得タスク93aは、要求するセマフォ(要求セマフォ)が存在するか否かを確認する(ステップS502)。具体的には、セマフォ取得タスク93aは、対象セマフォに対応するセマフォ構造体21〜23のセマフォ値211の値が「1」以上であるか否かを判定し、セマフォ値211の値が「1」以上である場合には要求するセマフォが存在すると認識し、セマフォ値211が「0」の場合には要求するセマフォが存在しないと認識する。
要求セマフォが存在する場合、セマフォ取得タスク93aは、要求セマフォに対応するセマフォ構造体21〜23の所有ISR212に実行中のISR80〜87のISR識別子を設定する(ステップS503)。
セマフォ取得タスク93aは、実行中のISR80〜87に対応するICB40〜47のセマフォ取得中フラグ1713に「ON」を設定する(ステップS504)。また、セマフォ取得タスク93aは、要求セマフォに対応するセマフォ構造体21〜23のセマフォ値211の値から1減算(デクリメント)して、呼び出し元のつぎのアドレスに戻る(ステップS505,S506)。
一方、要求セマフォが存在しない場合、セマフォ取得タスク93aは、実行中のISR80〜87に対応するICB40〜47のセマフォ待ちインデックス173に要求するセマフォのインデックスを設定する(ステップS507)。
セマフォ取得タスク93aは、実行中のISR80〜87に対応するICB40〜47のセマフォ待ちフラグ1714に「ON」を設定するとともにready/notreadyフラグ1712に「OFF」を設定する。(ステップS508)。これにより、実行中のISR80〜87は、実行状態404からセマフォ待ち状態405に遷移する。
セマフォ取得タスク93aは、要求セマフォに対応するセマフォ構造体21〜23の待ちISR213に実行中のISR80〜87のISR識別子を設定して、スケジューラ6に処理を移行する(ステップS509,S510)。
つぎに、図11のフローチャートを参照して、セマフォ解放タスク94のセマフォ解放処理の動作について説明する。セマフォ解放タスク94は、CPU11の動作モードを割込み禁止状態にして、セマフォを解放する(セマフォ解放タスク94を起動した)ISR80〜87に対応するICB40〜47のコンテキスト保存領域181にプロセッサコンテキストを格納する(ステップS600,S601)。
セマフォ解放タスク94は、セマフォを解放するISR80〜87に対応するICB40〜47のセマフォ取得中フラグ1713に「OFF」を設定する(ステップS602)。セマフォ解放タスク94は、解放したセマフォを待つISR80〜87が存在するか否かを判定する(ステップS603)。具体的には、セマフォ解放タスク94は、解放したセマフォに対応するセマフォ構造体21〜23の待ちISR213にISR識別子が設定されているか否かを判定する。
解放したセマフォを待つISR80〜87が存在しない場合、セマフォ解放タスク94は、解放したセマフォに対応するセマフォ構造体21〜23のセマフォ値211の値をインクリメントする(ステップS604)。
セマフォ解放タスク94は、ステップS601においてセマフォを解放するISR80〜87に対応するICB40〜47のコンテキスト保存領域181に格納したプロセッサコンテキストを復帰(スタック領域にコピー)して、セマフォ解放タスク94を起動した呼び出し元のつぎのアドレスに戻る(ステップS605,S606)。
一方、解放したセマフォを待つISR80〜87が存在する場合、セマフォ解放タスク94は、セマフォ待ちしているISR80〜87に対応するICB40〜47のセマフォ待ちインデックス173をクリアするとともに、セマフォ待ちフラグ1714に「OFF」を設定し、ready/notreadyフラグ1712に「ON」を設定する(ステップS607)。
セマフォ解放タスク94は、解放したセマフォに対応するセマフォ構造体21〜23の待ちISR213をクリアする(ステップS608)。待ちISR213には、解放したセマフォを待っているISR80〜87のISR識別子が設定されている。待ちISR213に複数のISR識別子が設定されている場合、セマフォ解放タスク94は、予め定められた順番でつぎにセマフォを取得するISR80〜87を選択する。たとえば、一番先に待ちISR213に設定されたISR80〜87を選択してもよいし、待ちISR213に設定されているISR80〜87の中で最も優先順位の高いISR80〜87を選択するようにしてもよい。
セマフォ解放タスク94は、開放したセマフォに対応するセマフォ構造体21〜23の所有ISR212に選択したISR80〜87のISR識別子を設定する(ステップS609)。すなわち、所有ISR212の設定を、セマフォ待ちしていたISR80〜87に変更する。その後、セマフォ解放タスク94は、スケジューラ6に処理を移行する(ステップS610)。
つぎに、図12のフローチャートを参照して、セマフォ取得タスク93bのセマフォ取得処理(セマフォを取得できない場合でもセマフォ取得待ち状態に遷移しない処理)の動作を説明する。なお、要求するセマフォが存在しておりセマフォを取得するステップS700〜S706については、先の図10のフローチャートを参照して説明したセマフォ取得タスク93aのセマフォ取得処理のステップS500〜506の動作と同じであるので詳細な説明は省略する。
セマフォ取得タスク93bは、CPU11の動作モードを割込み禁止状態にして、セマフォ取得タスク93bを起動した(現在実行中の)ISR80〜87に対応するICB40〜47のコンテキスト保存領域181にプロセッサコンテキストを格納し、要求するセマフォ(対象セマフォ)が存在するか否かを確認する(ステップS700〜S702)。
要求するセマフォ(要求セマフォ)が存在する場合、セマフォ取得タスク93bは、要求するセマフォ構造体21〜23の所有ISR212に現在実行中のISR80〜87のISR識別子を設定する(ステップS703)。
セマフォ取得タスク93bは、実行中のISR80〜87に対応するICB40〜47のセマフォ取得中フラグ1713に「ON」を設定するとともに、開放したセマフォに対応するセマフォ構造体21〜23のセマフォ値211の値をデクリメントして、呼び出し元のつぎのアドレスに戻る(ステップS704〜S706)。
一方、要求セマフォが存在しない場合、セマフォ取得タスク93bは、エラー(セマフォが取得できなかったことを示すコード)を返して、呼び出し元のつぎのアドレスに戻る(ステップS707)。
つぎに、図13のフローチャートを参照して、ISR遅延タスク95の遅延処理の動作について説明する。ISR遅延タスク95は、CPU11の動作モードを割込み禁止状態にして、コンテキストをスタック領域に保存する(ステップS800,S801)。
ISR遅延タスク95は、実行中のISR80〜87に対応するICB40〜47の状態フラグ171のready/notreadyフラグ1712に「OFF」を設定し、遅延中フラグ1718に「ON」を設定する(ステップS802,S803)。これにより、実行中のISR80〜87は、実行状態404から実行停止状態406に遷移する。
ISR遅延タスク95は、実行停止状態406に留まる時間、すなわちISR遅延タスク95を起動したISR80〜87を遅延させる時間を対応するICB40〜47の遅延時間カウンタ179に設定してスケジューラ6に処理を移行する(ステップS804,S805)。
遅延時間カウンタ179の値は、後述するタイマ割込みハンドラ98によってデクリメントされる。したがって、遅延時間カウンタ179に設定する値は、「遅延させる時間/タイマ割込みハンドラ98が起動する時間」となる。ここで、タイマ割込みハンドラ98が起動する時間とは、プロセッサ1内のタイマ(図示せず)による割込み時間のことである。
つぎに、図14のフローチャートを参照して、ISR復帰タスク96の遅延復帰処理の動作について説明する。ISR復帰タスク96は、CPU11の動作モードを割込み禁止状態にして、コンテキストをスタック領域に保存する(ステップS900,S901)。
ISR復帰タスク96は、実行停止状態406から復帰させる(復帰対象)ISR80〜87に対応するICB40〜47の状態フラグ171のready/notreadyフラグ1712に「ON」を設定し、遅延中フラグ1718に「OFF」を設定する(ステップS902,S903)。これにより、復帰対象のISR80〜87は、実行停止状態406から実行待ち状態403に遷移する。
ISR復帰タスク96は、復帰対象のISR80〜87に対応するICB40〜47の遅延時間カウンタ179の値を初期化(たとえば、「null」を設定)して、スケジューラ6に処理を移行する(ステップS904,S905)。
つぎに、図15のフローチャートを参照して、タイマ割込みハンドラ98のタイマ割込み処理の動作を説明する。タイマ割込みハンドラ98は、コンテキストをスタック領域に保存する(ステップS1000)。
タイマ割込みハンドラ98は、ICB40〜47の繋がりの先頭のICB40〜47を処理対象ICBとし、処理対象ICBの遅延中フラグ1718がON(「1」)であるか否かを判定する(ステップS1001)。処理対象ICBの遅延中フラグ1718がONの場合、タイマ割込みハンドラ98は、処理対象ICBの遅延時間カウンタ179の値をデクリメントする(ステップS1002)。
タイマ割込みハンドラ98は、処理対象ICBの遅延時間カウンタ179の値が「0」であるか否かを判定する(ステップS1003)。処理対象ICBの遅延時間カウンタ179の値が「0」の場合、タイマ割込みハンドラ98は、処理対象ICBのready/notreadyフラグ1712に「ON」を設定するとともに、遅延中フラグ1718に「OFF」を設定する(ステップS1004,S1005)。また、タイマ割込みハンドラ98は、処理対象ICBの遅延時間カウンタ179を初期化(たとえば、「null」を設定)する(ステップS1006)。
タイマ割込みハンドラ98は、処理対象ICBがICB配列4の最後尾のICBになるまで、ICB配列4の繋がりに基づいて現在の処理対象ICBのつぎに繋がっているICB40〜47を新たな処理対象ICBとして、処理対象ICBの遅延中フラグ1718がONの場合には遅延時間カウンタ179の値をデクリメントし、デクリメント後の遅延時間カウンタ179の値が「0」の場合には処理対象ICBのready/notreadyフラグ1712を「ON」にし、遅延中フラグ1718を「OFF」にして自演時間カウンタを初期化する動作を繰り返す(ステップS1001〜S1008)。
タイマ割込みハンドラ98は、処理対象ICBがICB配列4の最後尾のICBになるとスケジューラ6に処理を移行する(ステップS1009)。
つぎに、図16のフローチャートを参照して、ISR終了タスク97のISR終了処理の動作について説明する。ISR終了タスク97は、CPU11の動作モードを割込み禁止状態にする(ステップS1100)。
ISR終了タスク97は、自タスクを起動した(実行中の)ISR80〜87に対応するICB40〜47の実行カウンタ172の値をデクリメントする(ステップS1101)。ISR終了タスク97は、実行中のISR80〜87に対応するICB40〜47の実行カウンタ172の値が「0」であるか否かを判定する(ステップS1102)。
実行中のISR80〜87に対応するICB40〜47の実行カウンタ172の値が「0」の場合、ISR終了タスク97は、実行中のISR80〜87に対応するICB40〜47のready/notreadyフラグ1712に「OFF」を設定する(ステップS1103)。これにより、実行中のISR80〜87は、実行状態404から割込み待ち状態402に遷移する。
実行中のISR80〜87に対応するICB40〜47のready/notreadyフラグ1712を「OFF」にした後、または実行中のISR80〜87に対応するICB40〜47の実行カウンタ172の値が「0」ではない場合、ISR終了タスク97は、実行中のISR80〜87に対応するICB40〜47を初期化する(ステップS1104)。
実行中のISR80〜87に対応するICB40〜47のスタックボトムアドレス176およびコンテキスト保存領域181を初期化した後に、ISR終了タスク97はスケジューラ6に処理を移行する(ステップS1105)。
このようにこの実施の形態1においては、定常状態を含む複数のISRで構成される組込みソフトウェアに適用され、複数のISRで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、複数のISRの割込みレベルに対応付けられ各ISRの状態に関する情報を保持する割込み制御ブロック(ICB)を有し、複数のICBをISRの割込みレベルの優先順位が高いものから順に接続したICB配列と、に基づいてISRをスケジューリングする際に、ISR起動タスクが、割込み発生時にスタック領域に格納されたプロセッサコンテキストを割込まれたISRに対応するICBのコンテキスト保存領域に格納するとともに、発生した割込みのISRに対応するICBに実行待ち状態であることを設定し、スケジューラおよびディスパッチャがISRのスケジューリング処理として、実行待ち状態が設定されているICBの中で最も優先順位の高いICBを選択し、選択したICBのコンテキスト保存領域に格納されているプロセッサコンテキストをスタック領域に格納して割込み復帰命令によって選択したICBに対応するISRを実行させる。
すなわち、割込み発生時にスタック領域に格納されているプロセッサコンテキストを割込まれたISRに対応するICBのコンテキスト保存領域に格納するとともに、発生した割込みのISRを実行待ち状態に遷移させ、実行待ち状態のISRの中で最も優先順位の高いISRのICBのコンテキスト保存領域に格納されているプロセッサコンテキストをスタック領域に格納して、割込み復帰命令によって復帰する戻りアドレスを差し替えることで、実行待ち状態のISRの中で最も優先順位の高いISRを実行させるようにしている。これにより、リアルタイムOSを用いることなく、同期排他制御を実現する最小限の構造(ISRのみ)で、リアルタイムOSを用いた場合と比較して製品に必要なメモリ容量を減らすことができる。
また、この実施の形態1においては、セマフォ取得タスクが、実行中のISRが要求するセマフォに対応付けられたセマフォ構造体のセマフォ数の値が1以上の場合、当該セマフォ数の値をデクリメントするとともに、セマフォを要求するISRのISR識別子を当該所有ISRに設定してセマフォを取得し、要求するセマフォに対応付けられたセマフォ構造体のセマフォ数が1より小さい場合、セマフォを要求するISRのISR識別子を当該待ちISRに設定して、セマフォを要求したISRに対応付けられたICBにセマフォ待ち状態を設定し、セマフォ解放タスクが、実行中のISRが開放するセマフォに対応付けられたセマフォ構造体のセマフォ数をインクリメントするとともに当該所有ISRに設定されているセマフォを開放するISRのISR識別子を削除し、当該待ちISRにISR識別子が設定されている場合には、当該セマフォ数をデクリメントするとともに当該待ちISRに設定されているISR識別子を当該所有ISRに設定し、当該待ちISRに設定されているISR識別子を削除し、新たにセマフォを取得したISRに対応付けられたICBに実行待ち状態を設定するようにしている。
すなわち、要求するセマフォを取得できない場合には、セマフォを要求したISRをセマフォ待ち状態に遷移させて処理を一時停止させ、要求したセマフォを取得しているISRがセマフォを開放したときに、開放したセマフォをセマフォ待ち状態のISRに取得させて実行待ち状態に遷移させるようにしている。これにより、リアルタイムOSを用いることなく、ISRのみで同期排他制御を実行する場合でも、セマフォを利用した同期排他制御を実現することができる。
また、この実施の形態1では、ISR起動タスクが、割込みが発生するごとに、発生した割込みの処理を行なうISRに対応付けられたICBの実行カウンタの値をインクリメントしてICBに割込み回数を保持させ、ディスパッチャが、実行カウンタが保持する割込み回数だけ当該ICBを選択対象とし前記割込み回数だけ自身が対応づけられたISRを実行させ、ISR終了タスクが、実行カウンタの値をデクリメントするようにしているため、リアルタイムOSを用いることなくISRのみで同期排他制御を実現する場合でも、何回割込みが発生したかを認識して、割込み発生回数だけ処理を実行することができる。
実施の形態2.
図17〜図21(図21−1、図21−2を示す)を用いてこの発明の実施の形態2を説明する。この実施の形態2では、セマフォを利用する際に発生する優先度(割込みレベルの優先順位)の逆転を回避するものである。
まず、図5および図17を参照して優先度の逆転について説明する。なお、説明を簡単にするために、ここではセマフォの数は1つとし、1つのISRがセマフォを取得していると他のタスクはセマフォを取得することができないものとする。
図17において、左軸1601は優先順位を示し、下軸1602は時間軸(時間経過)を示しており、ISR1603はISR1603〜1606の中で最も優先順位が高く(優先度4)、ISR1604はISR1603のつぎに優先順位が高く(優先度3)、ISR1605はISR1604のつぎに優先順位が高く(優先度2)、ISR1606はISR1603〜1606の中で最も優先順位が低い(優先度1)タスクである。
時刻t1においてISR1606が起動される。時刻t1においては、ISR1606のみが起動されているので、ISR1606が実行状態404となりセマフォを取得する。
時刻t2においてISR1603が起動される。ISR1603は優先度4であり、実行状態のISR1606は優先度1であるので、ISR1606は実行待ち状態403とりISR1603が実行状態404となる。
時刻t3において、実行状態404のISR1603がセマフォを取得しようとするが、ISR1606が共有するセマフォを取得しているため、ISR1603はセマフォ待ち状態405となる。そのため、ISR1603よりも優先度は低いがセマフォを取得しているISR1606が実行状態404となる。
時刻t4においてISR1604、1605が起動される。ISR1604は優先度3であり、ISR1605は優先度2であるので、実行状態404のISR1606が実行待ち状態403となり、ISR1604が実行状態404となる。すなわち、最も優先度の高い優先度4のISR1603よりも先に優先度の低いISR1604が実行状態404となる。
時刻t5においてISR1604が終了(割込み待ち状態402に遷移)する。時刻t5においては、ISR1603、1605、1606が待ち状態となっている。待ち状態(実行待ち状態403およびセマフォ待ち状態405)のISR1603、1605、1606の中で、ISR1603が優先度は最も高い。しかしながら、ISR1603はISR1606が取得しているセマフォが開放されるのを待つセマフォ待ち状態405であり、実行状態404に遷移することはできない。したがって、ISR1603のつぎに優先度の高いISR1605が実行状態404となる。
時刻t6においてISR1605が終了する。時刻t6においては、ISR1603、1606が待ち状態となっている。ISR1603は、ISR1606よりも優先度は高いがISR1606が取得しているセマフォを待っているセマフォ待ち状態405であるので、ISR1606が実行状態404となる。
時刻t7においてISR1606がセマフォを開放して処理を終了する。セマフォが開放されたため、セマフォ待ち状態405のISR1603が実行待ち状態403を経て実行状態404となり、セマフォを取得して処理を再開する。
このように、優先度1のISR1606がセマフォを取得しているために、優先度4のISR1603がセマフォ待ち状態405となった場合に、優先度2、3のISR1604、1605が起動されると、セマフォを取得しているISR1606よりも優先度の高いISR1604、1605を実行した後にISR1606を実行し、最も優先度の高いISR1603が最後に実行される状態、すなわち優先度が逆転した形となりISR1603〜1606の実行順序が変化することを優先度の逆転という。
優先度の逆転を防止するためには、セマフォを取得しているISRと、ISRとセマフォを共有しておりかつセマフォ待ち状態になっているISRの優先度を交換すればよい。ただし、セマフォを取得しているISRの優先度が、このISRとセマフォを共有しておりかつセマフォ待ち状態になっているISRの優先度よりも高い場合には優先度の逆転は発生しないので、セマフォを取得しているISRの優先度が、このISRとセマフォを共有しておりかつセマフォ待ち状態になっているISRの優先度よりも低い場合のみ、ISR間の優先度を交換する。
具体的には、先の図17の時刻t3において、ISR1603がセマフォ待ち状態405に遷移する際にISR1606を優先度4とし、自身の優先度を優先度1とする優先度の交換を行なう。これにより、図18に示すように、優先度3のISR1604と優先度2のISR1605とが起動されても、セマフォを取得しているISR1606が実行状態404となる。
時刻t4aにおいてISR1606がセマフォを開放して処理を終了する。このときISR1606は、セマフォ待ち状態405のISR1603を優先度4とし、自身の優先度を優先度1とする優先度の交換、すなわち本来の優先度に戻して処理を終了する。これにより、図19に示すように、ISR1604、ISR1605よりも先にISR1603が実行状態404となり、ISR1603、ISR1604、ISR1605という本来の優先順位にしたがって処理が行なわれ、セマフォを利用する際の優先度の逆転が回避される。
つぎに、セマフォを利用する際の優先度の逆転を回避するこの実施の形態2のリアルタイム組込み簡易モニタプログラムについて説明する。この実施の形態2のリアルタイム組込み簡易モニタプログラムが適用される装置の構成は、先の図1に示した実施の形態1の装置の構成と同じであるので、ここではその説明を省略する。
この発明における実施の形態2のリアルタイム組込み簡易モニタプログラムは、先の図2に示した実施の形態1のリアルタイム組込み簡易モニタプログラムのセマフォ取得タスク93aおよびセマフォ解放タスク94の代わりに、セマフォ取得タスク93cおよびセマフォ解放タスク94aを備えている。
セマフォ取得タスク93cは、セマフォ取得タスク93aの機能に加え、要求するセマフォを取得することができない(セマフォ待ち状態405に遷移する)場合に、要求するセマフォを取得しているISR80〜87の優先度と実行中のISR80〜87との優先度とを交換(変更)する機能を備えている。
セマフォ解放タスク94aは、セマフォ解放タスク94の機能に加え、自タスクを起動した(実行中の)ISR80〜87の優先度が変更されている場合、変更されている優先度を予め定められた優先度に戻す機能を備えている。
つぎに、この実施の形態2のリアルタイム組込み簡易モニタプログラムの動作を説明する。なお、この実施の形態2のリアルタイム組込み簡易モニタプログラムと先の実施の形態1のリアルタイム組込み簡易モニタプログラムとの相違点は、セマフォの取得処理およびセマフォ開放処理であるので、ここではセマフォの取得処理を実現するセマフォ取得タスク93c、およびセマフォの開放処理を実現するセマフォ解放タスク94aの動作のみを説明する。
まず、図20−1および図20−2のフローチャートを参照して、セマフォ取得タスク93cの動作を説明する。セマフォ取得タスク93cは、CPU11の動作モードを割込み禁止状態にして、自タスクを起動した(実行中の)ISR80〜87に対応するICB40〜47のコンテキスト保存領域181にプロセッサコンテキストを保存する(図20−1のステップS1200,S1201)。
セマフォ取得タスク93cは、要求するセマフォ(要求セマフォ)が存在するか否かを確認する(図20−1のステップS1202)。要求セマフォが存在する場合、セマフォ取得タスク93cは、要求セマフォに対応するセマフォ構造体21〜23の所有ISR212に実行中のISR80〜87のISR識別子を設定する(図20−1のステップS1203)。
セマフォ取得タスク93cは、実行中のISR80〜87に対応するICB40〜47のセマフォ取得中フラグ1713に「ON」を設定する(図20−1のステップS1204)。また、セマフォ取得タスク93cは、要求セマフォに対応するセマフォ構造体21〜23のセマフォ値211の値をデクリメントして、呼び出し元のつぎのアドレスに戻る(図20−1のステップS1205,S1206)。
一方、要求セマフォが存在しない場合、セマフォ取得タスク93cは、要求セマフォを取得しているISR80〜87の優先順位が、実行中のISR80〜87の優先順位よりも高いか否かを判定する(図20−2のステップS1207)。
具体的には、セマフォ取得タスク93cは、要求セマフォに対応するセマフォ構造体21〜23の所有ISR212に設定されているISR識別子から、要求セマフォを取得しているISR80〜87を認識する。また、セマフォ取得タスク93cは、ディスパッチャ7によって実行中のISR80〜87の優先順位が設定されている割込みタスクメモから、実行中のISR80〜87の優先順位を取得する。セマフォ取得タスク93cは、認識したISR80〜87の優先順位と、割込みタスクメモから取得した優先順位とを比較して、要求セマフォを取得しているISR80〜87の優先順位が、実行中のISR80〜87の優先順位よりも高いか否かを判定する。
実行中のISR80〜87の優先順位が要求セマフォを取得しているISR80〜87の優先順位よりも高い場合、セマフォ取得タスク93cは、要求セマフォを取得しているISR80〜87に対応するICB40〜47のICB位置変更フラグ1719に「ON」を設定する(図20−2のステップS1208)。
また、セマフォ取得タスク93cは、実行中のISR80〜87に対応するICB40〜47のICB位置変更フラグ1719に「ON」を設定する(図20−2のステップS1209)。
セマフォ取得タスク93cは、要求セマフォを取得しているISR80〜87に対応するICB40〜47のICB位置変更対象180に実行中のISR80〜87の情報(ISR識別子)を設定する(図20−2のステップS1210)。
また、セマフォ取得タスク93cは、実行中のISR80〜87に対応するICB40〜47のICB位置変更対象180に要求セマフォを取得しているISR80〜87の情報(ISR識別子)を設定する(図20−2のステップS1211)。
セマフォ取得タスク93cは、ICB40〜47の位置を変更する(図20−2のステップS1212)。具体的には、セマフォ取得タスク93cは、ICB配列4におけるICB40〜47の繋がりにおいて、要求セマフォを取得しているISR80〜87に対応するICB40〜47と、実行中のISR80〜87に対応するICB40〜47とを入れ替える。これにより、ディスパッチャ7が実行すべきISR80〜87を検索する順番が変更され優先順位が交換されたことになる。
セマフォ取得タスク93cは、実行中のISR80〜87に対応するICB40〜47のセマフォ待ちインデックス173に要求するセマフォのインデックスを設定する(図20−2のステップS1213)。
セマフォ取得タスク93cは、実行中のISR80〜87に対応するICB40〜47のセマフォ待ちフラグ1714に「ON」を設定するとともにready/notreadyフラグ1712に「OFF」を設定する(図20−2のステップS1214)。セマフォ取得タスク93cは、要求セマフォに対応するセマフォ構造体21〜23の待ちISR213に実行中のISR80〜87のISR識別子を設定して、スケジューラ6に処理を移行する(図20−2のステップS1215,S1216)。
つぎに、図21のフローチャートを参照して、セマフォ解放タスク94aの動作を説明する。セマフォ解放タスク94aは、CPU11の動作モードを割込み禁止状態にして、セマフォを解放する(セマフォ解放タスク94aを起動した)ISR80〜87に対応するICB40〜47のコンテキスト保存領域181にプロセッサコンテキストを格納する(図21−1のステップS1300,S1301)。
セマフォ解放タスク94aは、セマフォを解放するISR80〜87に対応するICB40〜47のセマフォ取得中フラグ1713に「OFF」を設定する(図21−1のステップS1302)。セマフォ解放タスク94aは、解放したセマフォを待つISR80〜87が存在するか否かを判定する(図21−1のステップS1303)。
解放したセマフォを待つISR80〜87が存在しない場合、セマフォ解放タスク94aは、解放したセマフォに対応するセマフォ構造体21〜23のセマフォ値211の値をインクリメントする(図21−1のステップS1304)。
セマフォ解放タスク94は、ステップS1301においてセマフォを解放するISR80〜87に対応するICB40〜47のコンテキスト保存領域181に格納したプロセッサコンテキストを復帰(スタック領域にコピー)して、セマフォ解放タスク94aを起動した呼び出し元のつぎのアドレスに戻る(図21−1のステップS1305,S1306)。
一方、解放したセマフォを待つISR80〜87が存在する場合、セマフォ解放タスク94aは、セマフォ待ちしているISR80〜87に対応するICB40〜47のセマフォ待ちインデックス173をクリアするとともに、セマフォ待ちフラグ1714に「OFF」を設定し、ready/notreadyフラグ1712に「ON」を設定する(図21−1のステップS1307)。
セマフォ解放タスク94は、解放したセマフォに対応するセマフォ構造体21〜23の待ちISR213をクリアする(図21−1のステップS1308)。セマフォ解放タスク94aは、開放したセマフォに対応するセマフォ構造体21〜23の所有ISR212に選択したISR80〜87のISR識別子を設定する(図21−1のステップS1309)。
セマフォ解放タスク94aは、セマフォを開放するISR80〜87に対応するICB40〜47のICB位置変更フラグ1719が「ON」であるか否かを判定する(図21−2のステップS1310)。
ICB位置変更フラグ1719が「ON」の場合、セマフォ解放タスク94aは、セマフォを取得したISR80〜87に対応するICB40〜47のICB位置変更フラグ1719に「OFF」を設定する(図21−2のステップS1311)。また、セマフォ解放タスク94aは、セマフォを開放するISR80〜87に対応するICB40〜47のICB位置変更フラグ1719に「OFF」を設定する(ステップS22−2のステップS1312)。
セマフォ解放タスク94aは、セマフォを獲得したISR80〜87に対応するICB40〜47のICB位置変更対象180を初期化する(図21−2のステップS1313)。また、セマフォ解放タスク94aは、セマフォを開放するISR80〜87に対応するICB40〜47のICB位置変更対象180を初期化する(図21−2のステップS1314)。
セマフォ解放タスク94aは、ICB配列4におけるICB40〜47の位置を元に戻す(図21−2のステップS1315)。具体的には、ICB配列4におけるICB40〜47の繋がりにおいて、セマフォを開放したISR80〜87に対応するICB40〜47と、セマフォを取得したISR80〜87に対応するICB40〜47とを入れ替える。これにより、セマフォを取得したISR80〜87がセマフォ待ち状態405に遷移する際に変更したICB配列4におけるICB40〜47の繋がりが、本来の優先順位に基づいた繋がりに戻される。
ICB配列4におけるICB40〜47の位置を元に戻した後、またはセマフォを開放するISR80〜87に対応するICB40〜47のICB位置変更フラグ1719が「OFF」であった場合、セマフォ解放タスク94aは、スケジューラ6に処理を移行する(図21−2のステップS1316)。
このようにこの実施の形態2においては、セマフォ取得タスクが、要求するセマフォが使用不可であると判定した場合に、要求するセマフォを取得しているISRの優先順位とセマフォを要求したISRの優先順位とを比較して、要求するセマフォを取得しているISRの優先順位がセマフォを要求したISRの優先順位よりも低い場合には、要求するセマフォを取得しているISRの優先順位とセマフォを要求したISRの優先順位とを交換するようにICB配列の接続を変更するとともに、優先順位を交換したISRに対応付けられたICBに優先順位を変更したことを示す情報を設定し、セマフォ解放タスクが、セマフォを開放するISRに対応付けられたICBに優先順位が変更されたことを示す情報が設定されている場合には、セマフォを開放するISRの現在の優先順位と、該セマフォを開放するISRと優先順位を交換したISRの現在の優先順位とを交換するようにICB配列の接続を変更するとともに、優先順位を交換したISRに対応付けられたICBに優先順位の変更がないことを示す情報を設定する。これにより、セマフォを利用する際に予め定められた優先度とは異なる順番でISRが実行される優先順位の逆転を回避することができる。
以上のように、本発明にかかるリアルタイム組込み簡易モニタプログラムは、組込みソフトウェアの同期排他制御に有用であり、特に、組込みソフトウェアを格納するメモリ容量が少ない場合の同期排他制御に適している。
この発明におけるリアルタイム組込み簡易モニタプログラムが適用される装置の構成の一例を示す図である。 この発明におけるリアルタイム組込み簡易モニタプログラムの実施の形態1の構成を示す概略図である。 図2に示したICBの構成を示す図である。 図2に示したセマフォ構造体の構成を示す図である。 図2に示したISRの状態の遷移を説明するための図である。 実施の形態1の起動ISR生成タスクの動作を説明するためのフローチャートである。 実施の形態1のISR起動タスクの動作を説明するためのフローチャートである。 実施の形態1のスケジューラの動作を説明するためのフローチャートである。 実施の形態1のディスパッチャの動作を説明するためのフローチャートである。 実施の形態1のセマフォ待ち状態に遷移するセマフォ取得タスクの動作を説明するためのフローチャートである。 実施の形態1のセマフォ解放タスクの動作を説明するためのフローチャートである。 実施の形態1のセマフォ待ち状態に遷移しないセマフォ取得タスクの動作を説明するためのフローチャートである。 実施の形態1のISR遅延タスクの動作を説明するためのフローチャートである。 実施の形態1のISR復帰タスクの動作を説明するためのフローチャートである。 実施の形態1のタイマ割込みハンドラの動作を説明するためのフローチャートである。 実施の形態1のISR終了タスクの動作を説明するためのフローチャートである。 優先度の逆転を説明するための図である。 優先度の逆転の回避を説明するための図である。 優先度の逆転の回避を説明するための図である。 実施の形態2のセマフォ待ち状態に遷移するセマフォ取得タスクの動作を説明するためのフローチャートである。 実施の形態2のセマフォ待ち状態に遷移するセマフォ取得タスクの動作を説明するためのフローチャートである。 実施の形態2のセマフォ解放タスクの動作を説明するためのフローチャートである。 実施の形態2のセマフォ解放タスクの動作を説明するためのフローチャートである。
符号の説明
1 プロセッサ
2 プログラム格納部
3 データ格納部
4 ICB配列
5 セマフォ構造体群
6 スケジューラ
7 ディスパッチャ
9 状態処理プログラム
10 制御対象装置
11 CPU
12 プログラムカウンタ
13 レジスタ群
14 コントロールレジスタ
21,22,23 セマフォ構造体
40,41,42,43,44,45,46,47 ICB
80,81,82,83,84,85,86,87,1603,1604,1605,1606 ISR
91 ISR生成タスク
92 ISR起動タスク
93a,93b,93c セマフォ取得タスク
94,94a セマフォ解放タスク
95 ISR遅延タスク
96 ISR復帰タスク
97 ISR終了タスク
98 タイマ割込みハンドラ
401 ドーマント状態
402 割込み待ち状態
403 実行待ち状態
404 実行状態
405 セマフォ待ち状態
406 実行停止状態
1601 優先順位
1602 時間軸

Claims (8)

  1. 定常状態を含む複数の割込みサービスルーチン(ISR)で構成される組込みソフトウェアに適用され、前記複数のISRで用いる複数のセマフォに対応付けられ、当該セマフォの使用状態に関する情報を保持するセマフォ構造体と、
    前記複数のISRの割込みレベルに対応付けられ各ISRの状態に関する情報を保持する割込み制御ブロック(ICB)を有し、該ICBを前記ISRの割込みレベルの優先順位が高いものから順に接続したICB配列と、
    に基づいて前記ISRをスケジューリングするリアルタイム組込み簡易モニタプログラムであって、
    割込みが発生すると、割込み発生時にスタック領域に格納されたプログラムカウンタの値、スタックレジスタの値であるスタックポインタ、およびコンテキストを割込まれたISRに対応するICBのコンテキスト保存領域に格納するとともに、前記発生した割込みのISRに対応するICBに実行待ち状態であることを設定するISR起動ステップと、
    実行待ち状態が設定されているICBの中で最も優先順位の高いICBを選択し、選択したICBのコンテキスト保存領域に格納されているプログラムカウンタの値、スタックポインタ、およびコンテキストを前記スタック領域に格納して割込み復帰命令によって選択したISRを実行させるスケジューリングステップと、
    前記スケジューリングステップによって実行されたISRの処理を終了する際に、終了するISRに対応付けられたICBに割込み待ち状態であることを設定するISR終了ステップと、
    を備えることを特徴とするリアルタイム組込み簡易モニタプログラム。
  2. 前記スケジューリングステップによって実行されたISRが要求するセマフォに対応付けられたセマフォ構造体が保持している使用情報に基づいて要求するセマフォを使用可能であるか否かを判定し、前記要求するセマフォが使用可能であると判定した場合には、セマフォを要求したISRに関する情報に基づいて前記使用情報のうち使用可能なセマフォ数およびセマフォを取得したISRに関する情報を更新して実行されたISRにセマフォを取得させ、前記要求するセマフォが使用不可であると判定した場合には、セマフォを要求したISRに関する情報に基づいて前記使用情報のうちセマフォ待ちのISRに関する情報を更新するとともに、前記セマフォを要求したISRに対応付けられたICBにセマフォ待ち状態であることを設定するセマフォ取得ステップと、
    前記スケジューリングステップによって実行されたISRが開放するセマフォに対応付けられたセマフォ構造体が保持している使用情報に基づいて開放するセマフォを待っているISRが存在するか否かを判定し、前記開放するセマフォを待っているISRが存在すると判定した場合には、前記セマフォを待っているISRのうち一番先に当該セマフォを待っているISRまたは最も優先順位の高いISRを選択し、セマフォを開放するISRに関する情報および選択したセマフォを待っているISRに関する情報に基づいて、前記使用情報のうちセマフォを取得したISRに関する情報および選択したセマフォを待っているISRに関する情報を更新して実行されたISRからセマフォを開放し、前記選択したセマフォを待っているISRに開放したセマフォを取得させるとともに、新たにセマフォを取得したISRに対応付けられたICBに実行待ち状態であることを設定し、前記開放するセマフォを待っているISRが存在しないと判定した場合には、前記セマフォを開放するISRに関する情報に基づいて前記使用情報のうち使用可能なセマフォ数およびセマフォを取得したISRに関する情報を更新してセマフォを開放するセマフォ開放ステップと、
    をさらに備えることを特徴とする請求項1に記載のリアルタイム組込み簡易モニタプログラム。
  3. 前記セマフォ構造体の使用情報は、使用可能なセマフォの数が設定されるセマフォ数と、セマフォを取得しているISRを識別するISR識別子が設定される所有ISRと、セマフォの取得を待っているセマフォ待ち状態のISRのISR識別子が設定される待ちISRとを含み、
    前記セマフォ取得ステップは、
    前記スケジューリングステップによって実行されたISRが要求するセマフォに対応付けられたセマフォ構造体のセマフォ数の値が1以上の場合、当該セマフォ数の値をデクリメントするとともに、セマフォを要求するISRのISR識別子を当該所有ISRに設定してセマフォを取得し、前記要求するセマフォに対応付けられたセマフォ構造体のセマフォ数が1より小さい場合、前記セマフォを要求するISRのISR識別子を当該待ちISRに設定して、前記セマフォを要求したISRに対応付けられたICBにセマフォ待ち状態を設定し、
    前記セマフォ開放ステップは、
    前記スケジューリングステップによって実行されたISRが開放するセマフォに対応付けられたセマフォ構造体のセマフォ数をインクリメントするとともに当該所有ISRに設定されているセマフォを開放するISRのISR識別子を削除し、当該待ちISRにISR識別子が設定されている場合には、当該セマフォ数をデクリメントするとともに当該待ちISRに設定されているISR識別子を当該所有ISRに設定し、当該待ちISRに設定されているISR識別子を削除し、新たにセマフォを取得したISRに対応付けられたICBに実行待ち状態を設定すること、
    を特徴とする請求項2に記載のリアルタイム組込み簡易モニタプログラム。
  4. 前記ISR起動ステップは、
    割込みが発生するごとに、発生した割込みの処理を行なうISRに対応付けられたICBの実行カウンタの値をインクリメントしてICBに割込み回数を保持させ、
    前記スケジューリングステップは、
    前記実行カウンタが保持する割込み回数だけ当該ICBを選択対象とし前記割込み回数だけ自身が対応づけられたISRを実行させ、
    前記ISR終了ステップは、
    前記実行カウンタの値をデクリメントすること、
    を特徴とする請求項2または3に記載のリアルタイム組込み簡易モニタプログラム。
  5. 前記ISR起動ステップは、
    前記発生した割込みの処理を行なうISRに対応付けられたICBの実行カウンタの値が、当該ICBに予め登録されている実行回数上限値以下の場合に、前記実行カウンタの値をインクリメントすること、
    を特徴とする請求項4に記載のリアルタイム組込み簡易モニタプログラム。
  6. 前記セマフォ取得ステップは、
    前記要求するセマフォが使用不可であると判定した場合に、前記要求するセマフォを取得しているISRの優先順位と前記セマフォを要求したISRの優先順位とを比較して、前記要求するセマフォを取得しているISRの優先順位が前記セマフォを要求したISRの優先順位よりも低い場合には、前記要求するセマフォを取得しているISRの優先順位と前記セマフォを要求したISRの優先順位とを交換するようにICB配列の接続を変更するとともに、優先順位を交換したISRに対応付けられたICBに優先順位を変更したことを示す情報を設定し、
    前記セマフォ開放ステップは、
    前記セマフォを開放するISRに対応付けられたICBに優先順位が変更されたことを示す情報が設定されている場合には、前記セマフォを開放するISRの現在の優先順位と、該セマフォを開放するISRと優先順位を交換したISRの現在の優先順位とを交換するようにICB配列の接続を変更するとともに、優先順位を交換したISRに対応付けられたICBに優先順位の変更がないことを示す情報を設定すること、
    を特徴とする請求項2〜5の何れか一つに記載のリアルタイム組込み簡易モニタプログラム。
  7. 前記ISR起動ステップは、
    割込みが発生するごとに、発生した割込みの処理を行なうISRに対応付けられたICBの実行カウンタの値をインクリメントしてICBに割込み回数を保持させ、
    前記スケジューリングステップは、
    前記実行カウンタが保持する割込み回数だけ当該ICBを選択対象とし前記割込み回数だけ自身が対応づけられたISRを実行させ、
    前記ISR終了ステップは、
    前記実行カウンタの値をデクリメントすること、
    を特徴とする請求項1に記載のリアルタイム組込み簡易モニタプログラム。
  8. 前記ISR起動ステップは、
    前記発生した割込みの処理を行なうISRに対応付けられたICBの実行カウンタの値が、当該ICBに予め登録されている実行回数上限値以下の場合に、前記実行カウンタの値をインクリメントすること、
    を特徴とする請求項7に記載のリアルタイム組込み簡易モニタプログラム。
JP2005228523A 2005-08-05 2005-08-05 リアルタイム組込み簡易モニタプログラム Expired - Fee Related JP4068106B2 (ja)

Priority Applications (5)

Application Number Priority Date Filing Date Title
JP2005228523A JP4068106B2 (ja) 2005-08-05 2005-08-05 リアルタイム組込み簡易モニタプログラム
TW094145827A TWI306216B (en) 2005-08-05 2005-12-22 Real-time embedded simple monitor method, real-time embedded simple monitor program product and real-time embedded simple monitor program by computer-readable storage medium
CNB2006100064140A CN100429625C (zh) 2005-08-05 2006-01-20 实时内部简易监视方法
US11/350,068 US7472214B2 (en) 2005-08-05 2006-02-09 Real-time embedded simple monitor method and computer product
HK07106107.0A HK1101434A1 (en) 2005-08-05 2007-06-07 Method of real-time embedded simple monitor

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005228523A JP4068106B2 (ja) 2005-08-05 2005-08-05 リアルタイム組込み簡易モニタプログラム

Publications (2)

Publication Number Publication Date
JP2007047866A JP2007047866A (ja) 2007-02-22
JP4068106B2 true JP4068106B2 (ja) 2008-03-26

Family

ID=37700019

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005228523A Expired - Fee Related JP4068106B2 (ja) 2005-08-05 2005-08-05 リアルタイム組込み簡易モニタプログラム

Country Status (5)

Country Link
US (1) US7472214B2 (ja)
JP (1) JP4068106B2 (ja)
CN (1) CN100429625C (ja)
HK (1) HK1101434A1 (ja)
TW (1) TWI306216B (ja)

Families Citing this family (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3976065B2 (ja) * 2006-01-16 2007-09-12 セイコーエプソン株式会社 マルチプロセッサシステム及びマルチプロセッサシステムの割込み制御方法をコンピュータに実行させるためのプログラム
US8214574B2 (en) * 2006-09-08 2012-07-03 Intel Corporation Event handling for architectural events at high privilege levels
US8359602B2 (en) * 2008-02-21 2013-01-22 Ca, Inc. Method and system for task switching with inline execution
JP2010140290A (ja) * 2008-12-12 2010-06-24 Panasonic Corp マルチプロセッサシステム及びその排他制御の調停方法
JP2011232956A (ja) * 2010-04-27 2011-11-17 Clarion Co Ltd コンピュータシステムとプログラム
GB2497736A (en) * 2011-12-16 2013-06-26 St Microelectronics Ltd Hardware monitor with context selector for selecting from multiple contexts
JP5912804B2 (ja) * 2012-04-20 2016-04-27 富士電機株式会社 周辺装置アクセスシステム
JP2015076693A (ja) * 2013-10-08 2015-04-20 株式会社リコー 表示装置、表示システム、及びプログラム
JP5917678B1 (ja) * 2014-12-26 2016-05-18 株式会社Pfu 情報処理装置、方法およびプログラム
CN104503836B (zh) * 2015-01-08 2018-01-30 辽宁科技大学 多核处理器进程调度系统和多核处理器进程调度方法
FR3033427B1 (fr) * 2015-03-03 2018-05-18 Zodiac Aerotechnics Procede de sequencement de commandes d'execution, procede d'execution, programme d'ordinateur et circuit integre
CN107584985A (zh) * 2016-07-08 2018-01-16 福特环球技术公司 车辆中的用户需求式气候控制
US11113061B2 (en) * 2019-09-26 2021-09-07 Advanced Micro Devices, Inc. Register saving for function calling

Family Cites Families (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4979055A (en) 1987-06-02 1990-12-18 Conner Peripherals, Inc. Disk drive system controller architecture utilizing embedded real-time diagnostic monitor
JP2650965B2 (ja) * 1988-05-27 1997-09-10 株式会社日立製作所 計算機システムおよびそのタスクスケジュール方法
JPH03157733A (ja) * 1989-11-16 1991-07-05 Mitsubishi Electric Corp タスクレディキュー管理装置
JPH04287233A (ja) * 1991-03-18 1992-10-12 Hitachi Ltd 事象処理制御方法
JPH05257718A (ja) * 1992-03-13 1993-10-08 Mitsubishi Electric Corp プロセス制御装置
JPH06187175A (ja) * 1992-12-18 1994-07-08 Erugu Kk マルチタスクコンピューティングシステムの排他制御方式
JP3245500B2 (ja) 1994-04-28 2002-01-15 エヌイーシーマイクロシステム株式会社 マルチプログラミングにおける事象管理方式
JPH0877025A (ja) * 1994-09-01 1996-03-22 Kokusai Electric Co Ltd タスクの優先度制御方法、タスクの優先度制御装置
US5853874A (en) 1994-11-28 1998-12-29 Exxon Chemical Patents, Inc. Low viscosity hot melt pressure sensitive ashesive compositions
JP3727637B2 (ja) * 1994-12-26 2005-12-14 三菱電機株式会社 制御ソフトウェア実行システムの制御方法
JPH1049386A (ja) * 1996-08-02 1998-02-20 Nec Corp 資源排他方式
US6412035B1 (en) * 1997-02-03 2002-06-25 Real Time, Inc. Apparatus and method for decreasing the response times of interrupt service routines
US5987601A (en) * 1997-02-14 1999-11-16 Xyron Corporation Zero overhead computer interrupts with task switching
JP3432693B2 (ja) * 1997-03-11 2003-08-04 三菱電機株式会社 プラント監視制御システム
JPH1124946A (ja) 1997-07-04 1999-01-29 Canon Inc タスクスケジューリング装置および方法
US6298410B1 (en) * 1997-12-31 2001-10-02 Intel Corporation Apparatus and method for initiating hardware priority management by software controlled register access
US6430593B1 (en) * 1998-03-10 2002-08-06 Motorola Inc. Method, device and article of manufacture for efficient task scheduling in a multi-tasking preemptive priority-based real-time operating system
JPH11272480A (ja) 1998-03-24 1999-10-08 Nippon Telegr & Teleph Corp <Ntt> オンチップリアルタイムos
GB9825102D0 (en) * 1998-11-16 1999-01-13 Insignia Solutions Plc Computer system
JP2001092676A (ja) 1999-09-22 2001-04-06 Kenwood Corp 組み込みプログラムにおけるタスク管理システム
JP2003131892A (ja) 2001-10-25 2003-05-09 Matsushita Electric Ind Co Ltd タスク実行制御装置及びタスク実行制御方法
JP2003345612A (ja) * 2002-05-28 2003-12-05 Sony Corp 演算処理システム、コンピュータ・システム上でのタスク制御方法、並びにコンピュータ・プログラム
JP2004127039A (ja) 2002-10-03 2004-04-22 Seiko Epson Corp タスク排他制御方法及びタスク排他制御装置
JP4047783B2 (ja) * 2003-09-01 2008-02-13 沖電気工業株式会社 タスク制御方法とタスク切替装置

Also Published As

Publication number Publication date
US7472214B2 (en) 2008-12-30
HK1101434A1 (en) 2007-10-18
US20070033384A1 (en) 2007-02-08
CN1908904A (zh) 2007-02-07
CN100429625C (zh) 2008-10-29
TWI306216B (en) 2009-02-11
TW200707297A (en) 2007-02-16
JP2007047866A (ja) 2007-02-22

Similar Documents

Publication Publication Date Title
JP4068106B2 (ja) リアルタイム組込み簡易モニタプログラム
US9798595B2 (en) Transparent user mode scheduling on traditional threading systems
JP4580845B2 (ja) タスク実行装置
KR100848603B1 (ko) 데이터 처리장치와 복귀상태의 저장방법
JP4345630B2 (ja) 情報処理装置、割り込み処理制御方法、並びにコンピュータ・プログラム
TWI267782B (en) Deallocation of computer data in a multithreaded computer
JP5809366B2 (ja) ポータブルコンピューティングデバイスにおいて要求をスケジューリングするための方法およびシステム
US6820155B1 (en) Interruption managing device and interruption managing method
JPWO2009157178A1 (ja) 仮想計算機制御装置、仮想計算機制御プログラム及び仮想計算機制御回路
US20180203722A1 (en) Method for reducing interrupt latency in embedded systems
JP4873423B2 (ja) 仮想化プログラム、シミュレーション装置、仮想化方法
JP2004288162A (ja) 同期タスクを利用したオペレーティングシステムアーキテクチャ
WO2008148076A1 (en) Lazy kernel thread binding
JP2005078640A (ja) プロセッサ資源電力管理のためのスレッド・スケジューリング機構
JP2008108075A (ja) タスク切替え制御方法及びコンピュータシステム
EP1693743A2 (en) System, method and medium for using and/or providing operating system information to acquire a hybrid user/operating system lock
JP4523910B2 (ja) 並列処理装置及び並列処理方法及び並列処理プログラム
JP2005190207A (ja) 割り込み制御装置、制御方法
US20080307419A1 (en) Lazy kernel thread binding
WO2008157455A2 (en) Notifying user mode scheduler of blocking events
JP5557612B2 (ja) 計算機及び転送プログラム
WO2023144939A1 (ja) コンピュータ、制御方法及び制御プログラム
JP2005519393A (ja) 仮想直接メモリ・アクセスのための方法及び装置
JP2008225710A (ja) コンピュータシステム及び該システムで用いられるプロセス切替え方法
CN114443255A (zh) 一种线程调用方法和装置

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20070830

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20071002

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20071130

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20080108

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20080109

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110118

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

Ref document number: 4068106

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120118

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130118

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130118

Year of fee payment: 5

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees