(57)【要約】      （修正有）【課題】タスクの実行が時間的にずらされた場合でも、決定論的エラー処理を提供する。【解決手段】通信すべきデータが、データ伝送間隔Ｋ内で、一時的なデータ記憶のための第１のデータ領域からの読み取りおよび一時的なデータ記憶のための第２のデータ領域内での読み取られたデータの記憶により、第１のタスクＴ１と第２のタスクＴ２との間で通信する装置において、第１のタスクＴ１を実行するための時間間隔ｌ１および第２のタスクＴ２を実行するための通信間隔ｌ２が設定され、データ伝送間隔、時間間隔および通信間隔が、相互に接近し、もしくは重複して特定の関係を満たす場合には、当該タスクの実行をスキップする。【選択図】図１
2019194848.tif 000002
【特許請求の範囲】
【請求項１】
通信におけるエラー処理のための方法であって、通信すべきデータが、データ伝送間隔（Ｋ）内で、一時的なデータ記憶のための第１のデータ領域からの読み取りおよび一時的なデータ記憶のための第２のデータ領域内での読み取られた前記データの記憶により、第１のタスク（Ｔ１）と第２のタスク（Ｔ２）との間で通信される、方法において、前記第１のタスク（Ｔ１）を実行するための時間間隔（ｌ１）および前記第２のタスク（Ｔ２）を実行するための通信間隔（ｌ２）が設定され、
ａ）１つの通信間隔（ｌ２）内の前記データ伝送間隔（Ｋ）の実行は、以下の場合にはスキップされ、すなわち、第１のタスク（Ｔ１）が前記通信間隔（ｌ２）の時間的に直前に、前記通信間隔（ｌ２）のすぐ前の通信間隔（ｌ２）の前記時間間隔（ｌ１）の最後の時間間隔（ｌ１）内で開始されており、前記最後の時間間隔（ｌ１）の終了時点（ｔ６）を過ぎても続いており、かつ前記通信間隔（ｌ２）の第２のタスク（Ｔ２）の実行が既に開始されている場合には、スキップされ、または
ｂ）１つの通信間隔（ｌ２）内の前記データ伝送間隔（Ｋ）の実行は、以下の場合にはスキップされ、すなわち、第２のタスク（Ｔ２）が前記通信間隔（ｌ２）の時間的にすぐ前の通信間隔（ｌ２）内で開始されており、前記すぐ前の通信間隔（ｌ２）の終了時点（ｔ６）を過ぎても続いており、かつ前記通信間隔（ｌ２）内の前記第１のタスク（Ｔ１）の実行が既に開始されている場合には、スキップされることを特徴とする、方法。
【請求項２】
前記第１のタスク（Ｔ１）の実行が前記第２のタスク（Ｔ２）の実行より遅く完了する場合は、前記データ伝送間隔（Ｋ）の前記開始が前記第１のタスク（Ｔ１）の前記実行の前記完了によって起動され（３０１、５０１）、または前記第２のタスク（Ｔ２）の実行が前記第１のタスク（Ｔ１）の実行より遅く完了する場合は、前記データ伝送間隔（Ｋ）の前記開始が前記第２のタスク（Ｔ２）の前記実行の前記完了によって起動される（３０２、６０１）ことを特徴とする、請求項１に記載の方法。
【請求項３】
前記第１のタスク（Ｔ１）の実行が、前記第１のタスク（Ｔ１）の前記実行が開始された前記通信間隔（ｌ２）の終了を過ぎても継続している場合で、前記データ伝送間隔（Ｋ）の前記開始が前記第１のタスク（Ｔ１）の前記実行の前記完了によって起動される（５０１）場合、前記第１のタスク（Ｔ１）の前記実行のすぐ後の前記第２のタスク（Ｔ２）の実行が、前記データ伝送間隔（Ｋ）の終了まで延期されることを特徴とする、請求項２に記載の方法。
【請求項４】
前記第２のタスク（Ｔ２）の実行が、前記第２のタスク（Ｔ２）の前記実行が開始された前記通信間隔（ｌ２）の終了を過ぎても継続している場合で、前記データ伝送間隔（Ｋ）の前記開始が前記第１のタスク（Ｔ１）の前記実行の前記完了によって起動される（６０１）場合、前記通信間隔内では前記データ伝送間隔（Ｋ）の起動がもはや起こらないことを特徴とする、請求項２に記載の方法。
【請求項５】
前記通信すべきデータが、前記データ伝送間隔（Ｋ）内で、１つまたは複数のインスタンスにより、前記第１のタスク（Ｔ１）および前記第２のタスク（Ｔ２）を実行するためのハードウェアの外部で通信されることを特徴とする、請求項２〜４のいずれか一項に記載の方法。
【請求項６】
前記通信間隔（ｌ２）の期間が、前記時間間隔（ｌ１）のための期間の整数倍であり、これに関し、１つの通信間隔（ｌ２）が１つまたは複数の時間間隔（ｌ１）を含んでおり、前記時間間隔（ｌ１）の一番早い時間間隔（ｌ１）が、前記通信間隔（ｌ２）と同時に始まることを特徴とする、請求項１〜５のいずれか一項に記載の方法。
【請求項７】
１つの通信間隔（ｌ２）中に少なくとも１つの時間間隔（ｌ１）が始まり、これに関し、時間間隔（ｌ１）が時間的に重なり合っておらず、前記データ伝送間隔（Ｋ）が、前記時間間隔（ｌ１）の一番早い時間間隔（ｌ１）内の前記第１のタスク（Ｔ１）の最初の実行の前に終了しているか、または前記時間間隔（ｌ１）の一番遅い時間間隔（ｌ１）内の前記第１のタスク（Ｔ１）の最後の実行の完了後に開始されるかのいずれかであることを特徴とする、請求項１〜６のいずれか一項に記載の方法。
【請求項８】
ステータス変数（Ｓ）が、前記第１のタスク（Ｔ１）の前記実行の第１の状態および前記第２のタスク（Ｔ２）の前記実行の第２の状態に応じて決定され、これに関し、前記データ伝送間隔（Ｋ）が前記ステータス変数（Ｓ）の値に応じてスタートすることを特徴とする、請求項１〜７のいずれか一項に記載の方法。
【請求項９】
１つの通信間隔（ｌ２）内の前記第１のタスク（Ｔ１）の１つが中止される場合に、詳しくは、前記通信間隔（ｌ２）中に動作すべき前記第１のプロセス（Ｔ１）の最後の前記第１のプロセス（Ｔ１）を除く、前記通信間隔（ｌ２）中に動作すべき前記第１のタスク（Ｔ１）の１つが、前記通信間隔（ｌ２）に割り当てられた最初の前記時間間隔（ｌ１）の終了時に完了していないので、１つの第１のタスク（Ｔ１）の実行が中止される場合に、第１の状態カウンタ（Ｚ１）が訂正され、その際、前記第１の状態カウンタ（Ｚ１）が、前記中止された第１のタスク（Ｔ１）が実行された場合に前記第１の状態カウンタ（Ｚ１）が有するであろう状態に訂正されることを特徴とする、請求項８に記載の方法。
【請求項１０】
ステータス変数（Ｓ）が、前記第１のタスク（Ｔ１）および前記第２のタスク（Ｔ２）に割り当てられた優先度に応じて決定され、これに関し、一番低い優先度を割り当てられた前記タスクが、前記通信間隔（ｌ２）の１つ内の最後のタスクとして実行される場合、前記一番低い優先度をもつ前記タスクが完了するすぐ後のデータ伝送間隔（Ｋ）の開始が、すぐ後に続く通信間隔（ｌ２）内にずらされることを特徴とする、請求項１〜９のいずれか一項に記載の方法。
【請求項１１】
プロセッサ（１００１）および少なくとも１つの一時的なデータメモリ（１００２）であって、通信すべきデータを、データ伝送間隔（Ｋ）内で、前記少なくとも１つの一時的なデータメモリ（１００２）の第１のデータ領域（Ｂ５１、Ｂ５２）からの読み取りおよび前記少なくとも１つの一時的なデータメモリ（１００２）の第２のデータ領域（Ｂ１０１、Ｂ１０２）内での読み取られた前記データの記憶により、第１のタスク（Ｔ１）と第２のタスク（Ｔ２）との間で請求項１〜１０のいずれか一項に記載の方法に基づいて通信するように形成されている、プロセッサ（１００１）および少なくとも１つの一時的なデータメモリ（１００２）を特徴とする、通信におけるエラー処理のための装置（１０００）。
【請求項１２】
前記装置が、前記通信すべきデータをダイレクトメモリアクセス、ＤＭＡまたは割り込みサービスルーチンで通信するためのモジュール（１００３）を含んでいることを特徴とする請求項１１に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、とりわけ異なるサイクルタイムが設定されている時間間隔内で実行される２つ以上のタスクに分散されたソフトウェアコンポーネント間の通信におけるエラー処理のための方法および装置に関する。
【背景技術】
【０００２】
エラーにより、タスクが完了する前に、サイクルタイム、つまり時間間隔の終了に達する可能性があり、このタスクの結果は、時間間隔の終了時にもう１つのタスクに渡すことになっている。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
このようなエラーには決定論的エラー処理が望ましい。
【課題を解決するための手段】
【０００４】
これは、独立請求項に基づく方法および装置によって達成される。コンピュータプログラムおよびコンピュータプログラム製品も提供される。
通信におけるエラー処理のための方法であって、通信すべきデータが、データ伝送間隔内で、一時的なデータ記憶のための第１のデータ領域からの読み取りおよび一時的なデータ記憶のための第２のデータ領域内での読み取られたデータの記憶により、第１のタスクと第２のタスクとの間で通信される、方法に関して、第１のタスクを実行するための時間間隔および第２のタスクを実行するための通信間隔が設定され、これに関し、
ａ）第１の通信間隔内のデータ伝送間隔の実行は、以下の場合にはスキップされ、すなわち、第１のタスクが第１の通信間隔の時間的に直前に、この通信間隔のすぐ前の通信間隔の最後の時間間隔内で開始されており、この最後の時間間隔の終了時点を過ぎても続いており、かつ第１の通信間隔の第２のタスクの実行が既に開始されている場合には、スキップされ、または
ｂ）第１の通信間隔内のデータ伝送間隔の実行は、以下の場合にはスキップされ、すなわち、第２のタスクが第１の通信間隔の時間的にすぐ前の第２の通信間隔内で開始されており、すぐ前の第２の通信間隔の終了時点を過ぎても続いており、かつ第１の通信間隔内の第１のタスクの実行が既に開始されている場合には、スキップされる。
【０００５】
時間間隔および通信間隔とはスケジューラの論理間隔であり、これらの論理間隔は、固定的なタイムスライスに基づいており、ずらすことはできない。しかしながらスケジューラのこの提示している実装は、論理間隔の遵守を強制しているのではなく、実際の間隔を終了したと初めて見なすのは、スケジューラがこの実際の間隔のすぐ後の新たな間隔内でタスク実行を現実にも実施してからである。これにより、タスクがそれらタスクにその実行のために割り当てられた論理間隔の終了を遵守できないほど計算システムを鈍らせる負荷ピーク時にも、決定論的通信が可能である。これは、様々な設定された静的なタスク分散およびタスクスケジューリングを有するカテゴリーに応じた様々な固有事項による、効率的なエラー処理を可能にする。これは、タスク実行の散発的な中止に関する有効なエラー処理コンセプトである。
【０００６】
好ましいのは、第１のタスクの実行が第２のタスクの実行より遅く完了する場合は、データ伝送間隔の開始が第１のタスクの実行の完了によって起動され、または第２のタスクの実行が第１のタスクの実行より遅く完了する場合は、データ伝送間隔の開始が第２のタスクの実行の完了によって起動されることである。
【０００７】
第１のタスクの実行が、第１のタスクのこの実行が開始された通信間隔の終了を過ぎても継続している場合で、データ伝送間隔の開始が第１のタスクの実行の完了によって起動される場合、第１のタスクのこの実行のすぐ後の第２のタスクの実行が、データ伝送間隔の終了まで延期されることが好ましい。これにより不整合データが発生しない。
【０００８】
第２のタスクの実行が、第２のタスクのこの実行が開始された通信間隔の終了を過ぎても継続している場合で、データ伝送間隔の開始が第１のタスクの実行の完了によって起動される場合、この通信間隔内ではデータ伝送間隔の起動がもはや起こらないことが好ましい。これにより不整合データが発生しない。
【０００９】
通信すべきデータが、データ伝送間隔内で、１つまたは複数のインスタンスにより、第１のタスクおよび第２のタスクを実行するためのハードウェアの外部で通信されることが好ましい。通信作業を１つまたは複数のインスタンスにスワップすることにより、決定論的処理が、例えばダイレクトメモリアクセス、ＤＭＡまたは割り込みサービスルーチン、ＩＳＲによって保証される。
【００１０】
前述のエラー処理コンセプトは、データ整合性がいつでも保証されていることを確保する。通信またはタスク実行のためのトランザクションが省略されるのは、さもなければデータ整合性が保証できなくなる場合だけである。これらのエラー処理コンセプトは、システム全体のロバスト性を高めるために、個々のタスク実行の中止および個々のトランザクションの中止により、システム負荷を減らすことができる。これらのエラー処理コンセプトは、複数回のプロセスアクティブ化のようなランタイムエラーを認識するために、スケジューリング情報にアクセスすることができる。
【００１１】
通信間隔の期間は、時間間隔のための期間の整数倍であることが好ましく、これに関し、１つの通信間隔は複数の時間間隔を含んでおり、これらの複数の時間間隔の一番早い時間間隔が、通信間隔と同時に始まる。これにより論理間隔が同期する。
【００１２】
１つの通信間隔中に少なくとも１つの時間間隔が始まることが好ましく、これに関し、時間間隔は時間的に重なり合っておらず、データ伝送間隔は、これらの時間間隔の一番早い時間間隔内の第１のタスクの最初の実行の前に終了しているか、またはこれらの時間間隔の一番遅い時間間隔内の第１のタスクの最後の実行の完了後に開始される。協調スケジューリングにより、新たな間隔内での最初のタスク実行が行われる前に通信が完全に完了していることが保証される。プリエンプティブスケジューリングでは、関与するプロセスによる中断は起こらず、かつ優先度のより低いプロセスが場合によっては押し退けられることが、スケジューラによって保証されている。
【００１３】
ステータス変数は、第１のプロセスの実行の第１の状態および第２のプロセスの実行の第２の状態に応じて決定されることが好ましく、これに関し、データ伝送間隔はステータス変数の値に応じてスタートする。ステータス変数は、例えば、第１の状態用の第１の状態カウンタの第１のカウントおよび第２の状態用の第２の状態カウンタの第２のカウントによって決定される。
【００１４】
１つの通信間隔内の第１のプロセスの１つが中止される場合に、詳しくは、この通信間隔中に動作すべき第１のプロセスの最後の第１のプロセスを除く、この通信間隔中に動作すべき第１のプロセスの１つが、この通信間隔に割り当てられた最初の時間間隔の終了時に完了していないので、１つの第１のタスクの実行が中止される場合に、第１の状態カウンタが訂正されることが有利であり、その際、第１の状態カウンタは、中止された第１のタスクが実行された場合に第１の状態カウンタが有するであろう状態に訂正される。
【００１５】
ステータス変数が、第１のタスクおよび第２のタスクに割り当てられた優先度に応じて決定されることが有利であり、これに関し、一番低い優先度を割り当てられたタスクが、通信間隔の１つ内の最後のタスクとして実行される場合、一番低い優先度をもつタスクが完了するすぐ後のデータ伝送間隔の開始は、すぐ後に続く通信間隔内にずらされる。一番高い優先度をもつタスクは、時間間隔内で最初にまたはそのほかのタスクと同時にアクティブにされる。一番低い優先度をもつタスクは通信間隔が終わっても続けられる。通信はその後、データ伝送間隔内で行われる。
【００１６】
通信におけるエラー処理のための装置に関しては、プロセッサおよび少なくとも１つの一時的なデータメモリが設けられており、これらは、通信すべきデータを、データ伝送間隔内で、少なくとも１つの一時的なデータメモリの第１のデータ領域からの読み取りおよび少なくとも１つの一時的なデータメモリの第２のデータ領域内での読み取られたデータの記憶により、第１のタスクと第２のタスクとの間で本方法の１つに基づいて通信するように形成されている。
【００１７】
この装置が、通信すべきデータをダイレクトメモリアクセス、ＤＭＡまたは割り込みサービスルーチンで通信するためのモジュールを含んでいることが有利である。
さらなる有利な形態は、以下の説明および図面から明らかである。
【図面の簡単な説明】
【００１８】
【図１】タスクの第１の時間制御された挙動の概略図である。
【図２】第１のエラー処理コンセプトの概略図である。
【図３】第２のエラー処理コンセプトの概略図である。
【図４】タスクの第２の時間制御された挙動の概略図である。
【図５】第３のエラー処理コンセプトの概略図である。
【図６】第４のエラー処理コンセプトの概略図である。
【図７】タスクの第３の時間制御された挙動の概略図である。
【図８】第５のエラー処理コンセプトの概略図である。
【図９】第６のエラー処理コンセプトの概略図である。
【図１０】通信のための装置の概略図である。
【発明を実施するための形態】
【００１９】
タスクとは、ランタイムのためのコンピュータプログラムであり、その実行はオペレーティングシステムで特定のアクションにより動的にコントロールされる。タスクは、オペレーティングシステムのタスク制御によって管理され、このタスク制御をスケジューラとも言う。タスク制御は、タスクをそれが完了するまで計算させることができるか、または短い期間後にその都度、ちょうど動作しているタスクを中断させることができるかのいずれかである。こうしてタスク制御は、様々なアクティブタスクの間であちこちに切り替えることができる。タスクは、異なる長さであってよく、かつ異なる時点でスタートしてよい。
【００２０】
タスクの経時的な実行に関しては、タスク制御において、第１のタスクの周期的実行のための繰り返される時間間隔および第２のタスクの周期的実行のための繰り返される時間間隔が規定される。この例では、第２のタスクのための時間間隔の期間が、第１のタスクのための時間間隔の期間より長い。例えば第１のタスクのための時間間隔は５ｍｓの長さである。例えば第２のタスクのための時間間隔は１０ｍｓの長さである。これらの時間間隔はスケジューラの論理間隔であり、これらの論理間隔は、固定的なタイムスライスに基づいており、ずらすことはできない。
【００２１】
タスク内のソフトウェアコンポーネントは相互間でデータを交換することができる。タスク間の通信のため、データを一時的なデータメモリ、とりわけバッファ内に中間記憶することができる。通信については、例えば通信すべきデータを、データ伝送間隔内で、第１のバッファからの読み取りおよび第２のバッファ内での読み取られたデータの記憶により、第１のタスクと第２のタスクとの間で通信する。この例では第１のタスクに、読み取り専用アクセスのための第１の５ｍｓバッファおよび読み取り書き込みアクセスのための第２の５ｍｓバッファを備えた第１のチャネルが割り当てられている。この例では第２のタスクに、読み取り専用アクセスのための第１の１０ｍｓバッファおよび読み取り書き込みアクセスのための第２の１０ｍｓバッファを備えた第２のチャネルが割り当てられている。一般的には、ｎ個のタスクのために、２ｎ個のこのようなバッファを備えたｎ個のチャネルを設けていることができる。
【００２２】
スケジューラの、以下の例に基づいて提示する実装は、論理間隔の遵守を強制しているのではなく、実際の間隔を終了したと初めて見なすのは、スケジューラがこの実際の間隔のすぐ後の新たな間隔内でタスク実行を現実にも実施してからである。一般的には、タスク間の通信におけるエラー処理に関し、以下に提示するエラーケースを分類することができる。
【００２３】
スケジューリングエラー
ａ）スケジュールが不完全であるかまたは決定論的でない。
ｂ）タスクがアクティブになっていない（スキップされた）。
ｃ）タスクが自発的にアクティブになっている。
ｄ）チャネルのバッファがそれらの初期化前に使用される。
【００２４】
負荷に依存したエラー
ａ）タスクの完了が超える（複数回のタスクアクティブ化の際）。
ｂ）通信が最後のデータ伝送間隔内で完了しなかった。
ｃ）通信が最後のデータ伝送間隔内で実行されなかった。
【００２５】
メモリエラー
ａ）チャネル状態が損傷している。
スケジューリングエラーａ）〜ｃ）は、外部の時刻基準、例えば時計またはカウンタによってしか認識できない。
【００２６】
そのほかのエラーは、チャネル状態機械によって確実に認識できる。以下の例は、このチャネル状態機械に基づく通信方法ならびにエラー認識およびエラー処置の詳細を説明している。
【００２７】
計算システムにおいて通信方法および／またはエラー処理コンセプトをスケジューリング情報に基づいて選択するアルゴリズムは、タスクのコアへの割当て、スケジューリングタイプ、例えばプリエンプティブまたは協調、ならびに通信に関与するタスクの優先度および場合によってはシステムにおけるアクティブ化パターンによる順次実行を使用する。
【００２８】
カテゴリー「Ｃｏｎｃｕｒｒｅｎｃｙ  Ｌｅｖｅｌ」を確定する。このカテゴリーには、通信方法および／または対応するエラー処理コンセプトが割り当てられている。
「Ｃｏｎｃｕｒｒｅｎｃｙ  Ｌｅｖｅｌ」のあり得るカテゴリーは、
Ｃｏｏｐｅｒａｔｉｖｅ  Ｃｏｒｅ  Ｌｏｃａｌ
通信に関与するタスクが、専ら協調スケジューリングを有しており、かつ同じ計算コア上で実行される。
【００２９】
Ｐｒｅｅｍｐｔｉｖｅ  Ｃｏｒｅ  Ｌｏｃａｌ
通信に関与するタスクが、プリエンプティブスケジューリングを有しており、かつ同じ計算コア上で実行される。
【００３０】
Ｐａｒａｌｌｅｌ  Ｃｒｏｓｓ  Ｃｏｒｅ
タスクが、少なくとも２つの計算コア上で実行される。
Ｓｅｑｕｅｎｔｉａｌ  Ｃｏｒｅ  Ｌｏｃａｌ
タスクが、順次的に同じ計算コア上で実行される。
【００３１】
Ｓｅｑｕｅｎｔｉａｌ  Ｃｒｏｓｓ  Ｃｏｒｅ
タスクが、順次的に少なくとも２つの計算コア上で実行される。
カテゴリー「Ｃｏｏｐｅｒａｔｉｖｅ  Ｃｏｒｅ  Ｌｏｃａｌ」における通信のための通信方法を、図１に基づいて説明する。
【００３２】
この通信方法は、すべての関与するタスクに通信負荷を分散することができる。この通信方法は、リアルタイムシステムにおける効率的で決定論的な通信を可能にする。この場合、ステータス変数Ｓを通信時点の決定に使用する。ステータス変数Ｓは、以下ではステータス変数のフェーズとも言う下記の状態の１つをとることができる。
【００３３】
ＰＲＯＣ＿ＡＣＴＩＶＥ
関与するタスクの少なくとも１つが、バッファ内に準備されたデータを使用している。読み取りバッファの上書きは、整合性の理由から許可されない。
【００３４】
ＰＲＯＣ＿ＣＯＭＰＬＥＴＥ
すべてのタスクが、１つの論理間隔内で（場合によってはあり得るエラーシナリオを考慮して）必要な数のアクティブ化を完了しており、準備されたデータはこの論理間隔内ではもう必要なくなっている。
【００３５】
ＴＲＡＮＳ＿ＡＣＴＩＶＥ
個々のタスクの読み取りバッファを更新している。内包されているデータを用いた計算は、整合性の理由から許可されない。
【００３６】
ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥ
バッファの更新が完了している。データを計算のために使用できる。ただしタスクはアクティブになっていない。
【００３７】
１つの通信間隔内で、ステータス変数Ｓは、状態ＰＲＯＣ＿ＡＣＴＩＶＥ、ＰＲＯＣ＿ＣＯＭＰＬＥＴＥ、ＴＲＡＮＳ＿ＡＣＴＩＶＥ、ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥをこの順番に進んでいく。状態ＰＲＯＣ＿ＣＯＭＰＬＥＴＥおよびＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥはスキップできる。各通信間隔内で１つのデータ伝送間隔Ｋを実行するべきである。データ伝送間隔Ｋ中は、バッファを更新するために、バッファに書き込みおよび／または読み取りアクセスする。通信間隔は、以下の例で説明するように、スケジューラの論理間隔に同期して定義されている。前述の例では、少なくとも１つのタスクが実行される場合は常にステータス変数Ｓが状態ＰＲＯＣ＿ＡＣＴＩＶＥにセットされる。データ伝送間隔Ｋ中はステータス変数Ｓが状態ＴＲＡＮＳ＿ＡＣＴＩＶＥにセットされる。状態ＰＲＯＣ＿ＣＯＭＰＬＥＴＥは、１つの通信間隔のすべての実行が完了した後にセットされる。状態ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥは、データ伝送間隔が終了した後に初めてセットされる。
【００３８】
通信を周期的に行うために、相互に通信すべき間隔Ｔ１、Ｔ２、．．．、Ｔｎの最小公倍数、ＫＧＶとして、通信間隔ｌ２を計算する。
Ｔｎは、タスクｎの間隔を表している。論理間隔は、個々のタスクの周期に時間的に同期して動作するよう定義されている。タスクはスケジューラによってアクティブにされる。通信間隔ｌ２の終了までに、すべてのタスクおよびデータ伝送間隔Ｋが動作していることが望ましい。タスクにはそれぞれデッドラインが割り当てられており、これらのデッドラインまでにタスクが完了していなければならない。タスクをアクティブ化した後、このタスクに割り当てられたデッドラインの前に適時にこのタスクの計算を完了できない場合、スケジューラによるこのタスクのその後のアクティブ化は行われない。タスクをアクティブ化した後、このタスクに割り当てられたデッドラインの前に適時にこのタスクの計算を完了はするが、この通信間隔ｌ２内に規定されているデータ伝送間隔Ｋは終了しない場合、この通信のためのエラー処理が必要である。
【００３９】
図１に基づく例に関し、通信間隔には、
ｌ２＝ＫＧＶ（１０ｍｓ、５ｍｓ）＝１０ｍｓ
が適用されている。
【００４０】
ＫＧＶの代わりにそのほかの公倍数を使用してもよい。
以下では図１に基づき、ステータス変数Ｓのフェーズがどのように順次進んでいくのかを説明する。ステータス変数Ｓは、第１のタスクの実行の第１の状態および第２のタスクの実行の第２の状態に応じて決定される。
【００４１】
通信はデータ伝送間隔Ｋ内で行われ、データ伝送間隔Ｋは、ステータス変数Ｓの値に応じてスタートする。
ステータス変数Ｓは、例えば、第１の状態用の第１の状態カウンタＺ１の第１のカウントおよび第２の状態用の第２の状態カウンタＺ２の第２のカウントによって決定される。第１の状態カウンタは、図１に示したように状態２、１、０をとることができる。第２の状態カウンタは、図１に示したように状態１、０をとることができる。
【００４２】
第１の状態カウンタＺ１は、図１に示した時間経過では左側で、第１のカウント２で始まる。第１の論理間隔ｌ１に同期して始まる時点ｔ１で、第１のタスクＴ１の最初の実行が開始される。第１のタスクＴ１の最初の実行が完了する時点ｔ２で、第１のカウントが１にセットされる。第１の論理間隔ｌ１の最初の繰り返しに同期して始まる時点ｔ３で、第１のタスクＴ１の２番目の実行が開始される。第１のタスクＴ１の２番目の実行が完了する時点ｔ４で、第１のカウントが０にセットされる。
【００４３】
続いて時点ｔ４でデータ伝送間隔Ｋがスタートする。データ伝送間隔Ｋは時点ｔ５で終了する。時点ｔ５で第１のカウントが２にセットされる。
第１の論理間隔ｌ１の２番目および３番目の繰り返しも図１に示されている。２番目の繰り返しでは第１のタスクＴ１の３番目の実行が、第１の論理間隔ｌ１の２番目の繰り返しと同期して時点ｔ６で開始され、時点ｔ７で完了する。第１のカウントが時点ｔ７で２から１にセットされる。
【００４４】
３番目の繰り返しでは第１のタスクＴ１の４番目の実行が、第１の論理間隔ｌ１の３番目の繰り返しと同期して時点ｔ８で開始され、時点ｔ９で完了する。第１のカウントが時点ｔ９で１から０にセットされる。
【００４５】
第２の状態カウンタＺ２は、図１では左側で、第２のカウント１で始まる。時点ｔ１で、第２の論理間隔ｌ２が第１の論理間隔ｌ１と同期して始まる。第２のタスクＴ２の最初の実行は、第１のタスクＴ１の最初の実行が完了した後に、時点ｔ２で開始される。つまり第１のタスクＴ１は、時点ｔ１と時点ｔ２との間で第２のタスクＴ２として処理される。
【００４６】
第２のタスクＴ２の最初の実行は、時点ｔ１０で、この例では時点ｔ３の前に完了する。時点ｔ１０で第２のカウントが１から０にセットされる。データ伝送間隔Ｋの終了時に、つまり時点ｔ５で、第２のカウントが０から１にセットされる。
【００４７】
第２の論理間隔ｌ２の繰り返しも図１に示されている。時点ｔ６で、第２の論理間隔ｌ２の繰り返しが第１の論理間隔ｌ１の２番目の繰り返しと同期して始まる。第２のタスクＴ２の２番目の実行は、第１のタスクＴ１の３番目の実行が完了した後に時点ｔ７で開始される。つまり第１のタスクＴ１は、時点ｔ６と時点ｔ７との間で第２のタスクＴ２として処理される。この繰り返しでは第２のタスクＴ２の２番目の実行が、第１のタスクＴ１の４番目の実行のための時点ｔ８とｔ９との間で、第１のタスクＴ１の３番目の繰り返しを行うために中断される。時点ｔ９で第２のタスクＴ２の繰り返しが続行され、時点ｔ１１で完了する。時点ｔ１１で第２のカウントが０にセットされ、データ伝送間隔Ｋが繰り返される。データ伝送間隔Ｋの繰り返しは時点ｔ１２で終了する。第１のカウントが時点ｔ１２で２にセットされる。第２のカウントが時点ｔ１２で１にセットされる。
【００４８】
時点ｔ１とｔ４およびｔ６とｔ９との間では、第１の５ｍｓバッファＢ５１および第２の５ｍｓバッファＢ５２へのアクセスが許可されている。時点ｔ１とｔ１０およびｔ６とｔ１１との間では、第１の１０ｍｓバッファＢ１０１および第２の１０ｍｓバッファＢ１０２へのアクセスが許可されている。５ｍｓタスクからのアクセスは、この例ではｔ１とｔ２、ｔ３とｔ４、ｔ６とｔ７、およびｔ８とｔ９との間で、つまり第１のタスクＴ１の実行中に行われている。１０ｍｓタスクからのアクセスは、この例ではｔ２とｔ１０との間、つまり第２のタスクＴ２の最初の実行中に、およびｔ６とｔ７との間、つまりプリエンプティブに第２のタスクＴ２の繰り返しの実行前に行われている。データ伝送間隔Ｋ内では、タスクに対してすべてのバッファへのアクセスが禁じられている。タスクから第１の５ｍｓバッファＢ５１および第１の１０ｍｓバッファＢ１０１へのアクセスは、図１では一方向矢印で示される。タスクからもう一方のバッファへのアクセスは、図１では双方向矢印で示されている。データ伝送間隔Ｋ内では、第２の５ｍｓバッファＢ５２から第２の１０ｍｓバッファＢ１０２に書き込まれ、かつ第１の１０ｍｓバッファＢ１０１から第１の５ｍｓバッファＢ５１に書き込まれる。
【００４９】
ステータス変数Ｓは、時点ｔ１とｔ４との間では状態ＰＲＯＣ＿ＡＣＴＩＶＥを有している。
ステータス変数Ｓは、第１の状態カウンタＺ１も第１の状態値０を有し、第２の状態カウンタＺ２も第２の状態値０を有する時点ｔ４とｔ５との間では状態ＴＲＡＮＳ＿ＡＣＴＩＶＥを有している。
【００５０】
ステータス変数Ｓは、時点ｔ５とｔ６との間では状態ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥを有している。
ステータス変数Ｓは、時点ｔ６とｔ１１との間では状態ＰＲＯＣ＿ＡＣＴＩＶＥを有している。
【００５１】
ステータス変数Ｓは、第１の状態カウンタＺ１も第１の状態値０を有し、第２の状態カウンタＺ２も第２の状態値０を有する時点ｔ１１とｔ１２との間では状態ＴＲＡＮＳ＿ＡＣＴＩＶＥを有している。
【００５２】
ステータス変数Ｓは、図１では時点ｔ１２以降は状態ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥを有している。
通信はタスクのコンテキスト内で行われるので、このシナリオでのＰＲＯＣ＿ＣＯＭＰＬＥＴＥは、純粋な論理ステータスであり、ＰＲＯＣ＿ＡＣＴＩＶＥからＴＲＡＮＳ＿ＡＣＴＩＶＥに直接移行する場合は省略される。
【００５３】
タスクを実際に実行する際、タスクおよび通信を完全に実行するために実際に必要な通信間隔は、前述のエラーにより通信間隔から逸脱する可能性がある。エラー処理を図２および図３に基づいて説明する。既に図１に基づいて説明した要素に関しては、同じ符号を使用し、かつ図１についての説明を参照されたい。
【００５４】
図１に示した状況とは異なり、図２に示したように、第１の論理間隔ｌ１の最初の繰り返し中に、時点ｔ２０で第１のタスクＴ１の２番目の実行の中断が行われる。２番目の実行は、時点ｔ６の前の時点ｔ２１で続行され、時点ｔ６の前の時点ｔ２２で完了する。時点ｔ６ではデータ伝送間隔Ｋが開始されている。データ伝送間隔Ｋは、この例では時点ｔ６の後にある時点ｔ２３で終了する。これは、データ伝送間隔Ｋが第１の論理間隔ｌ１の２番目の繰り返しが始まった後に終了することを意味している。
【００５５】
第２のタスクＴ２の２番目の実行は時点ｔ２３で開始される。これにより、第２のタスクＴ２の２番目の実行は、第１のタスクＴ１の最新のデータを得ることになる。第１のタスクＴ１の３番目の実行は、第１の間隔ｌ１の２番目の繰り返し内では抑制される。これにより第２のタスクＴ２の２番目の実行を、第１の間隔ｌ１の２番目の繰り返しが終了する前に完了させることができる。
【００５６】
図１で示した状況とは異なり、図３に示したように、第１の論理間隔ｌ１の最初の繰り返し中に、時点ｔ３で第２のタスクＴ２の最初の実行の中断が行われる。第１のタスクＴ１の２番目の実行は、時点ｔ３の後の時点ｔ３０で開始され、時点ｔ６の前の時点ｔ３１で、つまり第１の論理間隔ｌ１の最初の繰り返し中に完了する。時点ｔ３１で、第２のタスクＴ２の最初の実行が続行される。第１のタスクＴ１の３番目の実行を時点ｔ３２までに実施するため、時点ｔ６で第２のタスクＴ２の最初の実行が改めて中断される。時点ｔ３２で第２のタスクＴ２の最初の実行が続行され、時点ｔ８の前の時点ｔ３３で完了する。時点ｔ８で、第１のタスクＴ１の４番目の実行が開始される。時点ｔ３４で、第１のタスクＴ１の４番目の実行が完了する。時点ｔ３４でデータ伝送間隔Ｋが開始される。データ伝送間隔Ｋは時点ｔ３５で終了する。
【００５７】
第２のタスクＴ２の２番目の実行は、論理的な第２の間隔ｌ２の繰り返し内では抑制される。
それぞれの実行の抑制、つまりスキップにより、計算システムが決定的に負荷軽減される。実行中のタスクが論理間隔の境界を超えることを、以下にタスクデッドライン違反と言う。このようなタスクデッドライン違反への反応として、通信インフラにより、次の周期のタスク実行が中止される。
【００５８】
これに関し、原理的には２つの形式を区別しなければならない。
形式１
デッドライン違反が、タスクの最後の実行の際にデータ伝送間隔内で起こっている。
【００５９】
形式１の場合、２つのさらなる形式が区別される。
形式１Ａ
デッドライン違反が、トランザクションのスタート前に既に起こっている。関与するタスクの１つが、新たな間隔内で既に計算を開始していた。ＰＲＯＣ＿ＡＣＴＩＶＥからのステータス移行が、新たなデータ伝送間隔へ移行する。バッファの更新が省略される。
【００６０】
形式１Ｂ
ここでは図２に示したように、バッファの更新が既に行われている。ステータスＴＲＡＮＳ＿ＡＣＴＩＶＥがセットされており、その一方でデッドライン違反が起こっている。協調スケジューリングにより、新たな間隔内での最初のタスク実行が行われる前に通信が完全に完了していることが保証される。
【００６１】
形式２
デッドライン違反が、タスクの最後の実行の際にデータ伝送間隔内で起こっているのではない。
【００６２】
形式２の場合、タスク実行の中止によって違ってしまったカウントを訂正するだけである。これは通信への影響を有さない。
図４では、カテゴリー「Ｐａｒａｌｌｅｌ  Ｃｒｏｓｓ  Ｃｏｒｅ」に相当する通信のための通信方法を示している。符号が一致する要素に関しては、図１についての説明も参照されたい。
【００６３】
前述の例とは異なり、タスクは並行しても計算される。これに加え、データ伝送間隔Ｋ内での通信の実施は、通信すべきデータを通信するためのモジュール４００により、ダイレクトメモリアクセス、ＤＭＡまたは割り込みサービスルーチンで行われる。データ伝送間隔Ｋのスタートには第１のトリガ３０１を使い、データ伝送間隔Ｋの繰り返しのスタートには第２のトリガ３０２を使う。
【００６４】
通信作業を、ＤＭＡハードウェアまたはＩＳＲのような１つまたは複数のインスタンスにスワップすることにより、決定論的処理が保証されている。これらのインスタンスにも、要件に応じて優先順位をつけることができ、これらのインスタンスが、さらなる計算コアまたは専用ハードウェアリソースへの通信負荷の分散を可能にする。
【００６５】
図４に示したように、タスクからはそれぞれ更新のアクティブ化だけが行われる。バッファの本来の更新はさらなるインスタンスによって実施される。すべての関与するタスクが完全に並行して動作し得るので、実行の開始時にはステータスをチェックしなければならない。
【００６６】
ＴＲＡＮＳ＿ＡＣＴＩＶＥの場合、データの更新が完了するまで実行を延期する。ベーシックなタスクモデルを使用する場合、これはビジーウェイトによって達成される。状態ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥは、更新が行われるコンテキスト内でのみセットされる。
【００６７】
この場合には、カテゴリー「Ｐａｒａｌｌｅｌ  Ｃｒｏｓｓ  Ｃｏｒｅ」に相当する通信のためのタスク実行の散発的な中止に関するエラー処理コンセプトが可能である。このコンセプトを図５および図６に基づいてより詳しく説明する。符号が一致している要素に関しては、図２についての説明も参照されたい。
【００６８】
前述の例とは異なり、第２のタスクの最初の実行は、時点ｔ２の後の時点ｔ５１で中断され、時点ｔ３の前の時点ｔ５２で続行される。これに加え、第２のタスクＴ２の最初の実行は、時点ｔ３および時点ｔ２０の後で、時点ｔ２１の前に、時点ｔ５３で完了する。これは、第１のタスクと第２のタスクがこの例では少なくとも一時的に並行して計算されることを意味している。
【００６９】
これに加え、データ伝送間隔Ｋ内の通信の実施は、通信すべきデータを通信するためのモジュール４００により、ダイレクトメモリアクセス、ＤＭＡまたは割り込みサービスルーチンで行われる。データ伝送間隔Ｋのスタートには、第１のタスクＴ１の２番目の実行の完了時に起動される第３のトリガ５０１を使う。
【００７０】
図６では、図３でのような通信を示している。それゆえ符号が一致している要素に関しては、図３についての説明を参照されたい。
前述の例とは異なり、第２のタスクＴ２の最初の実行は、時点ｔ３１ではなく、時点ｔ３１の前で時点ｔ３０の後にある時点ｔ６１で既に続行される。これに加え、第２のタスクＴ２の最初の実行が時点ｔ６で中断されない。これは、第１のタスクと第２のタスクがこの例では少なくとも一時的に並行して計算されることを意味している。
【００７１】
前述の例とは異なり、データ伝送間隔Ｋ内の通信の実施は、通信すべきデータを通信するためのモジュール４００により、ダイレクトメモリアクセス、ＤＭＡまたは割り込みサービスルーチンで行われる。データ伝送間隔Ｋのスタートには、第１のタスクＴ１の４番目の実行の完了時に起動される第４のトリガ６０１を使う。
【００７２】
図７では、カテゴリー「Ｐｒｅｅｍｐｔｉｖｅ  Ｃｏｒｅ  Ｌｏｃａｌ」に相当する通信のためのタスク実行の散発的な中止に関するエラー処理コンセプトに関する通信を示している。符号が一致している要素に関しては、図１についての説明も参照されたい。
【００７３】
以下に図７に基づいて説明する例では、タスクが順次計算される。その際、第１のタスクＴ１は第２のタスクＴ２より高い優先度で計算される。これは、第１のタスクＴ１のスケジュールに従い、第１のタスクＴ１の計算が必要になるとただちに、スケジューラが第２のタスクＴ２の実行を中断することを意味している。
【００７４】
この例では、図７に示した時間経過において時点ｔ１で、第１の論理間隔ｌ１も第２の論理間隔ｌ２も同期して始まる。第１のカウントは開始時には値２になっており、第２のカウントは開始時には値１になっている。ステータス変数Ｓは、時点ｔ１の前は状態ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥを有しており、時点ｔ１以降は状態ＰＲＯＣ＿ＡＣＴＩＶＥを有している。優先順位に基づき、第１のタスクＴ１の最初の実行が時点ｔ１で開始され、時点ｔ２で完了する。時点ｔ２で第１のカウントが１にセットされる。第２のタスクＴ２の実行は時点ｔ２で開始され、時点ｔ３で中断され、この時点ｔ３では第１の論理間隔ｌ１の１番目の繰り返しが、第１のタスクＴ１の２番目の実行と同時に始まる。時点ｔ４で第１のタスクＴ１の２番目の実行が完了し、第１のカウントが０にセットされる。第２のタスクＴ２の実行が時点ｔ４で続行され、時点ｔ５で完了し、この時点ｔ５で第２のカウントが０にセットされる。ステータス変数Ｓは、時点ｔ５で値ＰＲＯＣ＿ＣＯＭＰＬＥＴＥにセットされる。
【００７５】
第２のタスクＴ２の実行が、第１のタスクＴ１の２番目の実行の後に完了したので、データ伝送間隔Ｋは、第１の論理間隔ｌ１の２番目の繰り返しと第２の論理間隔ｌ２の繰り返しが同期して始まる時点ｔ６でようやく開始される。ステータス変数Ｓは、時点ｔ６とｔ７との間ではＴＲＡＮＳ＿ＡＣＴＩＶＥにセットされている。第１のタスクＴ１の３番目の実行は、データ伝送間隔Ｋが終了する時点ｔ７で開始される。時点ｔ７で、第１のカウントが２にセットされ、第２のカウントが１にセットされ、ステータス変数ＳはＰＲＯＣ＿ＡＣＴＩＶＥにセットされる。
【００７６】
第１のタスクＴ１の３番目の実行は時点ｔ８で完了し、この時点ｔ８で第１のカウントが１にセットされる。第２のタスクＴ２の実行の繰り返しが時点ｔ８で開始され、時点ｔ９で完了し、この時点ｔ９で第２のカウントが０にセットされる。時点ｔ９に続く時点ｔ１０で、第１の論理間隔ｌ１の３番目の繰り返しおよび第１のタスクＴ１の４番目の実行が開始される。時点ｔ１１で第１のタスクＴ１の４番目の実行が完了する。第１のカウントが０にセットされる。第２のタスクＴ２の繰り返しは時点ｔ１１では既に完了しているので、ステータス変数Ｓが状態ＴＲＡＮＳ＿ＡＣＴＩＶＥにセットされる。データ伝送間隔Ｋの繰り返しは時点ｔ１１で開始され、時点ｔ１２で終了する。時点ｔ１２で、ステータス変数Ｓが状態ＴＲＡＮＳ＿ＣＯＭＰＬＥＴＥにセットされる。第１のカウントは値２にセットされ、第２のカウントは値１にセットされる。タスクのバッファへのアクセスは、前述のようにタスクの実行中に行われる。
【００７７】
この場合には、図８および図９に基づいてより詳しく説明するエラー処理コンセプトが可能である。符号が一致している要素に関しては、図８に関しては図２についての説明も、および図９に関しては図３についての説明も参照されたい。
【００７８】
図８に示した例では、第１のタスクＴ１が第２のタスクＴ２より高い優先度で実行される。時点ｔ２２で第１のタスクＴ１の２番目の実行が完了する。時点ｔ２２でデータ伝送間隔Ｋが開始される。この時点ｔ２２は、第１の間隔ｌ１の２番目の繰り返しが開始されるのが望ましい時点ｔ６の少し前である。したがってデータ伝送間隔Ｋは、この第２の論理間隔ｌ２中にもうスタートしてはいるが、時点ｔ６を過ぎてもまだ時点ｔ２３まで継続される。それゆえ第２のタスクＴ２の繰り返しは、データ伝送間隔Ｋの終了まで、つまり時点ｔ２３まで延期される。第１のタスクＴ１のより高い優先度にもかかわらず、この場合には第１の間隔ｌ１の２番目の繰り返し内の第１のタスクＴ１がスキップされるので、第２のタスクＴ２が中断されずに実行される。これは、第１のタスクＴ１がより高い優先度で実行はされるが、必要であれば、エラー処理のために第１のタスクＴ１がスキップされることを意味している。
【００７９】
図９に示した例では、第１のタスクＴ１が第２のタスクＴ２より高い優先度で実行される。第２のタスクＴ２の実行が、時点ｔ６の後、つまり第２の論理間隔ｌ２の繰り返し内にある時点ｔ３３まで継続している。第２のタスクＴ２がその完了まで実行される。それまでにデータ伝送間隔Ｋがまだ実行されていなかったので、タスクの優先度に関係なく、第２のタスクＴ２の繰り返しは実行されずに省略される。
【００８０】
スケジューリングエラーｄ）チャネルのバッファがそれらの初期化前に使用される、または負荷に依存したエラーａ）タスクの完了が超える（複数回のタスクアクティブ化の際）、ｂ）通信が最後のデータ伝送間隔内で完了しなかった、ｃ）通信が最後のデータ伝送間隔内で実行されなかった、のうちの１つ、またはメモリエラーａ）チャネル状態が損傷している、が認識された場合、これらの例では１つのタスクが中止されるかまたはデータ伝送間隔Ｋがずらされるかのいずれかである。この例では１つのタスクは、このタスクの実行がスケジューラによりアクティブにされないことによって中止される。この例ではデータ伝送間隔は、スケジューラがタスクおよびデータ伝送間隔の実行を適切な時点でアクティブにすることによってずらされる。
【００８１】
個々の通信方法およびエラー処理コンセプトの使用は、挙げたカテゴリー「Ｃｏｎｃｕｒｒｅｎｃｙ  Ｌｅｖｅｌ」に限定されない。個々の通信方法およびエラー処理コンセプトは、ほかのシナリオまたはカテゴリー、例えば「Ｓｅｑｕｅｎｔｉａｌ  Ｃｏｒｅ  Ｌｏｃａｌ」または「Ｓｅｑｕｅｎｔｉａｌ  Ｃｒｏｓｓ  Ｃｏｒｅ」においても適用できる。
【００８２】
これらの通信方法およびエラー処理コンセプトは、２つのタスク間の通信に限定されない。図では、見やすくするために２つより多いタスクによる実行を行っていない。
通信のための装置１０００を図１０に示している。装置１０００は、プロセッサ１００１および少なくとも１つの一時的なデータメモリ１００２を含んでおり、これらは、通信すべきデータを、データ伝送間隔Ｋ内で、少なくとも１つの一時的なデータメモリ１００２の第１のデータ領域Ｂ５１、Ｂ５２からの読み取りおよび少なくとも１つの一時的なデータメモリ１００２の第２のデータ領域Ｂ１０１、Ｂ１０２内での読み取られたデータの記憶により、第１のタスクＴ１と第２のタスクＴ２との間で前述の方法に基づいて通信するように形成されている。
【００８３】
請求項に基づくこの装置は、一例ではモジュール１００３を含んでおり、モジュール１００３は、モジュール４００に関して説明したように、通信すべきデータをダイレクトメモリアクセス、ＤＭＡまたは割り込みサービスルーチンで通信するために形成されている。
【図１】
2019194848.tif 000003
【図２】
2019194848.tif 000004
【図３】
2019194848.tif 000005
【図４】
2019194848.tif 000006
【図５】
2019194848.tif 000007
【図６】
2019194848.tif 000008
【図７】
2019194848.tif 000009
【図８】
2019194848.tif 000010
【図９】
2019194848.tif 000011
【図１０】
2019194848.tif 000012
【外国語明細書】
2019194848000001.pdf