(57)【特許請求の範囲】
【請求項１】
制御対象の制御に関する処理を行う制御関連タスクが実行される制御関連タイムパーティションを含む複数のタイムパーティションのスケジューリング内容を示すスケジューリング情報に従って、前記制御関連タスクをスケジューリングして実行するスケジューリング手段と、
前記制御関連タスクの実行終了又は実行未終了を示す実行終了情報が格納される記憶部と、を備え、
前記スケジューリング手段は、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を実行未終了に更新するとともに、前記制御関連タスクの実行終了時に前記実行終了情報を実行終了に更新し、
前記スケジューリング手段は、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を実行未終了に更新する前に前記実行終了情報が実行未終了を示している場合を検出する、
制御装置。
【請求項２】
前記スケジューリング手段は、
前記スケジューリング情報に従って、前記制御関連タスクをスケジューリングして実行するシステムプログラムと、
前記システムプログラムを実行するプロセッサと、を含む、
請求項１に記載の制御装置。
【請求項３】
前記システムプログラムは、前記制御関連タスクが呼び出したときに、当該制御関連タスクを実行終了してスリープさせるための関数を提供し、
前記関数は、前記実行終了情報を前記制御関連タスクの実行終了に更新する処理を含む、
請求項２に記載の制御装置。
【請求項４】
前記システムプログラムは、前記スケジューリング情報に従って、前記複数のタイムパーティションをスケジューリングするパーティションスケジューラを含み、
前記パーティションスケジューラは、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を実行未終了に更新するとともに、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を実行未終了に更新する前に前記実行終了情報が実行未終了を示している場合を検出する、
請求項３に記載の制御装置。
【請求項５】
前記関数は、前記実行終了情報が実行未終了を示している場合の検出状況に応じた戻り値を前記制御関連タスクに返す請求項４に記載の制御装置。
【請求項６】
前記記憶部は、初期値として正常であることを示す正常値が設定される検出結果値がさらに格納され、
前記システムプログラムは、前記実行終了情報が実行未終了を示している場合を検出したときに、前記検出結果値を異常であることを示す異常値に更新し、
前記関数は、前記検出結果値に対応する値を前記戻り値に設定する請求項５に記載の制御装置。
【請求項７】
前記記憶部は、カウンタ値がさらに格納され、
前記システムプログラムは、前記実行終了情報が実行未終了を示している場合を検出したときに、前記カウンタ値を更新し、
前記関数は、前記カウンタ値を前記戻り値に設定する請求項５に記載の制御装置。
【請求項８】
前記制御関連タスクは、前記関数の戻り値が異常値に対応する値である場合、通常の処理に代えて、異常に対応する処理を実行する請求項６に記載の制御装置。
【請求項９】
前記システムプログラムは、前記実行終了情報が実行未終了を示している場合を検出したときに、前記カウンタ値をカウントアップし、
前記制御関連タスクは、前記関数の戻り値が所定の閾値以上である場合、通常の処理に代えて、異常に対応する処理を実行する請求項７に記載の制御装置。
【請求項１０】
前記スケジューリング情報は、異常に対応する処理を行う異常処置タスクが実行される異常処理タイムパーティションを含む複数のタイムパーティションのスケジューリング内容をさらに示し、
前記制御関連タスクにおける異常に対応する処理は、前記パーティションスケジューラに異常を通知する処理を含み、
前記パーティションスケジューラは、前記制御関連タスクからの通知に応じて、前記異常処理タイムパーティションを含む複数のタイムパーティションのスケジューリング内容に従った前記異常処置タスクのスケジューリングを開始する、
請求項８又は９に記載の制御装置。
【請求項１１】
前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時は、他のタイムパーティションから前記制御関連タイムパーティションへの切り替え時、及び、前記制御関連タイムパーティションから他のタイムパーティションへの切り替え時のいずれかである請求項１乃至１０のいずれか１項に記載の制御装置。
【請求項１２】
制御対象の制御に関する処理を行う制御関連タスクが実行される制御関連タイムパーティションを含む複数のタイムパーティションのスケジューリング内容を示すスケジューリング情報に従って、前記制御関連タスクをプロセッサによってスケジューリングして実行する制御方法であって、
前記プロセッサが、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に、前記制御関連タスクの実行終了又は実行未終了を示す実行終了情報を実行未終了に更新するステップと、
前記プロセッサが、前記制御関連タスクの実行終了時に前記実行終了情報を実行終了に更新するステップと、
前記プロセッサが、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を前記制御関連タスクの実行未終了に更新する前に、前記実行終了情報が実行未終了を示している場合を検出するステップと、
を備えた制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、機能安全の確保のためにサービスロボットおよび輸送機器等に搭載される制御装置に関し、特に、コンピュータシステムを用いた制御装置に関する。
【背景技術】
【０００２】
サービスロボットは、外界センサや自己診断装置によって安全状態を常時監視し、何らかの危険を検知した場合に適切な安全制御ロジックを実行することで、機能安全を確保する必要がある。
【０００３】
上述したサービスロボットのほか、運輸機器等の電気的な原理で動作するシステムを対象とした機能安全に関する国際標準としてIEC 61508が制定されている。IEC 61508では、機能安全の確保のために設けられるシステムのことを安全関連系と呼んでいる。IEC 61508は、マイクロプロセッサ及びPLC（Programmable Logic Controller）等のハードウェアとコンピュータプログラム（ソフトウェア）によって安全関連系を構築するための様々な技法を定めている。IEC 61508で定められている技法を用いることで、コンピュータシステムを用いて安全関連系を構築することが可能となる。
【０００４】
一方で、近年、マイクロプロセッサ等のプログラマブル電子機器の処理能力が向上している。このため、マルチタスクＯＳ（Operating System）を利用し、１つのコンピュータシステム上で様々なアプリケーションプログラムを並列実行することで、サービスロボット及び自動車等の機器に搭載されている複数用途のコンピュータシステムを統合することができる。
【０００５】
例えば特許文献１に、機能安全の確保に関するアプリケーションプログラム（以下、安全関連アプリケーションと呼ぶ）を、その他のアプリケーションプログラム（以下、非安全関連アプリケーションと呼ぶ）と共に１つのコンピュータシステム上で動作させる技術が開示されている。
【０００６】
IEC 61508で定められている技法を、安全関連アプリケーションおよび非安全関連アプリケーションを含むソフトウェア全体に適用すると、非安全関連アプリケーションにまで適用する必要性が生じる。このため、ソフトウェア開発コストが増大するという問題がある。
【０００７】
そこで、特許文献１に開示される技術では、システムプログラムのタイム・パーティションニングによって、安全関連アプリケーション（安全監視プログラム及び安全制御プログラム）を非安全関連アプリケーション（通常制御プログラム）から独立させている。このため、通常制御プログラムを安全関連系から除外することができ、コンピュータシステムを用いて構成される安全関連系の低コスト化に寄与することができる。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２０１０−２７１７５９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、特許文献１に例示されるような安全制御装置には、以下に説明する課題があった。以下、図２２及び図２３を参照して、その課題について説明する。
【００１０】
機能安全規格のIEC61508において、サービスロボット等のＥＣＵ（Electronic Control Unit）では、シーケンスモニタ機能によって、予定されている時間内に処理が正しく実行することができているかを監視することが必要とされている。
【００１１】
例えば、サービスロボット等の制御では、図２２に例示するように一定周期で繰り返し実行する必要のある処理が存在している。そのような処理として、サービスロボットのアクチュエータを制御する処理や、サービスロボットのセンサから情報を取得して、取得した情報を確認することでサービスロボットの状態を監視する処理等がある。ここで、図２２及び図２３において、「Partition 1」及び「Partition 2」は、タイムパーティションを示し、「Task」は、Partition 1で実行されるタスクを示している。タスクは、一定周期で繰り返し実行する必要のある処理を実行する。図２２では、一定周期でアクティブとなるPartition 1でタスクを実行することによって、一定周期でタスクが実行されるようにしている。このようにすることで、例えば、定期的に監視結果に応じた制御対象の制御を行うことができるため、より安定した制御対象の制御を行うことが可能となる。
【００１２】
しかしながら、図２２に例示する場合において、一定周期でタスクが実行されるようにするためには、一定周期毎にタスクの実行が終了している必要がある。例えば、図２３に例示するように、Partition 1の時間内にタスクの実行が終了していない場合、次にPartition 1がアクティブとなったときに、タスクは前回のPartition 1の時間の終了時に中断されたところからその実行を継続することになる。すなわち、この場合は、次にPartition 1がアクティブとなったときからタスクを再実行することができず、一定周期でタスクを実行することができなくなってしまう。したがって、一定周期でタスクを実行できていることを保障するためには、タイムパーティションの時間内にタスクを実行終了することができているか否かを監視することを可能とする必要がある。
【００１３】
本発明は、上述した知見に基づいてなされたものであって、タイムパーティションの時間内にタスクを実行終了することができているか否かを監視することが可能となる制御装置及び制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明の第１の態様にかかる制御装置は、制御対象の制御に関する処理を行う制御関連タスクが実行される制御関連タイムパーティションを含む複数のタイムパーティションのスケジューリング内容を示すスケジューリング情報に従って、前記制御関連タスクをスケジューリングして実行するスケジューリング手段と、前記制御関連タスクの実行終了又は実行未終了を示す実行終了情報が格納される記憶部と、を備え、前記システムプログラムは、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を実行未終了に更新するとともに、前記制御関連タスクの実行終了時に前記実行終了情報を実行終了に更新し、前記システムプログラムは、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を実行未終了に更新する前に前記実行終了情報が実行未終了を示している場合を検出するものである。
【００１５】
本発明の第２の態様にかかる制御方法は、制御対象の制御に関する処理を行う制御関連タスクが実行される制御関連タイムパーティションを含む複数のタイムパーティションのスケジューリング内容を示すスケジューリング情報に従って、前記制御関連タスクをプロセッサによってスケジューリングして実行する制御方法であって、前記プロセッサが、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に、前記制御関連タスクの実行終了又は実行未終了を示す実行終了情報を実行未終了に更新するステップと、前記プロセッサが、前記制御関連タスクの実行終了時に前記実行終了情報を実行終了に更新するステップと、前記プロセッサが、前記制御関連タイムパーティションに関する前記タイムパーティションの切り替え時に前記実行終了情報を前記制御関連タスクの実行未終了に更新する前に、前記実行終了情報が実行未終了を示している場合を検出するステップとを備えたものである。
【発明の効果】
【００１６】
上述した本発明の各態様によれば、タイムパーティションの時間内にタスクを実行終了することができているか否かを監視することが可能となる制御装置及び制御方法を提供することができる。
【図面の簡単な説明】
【００１７】
【図１】発明の実施の形態１にかかる安全制御装置の構成例を示すブロック図である。
【図２】発明の実施の形態１におけるタイム・パーティショニングの概念を説明するための図である。
【図３】発明の実施の形態１におけるリソース・パーティショニングの概念を説明するための概念図である。
【図４】発明の実施の形態１におけるパーティションスケジューラとタスクとの関係を示す図である。
【図５Ａ】スケジューリングパターンの具体例を示す図である。
【図５Ｂ】スケジューリングパターンの具体例を示す図である。
【図６】発明の実施の形態１にかかるパーティションスケジューラの処理手順の具体例を示すフローチャートである。
【図７】発明の実施の形態１にかかるＡＰＩ関数wai_pswの処理手順の具体例を示すフローチャートである。
【図８】発明の実施の形態１において、ＴＰの時間内にタスクが実行終了した場合におけるタスクの実行状況の具体例を示す図である。
【図９】発明の実施の形態１において、ＴＰの時間内にタスクが実行終了しなかった場合におけるタスクの実行状況の具体例を示す図である。
【図１０】発明の実施の形態２におけるパーティションスケジューラとタスクとの関係を示す図である。
【図１１】発明の実施の形態２にかかるパーティションスケジューラの処理手順の具体例を示すフローチャートである。
【図１２】発明の実施の形態２にかかるＡＰＩ関数wai_pswの処理手順の具体例を示すフローチャートである。
【図１３】発明の実施の形態２において、ＴＰの時間内にタスクが実行終了した場合におけるタスクの実行状況の具体例を示す図である。
【図１４】発明の実施の形態２において、ＴＰの時間内にタスクが実行終了しなかった場合におけるタスクの実行状況の具体例を示す図である。
【図１５】発明の実施の形態３におけるパーティションスケジューラとタスクとの関係を示す図である。
【図１６】発明の実施の形態３にかかるパーティションスケジューラの処理手順の具体例を示すフローチャートである。
【図１７】発明の実施の形態３にかかるＡＰＩ関数wai_pswの処理手順の具体例を示すフローチャートである。
【図１８】発明の実施の形態３において、ＴＰの時間内にタスクが実行終了した場合におけるタスクの実行状況の具体例を示す図である。
【図１９】発明の実施の形態３において、ＴＰの時間内にタスクが実行終了した場合におけるタスクの実行状況の具体例を示す図である。
【図２０】その他の実施の形態にかかるパーティションスケジューラとタスクとの関係を示す図である。
【図２１】その他の実施の形態にかかるパーティションスケジューラとタスクとの関係を示す図である。
【図２２】課題を説明するための図である。
【図２３】課題を説明するための図である。
【発明を実施するための形態】
【００１８】
以下では、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。各図面において、同一要素には同一の符号が付されており、説明の明確化のため、必要に応じて重複説明は省略される。
【００１９】
＜発明の実施の形態１＞
本実施の形態にかかる安全制御装置１は、サービスロボットや運輸機器等に搭載されて機能安全確保のための安全制御を実行する。安全制御装置１は、安全関連アプリケーションと非安全関連アプリケーションを同一のコンピュータシステムで実行するよう構成される。図１は、本実施の形態にかかる安全制御装置１の構成例を示すブロック図である。
【００２０】
プロセッサ１０は、プログラム（命令ストリーム）の取得、命令のデコード、命令のデコード結果に応じた演算処理を行う。なお、図１では、１つのプロセッサ１０のみを示しているが、安全制御装置１は、複数のプロセッサ１０を有するマルチプロセッサ構成であってもよい。また、プロセッサ１０は、マルチコアプロセッサでもよい。プロセッサ１０は、システムプログラムとしてのオペレーティングシステム（ＯＳ）１００を実行することによりマルチプログラミング環境を提供する。マルチプログラミング環境とは、複数のプログラムを定期的に切り替えて実行したり、あるイベントの発生に応じて実行するプログラムを切り替えたりすることによって、複数のプログラムがあたかも並列実行されているような環境を意味する。
【００２１】
マルチプログラミングは、マルチプロセス、マルチスレッド、マルチタスク等と呼ばれる場合もある。プロセス、スレッド及びタスクは、マルチプログラミング環境で並列実行されるプログラム単位を意味する。本実施の形態のプロセッサ１０が具備するマルチプログラミング環境は、マルチプロセス環境でもよいし、マルチスレッド環境でもよい。
【００２２】
実行用メモリ１１は、プロセッサ１０によるプログラム実行のために使用されるメモリである。実行用メモリ１１には、不揮発性メモリ１３からロードされたプログラム（ＯＳ１００及びアプリケーション１０１〜１０３等）、プロセッサ１０の入出力データ等が記憶される。なお、プロセッサ１０は、プログラムを不揮発性メモリ１３から実行用メモリ１１にロードすることなく、これらのプログラムを不揮発性メモリ１３から直接実行してもよい。
【００２３】
具体的には、実行用メモリ１１は、ＳＲＡＭ（Static Random Access Memory）、ＤＲＡＭ（Dynamic Random Access Memory）等のランダムアクセス可能な揮発性メモリとすればよい。図１の実行用メモリ１１は、論理的な構成単位を示している。すなわち、実行用メモリ１１は、例えば、複数のＳＲＡＭデバイスの組み合わせ、複数のＤＲＡＭデバイスの組み合わせ、又はＳＲＡＭデバイスとＤＲＡＭデバイスの組み合わせでもよい。
【００２４】
Ｉ／Ｏポート１２は、外部デバイスとの間のデータ送受信に使用される。例えば、安全制御装置１がサービスロボットに搭載される場合であれば、外部デバイスは、各種センサ及びサービスロボットを動作させるアクチュエータ等である。この場合、各種センサは、例えば、サービスロボット周囲の障害物を計測可能な視覚センサ、サービスロボットの姿勢を検知するための姿勢センサ、及びサービスロボットのアクチュエータの状態を検知するための回転センタ等のサービスロボットの内外の状態を検出するセンサを含む。
【００２５】
不揮発性メモリ１３は、電力の供給を受けることなく、実行用メモリ１１に比べて安定的に記憶内容を維持することが可能なメモリデバイスである。例えば、不揮発性メモリ１３は、ＲＯＭ（Read Only Memory）、フラッシュメモリ、ハードディスクドライブ若しくは光ディスクドライブ、又はこれらの組み合わせである。不揮発性メモリ１３は、ＯＳ１００及びアプリケーション１０１〜１０３を格納する。なお、不揮発性メモリ１３の少なくとも一部は安全制御装置１から取り外し可能に構成されてもよい。例えば、アプリケーション１０１〜１０３が格納されたメモリを取り外し可能としてもよい。また、不揮発性メモリ１３の少なくとも一部は、安全制御装置１の外部に配置されてもよい。
【００２６】
ＯＳ１００は、プロセッサ１０によって実行されることにより、プロセッサ１０及び実行用メモリ１１及び不揮発性メモリ１３等のハードウェア資源を利用して、タスクスケジューリングを含むタスク管理、割り込み管理、時間管理、資源管理、タスク間同期およびタスク間通信機構の提供等を行う。
【００２７】
さらに、機能安全の確保に関連する安全監視アプリケーション１０１及び安全制御アプリケーション１０３の通常制御アプリケーション１０２からの独立性を高めるため、ＯＳ１００は、ハードウェア資源を、時間的および空間的に保護する機能を有する。ここで、ハードウェア資源とは、プロセッサ１０、実行用メモリ１１、Ｉ／Ｏポート１２を含む。
【００２８】
このうち、時間的な保護は、プロセッサ１０の実行時間という時間的な資源をパーティショニングすることにより行う。具体的に述べると、時間的な保護は、プロセッサ１０の実行時間をパーティショニングし、各パーティション（タイムパーティションと呼ぶ）にタスク（プロセス又はスレッド）を割り当てることにより行う。ＯＳ１００のスケジューリング機能（パーティションスケジューラ２１）は、各タイムパーティション（以下、ＴＰと略称する場合がある。）に割り当てられたタスクに対して、プロセッサ１０の実行時間を含む資源の利用を保証する。
【００２９】
図２は、タイム・パーティショニングに関する概念図である。図２の例では、予め定められた１サイクル時間を３つのＴＰ１、ＴＰ２及びＴＰ３に分割する例を示している。例えば、１サイクル時間を１００Ｔｉｃｋとした場合、このうち前半の２０ＴｉｃｋがＴＰ１、中間の３０ＴｉｃｋがＴＰ２、後半の５０ＴｉｃｋがＴＰ３と規定される。
【００３０】
また、図２の例では、第１アプリケーション（ＡＰＬ１）〜第４アプリケーション（ＡＰＬ４）が、ＴＰ１〜ＴＰ３のいずれかに割り当てられている。ＯＳ１００のスケジューリング機能（パーティションスケジューラ２１）は、時間の経過に応じて、ＴＰ１〜ＴＰ３のいずれをアクティブにするかを選択・決定する。そして、アクティブなＴＰに割り当てられているアプリケーションが、プロセッサ１０で実行される。
【００３１】
一方、空間的な保護は、実行用メモリ１１及びＩ／Ｏポート１２を含む固定的な資源をパーティショニングし、各パーティション（リソースパーティションと呼ぶ）にタスクを割り当てることにより行う。ＯＳ１００のスケジューリング機能（パーティションスケジューラ２１）は、予め割り当てられたリソースパーティション（以下、ＲＰと略称する場合がある。）を超えてタスクが他のリソースにアクセスすることを禁止する。
【００３２】
図３は、リソース・パーティショニングに関する概念図である。図３の例では、２つのＲＰ（ＲＰ１及びＲＰ２）を示している。ＲＰ１には、実行用メモリ１１及び不揮発性メモリ１３の一部（Ａ領域）と、Ｉ／Ｏポート１２の一部（ポートＡ）が割り当てられている。また、ＲＰ２には、実行用メモリ１１及び不揮発性メモリ１３の他の一部（Ｂ領域）と、Ｉ／Ｏポート１２の他の一部（ポートＢ）が割り当てられている。ＲＰ１からはＲＰ２に割り当てられたリソースへのアクセスが禁止され、ＲＰ２からはＲＰ１に割り当てられたリソースへのアクセスが禁止される。
【００３３】
なお、全てのリソースがいずれかのＲＰに排他的に割り当てられる必要はない。つまり、複数のＲＰによって共有されるリソースがあってもよい。例えば、サービスロボットの安全制御を行う場合、アクチュエータには、通常制御アプリケーション１０２及び安全制御アプリケーション１０３の双方からアクセスできる必要がある。よって、通常制御アプリケーション１０２が属するＲＰと安全制御アプリケーション１０３が属するＲＰによって、アクチュエータを制御するためのＩ／Ｏポートを共有するとよい。
【００３４】
図１に戻り説明を続ける。アプリケーション１０１〜１０３は、ＯＳ１００及びプロセッサ１０によって提供されるマルチプログラミング環境で実行される。このうち、安全監視アプリケーション１０１は、通常制御アプリケーション１０２の実行状況の監視と、安全制御アプリケーション１０３の実行状況の監視と、Ｉ／Ｏポート１２への入出力データの監視と、をプロセッサ１０に実行させるための命令コードを含む。さらに、安全監視アプリケーション１０１は、パーティションスケジューラ２１への結果通知をプロセッサ１０に実行させるための命令コードを含む。つまり、安全監視アプリケーション１０１は、安全関連アプリケーションである。
【００３５】
また、通常制御アプリケーション１０２は、サービスロボット等の制御対象に通常の機能・動作を行わせるための制御手順をプロセッサ１０に実行させるための命令コードを含む。さらに、通常制御アプリケーション１０２は、パーティションスケジューラ２１への結果通知をプロセッサ１０に実行させるための命令コードを含む。つまり、通常制御アプリケーション１０２は、非安全関連アプリケーションである。
【００３６】
また、安全制御アプリケーション１０３は、何らかの異常が検出された場合に対応して、機能安全を確保するために定められた制御手順をプロセッサ１０に実行させるための命令コードを含む。さらに、安全制御アプリケーション１０３は、パーティションスケジューラ２１への結果通知をプロセッサ１０に実行させるための命令コードを含む。つまり、安全制御アプリケーション１０３は、安全関連アプリケーションである。
【００３７】
リセット回路１４は、ＯＳ１００からの信号に基づき、マイクロコントローラ１５のリセットを行う。パーティションスケジューラ２１からリセット回路１４に定期的に送信信号を送信するようにし、リセット回路１４は、パーティションスケジューラ２１からの送信信号が途絶えた場合に、マイクロコントローラ１５をリセットする。例えば、パーティションスケジューラ２１は、後述するように、１Ｔｉｃｋごとに動作するタイミングで送信信号を送信する。また、ＯＳ１００で異常を検知した場合、又は、アプリケーション１０１〜１０３のいずれかから異常を示す結果通知を受けた場合に、パーティションスケジューラ２１がリセット回路１４にリセット信号を送信するようにして、それに応じて、リセット回路１４がマイクロコントローラ１５をリセットするようにしてもよい。このようにすることで、マイクロコントローラ１５に不具合が発生した場合に、マイクロコントローラ１５をリセットして復旧することができる。
【００３８】
続いて以下では、パーティションスケジューラ２１と、アプリケーション１０１〜１０３の起動により生成されるタスクと、の関係について、図４を用いて説明する。図４は、ＯＳ１００によって提供されるマルチプログラミング環境で起動される、パーティションスケジューラ２１とタスク２４、２６、２８との関係を示す図である。
【００３９】
マイクロコントローラ１５は、プロセッサ１０、実行用メモリ１１、Ｉ／Ｏポート１２、不揮発性メモリ１３等を含む。なお、図４では、マイクロコントローラ１５の外部にリセット回路１４を備える構成を例示しているが、マイクロコントローラ１５の内部にリセット回路１４を含む構成としてもよい。
【００４０】
マイクロコントローラ１５には、外部のクロック源からのクロック信号が供給され、プロセッサ１０等は、このクロック信号に基づく所定のタイマー周期で動作する。本実施の形態では、所定のタイマー周期を、１Ｔｉｃｋであるとして説明する。このため、プロセッサ１０によりＯＳ１００が実行されることで、パーティションスケジューラ２１が１Ｔｉｃｋごとに動作すると共に、各ＴＰにおいて、タスクスケジューラ２３、２５、２７およびタスク（安全監視タスク２４、通常制御タスク２６、安全制御タスク２８）が１Ｔｉｃｋごとに動作する。
【００４１】
パーティションスケジューラ２１は、１Ｔｉｃｋごとに動作し、ＴＰの切り替え（パーティション・スケジューリング）を行う。パーティションスケジューラ２１は、次の１Ｔｉｃｋの間にＴＰ１〜ＴＰ３のいずれをアクティブにするかを選択・決定する。さらに、パーティションスケジューラ２１は、選択したＴＰに関するタスクスケジューラの動作を開始させる。
【００４２】
パーティションスケジューラ２１によるパーティション・スケジューリングについて具体的に述べると、パーティションスケジューラ２１は、スケジューリングテーブル２２を参照し、ＴＰの設定を定めたスケジューリングパターンに従って、パーティション・スケジューリングを行う。
【００４３】
スケジューリングテーブル２２は、ＴＰの切り替え順序およびタイミングを規定したスケジューリングパターンを保持している。スケジューリングテーブル２２は、例えば、実行用メモリ１１に予め格納されている。なお、スケジューリングテーブル２２は、少なくとも２つの異なるスケジューリングパターンを保持している。１つは、安全監視タスク２４による異常検知が行われていない場合（つまり通常時）に適用されるスケジューリングパターンである。もう１つは、安全監視タスク２４によって異常が検知された場合に適用されるスケジューリングパターンである。以下では、通常時に適用されるスケジューリングパターンを"通常制御スケジューリングパターン"と呼ぶ。また、異常検知時に適用されるスケジューリングパターンを"安全制御スケジューリングパターン"と呼ぶ。
【００４４】
図５Ａは、通常制御スケジューリングパターンの具体例を示している。図５Ａでは、通常制御タスク２６が属するＴＰ２が１サイクル時間の前半（Ｔ１）に割り当てられている。また、安全監視タスク２４が属するＴＰ１が１サイクル時間の後半（Ｔ２）に割り当てられている。図５Ａのスケジューリングパターンによれば、通常制御タスク２６と安全監視タスク２４が繰り返しスケジューリングされる。
【００４５】
図５Ｂは、安全制御スケジューリングパターンの具体例を示している。図５Ｂでは、安全制御タスク２８が属するＴＰ３が１サイクル時間の前半（Ｔ３）に割り当てられている。また、安全監視タスク２４が属するＴＰ１が１サイクル時間の後半（Ｔ４）に割り当てられている。図５Ｂのスケジューリングパターンによれば、安全制御タスク２８と安全監視タスク２４が繰り返しスケジューリングされる。
【００４６】
図４に戻り説明を続ける。タスクスケジューラ２３、２５、２７は、それぞれが属するＴＰ内でのタスクのスケジューリングを行う。各ＴＰ内でのタスクのスケジューリングには、一般的な優先度ベースのスケジューリングを適用すればよい。なお、図４では、各ＴＰはそれぞれ１つのタスクのみを含むものとして図示しているが、１以上のタスクが含まれるようにしてもよい。例えば、通常制御用のＴＰ２内には、通常制御タスクＡ及び通常制御タスクＢの２つのタスクが含まれていてもよい。
【００４７】
安全監視タスク２４は、安全監視アプリケーション１０１の起動によって生成されるタスクである。図４の例では、安全監視タスク２４は、ＴＰ１及びＲＰ１に割り当てられている。安全監視タスク２４は、非安全関連アプリケーションである通常制御タスク２６の実行状況の監視と、安全関連アプリケーションである安全制御タスク２８の実行状況の監視と、Ｉ／Ｏポート１２の入出力データを監視する。さらに、安全監視タスク２４は、タスクの実行状況を、パーティションスケジューラ２１へ通知する。
【００４８】
通常制御タスク２６は、通常制御アプリケーション１０２の起動によって生成されるタスクである。図４の例では、通常制御タスク２６は、ＴＰ２及びＲＰ２に割り当てられている。通常制御タスク２６は、サービスロボット等の制御対象に通常の機能・動作を行わせるための制御を行う。さらに、通常制御タスク２６は、タスクの実行状況を、パーティションスケジューラ２１へ通知する。
【００４９】
安全制御タスク２８は、安全制御アプリケーション１０３の起動によって生成されるタスクである。図４の例では、安全制御タスク２８は、ＴＰ３及びＲＰ３に割り当てられている。安全制御タスク２８は、何らかの異常が検出された場合に対応して、機能安全を確保するために定められた制御を行う。さらに、安全制御タスク２８は、タスクの実行状況を、パーティションスケジューラ２１へ通知する。
【００５０】
なお、各タスクからパーティションスケジューラ２１へと結果を通知する具体的な構成としては、様々な手法を採用することができる。例えば、タスクがＯＳ１００のシステムコール（サービスコール）を呼び出し、ＯＳ１００を介して、パーティションスケジューラ２１に結果を通知することができる。具体的には、例えば、タスク間通信を行うシステムコールを呼び出す。また、例えば、タスクの実行状況に関するフラグを実行用メモリ１１に格納するものとして、タスクがその実行状況に応じてフラグの値を設定し、パーティションスケジューラ２１がフラグの設定値に応じてタスクの実行状況を判断することもできる。
【００５１】
ここで、ＯＳ１００は、各タスク２４、２６、２８に対して、次回にタスクが属するタイムパーティションがアクティブとなるまで、そのタスクを実行終了してスリープさせるＡＰＩ（Application Program Interface）関数を提供する。したがって、一定周期でアクティブとなるＴＰに属するタスクに、このＡＰＩ関数を呼び出してスリープさせるようにすることで、そのタスクが一定周期で実行されるようにすることができる。以下、このＡＰＩ関数を「wai_psw」と記載する。
【００５２】
wai_pswフラグ２９は、タスク２４、２６、２８のそれぞれに対応するように、複数用意される。wai_pswフラグ２９は、例えば、実行用メモリ１１に格納される。wai_pswフラグ２９は、「OK」又は「NG」のいずれかを示す値をとる変数である。wai_pswフラグ２９がOKである場合、そのwai_pswフラグ２９に対応するタスクが実行終了していることを意味する。一方、wai_pswフラグ２９がNGである場合、そのwai_pswフラグ２９に対応するタスクが実行終了していないことを意味する。
【００５３】
wai_pswフラグ２９は、初期値がOKを示す値になっている。パーティションスケジューラ２１は、ＴＰがアクティブになったときに、そのＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新する。そして、各タスク２４、２６、２８のそれぞれは、ＴＰ内で実行すべき処理を実行終了したとき、wai_pswを呼び出すことによって、スリープするとともにwai_pswフラグ２９をOKに更新する。つまり、wai_pswには、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する処理が含まれている。これらの処理によれば、次にＴＰがアクティブとなったときにwai_pswフラグ２９がOKであれば、前回のＴＰの時間内にタスクが実行終了していたこと分かり、次にＴＰがアクティブとなったときにwai_pswフラグ２９がNGであれば、前回のＴＰの時間内にタスクが実行終了していなかったことが分かる。
【００５４】
ここで、wai_pswフラグ２９は、例えば、OKを示す値を０とし、NGを示す値を１としてもよく、OKを示す値を１とし、NGを示す値を０としてもよい。また、wai_pswフラグ２９は、OK又はNGを示す情報であれば、フラグのように２値化された情報に限られない。
【００５５】
起床フラグ３０は、タスク２４、２６、２８のそれぞれに対応するように、複数用意される。起床フラグ３０は、例えば、実行用メモリ１１に格納される。起床フラグ３０は、「E_OK」又は「E_TMOUT」のいずれかを示す値をとる変数である。起床フラグ３０がE_OKである場合、その起床フラグ３０に対応するタスクが、そのタスクが属するＴＰの時間内に実行終了できていたことを意味する。起床フラグ３０がE_TMOUTである場合、その起床フラグ３０に対応するタスクが、そのタスクが属するＴＰの時間内に実行終了できていなかったことを意味する。
【００５６】
起床フラグ３０は、初期値がE_OKを示す値になっている。パーティションスケジューラ２１は、ＴＰがアクティブになったときに、そのＴＰに属するタスクに対応するwai_pswフラグ２９がNGである場合、そのタスクに対応する起床フラグ３０をE_TMOUTに更新する。これによって、起床フラグ３０がE_TMOUTに更新されている場合、その起床フラグ３０に対応するタスクがＴＰの時間内に実行終了できていなかったことが分かる。
【００５７】
wai_pswは、呼び出し元のタスクに対応する起床フラグ３０がE_OKある場合、E_OKを示す値を戻り値として呼び出し元のタスクに返す。一方、wai_pswは、呼び出し元のタスクに対応する起床フラグ３０がE_TMOUTである場合、E_TMOUTを示す値を戻り値として呼び出し元のタスクに返す。この戻り値は、wai_pswを呼び出してスリープしていたタスクが起床してwai_pswから復帰するときに、そのタスクに返される。これによって、呼び出し元のタスクは、wai_pswからの戻り値がE_OKである場合、ＴＰの時間内に自身が実行終了できていたことを認識することができる。逆に、呼び出し元のタスクは、wai_pswからの戻り値がE_TMOUTである場合、ＴＰの時間内に自身が実行終了できていなかったことを認識することができる。
【００５８】
そして、呼び出し元のタスクは、wai_pswからの戻り値に応じた処理を実行する。例えば、wai_pswからの戻り値がE_OKである場合、呼び出し元のタスクは、通常の処理を実行する。逆に、wai_pswからの戻り値がE_TMOUTである場合、呼び出し元のタスクは、異常処置を実行する。ここで、異常処置は、制御対象を安全な方向に動作させるための処置であればどのようなものであってもよい。例えば、図５Ａに示す通常制御スケジューリングパターンに従って動作している場合、呼び出し元のタスクは、タスクの実行状況が異常である旨をパーティションスケジューラ２１に通知する。そして、パーティションスケジューラ２１は、その通知に応じて、スケジューリングパターンを、図５Ｂに示す安全制御スケジューリングパターンに切り替えるようにしてもよい。また、パーティションスケジューラ２１は、その通知に応じて、次の動作タイミングで、ＴＰを強制的にＴＰ３に切り替えるようにしてもよい。そして、ＴＰ３へ切り替えた後は、例えば、安全制御タスク２８によって制御対象を停止させる。また、パーティションスケジューラ２１は、タスクの実行状況が異常である旨の通知を安全制御タスク２８から通知された場合、パーティションスケジューラ２１自身が、制御対象を停止させるように制御するようにしてもよい。
【００５９】
ここで、起床フラグ３０及び戻り値のそれぞれは、例えば、E_OKを示す値を０とし、E_TMOUTを示す値を１としてもよく、E_OKを示す値を１とし、E_TMOUTを示す値を０としてもよい。また、起床フラグ３０及び戻り値のそれぞれは、E_OK又はE_TMOUTを示す情報であれば、フラグのように２値化された情報に限られない。さらに、起床フラグ３０と戻り値とで、E_OKを示す値及びE_TMOUTを示す値のそれぞれが異なる値で定義されていてもよい。
【００６０】
上述したように、パーティションスケジューラ２１が１Ｔｉｃｋごとに動作し、ＴＰ１〜ＴＰ３のいずれをアクティブにするかを選択・決定する。さらに、パーティションスケジューラ２１が、選択したＴＰに関するタスクスケジューラの動作を開始させる。そして、タスクスケジューラ２３、２５、２７が動作を開始することでタスクのスケジューリングが行われ、プロセッサ１０が、タスクスケジューラ２３、２５、２７によりスケジューリングされた順序に従って、ＴＰ内でのタスクを実行していく。これによって、アクティブなＴＰに割り当てられているアプリケーションが、プロセッサ１０で実行される。
【００６１】
続いて以下では、パーティションスケジューラ２１によるパーティション・スケジューリング処理及びフラグ制御処理について、図６を用いて説明する。図６は、発明の実施の形態１にかかるパーティションスケジューラ２１の処理手順の具体例を示すフローチャートである。
【００６２】
なお、図６では、通常制御スケジューリングパターン（例えば図５Ａ）または安全制御スケジューリングパターン（例えば図５Ｂ）に従って、スケジューリングを実行する場合を例に説明する。すなわち、ＴＰ２またはＴＰ３に続く次のＴＰはＴＰ１であり、かつ、ＴＰ２での異常がＴＰ１で検知された場合に、ＴＰ１からの結果を受けて次に選択・決定されるＴＰはＴＰ３である場合を例に説明する。
【００６３】
ＯＳ１００は、１Ｔｉｃｋ経過するごとに（Ｓ１１）、パーティションスケジューラ２１を起動する（Ｓ１２）。パーティションスケジューラ２１は、スケジューリングパターンを参照して、ＴＰの切り替えタイミングか否かを判定する（Ｓ１３）。
【００６４】
ＴＰの切り替えタイミングでないと判定した場合（Ｓ１３でＮｏ）、パーティションスケジューラ２１は、同一のＴＰＸについての動作を継続させて、Ｓ１９に進む。このため、ＴＰの切り替えタイミングとなるまでの間、Ｓ１１〜Ｓ１３、Ｓ１９、Ｓ２０の処理が繰り返される。ここで、変数ＸはＴＰの番号を示し、Ｘは１〜３のうちのいずれかの値となる。すなわち、通常制御スケジューリングパターンに従ってパーティション・スケジューリングを実施している場合は、安全制御用のＴＰ３を除いた、ＴＰ２又はＴＰ１のいずれかを動作させる。
【００６５】
一方、ＴＰの切り替えタイミングであると判定した場合（Ｓ１３でＹｅｓ）、パーティションスケジューラ２１は、ＴＰの切り替えを実行する（Ｓ１４）。このように、パーティションスケジューラ２１は、次にアクティブにするＴＰを変更する（Ｓ１３でＹｅｓ）場合には、さらに、切り替え前のＴＰに属するタスクからの通知結果に応じて、タスクの実行状況が正常であったか否かを判断する。判断の結果、タスクの実行状況が異常であった場合、パーティションスケジューラ２１は、次の１Ｔｉｃｋの間にアクティブにするＴＰを、安全制御スケジューリングパターンに従って選択・決定する。そして、パーティションスケジューラ２１は、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９がOKか否かを判定する（Ｓ１５）。
【００６６】
切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９がOKである場合（Ｓ１５でＹｅｓ）、切り替え先のＴＰが前回にアクティブだったときに、そのＴＰの時間内で、そのwai_pswフラグ２９に対応するタスクが実行終了していたことを意味する。そのため、パーティションスケジューラ２１は、そのタスクに対応する起床フラグ３０をE_OKに更新する（Ｓ１６）。そして、パーティションスケジューラ２１は、Ｓ１８に進む。
【００６７】
一方、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９がOKでない場合（Ｓ１５でＮｏ）、切り替え先のＴＰが前回にアクティブだったときに、そのＴＰの時間内で、そのwai_pswフラグ２９に対応するタスクが実行終了していなかったことを意味する。そのため、パーティションスケジューラ２１は、そのタスクに対応する起床フラグ３０をE_TMOUTに更新する（Ｓ１７）。すなわち、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９がNGである場合に、Ｓ１７を実行する。そして、パーティションスケジューラ２１は、Ｓ１８に進む。
【００６８】
Ｓ１８では、パーティションスケジューラ２１は、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。これによれば、切り替え先のＴＰでタスクが実行終了するためにwai_pswを呼び出してwai_pswフラグ２９をOKに更新しなかった場合に、wai_pswフラグ２９がNGのままとなる。すなわち、切り替え先のＴＰの時間内にタスクが実行終了しなかったことを、次回にその切り替え先のＴＰがアクティブとなったときのwai_pswフラグ２９の値によって判定すること（Ｓ１５）が可能となる。そして、パーティションスケジューラ２１は、Ｓ１９に進む。なお、Ｓ１５〜Ｓ１８の処理は、ＴＰ内に複数のタスクが属している場合、その複数のタスクに対応するwai_pswフラグ２９及び起床フラグ３０のそれぞれに対して行われることになる。
【００６９】
Ｓ１９では、パーティションスケジューラ２１は、現在アクティブになっているＴＰＸのタスクスケジューラを動作させる（Ｓ１９）。Ｓ１９で動作を開始したＴＰＸのタスクスケジューラは、ＴＰＸ内のタスクを優先度に応じて実行する（Ｓ２０）。
【００７０】
具体的には、ＴＰＸのタスクスケジューラは、スリープしていたＴＰＸ内のタスクを優先度に応じた順番で起床させる。起床したタスクは、wai_pswから復帰する。このとき、起床したタスクは、上述したようにwai_pswの戻り値に応じた処理を実行する。すなわち、wai_pswからの戻り値がE_OKである場合、起床したタスクがＴＰの時間内に実行終了できていたことになるため、通常の処理を実行する。逆に、wai_pswからの戻り値がE_TMOUTである場合、起床したタスクがＴＰの時間内に実行終了できていなかったことになるため、タスクの実行状況が異常である旨をパーティションスケジューラ２１に通知する処理を実行する。そして、これらのＴＰ内で実行すべき処理が終了した場合、タスクは、wai_pswを呼び出して再びスリープする。なお、wai_pswにおけるフラグ制御処理の処理手順については、図７を参照して後述する。
【００７１】
そして、１Ｔｉｃｋが経過すると（Ｓ１１）、パーティションスケジューラ２１が、再びＴＰのスケジューリングを開始する（Ｓ１２）。すなわち、パーティションスケジューラ２１は、スケジューリングパターンに従って、次の１Ｔｉｃｋの間にいずれのＴＰをアクティブにするかを選択・決定する。
【００７２】
続いて以下では、タスクにおけるフラグ制御処理について、図７を用いて説明する。図７は、発明の実施の形態１にかかるＡＰＩ関数wai_pswの処理手順の具体例を示すフローチャートである。
【００７３】
タスクスケジューラによって実行されたタスクは、ＴＰ内で実行すべき処理を実行終了した後、次のＴＰまでスリープするときに、wai_pswを呼び出す（Ｓ２１）。呼び出されたwai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。そして、wai_pswは、呼び出し元のタスクに対応する起床フラグ３０がE_TMOUTであるか否かを判定する（Ｓ２３）。
【００７４】
呼び出し元のタスクに対応する起床フラグ３０がE_TMOUTでない場合（Ｓ２３でＮｏ）、wai_pswは、wai_pswの戻り値にE_OKを設定し（Ｓ２４）、Ｓ２６に進む。すなわち、呼び出し元のタスクに対応する起床フラグ３０がE_OKである場合、Ｓ２４が実行される。一方、起床フラグがE_TMOUTである場合、wai_pswは、wai_pswの戻り値にE_TMOUTを設定し（Ｓ２５）、Ｓ２６に進む。
【００７５】
wai_pswは、タスクスケジューラに、呼び出し元のタスクをスリープさせるスリープ処理を実行させる（Ｓ２６）。すなわち、タスクスケジューラは、呼び出し元のタスクを実行終了して、スリープ状態に遷移させる。これによって、呼び出し元のタスクに対して割り当てたプロセッサ１０の実行時間が解放される。なお、上述したように、wai_pswによってスリープしたタスクは、そのタスクが属するＴＰが次にアクティブとなるまでは、スリープ状態を継続する。そして、次にそのＴＰがアクティブになって、タスクスケジューラによってプロセッサ１０の実行時間が割り当てられたときに、タスクは、スリープ時に設定された戻り値をwai_pswから受け取って、wai_pswから復帰する。つまり、タスクが起床して、タスクの実行が開始される。そして、タスクは、wai_pswからの戻り値がE_OKである場合、通常の処理を実行し、wai_pswからの戻り値がE_TMOUTである場合、異常処置を実行する。
【００７６】
ここで、タスクが属するＴＰが次にアクティブとなるまで、そのタスクをスリープさせる方法は、例えば、次に説明する方法で実現するようにしてもよく、同様の方法であれば、この方法にも限定されない。具体的には、タスクのそれぞれに対応する起床抑止フラグを実行用メモリ１１上に用意し、タスクがスリープしたときに、そのタスクに対応する起床抑止フラグを有効な値に更新する。例えば、wai_pswによって更新する。そして、起床抑止フラグが有効な値を示す場合は、同一ＴＰ内で、再度、その起床抑止フラグに対応するタスクの起床することを抑止するようにすればよい。なお、この場合、起床抑止フラグは、ＴＰの時間が終了してから、そのＴＰが次にアクティブとなったときまでに、ＯＳ１００又はパーティションスケジューラ２１等によって、無効な値に更新するようにすればよい。
【００７７】
図６及び図７で示した処理に関して、パーティション・スケジューリングの具体例を説明する。まず、図５Ａに例示した通常制御スケジューリングパターンに従って、Ｓ１９においてＴＰ２がアクティブの状態からスケジューリングを開始した場合を説明する。この場合、Ｓ１９ではＴＰＸ＝ＴＰ２として開始し、続くＳ２０、Ｓ１１〜Ｓ１３にかけてもＴＰＸ＝ＴＰ２のままである。そして、Ｓ１３でＮｏが続く限り、ＴＰＸ＝ＴＰ２の状態が維持される。Ｓ１３でＹｅｓとなり、Ｓ１４でＴＰ２からＴＰ１へと変更された場合、続くＳ１５〜Ｓ２０、Ｓ１１〜Ｓ１３にかけてＴＰ１のままである。そして、Ｓ１３でＮｏが続く限り、ＴＰＸ＝ＴＰ１の状態が維持される。ＴＰ１がアクティブのときに、Ｓ２０で、ＴＰ２に関する実行状況（データ入出力等）が正常であると判定されており、かつ、ＴＰ１に関するタスクの実行状況が正常（戻り値がE_OK）であると判定されていた場合には、次のＳ１４では、ＴＰＸ＝ＴＰ２となる（つまり、ＴＰ２から開始する通常制御スケジューリングパターンが継続される。）。一方で、Ｓ２０で、ＴＰ２に関する実行状況（データ入出力等）が異常であると判定されていた場合、又は、ＴＰ１に関するタスクの実行状況が異常（戻り値がE_TMOUT）であると判定されていた場合には、次のＳ１４で、ＴＰＸ＝ＴＰ３となる（つまり、ＴＰ３から開始する安全制御スケジューリングパターンに切り替わる。）。
【００７８】
また、図５Ｂに例示した安全制御スケジューリングパターンに従って、Ｓ１９においてＴＰ３がアクティブの状態からスケジューリングを開始した場合を説明する。この場合、Ｓ１９ではＴＰＸ＝ＴＰ３として開始し、続くＳ２０、Ｓ１１〜Ｓ１３にかけてもＴＰＸ＝ＴＰ３のままである。そして、Ｓ１３でＮｏが続く限り、ＴＰＸ＝ＴＰ３の状態が維持される。Ｓ１３でＹｅｓとなり、Ｓ１４でＴＰ３からＴＰ１へと変更された場合、続くＳ１５〜Ｓ２０、Ｓ１１〜Ｓ１３にかけてＴＰ１のままである。そして、Ｓ１３でＮｏが続く限り、ＴＰＸ＝ＴＰ１の状態が維持される。ＴＰ１がアクティブのときに、Ｓ２０で、ＴＰ３に関する実行状況（データ入出力等）が正常であると判定されており、かつ、ＴＰ１に関するタスクの実行状況が正常（戻り値がE_OK）であると判定されていた場合には、次のＳ１４では、ＴＰＸ＝ＴＰ２としてもよい（つまり、ＴＰ２から開始する通常制御スケジューリングパターンに切り替わる。）。ただし、制御対象の状態に応じては、スケジューリングパターンの切り替えは行わず、異常処理を継続して制御対象を停止させるようにしてもよい。一方で、Ｓ２０で、ＴＰ３に関する実行状況（データ入出力等）に異常があると判定されていた場合、又は、ＴＰ１に関するタスクの実行状況が異常（戻り値がE_TMOUT）であると判定されていた場合には、次のＳ１４で、ＴＰＸ＝ＴＰ３となる（つまり、ＴＰ３から開始する安全制御スケジューリングパターンが継続される。）。
【００７９】
続いて、図６及び図７を参照して説明したフラグ制御処理によるタスクの実行状況監視の具体例について、図８及び図９を参照して説明する。図８は、ＴＰの時間内にタスクが実行終了した場合におけるタスクの実行状況の具体例を示す図であり、図９は、ＴＰの時間内にタスクが実行終了しなかった場合におけるタスクの実行状況の具体例を示す図である。なお、図８及び図９において、「Partition 1」及び「Partition 2」は、タイムパーティションを示し、「Task」は、Partition 1に属するタスクを示している。例えば、図５Ａに示す通常制御スケジューリングパターンに従って動作している場合、「Partition 1」及び「Partition 2」は、ＴＰ１及びＴＰ２に相当する。
【００８０】
まず、図８を参照して、ＴＰの時間内にタスクが実行終了した場合について説明する。ここで、wai_pswフラグ２９はOKであり、起床フラグ３０はE_OKであるものとする。図８は、１Ｔｉｃｋが経過して起動されたパーティションスケジューラ２１が、Partition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）から図示されている。
【００８１】
この場合、Partition 1に属するタスクに対応するwai_pswフラグ２９はOKとなっているため（Ｓ１５でＹｅｓ）、パーティションスケジューラ２１は、Partition 1に属するタスクに対応する起床フラグ３０をE_OKに更新する（Ｓ１６）。また、パーティションスケジューラ２１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。タスクは、通常の処理を実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグをOKに更新する（Ｓ２２）。また、上記Ｓ１６で起床フラグ３０はE_OKとなっているため（Ｓ２３でＮｏ）、wai_pswは、戻り値にE_OKを設定する（Ｓ２４）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【００８２】
パーティションスケジューラ２１が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、Partition 1に属するタスクに対応するwai_pswフラグ２９はOKであるため（Ｓ１５でＹｅｓ）、パーティションスケジューラ２１は、Partition 1に属するタスクに対応する起床フラグ３０をE_OKに更新する（Ｓ１６）。すなわち、起床フラグ３０は、E_OKのままとなる。また、パーティションスケジューラ２１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、スリープ時に設定されたE_OKを戻り値としてwai_pswから受け取って、wai_pswから復帰する。タスクは、通常の処理を実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。また、上記Ｓ１６で起床フラグ３０はE_OKとなっているため、wai_pswは、戻り値にE_OKを設定する（Ｓ２４）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【００８３】
次に、Partition 1がアクティブとなったときも、wai_pswフラグ２９にE_OKが設定されており、wai_pswの戻り値にE_OKが設定されているため、同様の処理が繰り返される。このように、タスクがPartition 1の時間内に実行終了できているときはwai_pswの戻り値がE_OKとなることに基づいて、タスクは、通常の処理を実行してもよいということを認識することが可能となる。
【００８４】
次に、図９を参照して、ＴＰの時間内にタスクが実行終了しなかった場合について説明する。ここで、wai_pswフラグ２９はOKであり、起床フラグ３０はE_OKであるものとする。図９は、１Ｔｉｃｋが経過して起動されたパーティションスケジューラ２１が、Partition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）から図示されている。
【００８５】
この場合、Partition 1に属するタスクに対応するwai_pswフラグ２９はOKであるため（Ｓ１５でＹｅｓ）、パーティションスケジューラ２１は、Partition 1に属するタスクに対応する起床フラグ３０をE_OKに更新する（Ｓ１６）。また、パーティションスケジューラ２１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。
【００８６】
図９では、このときに、Partition 1の時間内にタスクが実行終了しなかった場合について図示している。この場合、Partition 1の時間が満了したときにタスクスケジューラによってタスクの実行が中断され、パーティションスケジューラ２１によってＴＰがPartition 2に切り替えられる（Ｓ１１〜Ｓ１４）。この場合は、タスクによってwai_pswが呼び出されていないため、wai_pswフラグ２９はNGのままとなる。
【００８７】
パーティションスケジューラ２１が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、Partition 1に属するタスクに対応するwai_pswフラグ２９はNGであるため（Ｓ１５でＮｏ）、パーティションスケジューラ２１は、Partition 1に属するタスクに対応する起床フラグ３０をE_TMOUTに更新する（Ｓ１７）。また、パーティションスケジューラ２１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、中断されたところから実行が再開される。タスクは、通常の処理を実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。また、上記Ｓ１７で起床フラグ３０はE_TMOUTとなっているため、wai_pswは、戻り値にE_TMOUTを設定する（Ｓ２５）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【００８８】
パーティションスケジューラ２１が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、上記と同様にＳ１５でＹｅｓの場合の処理が実行された後、Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、スリープ時に設定されたE_TMOUTを戻り値としてwai_pswから受け取って、wai_pswから復帰する。このように、wai_pswの戻り値がE_TMOUTであることに基づいて、タスクは、自身がPartition 1の時間内に実行終了できていなかったため、異常処置を実行する必要があるということを認識することが可能となる。
【００８９】
以上に説明したように、本実施の形態１では、ＴＰの切り替え時に切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新するとともに、そのタスクの実行終了時にwai_pswフラグ２９をOKに更新するようにしている。そして、ＴＰの切り替え時に切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新する前に、wai_pswフラグ２９がNGとなっていることを検出するようにしている。
【００９０】
これによれば、ＴＰの時間内にタスクが実行終了しなかったことを、wai_pswフラグ２９がNGであることによって検出することができる。すなわち、ＴＰの時間内にタスクを実行終了することができているか否かを監視することが可能となる。また、所定のタイミングで情報（wai_pswフラグ２９）を更新するのみという簡易な処理での監視が可能となる。
【００９１】
ここで、一定周期でタスクの実行が終了しているか否かを監視する方法として、個々のタスクにおいて一定周期で実行が終了しているか否かを監視する仕組みを作り込む方法も考えることもできる。しかしながら、そのようにした場合、タスクを生成するアプリケーションプログラムのそれぞれに対して独立して監視する仕組みを実装した場合には、アプリケーションプログラムが複雑になってしまうという問題があった。
【００９２】
それに対して、さらに、本実施の形態１では、タスクがその処理を実行終了してスリープするときに呼び出すＡＰＩ関数において、wai_pswフラグ２９をOKに更新するようにしている。また、ＴＰをスケジューリングするパーティションスケジューラ２１において、ＴＰの切り替え時にwai_pswフラグ２９をNGに更新するとともに、ＴＰの切り替え時にwai_pswフラグ２９を更新する前にwai_pswフラグ２９がNGとなっているかを検出するようにしている。
【００９３】
これによれば、タイム・パーティショニングを採用したマルチタスクシステムにおける既存の処理タイミングを利用して、監視する仕組みを実装することができる。すなわち、より簡易に、ＴＰの時間内にタスクを実行終了することができているか否かを監視することが可能となる。
【００９４】
なお、上述の例では、スケジューリングパターンとして、３つのＴＰ（安全監視用のＴＰ１、通常制御用のＴＰ２、安全制御用のＴＰ３）のみを組み合わせた場合を例に説明したが、ＴＰ２のような通常制御用パーティションや、ＴＰ３のような安全制御用パーティションについては、それぞれ複数個存在するものとしてもよい。例えば、２つの通常制御用のＴＰ２及びＴＰ４と、安全監視用のＴＰ１と、２つの安全制御用のＴＰ３及びＴＰ５と、が存在し、これら５つのＴＰ（ＴＰ１〜ＴＰ５）を組み合わせてスケジューリングパターンを構成してもよい。この場合、Ｓ１４では、パーティションスケジューラ２１が、ＴＰＸに関する実行状況（データ入出力等）の異常状態の種類を判定し、その異常種類に応じて、安全制御用のＴＰ３またはＴＰ５のいずれかを選択すればよい。また、Ｓ１４では、通常制御用のＴＰ２またはＴＰ４のいずれかを選択すればよい。
【００９５】
上述したように、本実施の形態では、ＯＳ１００は、安全監視用のＴＰ１からの通知、または、各ＴＰからの通知に応じて、次にアクティブとするパーティションを選択・決定するパーティションスケジューラ２１を備えている。パーティションスケジューラ２１は、各ＴＰにおいて実行されるタスクとは独立して、所定のタイマー周期で動作する。
【００９６】
独立に動作するパーティションスケジューラ２１が、全てのＴＰから結果通知を受ける構成とすることで、パーティションスケジューラ２１は、全てのＴＰに関する状況を一元的に把握することができる。このため、例えば、安全監視用のＴＰ１からの結果通知に応じて、パーティションスケジューラ２１が次のパーティションを決定・選択しようとする場合には、パーティションスケジューラ２１は、各ＴＰの状況を考慮した上で、正常状態にあるＴＰのみから次のパーティションを決定・選択することもできる。これによれば、より正確なパーティション・スケジューリングを実現することができるという効果を奏する。
【００９７】
＜発明の実施の形態２＞
続いて、本発明の実施の形態２にかかる安全制御装置について説明する。本実施の形態２にかかる安全制御装置の構成は、ＯＳ１００に代えてＯＳ２００を有すること以外は、図１を参照して説明した実施の形態１にかかる安全制御装置の構成と同様であるため、その説明を省略する。以下では、パーティションスケジューラ３１と、アプリケーション１０１〜１０３の起動により生成されるタスクと、の関係について、図を用いて説明する。図１０は、ＯＳ２００によって提供されるマルチプログラミング環境で起動される、パーティションスケジューラ３１とタスク２４、２６、２８との関係を示す図である。
【００９８】
図１０に示すように、本実施の形態２は、実施の形態１と比較して、ＯＳ１００に代えてＯＳ２００を有し、パーティションスケジューラ２１に代えてパーティションスケジューラ３１を有し、起床フラグ３０に代えて起床カウンタ３２を有する点が異なる。以下、実施の形態１と同様の内容については、適宜省略して説明する。
【００９９】
パーティションスケジューラ３１は、実施の形態１にかかるパーティションスケジューラ２１と比較して、起床フラグ３０の更新に代えて、起床カウンタ３２を更新する点が異なる。
【０１００】
起床カウンタ３２は、タスク２４、２６、２８のそれぞれに対応するように、複数用意される。起床カウンタ３２は、例えば、実行用メモリ１１に格納される。起床カウンタ３２は、カウンタ値をとる変数である。起床カウンタ３２の値が０である場合、その起床カウンタ３２に対応するタスクが、そのタスクが属するＴＰの１ＴＰ分の時間内に実行終了できていたことを意味する。起床カウンタ３２が１以上の値である場合、そのタスクが属するＴＰの１ＴＰ分の時間内に実行終了できていなかったことを意味する。また、この場合、その起床カウンタ３２の値は、その起床カウンタ３２に対応するタスクが実行開始されてから実行終了するまでに、そのタスクが属するＴＰをいくつ跨いだのかを意味する。
【０１０１】
起床カウンタ３２は、初期値が０になっている。パーティションスケジューラ３１は、ＴＰがアクティブになったときに、そのＴＰに属するタスクに対応するwai_pswフラグ２９がNGである場合、そのタスクに対応する起床カウンタ３２をカウントアップする。すなわち、タスクが実行終了せずに、いくつものＴＰを跨って実行が継続され続けてしまった場合、そのタスクに対応する起床カウンタ３２の値がカウントアップされ続けていくことになる。これによって、起床カウンタ３２が１以上の値に更新されている場合、その起床カウンタ３２に対応するタスクがＴＰの１ＴＰ分の時間内に実行終了できていなかったこと、及び、その起床カウンタ３２に対応するタスクが実行終了するまでにそのタスクが属するＴＰをいくつ跨いだのかが分かる。
【０１０２】
ＯＳ２００は、実施の形態１にかかるＯＳ１００と比較して、提供するwai_pswの処理内容が一部異なる。ＯＳ２００の提供するwai_pswは、実施の形態１にかかるＯＳ１００と比較して、起床フラグ３０に応じた値に代えて起床カウンタ３２の値を戻り値として呼び出し元のタスクに返す点、及び、起床カウンタ３２の値を初期化する点が異なる。この戻り値は、wai_pswを呼び出してスリープしていたタスクが起床してwai_pswから復帰するときに、そのタスクに返される。これによって、呼び出し元のタスクは、wai_pswからの戻り値が０である場合、１ＴＰの時間内に自身が実行終了できていたことを認識することができる。逆に、呼び出し元のタスクは、wai_pswからの戻り値が１以上である場合、１ＴＰの時間内に自身が実行終了できていなかったこと、及び、自身が実行終了するまでにＴＰをいくつ跨いだのかを認識することができる。
【０１０３】
そして、呼び出し元のタスクは、wai_pswからの戻り値に応じた処理を実行する。まず、呼び出し元のタスクが、１ＴＰの時間内に実行を終了する必要があるタスクである場合について説明する。この場合、wai_pswからの戻り値が０であるときに、呼び出し元のタスクは、通常の処理を実行する。逆に、wai_pswからの戻り値が１以上であるときに、呼び出し元のタスクは、異常処置を実行する。
【０１０４】
次に、呼び出し元のタスクが、合計で２ＴＰの時間内に実行を終了すればよいタスクである場合について説明する。この場合、wai_pswからの戻り値が０又は１であるときに、呼び出し元のタスクは、通常の処理を実行する。逆に、wai_pswからの戻り値が２以上であるときに、呼び出し元のタスクは、異常処置を実行する。このように、本実施の形態２では、処理を必ずしも１ＴＰ内で実行終了する必要がないタスクに対しても、それに応じた適切な監視を行うことが可能となる。すなわち、それぞれのタスクに適した、戻り値に対する閾値を設定し、戻り値が閾値以上である場合に、異常処置を実行するようにすればよい。
【０１０５】
ここで、タスクの処理にかかる時間が可変である場合も、動的に閾値を変更することで適切な監視を行うようにすることも可能である。例えば、タスクのそれぞれに対応する閾値を実行用メモリ１１上に用意し、タスクもしくはパーティションスケジューラ３１がその閾値を任意のタイミングで更新するようにする。
【０１０６】
続いて以下では、パーティションスケジューラ３１によるパーティション・スケジューリング処理及びフラグ制御処理について、図１１を用いて説明する。図１１は、発明の実施の形態１にかかるパーティションスケジューラ３１の処理手順の具体例を示すフローチャートである。なお、図６を参照して説明した、実施の形態１にかかる処理手順と同様の処理手順については、同一の符号を付し、説明を省略する。本実施の形態２にかかる処理手順では、実施の形態１にかかる処理手順と比較して、Ｓ１５でＹｅｓとなったときにＳ１６を実行せずにＳ１８を実行し、Ｓ１７に代えてＳ２７を実行するようにしている点が異なる。
【０１０７】
本実施の形態２では、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９がOKである場合（Ｓ１５でＹｅｓ）、パーティションスケジューラ３１は、Ｓ１８に進む。一方、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９がNGである場合（Ｓ１５でＮｏ）、パーティションスケジューラ３１は、そのタスクに対応する起床カウンタ３２をカウントアップする（Ｓ２７）。そして、パーティションスケジューラ３１は、Ｓ１８に進む。
【０１０８】
続いて以下では、タスクにおけるフラグ制御処理について、図１２を用いて説明する。図１２は、発明の実施の形態２にかかるＡＰＩ関数wai_pswの処理手順の具体例を示すフローチャートである。なお、図７を参照して説明した、実施の形態１にかかる処理手順と同様の処理手順については、同一の符号を付し、説明を省略する。
【０１０９】
本実施の形態２では、Ｓ２２の処理を実行した後、wai_pswは、wai_pswの戻り値に、呼び出し元のタスクに対応する起床カウンタ３２の値を設定する（Ｓ２８）。そして、wai_pswは、起床カウンタ３２の値を０で初期化し（Ｓ２９）、Ｓ２６に進む。
【０１１０】
続いて、図１１及び図１２を参照して説明したフラグ制御処理によるタスクの実行状況監視の具体例について、図１３及び図１４を参照して説明する。図１３は、１ＴＰの時間内にタスクが実行終了した場合におけるタスクの実行状況の具体例を示す図であり、図１４は、１ＴＰの時間内にタスクが実行終了しなかった場合におけるタスクの実行状況の具体例を示す図である。なお、図１３及び図１４において、「Partition 1」及び「Partition 2」は、タイムパーティションを示し、「Task」は、Partition 1に属するタスクを示している。
【０１１１】
まず、図１３を参照して、１ＴＰの時間内にタスクが実行終了した場合について説明する。ここで、wai_pswフラグ２９はOKであり、起床カウンタ３２は"０"であるものとする。図１３は、１Ｔｉｃｋが経過して起動されたパーティションスケジューラ３１が、Partition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）から図示されている。
【０１１２】
この場合、Partition 1に属するタスクに対応するwai_pswフラグはOKとなっているため（Ｓ１５でＹｅｓ）、パーティションスケジューラ３１は、Partition 1に属するタスクに対応する起床カウンタ３２はカウントアップしない。また、パーティションスケジューラ３１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。タスクは、通常の処理が実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。また、wai_pswは、wai_pswの戻り値に、呼び出し元のタスクに対応する起床カウンタ３２の値"０"を設定する（Ｓ２８）。さらに、wai_pswは、呼び出し元のタスクに対応する起床カウンタ３２の値を"０"に初期化する（Ｓ２９）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【０１１３】
パーティションスケジューラ３１が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、Partition 1に属するタスクに対応するwai_pswフラグ２９はOKであるため（Ｓ１５でＹｅｓ）、パーティションスケジューラ３１は、Partition 1に属するタスクに対応する起床カウンタ３２はカウントアップしない。すなわち、起床カウンタ３２の値は、"０"のままとなる。また、パーティションスケジューラ３１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、スリープ時に設定された値"０"を戻り値としてwai_pswから受け取って、wai_pswから復帰する。タスクは、通常の処理が実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。また、wai_pswは、wai_pswの戻り値に、呼び出し元のタスクに対応する起床カウンタ３２の値"０"を設定する（Ｓ２８）。さらに、wai_pswは、呼び出し元のタスクに対応する起床カウンタ３２の値を"０"に初期化する（Ｓ２９）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【０１１４】
次に、Partition 1がアクティブとなったときも、wai_pswフラグ２９にE_OKが設定されており、wai_pswの戻り値に"０"が設定されているため、同様の処理が繰り返される。このように、タスクが１つ分のPartition 1の時間内に実行終了できているときはwai_pswの戻り値が"０"となることに基づいて、タスクは、通常の処理を実行してもよいということを認識することが可能となる。
【０１１５】
次に、図１４を参照して、１ＴＰの時間内にタスクが実行終了しなかった場合について説明する。ここで、wai_pswフラグ２９はOKであり、起床カウンタ３２は"０"であるものとする。図１４は、１Ｔｉｃｋが経過して起動されたパーティションスケジューラ３１が、Partition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）から図示されている。
【０１１６】
この場合、Partition 1に属するタスクに対応するwai_pswフラグ２９はOKであるため（Ｓ１５でＹｅｓ）、パーティションスケジューラ３１は、Partition 1に属するタスクに対応する起床カウンタ３２はカウントアップしない。また、パーティションスケジューラ３１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。
【０１１７】
図１４では、このときに、Partition 1の時間内にタスクが実行終了しなかった場合について図示している。この場合、Partition 1の時間が満了したときにタスクスケジューラによってタスクの実行が中断され、パーティションスケジューラ３１によってＴＰがPartition 2に切り替えられる（Ｓ１１〜Ｓ１４）。この場合は、タスクによってwai_pswが呼び出されていないため、wai_pswフラグ２９はNGのままとなる。
【０１１８】
パーティションスケジューラ３１が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、Partition 1に属するタスクに対応するwai_pswフラグ２９はNGであるため（Ｓ１５でＮｏ）、パーティションスケジューラ３１は、Partition 1に属するタスクに対応する起床カウンタ３２をカウントアップする（Ｓ２７）。すなわち、起床カウンタ３２の値が"１"となる。また、パーティションスケジューラ３１は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、中断されたところから実行が再開される。タスクは、通常の処理を実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。また、wai_pswは、wai_pswの戻り値に、呼び出し元のタスクに対応する起床カウンタ３２の値"１"を設定する（Ｓ２８）。さらに、wai_pswは、呼び出し元のタスクに対応する起床カウンタ３２の値を"０"に初期化する（Ｓ２９）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【０１１９】
パーティションスケジューラ３１が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、上記と同様にＳ１５でＹｅｓの場合の処理が実行された後、Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、スリープ時に設定された"１"を戻り値としてwai_pswから受け取って、wai_pswから復帰する。このように、wai_pswの戻り値が"１"であることによって、タスクは、自身が１つ分のPartition 1の時間内に実行終了できていなかったため、異常処置を実行する必要があることを認識することが可能となる。なお、上述したように、タスクが、そのタスクが属するＴＰを１回だけ跨ぐことが許容されているような場合、タスクは、異常と判断せずに通常の処理の実行するようにしてもよい。この場合、タスクは、wai_pswの戻り値が２以上である場合に、異常と判断して異常処理を実行する。
【０１２０】
以上に説明したように、本実施の形態２では、ＴＰの切り替え時に切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新するとともに、そのタスクの実行終了時にwai_pswフラグ２９をOKに更新するようにしている。そして、ＴＰの切り替え時に切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新する前にwai_pswフラグ２９がNGとなっていることを検出したときに、カウンタ値を更新するようにしている。
【０１２１】
これによれば、タスクが実行開始から実行終了するまでに、そのタスクが属するＴＰをいくつ跨いだかをカウンタ値によって認識することが可能となる。すなわち、所定数のＴＰの時間内にタスクを実行終了することができているか否かをカウンタ値によって監視することが可能となる。また、所定のタイミングでフラグ及びカウンタ値を更新するのみという簡易な処理での監視が可能となる。
【０１２２】
＜発明の実施の形態３＞
続いて、本発明の実施の形態３にかかる安全制御装置について説明する。本実施の形態３にかかる安全制御装置の構成は、ＯＳ１００に代えてＯＳ３００を有すること以外は、図１を参照して説明した実施の形態１にかかる安全制御装置の構成と同様であるため、その説明を省略する。以下では、パーティションスケジューラ３３と、アプリケーション１０１〜１０３の起動により生成されるタスクと、の関係について、図を用いて説明する。図１５は、ＯＳ３００によって提供されるマルチプログラミング環境で起動される、パーティションスケジューラ３１とタスク２４、２６、２８との関係を示す図である。
【０１２３】
図１５に示すように、本実施の形態３は、実施の形態２と比較して、ＯＳ２００に代えてＯＳ３００を有し、パーティションスケジューラ３１に代えてパーティションスケジューラ３３を有する点が異なる。以下、実施の形態２と同様の内容については、適宜省略して説明する。
【０１２４】
パーティションスケジューラ３３は、実施の形態２にかかるパーティションスケジューラ３１と比較して、起床カウンタ３２をカウントアップするのではなく、カウントダウンして更新する点が異なる。つまり、本実施の形態３では、実施の形態２とは、起床カウンタ３２の扱い方が異なる。
【０１２５】
具体的には、本実施の形態３では、起床カウンタ３２の初期値は、その起床カウンタ３２に対応するタスクが、そのタスクが属するＴＰを跨ぐことが許容される数になっている。パーティションスケジューラ３３は、ＴＰがアクティブになったときに、そのＴＰに属するタスクに対応するwai_pswフラグ２９がNGである場合、そのタスクに対応する起床カウンタ３２をカウントダウンする。すなわち、タスクが実行終了せずに、いくつものＴＰを跨って実行が継続され続けてしまった場合、そのタスクに対応する起床カウンタ３２の値がカウントダウンされ続けていくことになる。これによって、起床カウンタ３２が０未満の値に更新されている場合、その起床カウンタ３２に対応するタスクが許容されるＴＰ数分の時間内に実行終了できていなかったことが分かる。
【０１２６】
ＯＳ３００は、実施の形態２にかかるＯＳ２００と比較して、提供するwai_pswの処理内容が一部異なる。ＯＳ３００の提供するwai_pswは、実施の形態２にかかるＯＳ２００と比較して、起床カウンタ３２の値を、タスクが跨ぐことが許容されるＴＰ数で初期化する点が異なる。これによって、呼び出し元のタスクは、wai_pswからの戻り値が０以上である場合、許容されるＴＰ数分の時間内に自身が実行終了できていたことを認識することができる。逆に、呼び出し元のタスクは、wai_pswからの戻り値が０未満である場合、許容されるＴＰ数分の時間内に自身が実行終了できていなかったこと、及び、自身がＴＰをいくつ余分に跨いだのかを認識することができる。例えば、戻り値が−１である場合、ＴＰを１つ余分に跨いだことになる。
【０１２７】
そして、呼び出し元のタスクは、wai_pswからの戻り値に応じた処理を実行する。まず、呼び出し元のタスクが、１ＴＰの時間内に実行を終了する必要があるタスクである場合について説明する。この場合、ＴＰを跨ぐことが許容されないため、起床カウンタ３２の初期値は０となる。そして、wai_pswからの戻り値が０である場合、呼び出し元のタスクは、通常の処理を実行する。逆に、wai_pswからの戻り値が０未満である場合、呼び出し元のタスクは、異常処置を実行する。
【０１２８】
次に、呼び出し元のタスクが、合計で２ＴＰの時間内に実行を終了すればよいタスクである場合について説明する。この場合、１回だけＴＰを跨ぐことが許容されるため、起床カウンタ３２の初期値は１となる。そして、wai_pswからの戻り値が０又は１である場合、呼び出し元のタスクは、通常の処理を実行する。逆に、wai_pswからの戻り値が０未満である場合、呼び出し元のタスクは、異常処置を実行する。このように、本実施の形態３では、実施の形態２と同様に、処理を必ずしも１ＴＰ内で実行終了する必要がないタスクに対しても、それに応じた適切な監視を行うことが可能となる。すなわち、それぞれのタスクに適した、起床カウンタ３２の初期値を設定し、それからカウントダウンされた起床カウンタ３２の値が０未満である場合に、異常処置を実行するようにすればよい。
【０１２９】
ここで、実施の形態２と同様にして、タスクの処理にかかる時間が可変である場合も、動的に初期値を変更することで適切な監視を行うようにすることを可能としてもよい。例えば、タスクのそれぞれに対応する起床カウンタ３２の初期値を実行用メモリ１１上に用意し、タスクもしくはパーティションスケジューラ３３がその初期値を任意のタイミングで更新するようにしてもよい。そして、wai_pswは、起床カウンタ３２の初期値として、実行用メモリ１１に用意された初期値を設定するようにする。
【０１３０】
続いて以下では、パーティションスケジューラ３３によるパーティション・スケジューリング処理及びフラグ制御処理について、図１６を用いて説明する。図１６は、発明の実施の形態１にかかるパーティションスケジューラ３３の処理手順の具体例を示すフローチャートである。
【０１３１】
本実施の形態３にかかる処理手順では、実施の形態２にかかる処理手順と比較して、Ｓ２７に代えてＳ３０を実行するようにしている点のみ異なる。すなわち、本実施の形態３では、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９がNGである場合（Ｓ１５でＮｏ）、パーティションスケジューラ３３は、そのタスクに対応する起床カウンタ３２をカウントダウンして（Ｓ３０）、Ｓ１８に進む。
【０１３２】
続いて以下では、タスクにおけるフラグ制御処理について、図１７を用いて説明する。図１７は、発明の実施の形態２にかかるＡＰＩ関数wai_pswの処理手順の具体例を示すフローチャートである。
【０１３３】
本実施の形態３にかかる処理手順では、実施の形態２にかかる処理手順と比較して、Ｓ２９に代えてＳ３１を実行するようにしている点のみ異なる。すなわち、本実施の形態３では、Ｓ２８の処理を実行した後、wai_pswは、起床カウンタ３２の値を、上述したような初期値で初期化して（Ｓ３１）、Ｓ２６に進む。
【０１３４】
続いて、フラグ制御処理によるタスクの実行状況監視の具体例について説明する。ここで、ＴＰを跨ぐことが許容されないタスクである場合、起床カウンタ３２の初期値は０となる。そのため、図１３に示すケースでは、起床カウンタ３２の初期値、起床カウンタ３２の更新（Ｓ３０）が無い点、wai_pswの戻り値、及びwai_pswの戻り値に応じたタスクの処理も、実施の形態２と同様となる。また、図１４に示すケースでは、wai_pswの戻り値が−１となること以外は、実施の形態２と同様となる。そのため、本実施の形態３では、その特徴をより明確に説明するために、１回だけＴＰを跨ぐことが許容されるタスクが、図１８及び図１９に示す実行状況となった場合について説明する。
【０１３５】
まず、図１８を参照して、１ＴＰの時間内にタスクが実行終了しなかった場合について説明する。ここで、wai_pswフラグ２９はOKであり、起床カウンタ３２は初期値の"１"であるものとする。図１８は、１Ｔｉｃｋが経過して起動されたパーティションスケジューラ３３が、Partition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）から図示されている。
【０１３６】
この場合、Partition 1に属するタスクに対応するwai_pswフラグ２９はOKであるため（Ｓ１５でＹｅｓ）、パーティションスケジューラ３３は、Partition 1に属するタスクに対応する起床カウンタ３２はカウントダウンしない。また、パーティションスケジューラ３３は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。
【０１３７】
図１８では、このときに、Partition 1の時間内にタスクが実行終了しなかった場合について図示している。この場合、Partition 1の時間が満了したときにタスクスケジューラによってタスクの実行が中断され、パーティションスケジューラ３３によってＴＰがPartition 2に切り替えられる（Ｓ１１〜Ｓ１４）。この場合は、タスクによってwai_pswが呼び出されていないため、wai_pswフラグ２９はNGのままとなる。
【０１３８】
パーティションスケジューラ３３が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、Partition 1に属するタスクに対応するwai_pswフラグ２９はNGであるため（Ｓ１５でＮｏ）、パーティションスケジューラ３３は、Partition 1に属するタスクに対応する起床カウンタ３２をカウントダウンする（Ｓ３０）。すなわち、起床カウンタ３２の値が"０"となる。また、パーティションスケジューラ３３は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、中断されたところから実行が再開される。タスクは、通常の処理を実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。また、wai_pswは、wai_pswの戻り値に、呼び出し元のタスクに対応する起床カウンタ３２の値"０"を設定する（Ｓ２８）。さらに、wai_pswは、呼び出し元のタスクに対応する起床カウンタ３２の値を"１"に初期化する（Ｓ２９）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【０１３９】
パーティションスケジューラ３３が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、上記と同様にＳ１５でＹｅｓの場合の処理が実行された後、Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、スリープ時に設定された"０"を戻り値としてwai_pswから受け取って、wai_pswから復帰する。このように、wai_pswの戻り値が"０"であることによって、タスクは、自身が許容される２つ分のPartition 1の時間内に実行終了できていたため、通常の処理を実行してもよいということを認識することが可能となる。
【０１４０】
まず、図１９を参照して、合計で２ＴＰの時間内にタスクが実行終了しなかった場合について説明する。ここで、wai_pswフラグ２９はOKであり、起床カウンタ３２は初期値の"１"であるものとする。図１９は、１Ｔｉｃｋが経過して起動されたパーティションスケジューラ３３が、Partition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）から図示されている。
【０１４１】
この場合、Partition 1に属するタスクに対応するwai_pswフラグ２９はOKであるため（Ｓ１５でＹｅｓ）、パーティションスケジューラ３３は、Partition 1に属するタスクに対応する起床カウンタ３２はカウントダウンしない。また、パーティションスケジューラ３３は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。
【０１４２】
図１９では、このときに、Partition 1の時間内にタスクが実行終了しなかった場合について図示している。この場合、Partition 1の時間が満了したときにタスクスケジューラによってタスクの実行が中断され、パーティションスケジューラ３３によってＴＰがPartition 2に切り替えられる（Ｓ１１〜Ｓ１４）。この場合は、タスクによってwai_pswが呼び出されていないため、wai_pswフラグ２９はNGのままとなる。
【０１４３】
パーティションスケジューラ３３が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、Partition 1に属するタスクに対応するwai_pswフラグ２９はNGであるため（Ｓ１５でＮｏ）、パーティションスケジューラ３３は、Partition 1に属するタスクに対応する起床カウンタ３２をカウントダウンする（Ｓ３０）。すなわち、起床カウンタ３２の値が"０"となる。また、パーティションスケジューラ３３は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、中断されたところから実行が再開される。図１９では、このときに、再度、Partition 1の時間内にタスクが実行終了しなかった場合について図示している。この場合、Partition 1の時間が満了したときにタスクスケジューラによってタスクの実行が中断され、パーティションスケジューラ３３によってＴＰがPartition 2に切り替えられる（Ｓ１１〜Ｓ１４）。この場合は、タスクによってwai_pswが呼び出されていないため、wai_pswフラグ２９はNGのままとなる。
【０１４４】
パーティションスケジューラ３３が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、Partition 1に属するタスクに対応するwai_pswフラグ２９はNGであるため（Ｓ１５でＮｏ）、パーティションスケジューラ３３は、Partition 1に属するタスクに対応する起床カウンタ３２をカウントダウンする（Ｓ３０）。すなわち、起床カウンタ３２の値が"−１"となる。また、パーティションスケジューラ３３は、Partition 1に属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）。Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、中断されたところから実行が再開される。タスクは、通常の処理を実行終了したとき、wai_pswを呼び出す（Ｓ２１）。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ２９をOKに更新する（Ｓ２２）。また、wai_pswは、wai_pswの戻り値に、呼び出し元のタスクに対応する起床カウンタ３２の値"−１"を設定する（Ｓ２８）。さらに、wai_pswは、呼び出し元のタスクに対応する起床カウンタ３２の値を"１"に初期化する（Ｓ２９）。そして、wai_pswは、呼び出し元のタスクをスリープさせる（Ｓ２６）。
【０１４５】
パーティションスケジューラ３３が、次にPartition 1をアクティブにしたとき（Ｓ１１〜Ｓ１４）、上記と同様にＳ１５でＹｅｓの処理が実行された後、Partition 1のタスクスケジューラは、動作を開始して（Ｓ１９）、Partition 1内のタスクを実行する（Ｓ２０）。このとき、タスクは、スリープ時に設定された"−１"を戻り値としてwai_pswから受け取って、wai_pswから復帰する。このように、wai_pswの戻り値が"−１"であることによって、タスクは、自身が許容される２つ分のPartition 1の時間内に実行終了できていなかったため、異常処置を実行する必要があることを認識することが可能となる。
【０１４６】
以上に説明したように、本実施の形態３のように、ＴＰの切り替え時に切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新する前にwai_pswフラグ２９がNGとなっていることを検出したときに、カウンタ値をカウントダウンすることによって更新することでも監視が可能である。
【０１４７】
発明の他の実施の形態．
本実施の形態では、ＴＰのそれぞれに属するタスクが、それぞれ安全監視タスク２４、通常制御タスク２６及び安全制御タスク２８である場合について例示したが、タスクの種類は、これに限られない。安全監視タスク２４、通常制御タスク２６及び安全制御タスク２８に限られず、他の任意の制御対象の制御に関する処理を実行するタスクを有するようにしてもよい。
【０１４８】
例えば、図２０に示すようなタスク３４〜３６を有するようにしてもよい。なお、この場合、安全制御装置は、アプリケーション１０１〜１０３に代えて、タスク３４〜３６に対応するアプリケーションを有する必要があるが、その点は自明であるため図示及び説明を省略する。
【０１４９】
監視制御タスク３４は、制御対象を制御する。具体的には、監視制御タスク３４は、通常制御タスク３５及び安全制御タスク３６からの指令値に基づいて、制御対象のアクチュエータを制御する。通常制御タスク３５は、制御対象に通常の機能・動作を行わせるための制御計算を行う。具体的には、通常制御タスク３５は、通常制御におけるアクチュエータの制御計算をして、アクチュエータの指令値を算出する。通常制御タスク３５は、算出した指令値を監視制御タスク３４に出力する。安全制御タスク３６は、機能安全を確保するために定められた制御計算を行う。具体的には、安全制御タスク３６は、安全制御におけるアクチュエータの制御計算をして、アクチュエータの指令値を算出する。安全制御タスク３６は、算出した指令値を監視制御タスク３４のそれぞれに出力する。監視制御タスク３４は、通常制御タスク４１又は安全制御タスク３６から出力された指令値に基づいてアクチュエータを制御する。
【０１５０】
さらに、監視制御タスク３４は、制御対象のセンサから、センサ値を取得する。監視制御タスク３４は、取得したセンサ値を通常制御タスク３５及び安全制御タスク３６に出力する。通常制御タスク３５及び安全制御タスク３６のそれぞれは、監視制御タスク３４から出力されたセンサ値に基づいて、アクチュエータの制御計算を行うようにしてもよい。
【０１５１】
また、その他に、例えば、図２１に示すようなタスク３７〜３９を有するようにしてもよい。なお、この場合、安全制御装置は、アプリケーション１０１〜１０３に代えて、タスク３７〜３９に対応するアプリケーションを有する必要があるが、その点は自明であるため図示及び説明を省略する。
【０１５２】
監視タスク３７は、制御対象のセンサから、センサ値を取得する。このセンサには、上述したように制御対象の姿勢を検知するための姿勢センサを含む。ここで説明する例では、制御対象として、人が搭乗することができる走行装置に適用した場合について説明する。この場合、監視タスク３７は、搭乗者による重心移動を姿勢センサにより検知することができる。監視タスク３７は、取得したセンサ値をＨＭＩ（Human Machine Interface）タスク３９に出力する。
【０１５３】
ＨＭＩタスク３９は、監視タスク３７から出力されたセンサ値に基づいて、制御対象のアクチュエータの制御計算をして、アクチュエータの指令値を算出する。ＨＭＩタスク３９は、算出した指令値を制御タスク３８に出力する。制御タスク３８は、ＨＭＩタスク３９から出力された指令値に基づいて、アクチュエータを制御する。
【０１５４】
これによれば、搭乗者の操作に応じて制御対象が制御されるというＨＭＩを実現することができる。例えば、搭乗者が重心を前後に移動させることで制御対象が前後後退を行い、搭乗者が重心を左右に移動させることで制御対象が左右旋回を行うといった制御が可能となる。これについては、実施の形態１〜３及び図２１によって説明した例についても同様のことが言える。具体的には、安全監視タスク２４又は監視制御タスク３４が取得したセンサ値に応じて、通常制御タスク２６及び安全制御タスク２８、もしくは、通常制御タスク３５及び安全制御タスク３６が同様の制御をすることで、ＨＭＩを実現することが可能である。また、本実施の形態によれば、より安定した制御対象の制御を行うことが可能となる。そのため、以上に説明したように、人が搭乗することができる走行装置を制御対象として適用することで、より安全性を向上した制御対象の制御を行うことが可能となる。
【０１５５】
なお、走行装置として、例えば、立ち乗り方の同軸二輪車とすることもできる。その場合は、アクチュエータを制御することで、車輪が回転動作をすることになる。また、安全制御装置自体も制御対象に搭載される構成としてもよい。
【０１５６】
さらに、本発明は上述した実施の形態のみに限定されるものではなく、既に述べた本発明の要旨を逸脱しない範囲において種々の変更が可能であることは勿論である。
【０１５７】
本実施の形態では、ＯＳが、ＴＰ１〜ＴＰ３を有する場合について例示したが、ＴＰの種類及び数は、これに限られない。スケジューリングパターンについても、本実施の形態に例示したものに限られない。
【０１５８】
また、本実施の形態では、タスクの数が３つである場合について例示したが、タスクの数は、これに限られない。例えば、本実施の形態では、ＴＰがＴＰ１〜ＴＰ３の３つである場合について例示したが、ＴＰの数を３つ以外の数とし、それぞれのＴＰが１つ以上の任意の数のタスクを有するようにしてもよい。
【０１５９】
本実施の形態では、ＴＰの切り替え時に、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新するとともに、切り替え先のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新する（Ｓ１８）前に、wai_pswフラグ２９がNGとなっていることを検出して（Ｓ１５でＮｏ）、起床フラグ３０をE_TMOUTに更新する（Ｓ１７）ようにしているが、これに限られない。例えば、ＴＰの切り替え時に、切り替え前のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新するとともに、切り替え前のＴＰに属するタスクに対応するwai_pswフラグ２９をNGに更新する前に、wai_pswフラグ２９がNGとなっていることを検出して、起床フラグ３０をE_TMOUTに更新するようにしてもよい。
【０１６０】
本実施の形態では、パーティションスケジューラが、wai_pswフラグ２９がNGとなっていることを検出したときに（Ｓ１５でＮｏ）、起床フラグ３０の更新のみを行うようにしているが（Ｓ１７）、これに限られない。例えば、パーティションスケジューラが、wai_pswフラグ２９がNGとなっていることを検出したときに、異常処置に対応する処理を即時実施するようにしてもよい。しかしながら、本実施の形態のように、起床フラグ３０によってタスクにおいて異常を認識して、タスクからパーティションスケジューラに異常を通知する構成とすることで、その他の異常等をタスクからパーティションスケジューラに通知をする仕組みに統合することができ、より少ない変更量でより簡易に実装することが可能となる。
【０１６１】
本実施の形態１では、wai_pswは、起床フラグ３０がE_TMOUTの場合に、戻り値にE_TMOUTを設定してタスクをスリープさせるようにしているが、これに限られない。例えば、起床フラグ３０がE_TMOUTの場合に、タスクをスリープさせずに、E_TMOUTを戻り値として即時復帰するようにしてもよい。このようにすることで、タスクによる異常処置の応答性を高めることができる。しかしながら、本実施の形態１のように、正常系と異常系とで処理を統一することによって、より少ない変更量でより簡易に実装することが可能となる。なお、このことは、実施の形態２及び３においても、同様のことが言える。すなわち、実施の形態２において、wai_pswは、起床カウンタ３２が閾値以上となっている場合に、タスクをスリープさせずに、即時復帰するようにしてもよい。また、実施の形態３において、wai_pswは、起床カウンタ３２が０未満となっている場合に、タスクをスリープさせずに、即時復帰するようにしてもよい。
【０１６２】
本実施の形態２では、起床カウンタ３２の初期値を０としているが、これに限られない。例えば、起床カウンタ３２の初期値を０以外の値とし、それに応じて閾値を設定するようにしてもよい。これは、本実施の形態３においても、同様のことが言える。すなわち、本実施の形態３において、０以外の値未満となったときに異常であると判定するようにし、それに応じて起床カウンタ３２の初期値を設定するようにしてもよい。
【符号の説明】
【０１６３】
１  安全制御装置
１０  プロセッサ
１１  実行用メモリ
１２  Ｉ／Ｏポート
１３  不揮発性メモリ
１４  リセット回路
１５  マイクロコントローラ
２１、３１、３３  パーティションスケジューラ
２２  スケジューリングテーブル
２３、２５、２７  タスクスケジューラ
２４  安全監視タスク
２６、３５  通常制御タスク
２８、３６  安全制御タスク
２９  wai_pswフラグ
３０  起床フラグ
３２  起床カウンタ
３４  監視制御タスク
３７  監視タスク
３８  制御タスク
３９  ＨＭＩタスク
１００、２００、３００  オペレーティングシステム
１０１  安全監視アプリケーション
１０２  通常制御アプリケーション
１０３  安全制御アプリケーション
【図１】
0005633501.tif 000002
【図２】
0005633501.tif 000003
【図３】
0005633501.tif 000004
【図４】
0005633501.tif 000005
【図５Ａ】
0005633501.tif 000006
【図５Ｂ】
0005633501.tif 000007
【図６】
0005633501.tif 000008
【図７】
0005633501.tif 000009
【図８】
0005633501.tif 000010
【図９】
0005633501.tif 000011
【図１０】
0005633501.tif 000012
【図１１】
0005633501.tif 000013
【図１２】
0005633501.tif 000014
【図１３】
0005633501.tif 000015
【図１４】
0005633501.tif 000016
【図１５】
0005633501.tif 000017
【図１６】
0005633501.tif 000018
【図１７】
0005633501.tif 000019
【図１８】
0005633501.tif 000020
【図１９】
0005633501.tif 000021
【図２０】
0005633501.tif 000022
【図２１】
0005633501.tif 000023
【図２２】
0005633501.tif 000024
【図２３】
0005633501.tif 000025