以下では、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。各図面において、同一要素には同一の符号が付されており、説明の明確化のため、必要に応じて重複説明は省略される。
<発明の実施の形態1>
本実施の形態にかかる安全制御装置1は、サービスロボットや運輸機器等に搭載されて機能安全確保のための安全制御を実行する。安全制御装置1は、安全関連アプリケーションと非安全関連アプリケーションを同一のコンピュータシステムで実行するよう構成される。図1は、本実施の形態にかかる安全制御装置1の構成例を示すブロック図である。
プロセッサ10は、プログラム(命令ストリーム)の取得、命令のデコード、命令のデコード結果に応じた演算処理を行う。なお、図1では、1つのプロセッサ10のみを示しているが、安全制御装置1は、複数のプロセッサ10を有するマルチプロセッサ構成であってもよい。また、プロセッサ10は、マルチコアプロセッサでもよい。プロセッサ10は、システムプログラムとしてのオペレーティングシステム(OS)100を実行することによりマルチプログラミング環境を提供する。マルチプログラミング環境とは、複数のプログラムを定期的に切り替えて実行したり、あるイベントの発生に応じて実行するプログラムを切り替えたりすることによって、複数のプログラムがあたかも並列実行されているような環境を意味する。
マルチプログラミングは、マルチプロセス、マルチスレッド、マルチタスク等と呼ばれる場合もある。プロセス、スレッド及びタスクは、マルチプログラミング環境で並列実行されるプログラム単位を意味する。本実施の形態のプロセッサ10が具備するマルチプログラミング環境は、マルチプロセス環境でもよいし、マルチスレッド環境でもよい。
実行用メモリ11は、プロセッサ10によるプログラム実行のために使用されるメモリである。実行用メモリ11には、不揮発性メモリ13からロードされたプログラム(OS100及びアプリケーション101〜103等)、プロセッサ10の入出力データ等が記憶される。なお、プロセッサ10は、プログラムを不揮発性メモリ13から実行用メモリ11にロードすることなく、これらのプログラムを不揮発性メモリ13から直接実行してもよい。
具体的には、実行用メモリ11は、SRAM(Static Random Access Memory)、DRAM(Dynamic Random Access Memory)等のランダムアクセス可能な揮発性メモリとすればよい。図1の実行用メモリ11は、論理的な構成単位を示している。すなわち、実行用メモリ11は、例えば、複数のSRAMデバイスの組み合わせ、複数のDRAMデバイスの組み合わせ、又はSRAMデバイスとDRAMデバイスの組み合わせでもよい。
I/Oポート12は、外部デバイスとの間のデータ送受信に使用される。例えば、安全制御装置1がサービスロボットに搭載される場合であれば、外部デバイスは、各種センサ及びサービスロボットを動作させるアクチュエータ等である。この場合、各種センサは、例えば、サービスロボット周囲の障害物を計測可能な視覚センサ、サービスロボットの姿勢を検知するための姿勢センサ、及びサービスロボットのアクチュエータの状態を検知するための回転センタ等のサービスロボットの内外の状態を検出するセンサを含む。
不揮発性メモリ13は、電力の供給を受けることなく、実行用メモリ11に比べて安定的に記憶内容を維持することが可能なメモリデバイスである。例えば、不揮発性メモリ13は、ROM(Read Only Memory)、フラッシュメモリ、ハードディスクドライブ若しくは光ディスクドライブ、又はこれらの組み合わせである。不揮発性メモリ13は、OS100、アプリケーション101〜103、シンボル情報210、及びTLB設定情報211を格納する。なお、不揮発性メモリ13の少なくとも一部は安全制御装置1から取り外し可能に構成されてもよい。例えば、アプリケーション101〜103が格納されたメモリを取り外し可能としてもよい。また、不揮発性メモリ13の少なくとも一部は、安全制御装置1の外部に配置されてもよい。
OS100は、プロセッサ10によって実行されることにより、プロセッサ10及び実行用メモリ11及び不揮発性メモリ13等のハードウェア資源を利用して、タスクスケジューリングを含むタスク管理、割り込み管理、時間管理、資源管理、タスク間同期およびタスク間通信機構の提供等を行う。
さらに、機能安全の確保に関連する安全監視アプリケーション101及び安全制御アプリケーション103の通常制御アプリケーション102からの独立性を高めるため、OS100は、ハードウェア資源を、時間的および空間的に保護する機能を有する。ここで、ハードウェア資源とは、プロセッサ10、実行用メモリ11、I/Oポート12を含む。
このうち、時間的な保護は、プロセッサ10の実行時間という時間的な資源をパーティショニングすることにより行う。具体的に述べると、時間的な保護は、プロセッサ10の実行時間をパーティショニングし、各パーティション(タイムパーティションと呼ぶ)にタスク(プロセス又はスレッド)を割り当てることにより行う。OS100のスケジューリング機能(パーティションスケジューラ21)は、各タイムパーティション(以下、TPと略称する場合がある。)に割り当てられたタスクに対して、プロセッサ10の実行時間を含む資源の利用を保証する。
図2は、タイム・パーティショニングに関する概念図である。図2の例では、予め定められた1サイクル時間を3つのTP1、TP2及びTP3に分割する例を示している。例えば、1サイクル時間を100Tickとした場合、このうち前半の20TickがTP1、中間の30TickがTP2、後半の50TickがTP3と規定される。
また、図2の例では、第1アプリケーション(APL1)〜第4アプリケーション(APL4)が、TP1〜TP3のいずれかに割り当てられている。OS100のスケジューリング機能(パーティションスケジューラ21)は、時間の経過に応じて、TP1〜TP3のいずれをアクティブにするかを選択・決定する。そして、アクティブなTPに割り当てられているアプリケーションが、プロセッサ10で実行される。
一方、空間的な保護は、実行用メモリ11及びI/Oポート12を含む固定的な資源をパーティショニングし、各パーティション(リソースパーティションと呼ぶ)にタスクを割り当てることにより行う。OS100のスケジューリング機能(パーティションスケジューラ21)は、予め割り当てられたリソースパーティション(以下、RPと略称する場合がある。)を超えてタスクが他のリソースにアクセスすることを禁止する。
図3Aは、リソース・パーティショニングに関する概念図である。図3Aの例では、2つのRP(RP1及びRP2)を示している。RP1には、実行用メモリ11及び不揮発性メモリ13の一部(A領域)と、I/Oポート12の一部(ポートA)が割り当てられている。また、RP2には、実行用メモリ11及び不揮発性メモリ13の他の一部(B領域)と、I/Oポート12の他の一部(ポートB)が割り当てられている。RP1からはRP2に割り当てられたリソースへのアクセスが禁止され、RP2からはRP1に割り当てられたリソースへのアクセスが禁止される。実行用メモリ11におけるリソース・パーティショニングは、後述するMMU(Memory Management Unit)14のメモリ保護機能を利用して実現される。
なお、全てのリソースがいずれかのRPに排他的に割り当てられる必要はない。つまり、複数のRPによって共有されるリソースがあってもよい。例えば、サービスロボットの安全制御を行う場合、アクチュエータには、通常制御アプリケーション102及び安全制御アプリケーション103の双方からアクセスできる必要がある。よって、通常制御アプリケーション102が属するRPと安全制御アプリケーション103が属するRPによって、アクチュエータを制御するためのI/Oポートを共有するとよい。
ここで、本実施の形態では、実行用メモリ11に対するアクセスに関しては、全てのアクセス種別(読み出し、書き込み、及び、実行)について、他のRPに対するアクセスを禁止するのではなく、読み出しによるアクセスのみは許容する。そのようにすることで、RP間の独立性を維持しつつ、他のRPに対して公開性を高めて実行用メモリ11の情報を提供することを可能としている。具体的に、図3Bに例を挙げて説明する。図3Bでは、2つのRP(RP1及びRP2)を示している。RP1には、実行用メモリ11の一部(A領域)が全てのアクセス種別におけるアクセスを許容するように割り当てられており、RP2には、実行用メモリ11の一部(B領域)が全てのアクセス種別におけるアクセスを許容するように割り当てられている。この場合、RP1には、B領域に対する読み出しによるアクセスのみが許容され、RP2には、A領域に対する読み出しによるアクセスのみが許容される。
図1に戻り説明を続ける。アプリケーション101〜103は、OS100及びプロセッサ10によって提供されるマルチプログラミング環境で実行される。このうち、安全監視アプリケーション101は、通常制御アプリケーション102の実行状況の監視と、安全制御アプリケーション103の実行状況の監視と、I/Oポート12への入出力データの監視と、をプロセッサ10に実行させるための命令コードを含む。さらに、安全監視アプリケーション101は、パーティションスケジューラ21への結果通知をプロセッサ10に実行させるための命令コードを含む。つまり、安全監視アプリケーション101は、安全関連アプリケーションである。
また、通常制御アプリケーション102は、サービスロボット等の制御対象に通常の機能・動作を行わせるための制御手順をプロセッサ10に実行させるための命令コードを含む。さらに、通常制御アプリケーション102は、パーティションスケジューラ21への結果通知をプロセッサ10に実行させるための命令コードを含む。つまり、通常制御アプリケーション102は、非安全関連アプリケーションである。
また、安全制御アプリケーション103は、何らかの異常が検出された場合に対応して、機能安全を確保するために定められた制御手順をプロセッサ10に実行させるための命令コードを含む。さらに、安全制御アプリケーション103は、パーティションスケジューラ21への結果通知をプロセッサ10に実行させるための命令コードを含む。つまり、安全制御アプリケーション103は、安全関連アプリケーションである。
シンボル情報210は、各アプリケーション101〜103における情報(変数)の変数名と、その情報が格納されている実行用メモリ11のアドレスとが対応付けられた情報である。シンボル情報210は、例えば、変数名とアドレスとを表形式で示す。各アプリケーション101〜103は、後述するように、シンボル情報210を参照することで、他のアプリケーションの情報(変数)であっても、そのアドレスを特定して変数の値を読み出すことを可能とする。以下、各アプリケーション(タスク)における情報を「データ」とも言う。
TLB設定情報211は、MMU14のTLBへの設定内容を示す情報である。OS100は、TLB設定情報211に基づいて、TLBを設定する。なお、シンボル情報210及びTLB設定情報211がどのように生成されるのかについては、図11を参照して後述する。
MMU14は、メモリ保護機能及び仮想記憶管理機能を有する。メモリ保護機能は、プロセッサ10から実行用メモリ11に対するアクセスを監視して、メモリ保護違反となるアクセスを検出する機能である。プロセッサ10から実行用メモリ11のあるアドレスに対するアクセスがあったときに、そのアクセスがそのアドレスに対するアクセス権限を有しているか否かを判定する。そして、そのアクセスがそのアドレスに対するアクセス権限を有していない場合には、そのアクセスをメモリ保護違反として検出するとともに、メモリ保護違反をプロセッサ10に通知する。また、この場合、MMU14は、実行用メモリ11に対するアクセスを抑止する。
MMU14は、このメモリ保護機能によって、実行用メモリ11におけるリソース・パーティショニングを実現する。具体的には、図3Aに例示する場合には、RP1に属するタスクには、RP1に割り当てられた実行用メモリ11の領域のみにアクセス可能なアクセス権限が付与され、RP2に属するタスクには、RP2に割り当てられた実行用メモリ11の領域のみにアクセス可能なアクセス権限が付与される。これによって、例えば、RP1に属するタスクが、RP2に割り当てられた実行用メモリ11の領域に対してアクセスした場合に、MMU14は、そのアクセスをメモリ保護違反として検出する。アクセス権限は、実行用メモリ11のページ単位に付与される。また、1ページのサイズとして、予め任意のサイズを定めることができる。
仮想記憶管理機能は、プロセッサ10が実行用メモリ11にアクセスするときに指定された仮想アドレスを、その仮想アドレスに対応する物理アドレスに変換する機能である。すなわち、MMU14は、仮想記憶管理機能によって、プロセッサ10からの仮想アドレスを指定した実行用メモリ11へのアクセスを、その仮想アドレスが示す実行用メモリ11上のアドレスと同一のアドレスを示す物理アドレスを指定した実行用メモリ11へのアクセスに変換して、実行用メモリ11に発行する。
図4は、MMU14の構成例を示すブロック図である。MMU14は、制御部141及びTLB142を有する。ここで、アクセス権限及び仮想アドレスに対応する物理アドレスは、プロセッサ10によって、MMU14が有するTLB142に設定される。TLB142は、例えば、MMU14が有するレジスタ及びメモリ等の記憶装置である。TLB142は、複数のエントリを含んでいる。なお、図4では、TLB142のエントリ数が64の場合について例示しているが、TLB142のエントリ数は、これに限られない。1エントリには、1つのページについての内容が設定される。1エントリには、ASID(アドレス空間識別子:Address Space Identification)、仮想アドレス、その仮想アドレスに対応する物理アドレス、そのASIDのタスクによるその物理アドレスのページに対するアクセス権限等が設定される。
ASIDは、RPごとに一意に定められた値をとる。なお、本実施の形態では、1つのTPに1つのRPが対応することになるため、ASIDは、TPごとに一意に定められた値ともなる。TLB142における仮想アドレスとして、仮想アドレスのうち、ページを特定可能な一定の範囲を示す仮想ページ番号が設定されることが一般的である。物理アドレスについても同様である。この場合は、仮想アドレスのうち、仮想ページ番号に該当する範囲を物理ページ番号とされているアドレスに置き換え、その他のオフセットアドレスを示す範囲をそのまま用いることで、仮想アドレスを物理アドレスに変換することができる。アクセス権限としては、データの読み出し権限、データの書き込み権限、及び、データ(命令)の実行権限の有無を設定することができる。すなわち、アクセス権限は、アクセス種別(読み出し、書き込み、又は実行)ごとに、その有無を設定することが可能である。
例えば、実行用メモリ11上のあるページについて、あるTPに属するタスクからのデータの読み出し及び書き込みを許容する場合、エントリには、そのTPに対応するASID、そのページの仮想アドレス、そのページの物理アドレス、及び、読み出し権限及び書き込み権限を有りとしたアクセス権限等が設定される。
プロセッサ10は、実行用メモリ11上のあるページ内のあるアドレスに対して、データの読み出し又は書き込みによるアクセスを行う場合、ASID、仮想アドレス、及びアクセス種別(読み出し又は書き込み)を指定したアクセスをMMU14に発行する。すなわち、ASID、仮想アドレス、及びアクセス種別のそれぞれを示す信号がMMU14に出力される。ASIDには、そのアクセスの発行元となったタスクに応じた値が指定される。すなわち、指定されたASIDを参照することで、どのTPに属するタスクの権限でのアクセスかを特定することができる。なお、本実施の形態では、同一のTPに属するタスクからアクセスには同一のASIDが指定されることになる。また、アクセス種別が書き込みである場合は、さらに実行用メモリ11に書き込むデータも指定される。
MMU14の制御部141は、TLB142を参照して、指定されたASIDが設定されており、指定された仮想アドレスが設定されており(又は仮想ページ番号が一致する)、かつ、指定されたアクセス種別の権限が有りに設定されているエントリを検出できた場合、そのアクセスを許容する。この場合、制御部141は、検出したエントリに基づいて、アクセスにおいて指定された仮想アドレスを物理アドレスに変換して、変換後の物理アドレスとアクセス種別を指定したアクセスを実行用メモリ11に発行する。すなわち、物理アドレス及びアクセス種別のそれぞれを示す信号が実行用メモリ11に出力される。また、アクセス種別が書き込みである場合は、さらに実行用メモリ11に書き込むデータも指定される。
また、プロセッサ10は、実行用メモリ11上のあるページ内のあるアドレスに対して、データ(命令)の実行によるアクセスを行う場合、ASID及び仮想アドレスを指定したアクセスをMMU14に発行する。制御部141は、上述と同様に、アドレスの変換及びアクセス権限のチェックを行う。すなわち、ここでのチェックでは、データ(命令)の実行権限の有無が判定される。そして、制御部141は、そのアクセスを許容する場合、変換後の物理アドレスを指定したアクセスを実行用メモリ11に発行する。
実行用メモリ11は、MMU14からのアクセスに応じて、そのアクセスに応じたデータの処理を行う。具体的には、実行用メモリ11は、読み出し又は書き込みによるアクセスであり、かつ、アクセス種別が読み出しである場合は、指定された物理アドレスのデータをプロセッサ10に出力する。実行用メモリ11は、読み出し又は書き込みによるアクセスであり、かつ、アクセス種別が書き込みである場合は、指定された物理アドレスに、指定されたデータを書き込む。実行用メモリ11は、データ(命令)の実行によるアクセスである場合、指定された物理アドレスのデータをプロセッサ10に出力する。
一方、制御部141は、TLB142を参照して、アクセスで指定された仮想アドレスが設定されており(又は仮想ページ番号が一致する)、かつ、指定されたASIDが設定されているエントリを検出したが、そのエントリにおいて、指定されたアクセス種別の権限が有りに設定されていない場合は、TLB保護違反(メモリ保護違反)を検出する。なお、アクセスで指定された仮想アドレス及び指定されたASIDが設定されているエントリを検出できなかった場合は、TLBミスヒットが検出されることになる。
なお、図1では、MMU14を、プロセッサ10の外部に有する場合について例示したが、プロセッサ10がMMU14を有するようにしてもよい。すなわち、プロセッサ10が、制御部141及びTLB142を有するようにしてもよい。
リセット回路15は、OS100からの信号に基づき、マイクロコントローラ20のリセットを行う。パーティションスケジューラ21からリセット回路15に定期的に送信信号を送信するようにし、リセット回路15は、パーティションスケジューラ21からの送信信号が途絶えた場合に、マイクロコントローラ20をリセットする。例えば、パーティションスケジューラ21は、後述するように、1Tickごとに動作するタイミングで送信信号を送信する。また、OS100で異常を検知した場合、又は、アプリケーション101〜103のいずれかから異常を示す結果通知を受けた場合に、パーティションスケジューラ21がリセット回路15にリセット信号を送信するようにして、それに応じて、リセット回路15がマイクロコントローラ20をリセットするようにしてもよい。このようにすることで、マイクロコントローラ20に不具合が発生した場合に、マイクロコントローラ20をリセットして復旧することができる。
続いて以下では、パーティションスケジューラ21と、アプリケーション101〜103の起動により生成されるタスクと、の関係について、図5を用いて説明する。図5は、OS100によって提供されるマルチプログラミング環境で起動される、パーティションスケジューラ21とタスク24、26、28との関係を示す図である。
マイクロコントローラ20は、プロセッサ10、実行用メモリ11、I/Oポート12、不揮発性メモリ13、MMU14等を含む。なお、図5では、マイクロコントローラ20の外部にリセット回路15を備える構成を例示しているが、マイクロコントローラ20の内部にリセット回路15を含む構成としてもよい。
マイクロコントローラ20には、外部のクロック源からのクロック信号が供給され、プロセッサ10等は、このクロック信号に基づく所定のタイマー周期で動作する。本実施の形態では、所定のタイマー周期を、1Tickであるとして説明する。このため、プロセッサ10によりOS100が実行されることで、パーティションスケジューラ21が1Tickごとに動作すると共に、各TPにおいて、タスクスケジューラ23、25、27およびタスク(安全監視タスク24、通常制御タスク26、安全制御タスク28)が1Tickごとに動作する。
パーティションスケジューラ21は、1Tickごとに動作し、TPの切り替え(パーティション・スケジューリング)を行う。パーティションスケジューラ21は、次の1Tickの間にTP1〜TP3のいずれをアクティブにするかを選択・決定する。さらに、パーティションスケジューラ21は、選択したTPに関するタスクスケジューラの動作を開始させる。
パーティションスケジューラ21によるパーティション・スケジューリングについて具体的に述べると、パーティションスケジューラ21は、スケジューリングテーブル22を参照し、TPの設定を定めたスケジューリングパターンに従って、パーティション・スケジューリングを行う。
スケジューリングテーブル22は、TPの切り替え順序およびタイミングを規定したスケジューリングパターンを保持している。スケジューリングテーブル22は、例えば、実行用メモリ11に予め格納されている。なお、スケジューリングテーブル22は、少なくとも2つの異なるスケジューリングパターンを保持している。1つは、安全監視タスク24による異常検知が行われていない場合(つまり通常時)に適用されるスケジューリングパターンである。もう1つは、安全監視タスク24によって異常が検知された場合に適用されるスケジューリングパターンである。以下では、通常時に適用されるスケジューリングパターンを"通常制御スケジューリングパターン"と呼ぶ。また、異常検知時に適用されるスケジューリングパターンを"安全制御スケジューリングパターン"と呼ぶ。
図6Aは、通常制御スケジューリングパターンの具体例を示している。図6Aでは、通常制御タスク26が属するTP2が1サイクル時間の前半(T1)に割り当てられている。また、安全監視タスク24が属するTP1が1サイクル時間の後半(T2)に割り当てられている。図6Aのスケジューリングパターンによれば、通常制御タスク26と安全監視タスク24が繰り返しスケジューリングされる。
図6Bは、安全制御スケジューリングパターンの具体例を示している。図6Bでは、安全制御タスク28が属するTP3が1サイクル時間の前半(T3)に割り当てられている。また、安全監視タスク24が属するTP1が1サイクル時間の後半(T4)に割り当てられている。図6Bのスケジューリングパターンによれば、安全制御タスク28と安全監視タスク24が繰り返しスケジューリングされる。
図5に戻り説明を続ける。タスクスケジューラ23、25、27は、それぞれが属するTP内でのタスクのスケジューリングを行う。各TP内でのタスクのスケジューリングには、一般的な優先度ベースのスケジューリングを適用すればよい。なお、図5では、各TPはそれぞれ1つのタスクのみを含むものとして図示しているが、1以上のタスクが含まれるようにしてもよい。例えば、通常制御用のTP2内には、通常制御タスクA及び通常制御タスクBの2つのタスクが含まれていてもよい。
安全監視タスク24は、安全監視アプリケーション101の起動によって生成されるタスクである。図5の例では、安全監視タスク24は、TP1及びRP1に割り当てられている。言い換えると、TP1には、RP1が割り当てられている。安全監視タスク24は、非安全関連アプリケーションである通常制御タスク26の実行状況の監視と、安全関連アプリケーションである安全制御タスク28の実行状況の監視と、I/Oポート12の入出力データを監視する。安全監視タスク24は、自身が属するRP1に割り当てられた実行用メモリ11のリソースを使用しながら、自身の処理を実行するために必要な演算等を行う。さらに、安全監視タスク24は、タスクの実行状況を、パーティションスケジューラ21へ通知する。
通常制御タスク26は、通常制御アプリケーション102の起動によって生成されるタスクである。図5の例では、通常制御タスク26は、TP2及びRP2に割り当てられている。言い換えると、TP2には、RP2が割り当てられている。通常制御タスク26は、サービスロボット等の制御対象に通常の機能・動作を行わせるための制御を行う。通常制御タスク26は、自身が属するRP2に割り当てられた実行用メモリ11のリソースを使用しながら、自身の処理を実行するために必要な演算等を行う。さらに、通常制御タスク26は、タスクの実行状況を、パーティションスケジューラ21へ通知する。
安全制御タスク28は、安全制御アプリケーション103の起動によって生成されるタスクである。図5の例では、安全制御タスク28は、TP3及びRP3に割り当てられている。言い換えると、TP3には、RP3が割り当てられている。安全制御タスク28は、何らかの異常が検出された場合に対応して、機能安全を確保するために定められた制御を行う。安全制御タスク28は、自身が属するRP3に割り当てられた実行用メモリ11のリソースを使用しながら、自身の処理を実行するために必要な演算等を行う。さらに、安全制御タスク28は、タスクの実行状況を、パーティションスケジューラ21へ通知する。
なお、各タスクからパーティションスケジューラ21へと結果を通知する具体的な構成としては、様々な手法を採用することができる。例えば、タスクがOS100のシステムコール(サービスコール)を呼び出し、OS100を介して、パーティションスケジューラ21に結果を通知することができる。具体的には、例えば、タスク間通信を行うシステムコールを呼び出す。また、例えば、タスクの実行状況に関するフラグを実行用メモリ11に格納するものとして、タスクがその実行状況に応じてフラグの値を設定し、パーティションスケジューラ21がフラグの設定値に応じてタスクの実行状況を判断することもできる。
上述したように、パーティションスケジューラ21が1Tickごとに動作し、TP1〜TP3のいずれをアクティブにするかを選択・決定する。さらに、パーティションスケジューラ21が、選択したTPに関するタスクスケジューラの動作を開始させる。そして、タスクスケジューラ23、25、27が動作を開始することでタスクのスケジューリングが行われ、プロセッサ10が、タスクスケジューラ23、25、27によりスケジューリングされた順序に従って、TP内でのタスクを実行していく。これによって、アクティブなTPに割り当てられているアプリケーションが、プロセッサ10で実行される。
ここで、図7を参照して、実行用メモリ11の割り当てについて説明する。図7は、実行用メモリ11のページの割り当て例を示す図である。OS100は、図7に示すように、各TP1〜TP3に対して、実行用メモリ11のページを割り当てる。なお、図7では、説明の簡略化のため、1つのTPに1つのページが割り当てられた場合について例示している。具体的には、TP1(RP1)にアドレス「0x0000C000」番地のページが割り当てられており、TP2(RP2)にアドレス「0x0000D000」番地のページが割り当てられており、TP3(RP3)にアドレス「0x0000E000」番地のページが割り当てられている。
この場合、TP1に属する安全監視タスク24は、アドレス「0x0000C000」番地のページを利用してその処理を実行し、TP2に属する通常制御タスク26は、アドレス「0x0000D000」番地のページを利用してその処理を実行し、TP3に属する安全制御タスク28は、アドレス「0x0000E000」番地のページを利用してその処理を実行する。ここで、OS100は、その起動時には常にTLB設定情報211を参照して、各TP1〜TP3に対して実行用メモリ11の領域を割り当てる。そのため、OS100は、TLB設定情報211において予め定められているページ(アドレス)を固定的に各TP1〜TP3に割り当てることになる。
続いて、図8を参照して、図7で示した場合におけるTLB142の設定例について説明する。図8は、図7で示した場合におけるTLB142の設定例を示す図である。図8では、ASID「0x01」は、TP1のASIDを示し、ASID「0x02」は、TP2のASIDを示し、ASID「0x03」は、TP3のASIDを示す。アクセス権限に、「R」が記載されている場合は、読み出し権限が「有り」であることを示し、「W」が記載されている場合は、書き込み権限が「有り」であることを示し、「E」が記載されている場合は、実行権限が「有り」であることを示す。逆に、それらが記載されていない場合は、それぞれ対応する権限が「無し」であることを示す。
具体的には、図8に示すTLB142の1番上のエントリにおいて、TP1(RP1)に属する安全監視タスク24は、アドレス「0x0000C000」番地のページに対して、読み出し権限、書き込み権限、及び実行権限の全てのアクセス権限が付与されている。一方、2番目、3番目のエントリにおいて、TP1(RP1)に属する安全監視タスク24は、他のTP2、3(RP2、3)のそれぞれに割り当てられたアドレス「0x0000D000」番地のページ及びアドレス「0x0000E000」番地のページに対しては、読み出し権限のみが付与されている。このようにすることで、TP1に属する安全監視タスク24は、他のTP2、3に割り当てられたページであっても、読み出しのみであればアクセスすることを可能としている。TP2(RP2)に属する通常制御タスク26及びTP3(RP3)に属する安全制御タスク28についても同様であるため、説明を省略する。
このTLB142のエントリへの情報の設定は、上述したようにOS100がその起動時に行う。具体的には、OS100は、TLB設定情報211に基づいて、各エントリの情報を作成して、MMU14に出力する。すなわち、ここでは、TLB設定情報211は、図8に示す各エントリの内容(TP、仮想アドレス、物理アドレス、及びアクセス権限)を示す情報であれば、どのような形式の情報であってもよい。MMU14の制御部141は、OS100から出力されたエントリの情報を、TLB142のエントリに格納する。
ここで、図8では、TLB142のエントリにおいて、仮想アドレスと物理アドレスに同一のアドレスが設定されている場合について例示しているが、異なるアドレスを設定するようにしてもよい。また、このように、仮想アドレスと物理アドレスに同一のアドレスを設定しており、仮想アドレスから物理アドレスへの変換が不要である場合は、MMU14の仮想記憶管理機能を無効にして、MMU14を利用するようにしてもよい。この場合、プロセッサ10は、物理アドレスを指定してメモリアクセスを発行することになる。また、この場合、制御部141は、プロセッサ10からのアクセスで指定された物理アドレスをそのまま指定したアクセスを実行用メモリ11に発行する。この場合は、TLB142には、例えば、図8に示すように、仮想アドレスに物理アドレスと同一のアドレスを設定しておけばよい。または、MMU14がTLB142の物理アドレスを参照して、上述したエントリの検出を行うようにしてもよい。
なお、各TP1〜TP3に対して割り当てるページは、図8において示した例に限られない。例えば、図8の例とは異なるアドレスのページを、各TP1〜TP3に割り当てるようにしてもよい。また、1つのTPに対して複数のページを割り当てるようにしてもよいことは言うまでもない。
続いて以下では、パーティションスケジューラ21によるパーティション・スケジューリングについて、図9を用いて説明する。図9は、発明の実施の形態1にかかるパーティションスケジューラ21の処理手順の具体例を示すフローチャートである。
なお、図9では、通常制御スケジューリングパターン(例えば図6A)または安全制御スケジューリングパターン(例えば図6B)に従って、スケジューリングを実行する場合を例に説明する。すなわち、TP2またはTP3に続く次のTPはTP1であり、かつ、TP2での異常がTP1で検知された場合に、TP1からの結果を受けて次に選択・決定されるTPはTP3である場合を例に説明する。
OS100は、1Tick経過するごとに(S11)、パーティションスケジューラ21を起動する(S12)。パーティションスケジューラ21は、スケジューリングパターンを参照して、TPの切り替えタイミングか否かを判定する(S13)。
TPの切り替えタイミングでないと判定した場合(S13でNo)、パーティションスケジューラ21は、同一のTPXについての動作を継続させる。このため、TPの切り替えタイミングとなるまでの間、S11〜S13、S15、S16の処理が繰り返される。ここで、変数XはTPの番号を示し、Xは1〜3のうちのいずれかの値となる。すなわち、通常制御スケジューリングパターンに従ってパーティション・スケジューリングを実施している場合は、安全制御用のTP3を除いた、TP2及びTP1のいずれかを動作させる。
一方、TPの切り替えタイミングであると判定した場合(S13でYes)、パーティションスケジューラ21は、TPの切り替えを実行する(S14)。このように、パーティションスケジューラ21は、次にアクティブにするTPを変更する(S13でYes)場合には、さらに、切り替え前のTPに属するタスクからの通知結果に応じて、切り替え前のTPが正常であったか否かを判断する。判断の結果、切り替え前のTPが異常であった場合、パーティションスケジューラ21は、次の1Tickの間にアクティブにするTPXを、安全制御スケジューリングパターンに従って、TP1及びTP3のいずれかから選択・決定する。判断の結果、正常であった場合、パーティションスケジューラ21は、次の1Tickの間にアクティブにするTPXを、通常制御スケジューリングパターンに従って、TP1及びTP2のいずれかを選択・決定する。
パーティションスケジューラ21は、現在アクティブになっているTPXのタスクスケジューラを動作させる(S15)。S15で動作を開始したTPXのタスクスケジューラは、TPX内のタスクを優先度に応じて実行する(S16)。
そして、1Tickが経過すると(S11)、パーティションスケジューラ21が、再びTPのスケジューリングを開始する(S12)。すなわち、パーティションスケジューラ21は、スケジューリングパターンに従って、次の1Tickの間にいずれのTPをアクティブにするかを選択・決定する。
図9で示した処理に関して、パーティション・スケジューリングの具体例を説明する。まず、図6Aに例示した通常制御スケジューリングパターンに従って、S15においてTP2がアクティブの状態からスケジューリングを開始した場合を説明する。この場合、S15ではTPX=TP2として開始し、続くS16、S11〜S13にかけてもTPX=TP2のままである。そして、S13でNoが続く限り、TPX=TP2の状態が維持される。S13でYesとなり、S14でTP2からTP1へと変更された場合、続くS15〜S16、S11〜S13にかけてTP1のままである。そして、S13でNoが続く限り、TPX=TP1の状態が維持される。TP1がアクティブのときに、S16で、TP2に関する実行状況(データ入出力等)が正常であると判定されていた場合には、次のS14では、TPX=TP2となる(つまり、TP2から開始する通常制御スケジューリングパターンが継続される。)。一方で、S16で、TP2に関する実行状況(データ入出力等)が異常であると判定されていた場合には、次のS14で、TPX=TP3となる(つまり、TP3から開始する安全制御スケジューリングパターンに切り替わる。)。
また、図6Bに例示した安全制御スケジューリングパターンに従って、S15においてTP3がアクティブの状態からスケジューリングを開始した場合を説明する。この場合、S15ではTPX=TP3として開始し、続くS16、S11〜S13にかけてもTPX=TP3のままである。そして、S13でNoが続く限り、TPX=TP3の状態が維持される。S13でYesとなり、S14でTP3からTP1へと変更された場合、続くS15〜S16、S11〜S13にかけてTP1のままである。そして、S13でNoが続く限り、TPX=TP1の状態が維持される。TP1がアクティブのときに、S16で、TP3に関する実行状況(データ入出力等)が正常であると判定されていた場合には、次のS14では、TPX=TP2とする(つまり、TP2から開始する通常制御スケジューリングパターンに切り替わる。)。一方で、S16で、TP3に関する実行状況(データ入出力等)に異常があると判定されていた場合には、次のS14で、TPX=TP3となる(つまり、TP3から開始する安全制御スケジューリングパターンが継続される。)。
なお、上述の例では、スケジューリングパターンとして、3つのTP(安全監視用のTP1、通常制御用のTP2、安全制御用のTP3)のみを組み合わせた場合を例に説明したが、TP2のような通常制御用パーティションや、TP3のような安全制御用パーティションについては、それぞれ複数個存在するものとしてもよい。例えば、2つの通常制御用のTP2及びTP4と、安全監視用のTP1と、2つの安全制御用のTP3及びTP5と、が存在し、これら5つのTP(TP1〜TP5)を組み合わせてスケジューリングパターンを構成してもよい。この場合、S14では、パーティションスケジューラ21が、TPXに関する実行状況(データ入出力等)の異常状態の種類を判定し、その異常種類に応じて、安全制御用のTP3またはTP5のいずれかを選択すればよい。また、S14では、通常制御用のTP2またはTP4のいずれかを選択すればよい。
上述したように、本実施の形態では、OS100は、安全監視用のTP1からの通知、または、各TPからの通知に応じて、次にアクティブとするパーティションを選択・決定するパーティションスケジューラ21を備えている。パーティションスケジューラ21は、各TPにおいて実行されるタスクとは独立して、所定のタイマー周期で動作する。
独立に動作するパーティションスケジューラ21が、全てのTPから結果通知を受ける構成とすることで、パーティションスケジューラ21は、全てのTPに関する状況を一元的に把握することができる。このため、例えば、安全監視用のTP1からの結果通知に応じて、パーティションスケジューラ21が次のパーティションを決定・選択しようとする場合には、パーティションスケジューラ21は、各TPの状況を考慮した上で、正常状態にあるTPのみから次のパーティションを決定・選択することもできる。これによれば、より正確なパーティション・スケジューリングを実現することができるという効果を奏する。
続いて、図10を参照して、他のTPのメモリ領域に対する読み出し処理手順について説明する。図10は、他のTPのメモリ領域に対する読み出し処理手順の具体例を示すフローチャートである。以下、一例として、図6Aに例示した通常制御スケジューリングパターンに従って、動作した場合について説明する。
ここでは、まず、TP1がアクティブとなったものとする。その場合、TP1に属する安全監視タスク24が動作を開始する(S21)。安全監視タスク24は、RP1に割り当てられたページに格納されている変数Aの値を更新する(S22)。すわなち、書き込みによるアクセスが行われたことになる。例えば、I/Oポート12を介して取得したセンサ値等の書き込みが行われる。ここで、S21及びS22は、図9のS16に対応する。
パーティションスケジューラ21は、TPの切り替えタイミングになったとき、TP1からTP2に切り替える(S23)。ここで、S23は、図9のS14に対応する。
TP2に属する通常制御タスク26が動作を開始する(S24)。通常制御タスク26は、変数Aの値を読み出す場合、シンボル情報210を参照して、変数Aの変数名から変数Aのアドレスを取得する(S25)。通常制御タスク26は、取得したアドレスにアクセスして、変数Aの値を読み出す(S26)。これによって、例えば、通常制御タスク26は、変数Aとして格納されたセンサ値を利用して、制御対象の制御計算を行うことができる。ここで、S24〜S26は、図9のS16に対応する。
なお、上述した例では、直前のTPのデータを読み出す場合について例示したが、これに限られず、他のTPのデータであれば同様に読み出すことが可能である。例えば、TP1、TP3、TP2の順でTPが切り替わる場合には、TP2に属する通常制御タスク26が、TP1(RP1)に割り当てられたページのデータを読み出すことも可能である。また、TP間で受け渡すデータの種類も、例示したセンサ値に限られず、任意のデータを受け渡すことが可能である。
また、上述した例では、TPの切り替えタイミングで切り替えて、他のTPのデータを読み出す場合について例示したが、これに限られない。例えば、パーティションスケジューラ21は、自身が検出した異常の種類、又は、各タスクから通知された異常の種類によっては、非安全関連のTP2の時間が満了していない場合であっても、緊急的に安全関連のTP3に切り替えて、制御対象を緊急停止させることもできる。以上に説明した処理手順によれば、そのような場合であっても、TP3に属するタスクが、TP2に割り当てられた実行用メモリ11の領域に格納されたデータを参照することができる。つまり、TP3に属するタスクへ、TP2に属するタスクのデータの受け渡しが可能となる。これによれば、そのような場合に、データの受け渡しを可能とする仕組み(専用ソフト等)を別途実装する必要もない。そのため、実装のための手間を省くことができ、コストを低減することが可能となる。
以上に説明したように、本実施の形態1にかかる安全制御装置1では、TPに属するタスクに、実行用メモリ11の特定のページを利用して処理を実行させるために、そのページに対する全てのアクセス種別のアクセス権限を付与してそのタスクを実行する場合に、他のTPに属するタスクに、そのページに対するアクセス権限として読み出し権限のみを付与するようにしている。これによれば、TPに属するタスクが処理を実行するために利用するページのデータを、他のTPに属するタスクから読み出すことが可能となる。一方、書き込み権限及び実行権限は付与していないため、TPに属するタスクが参照するデータが、他のTPに属するタスクによって書き換えられてしまうことや、TPに属するタスクが実行するデータ(命令)が、他のTPに属するタスクによって実行されてしまうことはない。すなわち、TPに属するタスクの動作が、他のTPに属するタスクの挙動によって不正に変更されてしまうことや、TPに属するタスクの処理が、他のTPに属するタスクによって実行されてしまうこともない。したがって、本実施の形態によれば、TP間(タスク間)の独立性を維持しつつ、他のタスクに対して公開性を高めて情報(データ)を提供することが可能となる。
また、これによれば、タスク間通信によってデータを受け渡す必要がないため、データを受け渡すための余分なメモリ領域も不要であり、データの受け渡しによるオーバーヘッドが発生することもない。そのため、必要なメモリ容量を低減しつつ、処理速度も向上することができる。
続いて、図11を参照して、本実施の形態にかかるソフトウェア生成装置2及びソフトウェア書込装置3のソフトウェア構成について説明する。図11は、本実施の形態にかかるソフトウェア生成装置2及びソフトウェア書込装置3のソフトウェア構成例を示すブロック図である。
ソフトウェア生成装置2は、コンフィグレータ50、52、コンパイラ51、53、リンカ54、バイナリ変換ツール55を有する。ソフトウェア書込装置3は、ソフトウェア書き込みツール60を有する。
ソフトウェア生成装置2は、安全制御装置1においてプロセッサ10によって実行される実行バイナリ206及びシンボル情報210を生成する装置である。実行バイナリ206には、OS100、安全監視アプリケーション101、通常制御アプリケーション102、及び安全制御アプリケーション103、TLB設定情報211が含まれる。ソフトウェア書込装置3は、ソフトウェア生成装置2が生成した実行バイナリ206及びシンボル情報210を安全制御装置1に書き込む装置である。
コンフィグレータ50は、ユーザーによって入力された非安全関連TPの設定情報に基づいて、その設定情報を示すソースコード301を生成する。この設定情報として、非安全関連のTP2についてのTLB142の設定内容が入力される。すなわち、非安全関連のTP2の設定情報として、TP2(RP2)に割り当てる実行用メモリ11のページのアドレス(仮想アドレス及び物理アドレス)、及び、TP2のタスクによるそのページに対するアクセス権限として読み出し権限、書き込み権限、及び実行権限の全てを「有り」とすることを示す情報と、他のTP1、3(RP1、3)に割り当てる実行用メモリ11のページのアドレス、及び、TP2のタスクによるそのページに対するアクセス権限として読み出し権限のみを「有り」とすることを示す情報とが含まれる。
コンパイラ51は、ソースコード300、301をコンパイルして、非安全関連バイナリ201を生成する。すなわち、ソースコード300は、通常制御アプリケーション102のソースコードであり、非安全関連バイナリ201は、通常制御アプリケーション102及び非安全関連TP2の設定情報のオブジェクトコードである。コンパイラ51は、ソースコード300が機能安全対応OS100のAPIライブラリを使用している場合には、機能安全対応OS APIライブラリ200を参照して、ソースコード300をコンパイルする。
コンフィグレータ52は、ユーザーによって入力された安全関連TPの設定情報に基づいて、その設定情報を示すソースコード302を生成する。この設定情報として、安全関連のTP1、TP3についてのTLB142の設定内容が入力される。すなわち、安全関連のTP1の設定情報として、TP1(RP1)に割り当てる実行用メモリ11のページのアドレス(仮想アドレス及び物理アドレス)、及び、TP1のタスクよるそのページに対するアクセス権限として読み出し権限、書き込み権限、及び実行権限の全てを「有り」とすることを示す情報と、他のTP2、3(RP2、3)に割り当てる実行用メモリ11のページのアドレス、及び、TP1のタスクによるそのページに対するアクセス権限として読み出し権限のみを「有り」とすることを示す情報とが含まれる。また、安全関連のTP3の設定情報として、TP3(RP3)に割り当てる実行用メモリ11のページのアドレス(仮想アドレス及び物理アドレス)、及び、TP3のタスクによるそのページに対するアクセス権限として読み出し権限、書き込み権限、及び実行権限の全てを「有り」とすることを示す情報と、他のTP1、2(RP1、2)に割り当てる実行用メモリ11のページのアドレス、及び、TP3のタスクによるそのページに対するアクセス権限として読み出し権限のみを「有り」とすることを示す情報とが含まれる。
コンパイラ53は、ソースコード302をコンパイルして、安全関連設定バイナリ203を設定する。すなわち、安全関連設定バイナリ203は、安全関連TP1、TP3の設定情報のオブジェクトコードである。
リンカ54は、非安全関連バイナリ201、安全関連バイナリ202、安全関連設定バイナリ203、及び、機能安全対応OSバイナリ204をリンクして、実行バイナリ205を生成する。ここで、安全関連バイナリ202は、安全関連TP1、TP3に属する安全監視アプリケーション101及び安全制御アプリケーション103のオブジェクトコードであり、機能安全対応OSバイナリ204は、OS100のオブジェクトコードである。
これによって、OS100、各アプリケーション101〜103、及び、TLB設定情報211のオブジェクトコードを含む実行バイナリ205が生成されることになる。すなわち、TLB設定情報211は、安全関連と非安全関連の全てのTP1〜TP3についての設定情報が含まれることになる。
バイナリ変換ツール55は、実行バイナリ205をバイナリ変換して、実行バイナリ206を生成する。具体的には、実行バイナリ205の命令コードを、安全制御装置1のプロセッサ10で実行可能な形式の命令コードに変換する。また、このときに、バイナリ変換ツール55は、実行バイナリ205に含まれる変数の変数名(シンボル)と、その変数が格納される実行用メモリ11上のアドレスとが、全ての変数について対応付けられた表を示すシンボル情報210を生成する。
ここで、実行バイナリ205には、各TP1〜TP3のTLB142の設定情報が含まれている。この設定情報によって、各TP1〜TP3のデータが配置される実行用メモリ11のページのアドレスを特定することが可能であるため、バイナリ変換ツール55は、そのアドレスを基準として、それぞれのページにおいて変数が配置される位置のアドレスを算出することが可能である。バイナリ変換ツール55は、そのようにして各変数のアドレスを算出して、シンボル情報210を生成する。
ソフトウェア書き込みツール60は、ソフトウェア生成装置2によって生成された実行バイナリ206及びシンボル情報210を安全制御装置1の不揮発性メモリ13に書き込む。
続いて、図12を参照して、本実施の形態にかかるソフトウェア生成及び書き込み処理について説明する。図12は、本実施の形態にかかるソフトウェア生成及び書き込み処理を示すフローチャートである。
非安全関連系のコンフィグレータ50は、ユーザーによって入力された非安全関連TP2の設定情報の内容が定義された記述を含むソースコード301を生成する(S31)。非安全関連系のコンパイラ51は、ソースコード300、301をコンパイルして非安全関連バイナリ201を生成する(S32)。
一方、安全関連系のコンフィグレータ52は、ユーザーによって入力された安全関連TP1、TP3の設定情報の内容が定義された記述を含むソースコード302を生成する(S33)。安全関連系のコンパイラ53は、ソースコード302をコンパイルして安全関連設定バイナリ203を生成する(S34)。
リンカ54は、非安全関連バイナリ201、安全関連バイナリ202、安全関連設定バイナリ203、及び、機能安全対応OSバイナリ204をリンクして、実行バイナリ205を生成する(S35)。バイナリ変換ツール55は、実行バイナリ205をバイナリ変換して実行バイナリ206を生成するとともに、シンボル情報210を生成する(S36)。ソフトウェア書き込みツール60は、実行バイナリ206及びシンボル情報210を安全制御装置1に書き込む(S37)。
続いて、図13を参照して、本実施の形態にかかるソフトウェア生成装置2及びソフトウェア書込装置3のハードウェア構成例について説明する。図13は、本実施の形態にかかるソフトウェア生成装置2及びソフトウェア書込装置3のハードウェア構成例を示すブロック図である。なお、図13を参照して説明するハードウェア構成は、一例であって、上述したソフトウェア生成装置2及びソフトウェア書込装置3の動作を実行可能であれば、この構成に限定されるものではない。
図13に示すハードウェア構成は、プロセッサ70、メモリ71、I/Oポート72、入力装置73、光ディスクドライブ74、及び、不揮発性メモリ75を有する。
プロセッサ70は、プログラム(命令ストリーム)の取得、命令のデコード、命令のデコード結果に応じた演算処理を行う。なお、プロセッサ10と同様に、プロセッサ70は、マルチプロセッサ構成としてもよく、マルチコアプロセッサであってもよい。メモリ71は、プロセッサ70によるプログラム実行のために使用されるメモリである。具体的には、メモリ71は、SRAM、DRAM等のランダムアクセス可能な揮発性メモリとすればよい。メモリ71は、図1の実行用メモリ11と同様に、論理的な構成単位を示している。
I/Oポート12は、外部デバイスとの間のデータ送受信に使用される。I/Oポート12は、シリアルポート又はUSB(Universal Serial Bus)ポート等である。入力装置73は、ユーザーからの入力を受け付ける。入力装置73は、例えば、マウス、キーボード、及びタッチパネル等である。
不揮発性メモリ75は、電力の供給を受けることなく、メモリ71に比べて安定的に記憶内容を維持することが可能なメモリデバイスである。例えば、不揮発性メモリ75は、ROM、フラッシュメモリ、ハードディスクドライブ若しくは光ディスクドライブ、又はこれらの組み合わせである。
ソフトウェア生成装置2が、図13に示すようなハードウェア構成である場合、次に説明するように動作することで、上述したソフトウェア生成処理を実行する。不揮発性メモリ75は、コンフィグレータ50、52、コンパイラ51、53、リンカ54、及び、バイナリ変換ツール55が格納される。プロセッサ70は、それらのプログラム50〜55をメモリ71にロードして実行する。プロセッサ70は、コンフィグレータ50を実行することによって、ユーザーから入力装置73に対して入力された設定情報に基づいて、ソースコード301を生成して不揮発性メモリ75に格納する。
また、不揮発性メモリ75は、機能安全対応OS APIライブラリ200及びソースコード300も格納される。プロセッサ70は、コンパイラ51を実行することによって、不揮発性メモリ75に格納されたソースコード300、301から、非安全関連バイナリ201を生成して不揮発性メモリ75に格納する。
また、プロセッサ70は、コンフィグレータ52を実行することによって、ユーザーから入力装置73に対して入力された設定情報に基づいて、ソースコード302を生成して不揮発性メモリ75に格納する。プロセッサ70は、コンパイラ53を実行することによって、不揮発性メモリ75に格納されたソースコード302から、安全関連設定バイナリ203を生成して不揮発性メモリ75に格納する。また、不揮発性メモリ75は、安全関連バイナリ202、及び機能安全対応OSバイナリ204も格納される。
プロセッサ70は、リンカ54を実行することによって、不揮発性メモリ75に格納された非安全関連バイナリ201、安全関連バイナリ202、安全関連設定バイナリ203及び機能安全対応OSバイナリ204から、実行バイナリ205を生成して不揮発性メモリ75に格納する。プロセッサ70は、バイナリ変換ツール55を実行することによって、不揮発性メモリ75に格納された実行バイナリ205から、実行バイナリ206及びシンボル情報210を生成して不揮発性メモリ75に格納する。プロセッサ70は、光ディスクドライブ74を制御して、不揮発性メモリ75に格納された実行バイナリ206及びシンボル情報210を光ディスク80に記録する。
ソフトウェア書込装置3が、図13に示すようなハードウェア構成である場合、次に説明するように動作することで、上述したソフトウェア書き込み処理を実行する。不揮発性メモリ75は、ソフトウェア書き込みツール60が格納される。プロセッサ70は、ソフトウェア書き込みツール60をメモリ71にロードして実行する。光ディスクドライブ74には、実行バイナリ206及びシンボル情報210が記録された光ディスク80が挿入される。プロセッサ70は、光ディスクドライブ74を制御して、光ディスク80に記録された実行バイナリ206及びシンボル情報210を読み出して、不揮発性メモリ75に格納する。プロセッサ70は、ソフトウェア書き込みツール60を実行することによって、不揮発性メモリ75に格納された実行バイナリ206及びシンボル情報210を安全制御装置1の不揮発性メモリ13に書き込む。例えば、シリアルポートを介して、シリアルインタフェースによって書き込みを行う。
以上に説明したように、本実施の形態1にかかるソフトウェア生成装置2では、TPに属するタスクに、実行用メモリ11の特定のページを利用して処理を実行させるために、そのページに対する全てのアクセス種別のアクセス権限を付与してそのタスクを実行するOS100を生成する。さらに、このときに、他のTPに属するタスクに、そのページに対するアクセス権限として読み出し権限のみを付与するようにアクセス権限を設定することを可能としている。これによれば、TPに属するタスクが処理を実行するために利用するページのデータを、他のTPに属するタスクから読み出すことが可能となる。したがって、上述したように、TP間(タスク間)の独立性を維持しつつ、他のタスクに対して公開性を高めて情報(データ)を提供することが可能となる。
ここで、上述した説明では、ソフトウェア生成装置2からソフトウェア書込装置3に光ディスク80を介して実行バイナリ206及びシンボル情報210を受け渡す場合について説明したが、これに限られない。例えば、光ディスクドライブ74に代えてフロッピー(登録商標)ディスクドライブを有するようにし、フロッピーディスクを介して実行バイナリ206及びシンボル情報210を受け渡すようにしてもよい。また、ソフトウェア生成装置2及びソフトウェア書込装置3のそれぞれに、有線LANポート、無線LANポート、又は赤外線ポート等の通信ポートを有するようにして、有線LAN通信、無線LAN通信、又は赤外線通信等の通信によって、実行バイナリ206及びシンボル情報210を受け渡すようにしてもよい。
また、上述した説明では、ソフトウェア生成装置2とソフトウェア書込装置3とが異なる装置で構成されている場合について説明したが、同一の装置で構成されていてもよい。また、コンフィグレータ50、52が、1つのコンフィグレータとして構成されていてもよく、コンパイラ51、53が、1つのコンパイラとして構成されていてもよい。
また、上述したようにして生成されたシンボル情報210は、各TP1〜TP3に属するタスク24、26、28のように制御対象の制御に関する処理を実行するタスクが、他のTPのデータを参照するときのみの利用には制限されない。例えば、シンボル情報210を生成することによって、安全制御装置1の動作状況を調査するツール(調査アプリケーションプログラム)から利用することも可能となる。例えば、調査アプリケーションプログラムを実行したとき、TP4(RP4)に属する調査タスクとして動作する場合には、ユーザーは、TP4の設定情報として、TP4(RP4)に割り当てる実行用メモリ11のページのアドレス(仮想アドレス及び物理アドレス)、及び、TP4の調査タスクによるそのページに対するアクセス権限として読み出し権限、書き込み権限、及び実行権限の全てを「有り」とすることを示す情報と、他のTP1〜3(RP1〜3)に割り当てる実行用メモリ11のページのアドレス、及び、TP4の調査タスクによるそのページに対するアクセス権限として読み出し権限のみを「有り」とすることを示す情報とを入力する。
これによれば、TP4の調査タスクには、他のTP1〜3(RP1〜3)に割り当てられた実行用メモリ11のページのデータ(変数)に対する読み出し権限が付与されることになる。したがって、調査用にTP1〜3のデータ(変数)を読み出してログする等して、TP1〜3のデータを調査することが可能となる。
また、上述した説明では、設定情報として、TPに属するタスクによる他のTPに割り当てられたページに対する読み出し権限のみを「有り」とすることを示す情報を設定する場合について例示したが、この読み出し権限のみの設定を不要とするようにしてもよい。また、設定情報として、書き込み権限及び実行権限のみを設定させるようにしてもよい。そして、OS100で、各TP1〜TP3に対して、他のTPに割り当てられた実行用メモリ11のページに対するアクセス権限として、無条件に読み出し権限のみは付与するようにTLB142を設定するようにしてもよい。これによれば、ユーザーによるアクセス権限設定の負荷を低減することができる。
<発明の実施の形態2>
続いて、本発明の実施の形態2にかかる安全制御装置について説明する。本実施の形態2にかかる安全制御装置の構成は、OS100に代えてOS200を有すること以外は、図1を参照して説明した実施の形態1にかかる安全制御装置1の構成と同様であるため、その説明を省略する。
以下では、パーティションスケジューラ31と、アプリケーション101〜103の起動により生成されるタスクと、の関係について、図を用いて説明する。図14は、OS200によって提供されるマルチプログラミング環境で起動される、パーティションスケジューラ31とタスク32、33、34との関係を示す図である。
本実施の形態2にかかる安全制御装置は、実施の形態1にかかる安全制御装置1と比較して、OS100に代えてOS200を有する点、パーティションスケジューラ21に代えてパーティションスケジューラ31を有する点、タスク24、26、28に代えてタスク32、33、34を有する点が異なる。また、本実施の形態2では、実行用メモリ11にwai_pswフラグ29及び起床フラグ30が格納される。以下、実施の形態1と同様の内容については、適宜省略し、異なる点について説明する。
OS200は、各タスク32、33、34に対して、次回にタスクが属するタイムパーティションがアクティブとなるまで、そのタスクを実行終了してスリープさせるAPI(Application Program Interface)関数を提供する。したがって、一定周期でアクティブとなるTPに属するタスクに、このAPI関数を呼び出してスリープさせるようにすることで、そのタスクが一定周期で実行されるようにすることができる。以下、このAPI関数を「wai_psw」と記載する。
wai_pswフラグ29は、タスク32、33、34のそれぞれに対応するように、複数用意される。wai_pswフラグ29は、例えば、実行用メモリ11に格納される。wai_pswフラグ29は、「OK」又は「NG」のいずれかを示す値をとる変数である。wai_pswフラグ29がOKである場合、そのwai_pswフラグ29に対応するタスクが実行終了していることを意味する。一方、wai_pswフラグ29がNGである場合、そのwai_pswフラグ29に対応するタスクが実行終了していないことを意味する。
wai_pswフラグ29は、初期値がOKを示す値になっている。パーティションスケジューラ31は、TPがアクティブになったときに、そのTPに属するタスクに対応するwai_pswフラグ29をNGに更新する。そして、各タスク32、33、34は、TP内で実行すべき処理を実行終了したとき、wai_pswを呼び出すことによって、スリープするとともにwai_pswフラグ29をOKに更新する。つまり、wai_pswには、呼び出し元のタスクに対応するwai_pswフラグ29をOKに更新する処理が含まれている。これらの処理によれば、次にTPがアクティブとなったときにwai_pswフラグ29がOKであれば、前回のTPの時間内にタスクが実行終了していたことが分かり、次にTPがアクティブとなったときにwai_pswフラグ29がNGであれば、前回のTPの時間内にタスクが実行終了していなかったことが分かる。
ここで、wai_pswフラグ29は、例えば、OKを示す値を0とし、NGを示す値を1としてもよく、OKを示す値を1とし、NGを示す値を0としてもよい。また、wai_pswフラグ29は、OK又はNGを示す情報であれば、フラグのように2値化された情報に限られない。
起床フラグ30は、タスク32、33、34のそれぞれに対応するように、複数用意される。起床フラグ30は、例えば、実行用メモリ11に格納される。起床フラグ30は、「E_OK」又は「E_TMOUT」のいずれかを示す値をとる変数である。起床フラグ30がE_OKである場合、その起床フラグ30に対応するタスクが、そのタスクが属するTPの時間内に実行終了できていたことを意味する。起床フラグ30がE_TMOUTである場合、その起床フラグ30に対応するタスクが、そのタスクが属するTPの時間内に実行終了できていなかったことを意味する。
起床フラグ30は、初期値がE_OKを示す値になっている。パーティションスケジューラ31は、TPがアクティブになったときに、そのTPに属するタスクに対応するwai_pswフラグ29がNGである場合、そのタスクに対応する起床フラグ30をE_TMOUTに更新する。これによって、起床フラグ30がE_TMOUTに更新されている場合、その起床フラグ30に対応するタスクがTPの時間内に実行終了できていなかったことが分かる。
また、wai_pswは、呼び出し元のタスクに対応する起床フラグ30がE_OKある場合、E_OKを示す値を戻り値として呼び出し元のタスクに返す。一方、wai_pswは、呼び出し元のタスクに対応する起床フラグ30がE_TMOUTである場合、E_TMOUTを示す値を戻り値として呼び出し元のタスクに返す。この戻り値は、wai_pswを呼び出してスリープしていたタスクが起床してwai_pswから復帰するときに、そのタスクに返される。これによって、呼び出し元のタスクは、wai_pswからの戻り値がE_OKである場合、TPの時間内に自身が実行終了できていたことを認識することができる。逆に、呼び出し元のタスクは、wai_pswからの戻り値がE_TMOUTである場合、TPの時間内に自身が実行終了できていなかったことを認識することができる。
そして、呼び出し元のタスクは、wai_pswからの戻り値に応じた処理を実行する。例えば、wai_pswからの戻り値がE_OKである場合、呼び出し元のタスクは、通常の処理を実行する。逆に、wai_pswからの戻り値がE_TMOUTである場合、呼び出し元のタスクは、異常処置を実行する。ここで、異常処置は、制御対象を安全な方向に動作させるための処置であればどのようなものであってもよい。例えば、図6Aに示す通常制御スケジューリングパターンに従って動作している場合、呼び出し元のタスクは、タスクの実行状況が異常である旨をパーティションスケジューラ31に通知する。そして、パーティションスケジューラ31は、その通知に応じて、スケジューリングパターンを、図6Bに示す安全制御スケジューリングパターンに切り替えるようにしてもよい。また、パーティションスケジューラ31は、その通知に応じて、次の動作タイミングで、TPを強制的にTP3に切り替えるようにしてもよい。そして、TP3へ切り替えた後は、例えば、安全制御タスク34によって制御対象を停止させる。また、パーティションスケジューラ21は、タスクの実行状況が異常である旨の通知を安全制御タスク34から通知された場合、パーティションスケジューラ31自身が、制御対象を停止させるように制御するようにしてもよい。
ここで、起床フラグ30及び戻り値のそれぞれは、例えば、E_OKを示す値を0とし、E_TMOUTを示す値を1としてもよく、E_OKを示す値を1とし、E_TMOUTを示す値を0としてもよい。また、起床フラグ30及び戻り値のそれぞれは、E_OK又はE_TMOUTを示す情報であれば、フラグのように2値化された情報に限られない。さらに、起床フラグ30と戻り値とで、E_OKを示す値及びE_TMOUTを示す値のそれぞれが異なる値で定義されていてもよい。
以上に説明したようにパーティションスケジューラ31は、実施の形態1にかかるパーティションスケジューラ21と比較して、さらに、wai_pswフラグ29のチェック、wai_pswフラグ29及び起床フラグ30の更新を行う。
安全監視タスク32、通常制御タスク33、及び安全制御タスク34のそれぞれは、実施の形態1にかかる安全監視タスク24、通常制御タスク26、及び安全制御タスク28のそれぞれと比較して、さらに、実行用メモリ11に対するアクセスを開始するときに実行用メモリ11に対するロックをかけ、アクセスが終了したときにロックを解除する。すなわち、本実施の形態2では、実行用メモリ11の排他制御を行う。例えば、安全監視タスク24が実行用メモリ11のロックをかけている場合、通常制御タスク26及び安全制御タスク28による実行用メモリ11に対するアクセスは一時的に制限されることになる。安全監視タスク32、通常制御タスク33、及び安全制御タスク34のそれぞれは、ロックを解除してから、その処理の実行を終了してスリープすることが期待値となる。
なお、ロックをかける単位は、実行用メモリ11全体であってもよく、実行用メモリ11の1ページ毎であってもよく、予め定めた数のページ単位であってもよく、ロックをかけるタスクが属するTPに対応するRP単位であってもよい。また、ロックをかける機構として、ミューテックス、セマフォ、又はスピンロック等の任意のロック機構を用いてよい。
続いて以下では、パーティションスケジューラ31によるパーティション・スケジューリングについて、図15を用いて説明する。図15は、発明の実施の形態2にかかるパーティションスケジューラ31の処理手順の具体例を示すフローチャートである。なお、図9を参照して説明した、実施の形態1にかかる処理手順と同様の処理手順については、同一の符号を付し、説明を省略する。本実施の形態2にかかる処理手順では、実施の形態1にかかる処理手順と比較して、S14とS15との間に、S17〜S20が実行される点が異なる。
TP切り替えを実行したとき(S14)、パーティションスケジューラ31は、切り替え先のTPに属するタスクに対応するwai_pswフラグ29がOKか否かを判定する(S17)。
切り替え先のTPに属するタスクに対応するwai_pswフラグ29がOKである場合(S17でYes)、切り替え先のTPが前回にアクティブだったときに、そのTPの時間内で、そのwai_pswフラグ29に対応するタスクが実行終了していたことを意味する。すなわち、この場合には、そのタスクが、実行用メモリ11のロックを解除してから、次のTPのタスクの実行が開始されたことが保障される。そのため、パーティションスケジューラ31は、そのタスクに対応する起床フラグ30をE_OKに更新する(S18)。そして、パーティションスケジューラ31は、S20に進む。
一方、切り替え先のTPに属するタスクに対応するwai_pswフラグ29がOKでない場合(S17でNo)、切り替え先のTPが前回にアクティブだったときに、そのTPの時間内で、そのwai_pswフラグ29に対応するタスクが実行終了していなかったことを意味する。すなわち、この場合には、そのタスクが、実行用メモリ11のロックを解除する前に、次のTPのタスクの実行が開始された可能性がある。つまり、次のTPのタスクが実行用メモリ11にアクセスできず、所望の処理を実行することができなかったおそれがある。そのため、パーティションスケジューラ31は、そのタスクに対応する起床フラグ30をE_TMOUTに更新する(S19)。すなわち、切り替え先のTPに属するタスクに対応するwai_pswフラグ29がNGである場合に、S19を実行する。そして、パーティションスケジューラ21は、S20に進む。
S20では、パーティションスケジューラ31は、切り替え先のTPに属するタスクに対応するwai_pswフラグ29をNGに更新する(S20)。これによれば、切り替え先のTPでタスクが実行終了するためにwai_pswを呼び出してwai_pswフラグ29をOKに更新しなかった場合に、wai_pswフラグ29がNGのままとなる。すなわち、切り替え先のTPの時間内にタスクが実行終了しなかったことを、次回にその切り替え先のTPがアクティブとなったときのwai_pswフラグ29の値によって判定すること(S17)が可能となる。そして、パーティションスケジューラ31は、S15に進む。なお、S17〜S20の処理は、TP内に複数のタスクが属している場合、その複数のタスクに対応するwai_pswフラグ29及び起床フラグ30のそれぞれに対して行われることになる。
続いて、図16を参照して、本実施の形態2にかかるタスクの処理手順の具体例について説明する。図16は、本実施の形態2にかかるタスクの処理手順の具体例を示すフローチャートである。
S16において、TPXのタスクスケジューラは、スリープしていたTPX内のタスクを優先度に応じた順番で起床させる。起床したタスクは、wai_pswから復帰する(S41)。このとき、起床したタスクは、上述したようにwai_pswの戻り値に応じた処理を実行する。すなわち、タスクは、wai_pswからの戻り値がE_OKか否かを判定する(S42)。
wai_pswからの戻り値がE_OKである場合(S42でYes)、起床したタスクがTPの時間内に実行終了できていたことになるため、通常の処理を実行する。すなわち、タスクは、自身が属するTPに割り当てられた実行用メモリ11のページを利用してその処理を実行する。具体的には、例えば、次に説明する処理を実行する。まず、タスクは、実行用メモリ11のロックをかける(S43)。タスクは、実行用メモリ11にアクセスして、データの読み出し及び書き込み等を行う(S44)。実行用メモリ11に対するアクセスを終了したとき、タスクは、実行用メモリ11のロックを解除する(S45)。そして、タスクは、S46に進む。
一方、wai_pswからの戻り値がE_OKでない(E_TMOUTである)場合(S42でNo)、起床したタスクがTPの時間内に実行終了できていなかったことになるため、タスクの実行状況が異常である旨をパーティションスケジューラ31に通知する処理を実行する(S46)。そして、タスクは、S46に進む。
これらのTP内で実行すべき処理が終了した場合、タスクは、wai_pswを呼び出して再びスリープする(S47)。なお、wai_pswにおけるフラグ制御処理の処理手順については、図17を参照して後述する。
続いて以下では、タスクにおけるフラグ制御処理について、図17を用いて説明する。図17は、発明の実施の形態2にかかるAPI関数wai_pswの処理手順の具体例を示すフローチャートである。すなわち、S47において、wai_pswが呼び出された後の処理手順について説明する。
タスクスケジューラによって実行されたタスクは、TP内で実行すべき処理を実行終了した後、次のTPまでスリープするときに、wai_pswを呼び出す(S51)。呼び出されたwai_pswは、呼び出し元のタスクに対応するwai_pswフラグ29をOKに更新する(S52)。そして、wai_pswは、呼び出し元のタスクに対応する起床フラグ30がE_TMOUTであるか否かを判定する(S53)。
呼び出し元のタスクに対応する起床フラグ30がE_TMOUTでない場合(S53でNo)、wai_pswは、wai_pswの戻り値にE_OKを設定し(S54)、S56に進む。すなわち、呼び出し元のタスクに対応する起床フラグ30がE_OKである場合、S54が実行される。一方、起床フラグがE_TMOUTである場合、wai_pswは、wai_pswの戻り値にE_TMOUTを設定し(S55)、S56に進む。
wai_pswは、タスクスケジューラに、呼び出し元のタスクをスリープさせるスリープ処理を実行させる(S56)。すなわち、タスクスケジューラは、呼び出し元のタスクを実行終了して、スリープ状態に遷移させる。これによって、呼び出し元のタスクに対して割り当てたプロセッサ10の実行時間が解放される。なお、上述したように、wai_pswによってスリープしたタスクは、そのタスクが属するTPが次にアクティブとなるまでは、スリープ状態を継続する。そして、次にそのTPがアクティブになって、タスクスケジューラによってプロセッサ10の実行時間が割り当てられたときに、タスクは、スリープ時に設定された戻り値をwai_pswから受け取って、wai_pswから復帰する。つまり、タスクが起床して、タスクの実行が開始される。そして、タスクは、wai_pswからの戻り値がE_OKである場合、通常の処理を実行し、wai_pswからの戻り値がE_TMOUTである場合、異常処置を実行する。
ここで、タスクが属するTPが次にアクティブとなるまで、そのタスクをスリープさせる方法は、例えば、次に説明する方法で実現するようにしてもよく、同様の方法であれば、この方法にも限定されない。具体的には、タスクのそれぞれに対応する起床抑止フラグを実行用メモリ11上に用意し、タスクがスリープしたときに、そのタスクに対応する起床抑止フラグを有効な値に更新する。例えば、wai_pswによって更新する。そして、起床抑止フラグが有効な値を示す場合は、同一TP内で、再度、その起床抑止フラグに対応するタスクの起床することを抑止するようにすればよい。なお、この場合、起床抑止フラグは、TPの時間が終了してから、そのTPが次にアクティブとなったときまでに、OS200又はパーティションスケジューラ31等によって、無効な値に更新するようにすればよい。
続いて、図15〜17を参照して説明した処理によるタスクの実行状況監視の具体例について、図18及び図19を参照して説明する。図18は、TPの時間内にタスクが実行終了した場合におけるタスクの実行状況の具体例を示す図であり、図19は、TPの時間内にタスクが実行終了しなかった場合におけるタスクの実行状況の具体例を示す図である。なお、図18及び図19において、「Partition 1」及び「Partition 2」は、タイムパーティションを示し、「Task」は、Partition 1に属するタスクを示している。例えば、図6Aに示す通常制御スケジューリングパターンに従って動作している場合、「Partition 1」及び「Partition 2」は、TP1及びTP2に相当する。
まず、図18を参照して、TPの時間内にタスクが実行終了した場合について説明する。ここで、wai_pswフラグ29はOKであり、起床フラグ30はE_OKであるものとする。図18は、1Tickが経過して起動されたパーティションスケジューラ21が、Partition 1をアクティブにしたとき(S11〜S14)から図示されている。
この場合、Partition 1に属するタスクに対応するwai_pswフラグ29はOKとなっているため(S17でYes)、パーティションスケジューラ31は、Partition 1に属するタスクに対応する起床フラグ30をE_OKに更新する(S18)。また、パーティションスケジューラ21は、Partition 1に属するタスクに対応するwai_pswフラグ29をNGに更新する(S20)。Partition 1のタスクスケジューラは、動作を開始して(S15)、Partition 1内のタスクを実行する(S16、S41)。タスクは、通常の処理(S43〜S45)を実行終了したとき、wai_pswを呼び出す(S47、S51)。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグをOKに更新する(S52)。また、上記S18で起床フラグ30はE_OKとなっているため(S53でNo)、wai_pswは、戻り値にE_OKを設定する(S54)。そして、wai_pswは、呼び出し元のタスクをスリープさせる(S56)。
パーティションスケジューラ31が、次にPartition 1をアクティブにしたとき(S11〜S14)、Partition 1に属するタスクに対応するwai_pswフラグ29はOKであるため(S17でYes)、パーティションスケジューラ31は、Partition 1に属するタスクに対応する起床フラグ30をE_OKに更新する(S18)。すなわち、起床フラグ30は、E_OKのままとなる。また、パーティションスケジューラ31は、Partition 1に属するタスクに対応するwai_pswフラグ29をNGに更新する(S20)。Partition 1のタスクスケジューラは、動作を開始して(S15)、Partition 1内のタスクを実行する(S16、S41)。このとき、タスクは、スリープ時に設定されたE_OKを戻り値としてwai_pswから受け取って、wai_pswから復帰する。タスクは、通常の処理(S43〜S45)を実行終了したとき、wai_pswを呼び出す(S47、S51)。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ29をOKに更新する(S52)。また、上記S18で起床フラグ30はE_OKとなっているため(S53でNo)、wai_pswは、戻り値にE_OKを設定する(S54)。そして、wai_pswは、呼び出し元のタスクをスリープさせる(S56)。
次に、Partition 1がアクティブとなったときも、wai_pswフラグ29にE_OKが設定されており、wai_pswの戻り値にE_OKが設定されているため、同様の処理が繰り返される。このように、タスクがPartition 1の時間内に実行終了できているときはwai_pswの戻り値がE_OKとなることに基づいて、タスクは、通常の処理を実行してもよいということを認識することが可能となる。
次に、図19を参照して、TPの時間内にタスクが実行終了しなかった場合について説明する。ここで、wai_pswフラグ29はOKであり、起床フラグ30はE_OKであるものとする。図19は、1Tickが経過して起動されたパーティションスケジューラ31が、Partition 1をアクティブにしたとき(S11〜S14)から図示されている。
この場合、Partition 1に属するタスクに対応するwai_pswフラグ29はOKであるため(S17でYes)、パーティションスケジューラ31は、Partition 1に属するタスクに対応する起床フラグ30をE_OKに更新する(S18)。また、パーティションスケジューラ31は、Partition 1に属するタスクに対応するwai_pswフラグ29をNGに更新する(S20)。Partition 1のタスクスケジューラは、動作を開始して(S15)、Partition 1内のタスクを実行する(S16、S41)。
図19では、このときに、Partition 1の時間内にタスクが実行終了しなかった場合について図示している。この場合、Partition 1の時間が満了したときにタスクスケジューラによってタスクの実行が中断され、パーティションスケジューラ31によってTPがPartition 2に切り替えられる(S11〜S14)。この場合は、タスクによってwai_pswが呼び出されていないため、wai_pswフラグ29はNGのままとなる。
パーティションスケジューラ31が、次にPartition 1をアクティブにしたとき(S11〜S14)、Partition 1に属するタスクに対応するwai_pswフラグ29はNGであるため(S17でNo)、パーティションスケジューラ31は、Partition 1に属するタスクに対応する起床フラグ30をE_TMOUTに更新する(S19)。また、パーティションスケジューラ31は、Partition 1に属するタスクに対応するwai_pswフラグ29をNGに更新する(S20)。Partition 1のタスクスケジューラは、動作を開始して(S15)、Partition 1内のタスクを実行する(S16、S41)。このとき、タスクは、中断されたところから実行が再開される。タスクは、通常の処理(S43〜S45)を実行終了したとき、wai_pswを呼び出す(S47、S51)。wai_pswは、呼び出し元のタスクに対応するwai_pswフラグ29をOKに更新する(S52)。また、上記S19で起床フラグ30はE_TMOUTとなっているため(S53でYes)、wai_pswは、戻り値にE_TMOUTを設定する(S55)。そして、wai_pswは、呼び出し元のタスクをスリープさせる(S56)。
パーティションスケジューラ31が、次にPartition 1をアクティブにしたとき(S11〜S14)、上記と同様にS17でYesの場合の処理が実行された後、Partition 1のタスクスケジューラは、動作を開始して(S15)、Partition 1内のタスクを実行する(S16、S41)。このとき、タスクは、スリープ時に設定されたE_TMOUTを戻り値としてwai_pswから受け取って、wai_pswから復帰する。このように、wai_pswの戻り値がE_TMOUTであることに基づいて、タスクは、自身がPartition 1の時間内に実行終了できていなかったため(S42でNo)、異常処置(S46)を実行する必要があるということを認識することが可能となる。
以上に説明したように、本実施の形態2では、TPの切り替え時に切り替え先のTPに属するタスクに対応するwai_pswフラグ29をNGに更新するとともに、そのタスクの実行終了時にwai_pswフラグ29をOKに更新するようにしている。そして、TPの切り替え時に切り替え先のTPに属するタスクに対応するwai_pswフラグ29をNGに更新する前に、wai_pswフラグ29がNGとなっていることを検出するようにしている。
これによれば、TPの時間内にタスクが実行終了しなかったことを、wai_pswフラグ29がNGであることによって検出することができる。すなわち、TPの時間内にタスクを実行終了することができているか否かを監視することが可能となる。これによれば、タスクが実行用メモリ11をロックしたままとなり、その後に切り替わったTPに属するタスクが実行用メモリ11にアクセスできずに、正常に処理を実行することができなかった可能性があることを検出することが可能である。つまり、そのような状態のまま動作を継続することを防止することができ、より安定した制御対象の制御を行うことが可能となる。また、それを所定のタイミングで情報(wai_pswフラグ29)を更新するのみという簡易な処理での監視が可能となる。
特に、本実施の形態では、他のTPに属するタスクにも、読み出し権限のみであればアクセス権限を付与するようにしている。したがって、そのようなタスクが、他のTPに割り当てられた実行用メモリ11のページにアクセスできず、正常にその処理を実行することができなかった可能性があることを好適に検出することができる。
ここで、一定周期でタスクの実行が終了しているか否かを監視する方法として、個々のタスクにおいて一定周期で実行が終了しているか否かを監視する仕組みを作り込む方法も考えることもできる。しかしながら、そのようにした場合、タスクを生成するアプリケーションプログラムのそれぞれに対して独立して監視する仕組みを実装した場合には、アプリケーションプログラムが複雑になってしまうという問題があった。
それに対して、さらに、本実施の形態2では、タスクがその処理を実行終了してスリープするときに呼び出すAPI関数において、wai_pswフラグ29をOKに更新するようにしている。また、TPをスケジューリングするパーティションスケジューラ31において、TPの切り替え時にwai_pswフラグ29をNGに更新するとともに、TPの切り替え時にwai_pswフラグ29を更新する前にwai_pswフラグ29がNGとなっているかを検出するようにしている。
これによれば、タイム・パーティショニングを採用したマルチタスクシステムにおける既存の処理タイミングを利用して、監視する仕組みを実装することができる。すなわち、より簡易に、TPの時間内にタスクを実行終了することができているか否かを監視することが可能となる。
本実施の形態2では、TPの切り替え時に、切り替え先のTPに属するタスクに対応するwai_pswフラグ29をNGに更新するとともに、切り替え先のTPに属するタスクに対応するwai_pswフラグ29をNGに更新する(S20)前に、wai_pswフラグ29がNGとなっていることを検出して(S17でNo)、起床フラグ30をE_TMOUTに更新する(S19)ようにしているが、これに限られない。例えば、TPの切り替え時に、切り替え前のTPに属するタスクに対応するwai_pswフラグ29をNGに更新するとともに、その切り替え前のTPに属するタスクに対応するwai_pswフラグ29をNGに更新する前に、wai_pswフラグ29がNGとなっていることを検出して、起床フラグ30をE_TMOUTに更新するようにしてもよい。
本実施の形態2では、パーティションスケジューラが、wai_pswフラグ29がNGとなっていることを検出したときに(S17でNo)、起床フラグ30の更新のみを行うようにしているが(S19)、これに限られない。例えば、パーティションスケジューラが、wai_pswフラグ29がNGとなっていることを検出したときに、異常処置に対応する処理を即時実施するようにしてもよい。しかしながら、本実施の形態のように、起床フラグ30によってタスクにおいて異常を認識して、タスクからパーティションスケジューラに異常を通知する構成とすることで、その他の異常等をタスクからパーティションスケジューラに通知をする仕組みに統合することができ、より少ない変更量でより簡易に実装することが可能となる。
本実施の形態2では、wai_pswは、起床フラグ30がE_TMOUTの場合に、戻り値にE_TMOUTを設定してタスクをスリープさせるようにしているが、これに限られない。例えば、起床フラグ30がE_TMOUTの場合に、タスクをスリープさせずに、E_TMOUTを戻り値として即時復帰するようにしてもよい。このようにすることで、タスクによる異常処置の応答性を高めることができる。しかしながら、本実施の形態2のように、正常系と異常系とで処理を統一することによって、より少ない変更量でより簡易に実装することが可能となる。
発明の他の実施の形態.
本実施の形態では、TPのそれぞれに属するタスクが、それぞれ安全監視タスク24、32、通常制御タスク26、33及び安全制御タスク28、34である場合について例示したが、タスクの種類は、これに限られない。安全監視タスク24、通常制御タスク26及び安全制御タスク28に限られず、その他の任意の制御対象の制御に関する処理を実行するタスクを有するようにしてもよい。
例えば、図20に示すようなタスク35〜37を有するようにしてもよい。なお、この場合、安全制御装置は、アプリケーション101〜103に代えて、タスク35〜37に対応するアプリケーションを有する必要があるが、その点は自明であるため図示及び説明を省略する。
監視制御タスク35は、制御対象を制御する。具体的には、監視制御タスク35は、通常制御タスク36及び安全制御タスク37からの指令値に基づいて、制御対象のアクチュエータを制御する。通常制御タスク36は、制御対象に通常の機能・動作を行わせるための制御計算を行う。具体的には、通常制御タスク36は、通常制御におけるアクチュエータの制御計算をして、アクチュエータの指令値を算出する。通常制御タスク36は、算出した指令値を監視制御タスク35に出力する。安全制御タスク37は、機能安全を確保するために定められた制御計算を行う。具体的には、安全制御タスク37は、安全制御におけるアクチュエータの制御計算をして、アクチュエータの指令値を算出する。安全制御タスク37は、算出した指令値を監視制御タスク35に出力する。監視制御タスク35は、通常制御タスク36又は安全制御タスク37から出力された指令値に基づいてアクチュエータを制御する。
さらに、監視制御タスク35は、制御対象のセンサから、センサ値を取得する。監視制御タスク35は、取得したセンサ値を通常制御タスク36及び安全制御タスク37に出力する。通常制御タスク36及び安全制御タスク37のそれぞれは、監視制御タスク35から出力されたセンサ値に基づいて、アクチュエータの制御計算を行うようにしてもよい。
図20の例では、監視制御タスク35及び安全制御タスク37は、制御対象の監視や、機能安全を確保するために定められた制御計算等のように、制御対象の機能安全の確保に関する処理を実行するタスクとなる。それに対して、通常制御タスク36は、その他の制御対象の制御に関する処理を実行するタスクとなる。そのため、監視制御タスク35及び安全制御タスク37は、安全関連のタスクとなり、通常制御タスク36は、非安全関連のタスクとなる。
また、その他に、例えば、図21に示すようなタスク38〜40を有するようにしてもよい。なお、この場合、安全制御装置は、アプリケーション101〜103に代えて、タスク38〜40に対応するアプリケーションを有する必要があるが、その点は自明であるため図示及び説明を省略する。
監視タスク38は、制御対象のセンサから、センサ値を取得する。このセンサには、上述したように制御対象の姿勢を検知するための姿勢センサを含む。ここで説明する例では、制御対象として、人が搭乗することができる走行装置に適用した場合について説明する。この場合、監視タスク38は、搭乗者による重心移動を姿勢センサにより検知することができる。監視タスク38は、取得したセンサ値をHMI(Human Machine Interface)タスク40に出力する。
HMIタスク40は、監視タスク38から出力されたセンサ値に基づいて、制御対象のアクチュエータの制御計算をして、アクチュエータの指令値を算出する。HMIタスク40は、算出した指令値を制御タスク39に出力する。制御タスク39は、HMIタスク40から出力された指令値に基づいて、アクチュエータを制御する。
図21の例では、監視タスク38、HMIタスク40及び制御タスク39によって、制御対象の監視、それに応じた制御計算、制御計算結果に基づいた制御対象の制御を行うことで、状況によっては制御対象の機能安全の確保に関する処理を実行する。そのため、監視タスク38、HMIタスク40及び制御タスク39は、安全関連のタスクとなる。この場合には、TP1〜TP3以外のTP(図示せず)に属する、その他の制御対象の制御に関する処理を実行するタスクが、非安全関連のタスクとなる。
ここで、図21において説明した構成によれば、搭乗者の操作に応じて制御対象が制御されるというHMIを実現することができる。例えば、搭乗者が重心を前後に移動させることで制御対象が前後後退を行い、搭乗者が重心を左右に移動させることで制御対象が左右旋回を行うといった制御が可能となる。これについては、実施の形態1〜2及び図20によって説明した例についても同様のことが言える。具体的には、安全監視タスク24、32又は監視制御タスク35が取得したセンサ値に応じて、通常制御タスク26、33及び安全制御タスク28、34、もしくは、通常制御タスク36及び安全制御タスク37が同様の制御をすることで、HMIを実現することが可能である。また、本実施の形態2によれば、より安定した制御対象の制御を行うことが可能となる。そのため、以上に説明したように、人が搭乗することができる走行装置を制御対象として適用することで、より安全性を向上した制御対象の制御を行うことが可能となる。
なお、走行装置として、例えば、立ち乗り方の同軸二輪車とすることもできる。その場合は、アクチュエータを制御することで、車輪が回転動作をすることになる。また、安全制御装置自体も制御対象に搭載される構成としてもよい。
さらに、本発明は上述した実施の形態のみに限定されるものではなく、既に述べた本発明の要旨を逸脱しない範囲において種々の変更が可能であることは勿論である。
本実施の形態では、OSが、TP1〜TP3を有する場合について例示したが、TPの種類及び数は、これに限られない。スケジューリングパターンについても、本実施の形態に例示したものに限られない。
本実施の形態では、タスクの数が3つである場合について例示したが、タスクの数は、これに限られない。例えば、本実施の形態では、TPがTP1〜TP3の3つである場合について例示したが、TPの数を3つ以外の数とし、それぞれのTPが1つ以上の任意の数のタスクを有するようにしてもよい。
本実施の形態では、TP(RP)ごとに異なるアクセス権限を付与する場合について例示した。すなわち、本実施の形態では、同一のTPに属するタスクに対して同一のアクセス権限を付与する場合について例示したが、これに限られない。例えば、タスクごとに異なるアクセス権限を付与するようにしてもよい。この場合は、タスクごとにASIDが一意に定義されることになる。
本実施の形態では、タイム・パーティショニングを採用したマルチタスクOSについて例示したが、これに限られない。タイム・パーティショニングを採用していないマルチタスクOSに適用することもできる。この場合は、タスクごとにASIDが一意に定義されることになる。
本実施の形態では、他のTP(RP)のタスクによる読み出しのみのアクセスを可能とするメモリとして、揮発性メモリである実行用メモリ11を対象とした場合について例示したが、これに限られない。例えば、対象とするメモリは、不揮発性メモリ13であってもよい。また、対象とするメモリは、揮発性メモリ及び不揮発性メモリの組み合わせであってもよい。
本実施の形態では、MMUによってメモリ保護機能を実装する場合について例示したが、これに限られない。例えば、MPU(Memory Protection Unit)によってメモリ保護機能を実装するようにしてもよい。MPUによって実装する場合、仮想記憶管理機能を有していないため、MPUが有するTLBに相当するテーブルのエントリには、ASID、アドレス、そのASIDのタスクによるそのアドレスのページに対するアクセス権限等が設定されることになる。