(57)【特許請求の範囲】
【請求項１】
ネットワーク通信を行うネットワークコントローラと、
プログラムを記憶するメモリと、
上記メモリに記憶されたプログラムを実行するＣＰＵとを有し、
上記メモリに記憶されたプログラムを上記ＣＰＵで実行しながら、上記ネットワークコントローラを用いて、通信の優先順位を持ったメッセージの送受信処理を実行するリアルタイム分散システムにおいて、
複数の送受信メッセージを格納した前記ネットワークコントローラによって複数のメッセージ送受信処理を実行してネットワーク通信を行うネットワークドライバと、
扱う送受信メッセージのネットワーク通信の優先順位と、該送受信メッセージのネットワーク通信の優先順位に対応した上記ネットワークドライバの処理の優先順位を決定するネットワークドライバ優先順位管理部と、
上記ネットワークドライバの処理の優先順位にしたがって上記ネットワークドライバの処理を実行するスケジューリング部とを有するリアルタイム分散システム。
【請求項２】
ネットワーク通信を行うネットワークコントローラと、
プログラムを記憶するメモリと、
メモリに記憶されたプログラムを実行するＣＰＵとを有し、
上記メモリに記憶されたプログラムを上記ＣＰＵで実行しながら、上記ネットワークコントローラを用いて、通信の優先順位を持ったメッセージの送受信処理を実行するリアルタイム分散システムにおいて、
複数の送受信メッセージを記憶するメッセージ記憶部と、
上記メッセージ記憶部に記憶された複数のメッセージの送受信処理を、
上記ネットワークコントローラを用いて、実行してネットワーク通信を行うネットワークドライバと、
扱う送受信メッセージのネットワーク通信の優先順位と、該送受信メッセージのネットワーク通信の優先順位に対応した上記ネットワークドライバの処理の優先順位を決定するネットワークドライバ優先順位管理部と、
上記ネットワークドライバの処理の優先順位にしたがってネットワークドライバの処理を実行するスケジューリング部とを有するリアルタイム分散システム。
【請求項３】
ネットワーク通信を行うネットワークコントローラと、
プログラムを記憶するメモリと、
メモリに記憶されたプログラムを実行するＣＰＵとを有し、上記メモリに記憶されたプログラムを上記ＣＰＵで実行しながら、上記ネットワークコントローラを用いて、通信の優先順位を持ったメッセージの送受信処理を実行するリアルタイム分散システムにおいて、
複数の送受信メッセージを記憶するメッセージ記憶部と、
前記ネットワークコントローラを用いて、ネットワーク通信を行うネットワークドライバと、
上記メッセージ記憶部に記憶された複数のメッセージの送受信処理を、上記ネットワークドライバ手段を用いて実行する通信処理ライブラリと、
扱う送受信メッセージのネットワーク通信の優先順位と、該送受信メッセージのネットワーク通信の優先順位に対応した上記ネットワークドライバの処理の優先順位を決定するネットワークドライバ優先順位管理部と、
上記ネットワークドライバの処理の優先順位にしたがってネットワークドライバの処理を実行するスケジューリング部とを有するリアルタイム分散システム。
【請求項４】
上記ネットワークコントローラは複数のメッセージを記憶するための複数のメールボックスを有し、該複数のメールボックスに記憶されたメッセージを、上記メッセージの優先順位に応じてネットワーク通信を実行できる請求項１，請求項２または請求項３記載のリアルタイム分散システム。
【請求項５】
上記複数のメールボックスに対して、それぞれひとつの優先順位のメッセージを記憶する請求項４記載のリアルタイム分散システム。
【請求項６】
上記複数のメールボックスのひとつに対して、複数の優先順位のメッセージを記憶する請求項４記載のリアルタイム分散システム。
【請求項７】
上記ネットワークコントローラは、ＣＡＮプロトコルを処理するＣＡＮコントローラであり、上記ネットワーク通信の優先順位は上記メッセージのメッセージＩＤで指定される請求項１，請求項２または請求項３記載のリアルタイム分散システム。
【請求項８】
上記ネットワークドライバ手段は、メッセージ送信処理を行うメッセージ送信タスクと、メッセージ受信処理を行うメッセージ受信タスクとを有し、上記スケジューリング部は、上記ネットワークドライバの処理の優先順位にしたがって、上記メッセージ送信タスクとメッセージ受信タスクを実行する請求項１，請求項２または請求項３記載のリアルタイム分散システム。
【請求項９】
上記メッセージ記憶部は、ＯＳＥＫ−ＣＯＭプロトコルのメッセージを記憶する、メッセージオブジェクトである請求項２または請求項３記載のリアルタイム分散システム。
【請求項１０】
前記ネットワークドライバは、送信メッセージまたは受信メッセージを一時記憶するメッセージバッファを有し、
送信したメッセージまたは受信したメッセージは一旦該メッセージバッファに記憶した後、上記メッセージ記憶手段に記憶する請求項３乃至請求項５記載のリアルタイム分散システム。
【請求項１１】
上記ネットワークドライバ手段は、送信メッセージまたは受信メッセージを一時記憶するメッセージバッファを有し、上記メールボックスのひとつに記憶されるメッセージは、上記メッセージバッファのひとつに記憶する請求項４乃至請求項６記載のリアルタイム分散システム。
【請求項１２】
上記ネットワークドライバ手段は、送信メッセージまたは受信メッセージを一時記憶するメッセージバッファを有し、上記メールボックスの複数に記憶されるメッセージを、上記メッセージバッファのひとつに記憶する請求項４乃至請求項６記載のリアルタイム分散システム。
【請求項１３】
前記通信処理ライブラリ手段は、ＯＳＥＫ−ＣＯＭプロトコルにしたがい、メッセージ送信処理と、メッセージ受信処理を行うことを特徴とする請求項３記載のリアルタイム分散システム。
【請求項１４】
前記ネットワークドライバ手段は、メッセージ送信処理を行うメッセージ送信タスクと、メッセージ受信処理を行うメッセージ受信タスクとを含み、
前記スケジューリング手段は、前記ネットワークドライバの処理の優先順位にしたがって、前記メッセージ送信タスクとメッセージ受信タスクを、前記通信処理ライブラリ手段のメッセージ送信処理やメッセージ受信処理を実行するタスクとは別のタスクとして実行することを特徴とする請求項１３に記載のリアルタイム分散システム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はネットワーク接続されたリアルタイム分散システムに係り、特に、メッセージの送受信処理を、メッセージが与えられた優先度に従って処理を行うのに好適なリアルタイム分散システムに関する。
【０００２】
【従来の技術】
ネットワークによりメッセージを送受信する場合、ネットワーク通信をハードウェアで実現するネットワークコントローラと、ネットワークコントローラを用いてネットワーク通信を行うネットワークドライバを用いる。いま、ネットワークコントローラに設けられた送受信メッセージを格納するバッファをメールボックスと呼ぶことにする。例えば送信の場合、アプリケーションからネットワークドライバへの送信要求は送信要求キューに並べられる。ネットワークドライバは送信要求キューから送信要求を１つずつ取り出して、送信メッセージをメールボックスへ格納してネットワーク送信処理を行う。通常、送信要求キューはＦIFO でキューイングされるため、送信要求時間順にネットワーク送信処理が行われる。しかし、リアルタイム分散システムでは、メッセージに優先順位を付加し、優先順位に応じたネットワーク通信処理を行うことが望まれる。そこで、例えば、ＣＱ出版社刊、インターフェース（１９９４年，第１２号）、７２頁〜１４８頁に記載されているように、キューイングされている送信要求をアプリケーションが送信するメッセージの優先順位にしたがって入れ替えることにより、ネットワーク通信の優先順位制御を行う方式がある。これにより、ネットワークドライバは送信要求時間順ではなく、ネットワークドライバが送信要求キューから送信要求を取り出す時点での送信データの優先順位にしたがってネットワーク送信処理が行える。
【０００３】
【発明が解決しようとする課題】
しかしながら上記従来技術では、一旦ネットワークドライバが起動されて、ネットワーク送信処理が開始されると、現在ネットワーク送信処理中のデータよりも高い優先順位のメッセージに対して送信要求がなされても、現在のネットワーク送信処理が完了するまで、高い優先順位のメッセージはネットワーク送信処理が行えないという問題がある。
【０００４】
例えば、ネットワークコントローラが複数接続されたリアルタイム分散システムを考える。このリアルタイム分散システムは、メッセージに付加された優先順位によりネットワークの優先順位制御を行うネットワークを用いるとする。複数のネットワークコントローラがネットワークへメッセージを送信する場合、メッセージに付加された優先順位によりネットワークの優先順位制御が行われ、送信要求のなされたメッセージで最も高い優先順位のメッセージの送信要求を行ったネットワークコントローラがネットワークへメッセージを送信することができる。このとき、低い優先順位のメッセージの送信要求を行ったネットワークコントローラはネットワークへのメッセージ送信が遅れてしまう。このため、低い優先順位のメッセージのネットワーク送信処理が完了するまで、このネットワークコントローラが高い優先順位のメッセージのネットワーク送信処理を行えない場合、高い優先順位のメッセージのネットワーク送信処理はさらに遅れ、システムのリアルタイム性の保証に問題を生じる。
【０００５】
そこで本発明は、ネットワークドライバ処理の開始後においても送信要求のなされたメッセージで最も優先順位の高いメッセージを送信できる分散処理システムを提供することを目的とする。
【０００６】
【課題を解決するための手段】
上記目的は、複数の送受信メッセージを格納したネットワークコントローラによって複数のメッセージ送受信処理を実行してネットワーク通信を行うネットワークドライバと、扱う送受信メッセージのネットワーク通信の優先順位と、該送受信メッセージのネットワーク通信の優先順位に対応したネットワークドライバの処理の優先順位を決定するネットワークドライバ優先順位管理部と、ネットワークドライバの処理の優先順位にしたがって上記ネットワークドライバの処理を実行するスケジューリング部とを有するリアルタイム分散システムによって達成することができる。
【０００７】
また、上記目的は複数の送受信メッセージを記憶するメッセージ記憶部と、メッセージ記憶部に記憶された複数のメッセージの送受信処理を、ネットワークコントローラを用いて、実行してネットワーク通信を行うネットワークドライバと、扱う送受信メッセージのネットワーク通信の優先順位と、該送受信メッセージのネットワーク通信の優先順位に対応したネットワークドライバの処理の優先順位を決定するネットワークドライバ優先順位管理部と、ネットワークドライバの処理の優先順位にしたがってネットワークドライバの処理を実行するスケジューリング部とを有するリアルタイム分散システムによって達成することができる。
【０００８】
また、複数の送受信メッセージを記憶する記憶部と、ネットワークコントローラを用いて、ネットワーク通信を行うネットワークドライバと、メッセージ記憶部に記憶された複数のメッセージの送受信処理を、ネットワークドライバ手段を用いて実行する通信処理ライブラリと、扱う送受信メッセージのネットワーク通信の優先順位と、該送受信メッセージのネットワーク通信の優先順位に対応したネットワークドライバの処理の優先順位を決定するネットワークドライバ優先順位管理部と、ネットワークドライバの処理の優先順位にしたがってネットワークドライバの処理を実行するスケジューリング部とを有するリアルタイム分散システムによって達成することができる。
【０００９】
このような構成により、一旦ネットワークドライバが起動されてメッセージ送信処理のタスクが開始されても、現在送信処理中のメッセージよりも高い優先順位のメッセージに対して送信要求がなされた場合は、現在のネットワーク送信処理完了を待たずに、並列により優先順位の高いネットワークドライバの送信処理タスクを起動して、優先順位の高いメッセージの送信処理を先に行う。これにより、送信要求のなされたメッセージで最も優先順位の高いメッセージを送信できる。受信についても同様に、あるメッセージ受信タスクの処理中に、より優先順位の高いメッセージを受信したときは、より優先順位の高いネットワークドライバの受信処理タスクを起動して、先に受信処理を行う。これにより最も優先順位の高いメッセージから順に受信できる。
【００１０】
【発明の実施の形態】
（１）本発明の一実施例
（ａ）本発明の一実施例の全体構成
図１は本発明の一実施例であるリアルタイム分散システムの構成を示したものである。リアルタイム分散システムは制御ユニット２０００および２０６０がネットワーク２００５で接続されている。本発明のネットワークは、例えば、オープン・デバイスネット・ベンダー・アソシエーション（Open DeviceNet Vendor Association）社発行、デバイスネット（DeviceNet ）仕様書（ボリューム１（Volume 1），リリース２.０（Release2.0 ），１９９８年）、第２章２.１〜２.８に記載されているＣＡＮ（Controller Area Network）を用いる。制御ユニット２０００は、CPU2001 ，メモリ２００２，ＣＡＮコントローラ２００３で構成され、それらはバス２００４で接続されている。ＣＡＮコントローラ２００３は、ネットワーク２００５を介して、他の制御ユニット２０６０に内蔵される  ＣＡＮコントローラと接続されている。メモリ２００２には、アプリケーションプログラム２００６，ＯＳＥＫ−ＣＯＭ２００８，ＣＡＮドライバ２００９，ＯＳ２０５０が記憶されている。ここで、ＯＳＥＫ−ＣＯＭは、オー・エス・イー・ケイ（ＯＳＥＫ）発行、オー・エス・イー・ケイ／ブイ・ディー・エックスコミュニケーション（ＯＳＥＫ／ＶＤＸ Communication）仕様書（バージョン  ２.１（Version2.1），リビジョン１（revision1）、１９９８年）に記載されているＯＳＥＫ−ＣＯＭプロトコルを処理するプログラムである。CPU2001 は、メモリ２００２に記憶されているプログラムを読み出して、プログラム処理を実行する。OS2050は複数のタスクを並列して実行できるマルチタスク機能を持つ。  ＣＡＮコントローラ２００３は、ネットワーク２００５を介して、他の制御ユニット２０６０とのメッセージ送信，メッセージ受信を行うハードウェアである。以下、ＣＡＮコントローラ２００３，アプリケーションプログラム２００６，OSEK−COM2008，ＣＡＮドライバ２００９，OS2050 の順に詳細に説明する。
【００１１】
（ｂ）ＣＡＮコントローラ
まず、ＣＡＮコントローラについて詳細に説明する。ＣＡＮコントローラ2003が使用する通信プロトコルはＣＡＮプロトコルである。ＣＡＮプロトコルは、各メッセージに固有なメッセージＩＤを持たせる。メッセージＩＤには優先順位が割り当てられ、ネットワーク２００５の優先順位制御(バスアービトレーション)はメッセージＩＤの優先順位に基づいて行われる。メッセージＩＤによるバスアービトレーションについて説明する。例えば、制御ユニット２０００が、ネットワーク２００５を介して、制御ユニット２０００と同様な構成を持つ、複数の制御ユニットに接続された場合を考える。各制御ユニットが同時に、ネットワーク２００５へメッセージを送信する場合、各メッセージの内で、最も優先順位の高いメッセージＩＤを持つメッセージを送信する制御ユニットだけが、ネットワーク２００５の使用権を獲得して(バスアービトレーションに勝つ)、優先的にネットワーク２００５へメッセージを送信することができる。
【００１２】
次にＣＡＮコントローラの構成について詳細に説明する。ＣＡＮコントローラ２００３は、コントロールレジスタ２０２２，送信・受信メールボックス2023，優先順位制御部２０２４，送信バッファ２０２５，受信フィルタ２０２７，受信バッファ２０２６で構成される。以下、これらについて詳細に説明する。
【００１３】
送信・受信メールボックス２０２３について説明する。送信・受信メールボックス２０２３は、メールボックスａ２０２８，メールボックスｂ２０２９，メールボックスｃ２０３０等の複数のメールボックスで構成され、送信メッセージ，受信メッセージを格納する。図２は、メールボックスａ２０２８の詳細な構成図である。メールボックスａ２０２８は、メールボックス番号６００４，
MessageID6001，DataSize6002，Data6003 で構成される。メールボックス番号  ６００４は、送信・受信メールボックス２０２３の各メールボックスごとに固有に与えられるもので、メールボックス番号を記憶する領域である。
【００１４】
MessageID6001 は、送信メッセージ，受信メッセージのメッセージＩＤを記憶する領域である。メールボックスａ２０２８は、MessageID6001 を持つ送信メッセージ，受信メッセージのみを格納する。DataSize6002は、格納する送信メッセージ，受信メッセージのデータサイズを記憶する領域である。Data6003は、送信メッセージ，受信メッセージのデータ格納領域である。メールボックスｂ２０２９，メールボックスｃ２０３０の詳細な構成は、メールボックスａ２０２８と同様である。
【００１５】
図３は、コントロールレジスタ２０２２の詳細な構成図である。コントロールレジスタ２０２２は、メールボックス番号５００１，TXPR5002，TXACK5003，
RXPR5004，MBIMR5005 で構成される。メールボックス番号５００１は、各メールボックスごとに、メールボックス番号を記憶する領域である。TXPR5002は、各メールボックス番号ごとに、メッセージ送信要求を記憶する領域であり、ＣＡＮコントローラ２００３にメッセージ送信を要求するときに、ビットセットする。  TXACK5003 は、各メールボックス番号ごとに、メッセージ送信完了を記憶する領域であり、ＣＡＮコントローラ２００３がメッセージ送信を完了したときに、ビットセットされる。RXPR5004は、各メールボックス番号ごとに、メッセージ受信完了を記憶する領域であり、ＣＡＮコントローラ２００３がメッセージ受信を完了したときに、ビットセットされる。MBIMR5005 は、各メールボックス番号ごとに、メッセージ送信完了時、または、メッセージ受信完了時の割り込み禁止を記憶する領域であり、メッセージ送信完了時、または、メッセージ受信完了時の、ＣＡＮコントローラ２００３からCPU2001 への割り込みを禁止するときに、ビットセットする。
【００１６】
優先順位制御部２０２４は、メッセージ送信要求が発生したときに、対応するメールボックスのメッセージを、送信バッファ２０２５へ転送する。また、同時に複数のメッセージ送信要求が発生したとき、対応する各メールボックスに格納されているメッセージＩＤを比較して、最も優先順位の高いメッセージＩＤを格納しているメールボックスのメッセージを、送信バッファ２０２５へ転送する。送信バッファ２０２５は、優先順位制御部２０２４から転送されたメッセージを格納する。格納されたメッセージは、メッセージＩＤによるバスアービトレーションに参加する。メッセージＩＤによるバスアービトレーションに勝った場合、メッセージはネットワーク２００５へ送信される。メッセージＩＤによるバスアービトレーションに負けた場合、メッセージはネットワーク２００５へ送信されず、次のバスアービトレーションの機会を待つ。メッセージＩＤによるバスアービトレーションに負けた場合、かつ、より優先順位の高いメッセージＩＤを持つメッセージに対してメッセージ送信要求が発生している場合、優先順位制御部２０２４は、より優先順位の高いメッセージＩＤを格納しているメールボックスのメッセージを、送信バッファ２０２５へ転送する。
【００１７】
受信バッファ２０２６は、ネットワーク２００５からの受信メッセージを格納する。
【００１８】
受信フィルタ２０２７は、受信バッファ２０２６に格納されたメッセージのメッセージＩＤと、各メールボックスに登録されたメッセージＩＤを比較して、同一のメッセージＩＤがあれば対応するメールボックスヘメッセージを格納する。
次に、メモリ２００２に記憶されている、アプリケーションプログラム2006，OSEK−COM2008 ，ＣＡＮドライバ２００９，OS2050について詳細に説明する。
【００１９】
（ｃ）アプリケーションプログラム
アプリケーションプログラムについて説明する。アプリケーションプログラム２００６は、図１に示すように、APa2012，APb2013，APc2014 等の複数のアプリケーションプログラムで構成される。本実施例ではこれらのアプリケーションプログラムはそれぞれ別のタスクとして実行される。
【００２０】
（ｄ）ＯＳＥＫ−ＣＯＭ
次にＯＳＥＫ−ＣＯＭの構成について詳細に説明する。OSEK−COM2008 は、メッセージオブジェクトａ２０１５，メッセージオブジェクトｂ２０１６，メッセージオブジェクトｃ２０１７等の複数のメッセージオブジェクト，メッセージ送信処理２０１０，メッセージ受信処理２０１１で構成される。なお、本実施例で用いられるメッセージには、Queuedメッセージ，Unqueuedメッセージの２種類がある。Queuedメッセージは、キューイングが必要で上書き不可能なメッセージである。Unqueuedメッセージは、キューイングが不要で、上書き可能なメッセージである。
【００２１】
図４は、メッセージオブジェクトａ２０１５の詳細な構成図を示したものである。メッセージオブジェクトａ２０１５は、sMsgObj3001，Status3007,Data3008，Buffer3009，sMsgNetParams3013，sQueuedMsgInfo3018，sQueuedMsgObjA3022 ，sQueuedMsgObjB3030等の複数のｓQueuedMsgObj，Status3024，Status3032等の複数のStatus，FIFOBufferA3029，FIFOBufferB3037等の複数のFIFOBuffer，NULL3011，NULL3038等の複数のＮＵＬＬ、で構成される。
【００２２】
Status3007は、sMsgObj の状態（送信状態，バッファの空き状態）を記憶する領域である。Status3024は、sQueuedMsgObjA3022の状態（バッファの空き状態）を記憶する領域である。Status3032は、sQueuedMsgObjB3030の状態（バッファの空き状態）を記憶する領域である。Data3008は、メッセージのデータを記憶する領域である。Buffer3009は、メッセージがUnqueuedメッセージの場合(３０１２)、Data3008のバッファである。FIFOBufferA3029は、メッセージがQueued メッセージの場合（３０１２）、Data3008のバッファである。FIFOBufferB3037 は、メッセージがQueuedメッセージの場合（３０１２）、Data3008のバッファである。
sMsgObj3001は、Size3002，StatusRef3003，DataRef3004，
sQueuedMsgInfoRef3005，sMsgNetParamsRef3006で構成される。Size3002 は、メッセージのデータサイズを記憶する領域である。StatusRef3003は、Status3007 へのポインタである。DataRef3004は、Data3008へのポインタである。
【００２３】
sQueuedMsgInfoRef3005は、メッセージがQueuedメッセージの場合、
sQueuedMsgInfo3018へのポインタである。sQueuedMsgInfoRef3005 は、メッセージがUnqueuedメッセージの場合、NULL3011へのポインタである。
【００２４】
sMsgNetParamsRef3006は、メッセージ送信、または、メッセージ受信が、ネットワーク２００５経由の場合、sMsgNetParams3013 へのポインタである。
【００２５】
sMsgNetParamsRef3006は、メッセージ送信、または、メッセージ受信が、ネットワーク２００５経由でない場合、NULL3011へのポインタである。
【００２６】
sMsgNetParams3013は、TransferDir3014，TransferMode3015，TimePeriod3016，Handle3017で構成される。TransferDir3014 は、メッセージが送信メッセージであるか、メッセージが受信メッセージであるかを記憶する領域である。
【００２７】
TransferMode3015は、Periodicalメッセージ送信を利用するか、Periodicalメッセージ送信を利用しないかを記憶する領域である。Periodicalメッセージ送信を利用すると、アプリケーションプログラムは周期時間ごとにメッセージ送信が行える。TimePeriod3016は、Periodicalメッセージ送信を利用する場合、その周期時間を記憶する領域である。Handle3017は、メッセージのメッセージＩＤを記憶する領域である。
【００２８】
sQueuedMsgInfo3018は、QueueDepth3019，NRec3020，sQueuedMsgObjRef3021で構成される。QueueDepth3019は、FIFOBufferのキューイング深さつまり、メモリの使用領域を記憶する領域である。NRec3020は、メッセージオブジェクト利用者数を記憶する領域である。例えば、APa2012，APb2013の２つのアプリケーションプログラムが、１つのメッセージオブジェクトａ２０１５を利用する場合、
NRec3020は２となる。図４は、NRec3020が２の場合を示しており、メッセージオブジェクトａ２０１５は、２つのsQueuedMsgObj(３０２２，３０３０）、２つのStatus（３０２４，３０３２）、２つのFIFOBuffer（３０２９，３０３７）を持つ構成となる。sQueuedMsgObjRef3021は、sQueuedMsgObjへのポインタである。  sQueuedMsgObjの構成について、sQueuedMsgObjＡ３０２２を例として説明する。sQueuedMsgObjA3022は、StatusRef3023，BoundaryDataRef3025，
WriteDataRef3026，ReadDataRef3027，sQueuedMsgObjRef3028で構成される。
【００２９】
StatusRef3023は、Status3024へのポインタである。BoundaryDataRef3025は、FIFOBufferA3029の先頭アドレスである。WriteDataRef3026は、FIFOBufferA3029の書き込みアドレスである。ReadDataRef3027は、FIFOBufferA3029の読み出しアドレスである。sQueuedMsgObjRef3028は、sQueuedMsgObjB3030へのポインタである。sQueuedMsgObjB3030の構成は、sQueuedMsgObjA3022の構成と同様である。ただし、sQueuedMsgObjRef3036はNULL3038へのポインタである。
【００３０】
次にＯＳＥＫ−ＣＯＭの動作について説明する。まずＯＳＥＫ−ＣＯＭのメッセージ送信処理２０１０について詳細に説明する。メッセージ送信処理２０１０は、各アプリケーションプログラムが、OSEK−COM2008 を用いて実際のメッセージ送信を行うためのプログラムである。本実施例では、ＯＳＥＫ−ＣＯＭのメッセージ送信処理は、それを呼び出したアプリケーションプログラムのタスクで実行される。図５は、メッセージ送信処理２０１０の流れを示すフローチャートである。図５を用いて、メッセージ送信処理２０１０について説明する。例えば、APa2012 が、メッセージオブジェクトａ２０１５，メールボックスａ２０２８を利用して、メッセージ送信を行うとする。
【００３１】
まずステップ１００で、APa2012 は、メッセージ送信で利用するメッセージオブジェクトａ２０１５を決定する。
【００３２】
ステップ１０１では、sMsgNetParamsRef3006を参照して、メッセージ送信がユニット内の通信か、ネットワーク２００５経由であるかを判定する。
【００３３】
ユニット内の通信の場合、ステップ１０２で、APa2012 が送信するメッセージのデータを、Data3008に書き込む。
【００３４】
送信するメッセージがUnqueuedメッセージの場合、Data3008をBuffer3009に書き込む。
【００３５】
送信するメッセージがQueuedメッセージの場合、Data3008をFIFOBuffer（3029，３０３７）に書き込む。
【００３６】
メッセージ送信がユニット内の通信でない場合、すなわち、ネットワーク経由の通信の場合、ステップ１０３で、TransferDir3014 を参照して、送信するメッセージが送信メッセージであるか判定する。
【００３７】
次にステップ１０４で、送信するメッセージがQueuedメッセージであるか判定する。
【００３８】
送信するメッセージがQueuedメッセージの場合、ステップ１０５で、Queuedメッセージ送信処理を行う。
【００３９】
送信するメッセージがUnqueuedメッセージの場合、ステップ１０６で、
Unqueuedメッセージ送信処理を行う。
【００４０】
図６は、図５のステップ１０２の処理詳細を示すフローチャートである。図６を用いて、ステップ１０２を説明する。
【００４１】
まずステップ２００で、APa2012 が送信するメッセージのデータを、Data3008に書き込む。
【００４２】
ステップ２０１では、送信するメッセージがUnqueuedメッセージの場合、
Data3008をBuffer3009に書き込む。
【００４３】
送信するメッセージがQueuedメッセージの場合、Data3008をFIFOBuffer（3029，３０３７）に書き込む。
【００４４】
図７は、図６のステップ２０１の処理詳細を示すフローチャートである。図７を用いて、ステップ２０１を説明する。
【００４５】
まずステップ３００で、送信するメッセージがQueuedメッセージであるか判定する。
【００４６】
送信するメッセージがQueuedメッセージである場合、ステップ３０１で、
Data3008をFIFOBuffer（３０２９，３０３７）へ書き込む。
【００４７】
送信するメッセージがQueuedメッセージでない場合、まずステップ３０２で  DataRef3004，Size3002 を参照して、Buffer3009の書き込みアドレスを決定する。次にステップ３０３で、Data3008をBuffer3009へ書き込む。
【００４８】
図８は、図７のステップ３０１の処理詳細を示すフローチャートである。図８を用いて、ステップ３０１を説明する。
【００４９】
まずステップ４００で、Size3002を参照して、送信するメッセージのデータサイズを決定する。
【００５０】
ステップ４０１では、DataRef3004を参照して、Data3008 のアドレスを決定する。
【００５１】
ステップ４０２では、sQueuedMsgObjRef3021を参照して、sQueuedMsgObjA3022のアドレスを決定する。
【００５２】
次にステップ４０３の条件が成立する間、すなわち、上記決定したアドレスがＮＵＬＬでない間、ステップ４０４からステップ４１１の手順を繰り返し、
Data3008をFIFOBuffer（３０２９，３０３７）へ書き込む。Data3008から
FIFOBufferA3029 への書き込みを例に、ステップ４０４からステップ４１１を説明する。
【００５３】
ステップ４０４では、FIFOBufferA3029があふれているか判定する。
【００５４】
あふれている場合は、ステップ４０５で、Status３０２４に、
FIFOBufferA3029があふれていることを示す値を書き込む。
【００５５】
あふれていない場合は、まずステップ４０６で、WriteDataRef3026を参照して、Data3008をFIFOBufferA3029へ書き込む。
【００５６】
次にステップ４０７で、WriteDataRef3026を更新する。
【００５７】
ステップ４０８では、LIMIT4007 を参照して、バッファａ２０１８があふれているか判定する。
【００５８】
あふれている場合はステップ４０９で、Status3024に、バッファａ２０１８があふれていることを示す値を書き込む。
【００５９】
あふれていない場合はステップ４１０で、Status3024に、バッファａ２０１８があふれていないことを示す値を書き込む。
【００６０】
ステップ４１１では、sQueuedMsgObjRef3028を参照して、sQueuedMsgObjB3030のアドレスを決定する。
【００６１】
図９は、図５のステップ１０５の処理詳細を示すフローチャートである。図９を用いて、ステップ１０５を説明する。
【００６２】
まずステップ５００で、TransferMode3015を参照して、Periodicalメッセージ送信を利用するか判定する。
【００６３】
Periodicalメッセージ送信を利用する場合は、ステップ５０１で
TimePeriod3016を参照して、Periodicalメッセージ送信を行う。
【００６４】
Periodicalメッセージ送信を利用しない場合は、まずステップ５０２で、
Size3002を参照して、送信するメッセージのデータサイズを決定する。
【００６５】
次にステップ５０３で、DataRef3004 を参照して、Data3008のアドレスを決定する。
【００６６】
ステップ５０４では、Handle3017を参照して、送信するメッセージのメッセージＩＤを決定する。
【００６７】
ステップ５０５では、ＣＡＮドライバの送信処理２０３２を呼び出し、ＣＡＮコントローラ２００３を用いて、ネットワーク２００５へメッセージを送信する。この呼び出しにより、ＣＡＮドライバの送信処理のタスクが起動されるが、その処理内容については後述する。
【００６８】
ステップ５０６では、ステップ５０５のリターンパラメータから、Data6003に送信するメッセージを書き込めたか判定する。
【００６９】
書き込めた場合には、まずステップ５０７で、APa2012 が送信するメッセージのデータを、Data3008に書き込む。
【００７０】
次にステップ５０８で、Data3008をFIFOBuffer（３０２９，３０３７）へ書き込む。
【００７１】
図１０は、図５のステップ１０６の処理詳細を示すフローチャートである。図１０を用いて、ステップ１０６を説明する。
【００７２】
まずステップ７００で、TransferMode3015を参照して、Periodicalメッセージ送信を利用するか判定する。
【００７３】
Periodicalメッセージ送信を利用する場合には、ステップ７０１で、
TimePeriod3016を参照して、Periodicalメッセージ送信を行う。
【００７４】
Periodicalメッセージ送信を利用しない場合には、まずステップ７０２で、  Size3002を参照して、送信するメッセージのデータサイズを決定する。
【００７５】
次にステップ７０３で、DataRef3004を参照して、Data3008 のアドレスを決定する。
【００７６】
ステップ７０４では、Handle3017を参照して、送信するメッセージのメッセージＩＤを決定する。
【００７７】
ステップ７０５では、ＣＡＮコントローラ２００３を用いて、ネットワーク  ２００５へメッセージを送信する。
【００７８】
ステップ７０６では、ステップ７０５のリターンパラメータから、Data6003に送信するメッセージを書き込めたか判定する。
【００７９】
書き込めた場合には、まずステップ７０７で、APa2012 が送信するメッセージのデータを、Data3008に書き込む。
【００８０】
次にステップ７０８で、Data3008をBuffer3009へ書き込む。
【００８１】
次に、ＯＳＥＫ−ＣＯＭのメッセージ受信処理２０１１について詳細に説明する。メッセージ受信処理２０１１は、各アプリケーションプログラムが、OSEK−COM2008 を用いて実際のメッセージ受信を行うためのプログラムである。本実施例では、ＯＳＥＫ−ＣＯＭのメッセージ受信処理は、それを呼び出したアプリケーションプログラムのタスクで実行されるものとする。図１１は、メッセージ受信処理２０１１の流れを示すフローチャートである。図１１を用いて、メッセージ受信処理２０１１について説明する。例えば、APa2012 が、メッセージオブジェクトａ２０１５，バッファａ２０１８，メールボックスａ２０２８を利用して、メッセージ受信を行うとする。また、APa2012が受信するメッセージは、CANコントローラ２００３によって、メールボックスａ２０２８へ格納され、ＣＡＮドライバのメッセージ送信・受信完了割り込み処理２０３４によって、バッファ  ａ２０１８へ格納されているとする。
【００８２】
まず、ステップ９００で、APa2012 は、メッセージ受信で利用するメッセージオブジェクトａ２０１５を決定する。
【００８３】
次にステップ９０１で、TransferDir3014 を参照して、受信するメッセージが受信メッセージであるか判定する。
【００８４】
受信メッセージの場合、まずステップ９０２で、DataRef3004 を参照して、
Data3008のアドレスを決定する。
【００８５】
ステップ９０３では、Handle3017を参照して、受信するメッセージのメッセージＩＤを決定する。
【００８６】
ステップ９０４は、ＣＡＮドライバの受信処理２０３３を呼び出し、この呼び出しにより、ＣＡＮドライバの受信処理のタスクが起動されるが、その処理内容については後述する。バッファａ２０１８からData3008へ受信するメッセージのデータを書き込む。
【００８７】
ステップ９０５では、ステップ９０４のリターンパラメータから、バッファ  ａ２０１８からData3008へ受信するメッセージのデータを書き込めたか判定する。
【００８８】
書き込めた場合には、ステップ９０６で、受信するメッセージがUnqueuedメッセージの場合（３０１２）、Data3008をBuffer3009へ書き込む。
【００８９】
受信するメッセージがQueuedメッセージの場合（３０１２）、Data3008をFIFOBuffer（３０２９，３０３７）へ書き込む。
【００９０】
最後にステップ９０７で、メッセージオブジェクトａ２０１５からAPa2012 へデータを読み込む。
【００９１】
図１２は、図１１のステップ９０７の処理詳細を示すフローチャートである。図１２を用いて、ステップ９０７を説明する。
【００９２】
まずステップ１１００で、Size3002を参照して、受信メッセージのデータサイズを決定する。
【００９３】
次にステップ１１０１で、受信するメッセージがQueuedメッセージであるか判定する。
【００９４】
Queuedメッセージである場合、まずステップ１１０２で、
sQueuedMsgObjRef3021を参照して、sQueuedMsgObjA3022のアドレスを決定する。
次にステップ１１０３で、Status3024を参照して、FIFOBufferA3029 に受信メッセージがあるか判定する。
【００９５】
受信メッセージがある場合、まずステップ１１０４で、ReadDataRef3027 を参照して、FIFOBufferA3029からAPa2012へ受信データを読み込む。
【００９６】
次にステップ１１０５で、ReadDataRef3027を更新する。
【００９７】
そしてステップ１１０６で、FIFOBufferA3029は空か判定する。
【００９８】
空であればステップ１１０７で、Status３０２４に、FIFOBufferA3029 は空であることを示す値を格納する。
【００９９】
空でなければステップ１１０８で、Status3024 に、FIFOBufferA3029は空でないことを示す値を格納する。
【０１００】
ステップ１１０１の判定で、Queuedメッセージでない場合、まずステップ1109で、DataRef3004，Size3002 を参照して、Buffer3009の読み込みアドレスを決定する。
【０１０１】
次にステップ１１１０で、Buffer3009からAPa2012 へ受信データを読み込む。
そしてステップ１１１１で、Status3007に、Buffer3009は空であることを示す値を格納する。
【０１０２】
（ｅ）ＣＡＮドライバ
次にＣＡＮドライバ２００９について詳細に説明する。まずＣＡＮドライバの構成について説明する。ＣＡＮドライバ２００９は、図１に示すように、バッファ２０３１，メッセージ属性テーブル２０２１，メッセージ送信処理２０３２，メッセージ受信処理２０３３，メッセージ送信・受信完了割り込み処理２０３４で構成される。
【０１０３】
バッファ２０３１は、バッファａ２０１８，バッファｂ２０１９，バッファ  ｃ２０２０等の複数のバッファで構成される。バッファ２０３１を構成するバッファの数は、送信・受信メールボックス２０２３を構成するメールボックスの数だけ用意し、各バッファは、各メールボックスの専用バッファとする。例えば、メールボックスａ２０２８の専用バッファをバッファａ２０１８とした場合、バッファは、Data6003と同様の、メッセージのデータ格納領域である。
【０１０４】
図１３は、メッセージ属性テーブル２０２１の詳細な構成図である。メッセージ属性テーブル２０２１は、メールボックス番号４００１，MessageID4002，DataSize4003，QUEUED4004，LOCKED4005，NOMSG4006，LIMIT4007で構成される。メールボックス番号４００１は、各メールボックスのメールボックス番号を記憶する領域である。MessageID4002 は、各メールボックス番号ごとに、メールボックスに登録されたメッセージＩＤを記憶する領域である。DataSize4003は、各メールボックス番号ごとに、メールボックスに登録されたメッセージのデータサイズを記憶する領域である。MessageID4002，DataSize4003 は、例えば、メールボックスａ２０２８を構成するMessageID6001，DataSize6002 と同様の記憶領域である。QUEUED4004は、各メールボックス番号ごとに、メッセージがQueuedメッセージであるか、Unqueuedメッセージであるかを記憶する領域である。メッセージがQueuedメッセージである場合にビットセットされる。LOCKED4005は、各メールボックス番号ごとに、メールボックスに格納されたメッセージが、メッセージ送信要求を受けて、ネットワーク２００５へのメッセージ送信を実行中であるか、メッセージ送信要求を受けておらず、ネットワーク２００５へのメッセージ送信を行っていないかを記憶する領域である。LOCKED4005は、メールボックスに格納されたメッセージが、メッセージ送信要求を受けて、ネットワーク２００５へのメッセージ送信を実行中である場合にビットセットされる。NOMSG4006 は、各メールボックス番号ごとに、バッファ２０３１に受信メッセージが貯まっているか、受信メッセージが貯まっていないかを記憶する領域である。NOMSG4006 は、バッファ２０３１に受信メッセージが貯まっていない場合にビットセットされる。LIMIT4007 は、各メールボックス番号ごとに、バッファ２０３１に受信メッセージが限度まで貯まっているか、受信メッセージが限度まで貯まっていないかを記憶する領域である。LIMIT4007 は、バッファ２０３１の各バッファに受信メッセージが限度まで貯まっている場合にビットセットされる。本実施例ではQueuedメッセージ，Unqueuedメッセージを扱うため、例えば、バッファ２０３１にQueuedメッセージをキューイングするＦＩＦＯバッファ等を設ける必要がある。
【０１０５】
Unqueuedメッセージは、キューイングが不要なメッセージである。バッファ2031の各バッファをＦＩＦＯバッファとして実装した場合、ＦＩＦＯバッファあふれのときにLIMIT4007 はビットセットされる。
【０１０６】
次にＣＡＮドライバの動作について説明する。ＣＡＮドライバの処理は、アプリケーションプログラムやＯＳＥＫ−ＣＯＭとは別のタスクで実行される。まずＣＡＮドライバのメッセージ送信処理２０３２について詳細に説明する。本実施例では、ＯＳＥＫ−ＣＯＭが、図９のステップ５０５により、ＣＡＮドライバのメッセージ送信処理を呼び出すと、ＣＡＮドライバのメッセージ送信処理タスクが起動される。ＣＡＮドライバのメッセージ送信処理の呼び出しが複数発生すると、それらに対応して複数のタスクが起動される。
【０１０７】
図１４は、ＣＡＮドライバのメッセージ送信処理２０３２の処理詳細を示すフローチャートである。図１４を用いて、ＣＡＮドライバの送信処理を説明する。まずステップ６００で、メッセージ属性テーブル２０２１を用いて、送信するメッセージのメッセージＩＤから、メールボックス番号を決定する。
【０１０８】
次にステップ６０１で、LOCKED4005にビットセットされているか判定する。ビットセットされている場合は、ステップ６０２で、リターンパラメータに、
Data6003に送信するメッセージを書き込めなかったことを示す値を格納する。
【０１０９】
ビットセットされていない場合は、まずステップ６０３で、LOCKED4005にビットセットする。
【０１１０】
次にステップ６０４で、APa2012が送信するメッセージのデータをData6003 に書き込む。
【０１１１】
そしてステップ６０５で、TXPR5002にビットセットして、ＣＡＮコントローラ２００３にネットワーク２００５へのメッセージ送信を要求する。
【０１１２】
ステップ６０６では、リターンパラメータに、Data6003に送信するメッセージを書き込めたことを示す値を格納する。
【０１１３】
以上の処理が終了すると、ＣＡＮドライバのメッセージ送信タスクは終了する。
【０１１４】
次にＣＡＮドライバのメッセージ受信処理２０３３について詳細に説明する。本実施例では、ＯＳＥＫ−ＣＯＭが図１１のステップ９０４によりＣＡＮドライバのメッセージ受信処理を呼び出すと、ＣＡＮドライバの受信処理タスクが起動される。ＣＡＮドライバのメッセージ受信処理の呼び出しが複数発生すると、それらに対応して複数のタスクが起動される。
【０１１５】
図１５は、ＣＡＮドライバのメッセージ受信処理２０３３の処理詳細を示すフローチャートである。図１５を用いて、ＣＡＮドライバの受信処理を説明する。
まずステップ１０００で、メッセージ属性テーブル２０２１を用いて、受信するメッセージのメッセージＩＤから、メールボックス番号を決定する。
【０１１６】
ステップ１００１では、MBIMR5005にビットセットする。
【０１１７】
ステップ１００２では、NOMSG4006にビットセットされているか判定する。
【０１１８】
ステップ１００２の判定においてビットセットされている場合は、ステップ  １００３で、リターンパラメータに、バッファａ２０１８に受信するメッセージが書き込まれていないことを示す値を格納する。
【０１１９】
ステップ１００２の判定においてビットセットされていない場合は、まずステップ１００４で、LIMIT4007 にビットセットされているか判定する。
【０１２０】
ステップ１００４の判定においてビットセットされている場合は、まずステップ１００５で、リターンパラメータには、バッファａ２０１８があふれていることを示す値を格納する。
【０１２１】
次にステップ１００６で、LIMIT4007をクリアする。
【０１２２】
ステップ１００４の判定においてビットセットされていない場合は、ステップ１００７で、リターンパラメータには、バッファａ２０１８があふれていないことを示す値を格納する。
【０１２３】
そしてステップ１００８では、バッファａ２０１８からData3008へ受信するメッセージのデータを書き込む。
【０１２４】
ステップ１００９では、NOMSG4006 にビットセットする。
【０１２５】
ステップ１０１０では、MBIMR5005 をクリアする。
【０１２６】
以上の処理が終了すると、ＣＡＮドライバのメッセージ受信タスクは終了する。
【０１２７】
次に、ＣＡＮドライバのメッセージ送信・受信完了割り込み処理２０３４について詳細に説明する。図１６は、メッセージ送信・受信完了割り込み処理2034の処理詳細を示すフローチャートである。図１６を用いて、メッセージ送信・受信完了割り込み処理について説明する。
【０１２８】
まずステップ８００で、ＣＡＮコントローラ２００３は、メッセージ送信完了割り込みか判定する。
【０１２９】
メッセージ送信完了割り込みである場合は、ステップ８０１の条件が成立する間、すなわち、ＣＡＮコントローラ２００３のメールボックス数だけ、メールボックス番号の小さいものから順番に、ステップ８０２からステップ８０４の手順を繰り返して実行する。
【０１３０】
ステップ８０２で、TXACK5003 にビットセットされているか判定する。
【０１３１】
ビットセットされている場合は、まずステップ８０３で、LOCKED4005をクリアする。
【０１３２】
次にステップ８０４で、TXACK5003 をクリアする。
【０１３３】
ステップ８０５では、メッセージ送信完了割り込みフラグをクリアする。
【０１３４】
ステップ８０６で、ＣＡＮコントローラ２００３は、メッセージ受信完了割り込みか判定する。
【０１３５】
メッセージ受信完了割り込みである場合は、ステップ８０７の条件が成立する間、すなわち、ＣＡＮコントローラ２００３のメールボックス数だけ、メールボックス番号の小さいものから順番に、ステップ８０８からステップ８１５の手順を繰り返して実行する。
【０１３６】
ステップ８０８で、RXPR5004にビットセットされているか判定する。
【０１３７】
ビットセットされている場合は、ステップ８０９で、QUEUED4004にビットセットされているか判定する。
【０１３８】
ステップ８０９の判定で、ビットセットされている場合は、ステップ８１０で、NOMSG4006にビットセットされているか判定する。
【０１３９】
ステップ８１０の判定で、ビットセットされている場合は、ステップ８１１で、メールボックスａ２０２８からバッファａ２０１８へ受信メッセージを書き込む。
【０１４０】
ステップ８１０の判定で、ビットセットされていない場合は、ステップ８１２で、LIMIT4007にビットセットする。
【０１４１】
ステップ８０９の判定で、ビットセットされていない場合は、ステップ８１３で、メールボックスａ２０２８からバッファａ２０１８へ受信メッセージを書き込む。
【０１４２】
ステップ８１４では、NOMSG4006をクリアする。
【０１４３】
ステップ８１５では、RXPR5004をクリアする。
【０１４４】
（ｆ）ＯＳ
次にOS2050について詳細に説明する。OS2050は、タスク優先順位管理テーブル２０５１とタスクのスケジューリングを行うスケジューラ２０５２を持つ。タスク優先順位管理テーブル２０５１を用いたスケジューラ２０５２のタスクスケジューリングの方法について説明する。
【０１４５】
図１７は、タスク優先順位管理テーブルの構成図である。図１７を用いて、タスク優先順位管理テーブルの構成について説明する。タスク優先順位管理テーブルは、メッセージのメッセージID1200とタスク優先順位１２０１で構成される。例えば、メッセージＩＤの優先順位が１００，２００，３００の順で高いとすると、メッセージＩＤの優先順位に対応して、そのメッセージを処理するタスクの優先順位も１，２，３の順で高くなるように、タスク優先管理テーブルをあらかじめ設定しておく。スケジューラ２０５２は、タスク優先順位管理テーブル2051を参照して、タスク優先順位が高いタスクを優先的に起動する。
【０１４６】
本実施例では、OSEK−COM2008 からの呼び出しにより、ＣＡＮドライバ2009のメッセージ送信処理２０３２やメッセージ受信処理２０３３のタスクが起動される。ＣＡＮドライバ２００９のメッセージ送信処理２０３２のタスク起動により、送信・受信メールボックス２０２３に送信メッセージを格納して、ＣＡＮコントローラ２００３にネットワーク２００５への送信要求ができるとする。
【０１４７】
メッセージＩＤが３００のメッセージを送信する、ＣＡＮドライバのメッセージ送信処理タスクを起動する場合、スケジューラ２０５２は、タスク優先順位管理テーブル２０５１を参照して、そのタスクを優先順位３で起動する。起動されたタスクは、ＣＡＮドライバ２００９を用いて、送信・受信メールボックス2023に送信メッセージを格納して、ＣＡＮコントローラ２００３にネットワーク2005への送信を要求する。
【０１４８】
メッセージＩＤが３００のメッセージを送信する、ＣＡＮドライバのメッセージ送信処理タスクが起動中に、メッセージＩＤが１００のメッセージを送信する、ＣＡＮドライバのメッセージ送信処理タスクを後から起動する場合、スケジューラ２０５２は、タスク優先順位管理テーブル２０５１を参照して、そのタスクを優先順位１で起動すると同時に、優先順位３で起動中のタスクを一時待機させる。これにより、メッセージＩＤが３００のメッセージより先に、メッセージ  ＩＤが１００のメッセージを送信・受信メールボックス２０２３に格納して、  ＣＡＮコントローラ２００３にネットワーク２００５への送信を要求できる。
【０１４９】
ＣＡＮドライバのメッセージ受信処理タスクも同様に、受信したメッセージ  ＩＤに応じた優先順位で起動される。
【０１５０】
本発明によれば、あるＣＡＮドライバのメッセージ送信処理タスクが、ＣＡＮコントローラのメールボックスへメッセージを格納して、ネットワークへのメッセージ送信要求を実行中であっても、後から起動された別のＣＡＮドライバのメッセージ送信処理タスクが、優先順位の高いメッセージをＣＡＮコントローラのメールボックスへ格納して、ネットワークへのメッセージ送信要求を実行することができる。これにより、最高優先順位のメッセージを常に最高優先順位で送信することができ、メッセージ送信のリアルタイム性を向上させることができる。また本発明によれば、あるＣＡＮドライバのメッセージ受信処理タスクが、  ＣＡＮコントローラのメールボックスからＯＳＥＫ−ＣＯＭのメッセージオブジェクトへメッセージを格納中であっても、後から起動された別のＣＡＮドライバのメッセージ受信処理タスクが、優先順位の高いメッセージをＣＡＮコントローラのメールボックスからＯＳＥＫ−ＣＯＭのメッセージオブジェクトへメッセージを格納することができる。これにより、最高優先順位のメッセージを常に最高優先順位で受信することができ、メッセージ受信のリアルタイム性を向上させることができる。
【０１５１】
（２）本発明の他の実施例
これまでの説明では、ＣＡＮドライバに、受信メッセージを一時記憶するバッファを設けたが、バッファを設けずにＣＡＮコントローラから受信メッセージを直接ＯＳＥＫ−ＣＯＭのメッセージオブジェクトに書き込んでもよい。これにより、メッセージ受信処理実行時間の削減やメモリ資源の節約ができる。
【０１５２】
また、複数のメールボックスを有するＣＡＮコントローラを用い、各メールボックスには特定のメッセージＩＤを１つだけ割り当てたが、１つのメールボックスに複数のメッセージＩＤを割り当てることもできる。これにより、ＣＡＮコントローラが有するメールボックスの数に関係なく、メッセージＩＤの異なる多種類のメッセージを送信，受信することができる。
【０１５３】
更に、ＣＡＮドライバに、受信メッセージを一時記憶するバッファを１つのメールボックスに対して１つずつ設けたが、１つのメールボックスに対して複数のバッファを設けることができる。これにより、１つのメールボックスに複数のメッセージを受信した場合、受信メッセージのメッセージＩＤごとにバッファリングすることができ、メッセージの優先順位に応じてＣＡＮドライバのメッセージ受信処理タスクを起動することで、メッセージ受信のリアルタイム性を向上させることができる。
【０１５４】
また、ＣＡＮドライバに、受信メッセージを一時記憶するバッファを設けたが、送信メッセージを一時記憶するバッファを設けてもよい。またバッファは、１つのメールボックスに対して複数のバッファを設けてもよい。これにより、１つのメールボックスを用いて複数のメッセージを送信する場合、送信メッセージのメッセージＩＤごとにバッファリングすることができ、メッセージの優先順位に応じてＣＡＮドライバのメッセージ送信処理タスクを起動することで、メッセージ送信のリアルタイム性を向上させることができる。
【０１５５】
ＣＡＮプロトコルを使用したが、他の通信プロトコルを使用してもよい。これにより、ＣＡＮプロトコルだけでなく、他のプロトコルへ対応できる。
【０１５６】
通信ライブラリとしてＯＳＥＫ−ＣＯＭを使用したが、メッセージ送信処理，メッセージ受信処理を行う他の通信ライブラリを使用してもよい。これにより、ＯＳＥＫ−ＣＯＭだけでなく、他の通信ライブラリへ対応できる。
【０１５７】
【発明の効果】
本発明によれば、最高優先順位のメッセージを常に最高優先順位で送信することができ、メッセージ送信のリアルタイム性を向上させる効果がある。
【図面の簡単な説明】
【図１】リアルタイム分散システムの構成図である。
【図２】リアルタイム分散システムの制御ユニット中のＣＡＮコントローラを構成する、メールボックスの詳細な構成図である。
【図３】ＣＡＮコントローラの、コントロールレジスタの詳細な構成図である。
【図４】リアルタイム分散システムの制御ユニット中のＯＳＥＫ−ＣＯＭを構成する、メッセージオブジェクトの詳細な構成図である。
【図５】メッセージ送信処理の流れを示すフローチャートである。
【図６】メッセージ送信処理の、メッセージオブジェクトのデータおよびバッファ更新の流れを示すフローチャートである。
【図７】メッセージ送信処理の、メッセージオブジェクトのバッファ更新の流れを示すフローチャートである。
【図８】メッセージ送信処理の、メッセージオブジェクトのＦＩＦＯバッファ更新の流れを示すフローチャートである。
【図９】メッセージ送信処理の、Queuedメッセージの送信の流れを示すフローチャートである。
【図１０】メッセージ送信処理の、Unqueuedメッセージの送信の流れを示すフローチャートである。
【図１１】メッセージ受信処理の流れを示すフローチャートである。
【図１２】メッセージ受信処理の、メッセージオブジェクトからのメッセージ受信の流れを示すフローチャートである。
【図１３】リアルタイム分散システムの制御ユニット中のＣＡＮドライバを構成する、メッセージ属性テーブルの詳細な構成図である。
【図１４】ローラによるメッセージ送信の流れを示すフローチャートである。
【図１５】ＣＡＮドライバ内バッファからのメッセージ受信の流れを示すフローチャートである。
【図１６】メッセージ送信・受信完了割り込み処理の流れを示すフローチャートである。
【図１７】リアルタイム分散システムの制御ユニット中のＯＳを構成する、タスク優先順位管理テーブルの詳細な構成図である。
【符号の説明】
２０００…制御ユニット、２００１…ＣＰＵ、２００２…メモリ、２００３…ＣＡＮコントローラ、２００４…バス、２００５…ネットワーク、２００６…アプリケーションプログラム、２００８…ＯＳＥＫ−ＣＯＭ、２００９…ＣＡＮドライバ、２０１０…ＯＳＥＫ−ＣＯＭのメッセージ送信処理、２０１１…OSEK−ＣＯＭのメッセージ受信処理、２０２１…メッセージ属性テーブル、２０２２…コントロールレジスタ、２０２３…送信・受信メールボックス、２０２４…優先順位制御部、２０２５…送信バッファ、２０２６…受信バッファ、２０２７…受信フィルタ、２０３１…バッファ、２０３２…ＣＡＮドライバのメッセージ送信処理、２０３３…ＣＡＮドライバのメッセージ受信処理、２０３４…ＣＡＮドライバのメッセージ送信・受信完了割り込み処理、２０５０…ＯＳ、２０５１…タスク優先順位管理テーブル、２０５２…スケジューラ。
【図１】
0003713977.tif 000002
【図２】
0003713977.tif 000003
【図３】
0003713977.tif 000004
【図４】
0003713977.tif 000005
【図５】
0003713977.tif 000006
【図６】
0003713977.tif 000007
【図７】
0003713977.tif 000008
【図８】
0003713977.tif 000009
【図９】
0003713977.tif 000010
【図１０】
0003713977.tif 000011
【図１１】
0003713977.tif 000012
【図１２】
0003713977.tif 000013
【図１３】
0003713977.tif 000014
【図１４】
0003713977.tif 000015
【図１５】
0003713977.tif 000016
【図１６】
0003713977.tif 000017
【図１７】
0003713977.tif 000018