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