(57)【要約】【課題】製造メーカ側で元々変更の用意がなされていなかったソフトウェアの変更を制御装置上で行うことによってソフトウェアを変更する。【解決手段】制御装置のインタフェースを介して、そのインタフェースに接続されているインタラクション装置を用いて、又は、制御装置プログラムに組み込まれたサービスコードによって、特に、制御装置の動作中に、オーバーレイメモリにおけるアドレス領域に、本来のプログラムルーチンを補完するバイパスルーチンの少なくとも一部が記憶されるか、又は少なくとも部分的に置換すべきバイパスルーチンの少なくとも一部が記憶される。【選択図】なし【特許請求の範囲】
【請求項１】
電子的な制御装置のメモリ内のソフトウェアを変更するための方法であって、
前記メモリは、前記ソフトウェアの少なくとも一部を成し且つ前記制御装置の少なくとも一つのプロセッサによって実行される複数の原始的なプログラムルーチンが記憶されている少なくとも一つの永久記憶装置と、一時的なデータを記憶するための少なくとも一つの主記憶装置と、オーバーレイメモリとを有しており、
前記オーバーレイメモリの各メモリアドレスを、割り当て情報を用いて前記永久記憶装置の一つのメモリアドレスに割り当て、それにより、前記プロセッサはオーバーレイ機能がアクティブ化された際に、前記永久記憶装置における或るアドレスのプログラムルーチン命令の代わりに、前記オーバーレイメモリの割り当てられたアドレスにおける命令を実行する、方法において、
特に前記制御装置の動作中に、前記オーバーレイメモリのアドレス領域に、本来のプログラムルーチンを少なくとも部分的に置換するバイパスルーチンの少なくとも一つの関数部分を記憶するか、又は、前記オーバーレイメモリに、バイパスルーチンの第１の部分として、前記プロセッサがアクセスできるアドレス領域に記憶される前記バイパスルーチンの第２の部分を直接的又は間接的に参照するジャンプ命令を記憶し、
オーバーレイ機能をアクティブ化するために、前記オーバーレイメモリのアドレス及び／又はアドレス領域を、置換すべきプログラムルーチンのアドレス又はアドレス領域に割り当てるか、又は、置換すべきプログラムルーチンの部分のアドレス又はアドレス領域に割り当てる割当情報を作成し、該割当情報を前記制御装置のインタフェースを介してアクティブ化又はデアクティブ化することを特徴とする、方法。
【請求項２】
前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分によって占有されている、前記永久記憶装置内の全てのアドレス領域を、前記オーバーレイメモリによって、置換を行う前記バイパスルーチンが少なくとも部分的に記憶されている、同じ長さのアドレス領域でオーバーレイする、請求項１に記載の方法。
【請求項３】
バイパスルーチンが前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分よりも長いプログラムコードを有している場合、前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分によって占有されている、前記永久記憶装置内の全てのアドレス領域を、前記オーバーレイメモリにおいて、前記バイパスルーチンの第１の部分が記憶される、同じ長さのアドレス領域によってオーバーレイする、但し、前記バイパスルーチンはジャンプ命令で終了しており、該ジャンプ命令は前記プロセッサに対して、該ジャンプ命令によって識別されており、且つ、前記バイパスルーチンの少なくとも一つの別の部分の記憶が開始されるアドレスにおいて、プログラムの処理を継続することを指示する命令である、請求項１に記載の方法。
【請求項４】
プログラムルーチン全体を置換する場合、前記バイパスルーチンは、プログラムの処理でもって、前記置換すべきプログラムルーチンを特にサブプログラムルーチンとして呼び出したプログラムルーチンに戻ることを前記プロセッサに指示するリターン命令で終了しているか、又は、
プログラムルーチンの一部のみを置換する場合、前記バイパスルーチンは、本来のプログラムルーチンの、前記置換すべき部分に続く命令で、プログラムの処理を継続することを前記プロセッサに指示するジャンプ命令で終了している、請求項２又は３に記載の方法。
【請求項５】
バイパスルーチンの全ての関数コードをアクティブな前記オーバーレイメモリ外のメモリ領域に記憶し、前記置換すべきプログラムルーチンの或るアドレスにおける命令又はデータを、前記オーバーレイメモリを用いてジャンプ命令でオーバーレイする、但し、該ジャンプ命令は前記プロセッサに対して、該ジャンプ命令によって識別されており、且つ、前記バイパスルーチンの前記関数コードの記憶が開始されるアドレスにおいて、処理を継続することを指示する命令であり、前記バイパスルーチンはリターン命令で終了しており、該リターン命令はプロセッサに対して、前記置換すべきプログラムルーチンを特にサブプログラムルーチンとして呼び出したプログラムルーチンに戻ることを指示する命令である、請求項１に記載の方法。
【請求項６】
前記バイパスルーチンの関数コードをアクティブな前記オーバーレイメモリ外のメモリ領域に記憶し、前記置換すべきプログラムルーチンの或るアドレスにおける命令を、前記オーバーレイメモリにおいてジャンプ命令でオーバーレイする、但し、該ジャンプ命令は前記プロセッサに対して、該ジャンプ命令によって識別されているアドレスにおいて、処理を継続することを指示する命令であり、且つ、前記バイパスルーチンの前記関数コードの呼び出しを更に行うプログラムコードの記憶が開始されるアドレスを参照する命令であり、特に、前記バイパスルーチンの前記関数コードの呼び出しは、該プログラムコード内で呼び出されたサブプログラムルーチン内で行われる、請求項１に記載の方法。
【請求項７】
前記オーバーレイ機能のアクティブ化を、該オーバーレイ機能のアクティブ化によって置換すべき機械コードが前記制御装置の前記プロセッサによって実行されない時点に行う、請求項１乃至６のいずれか一項に記載の方法。
【請求項８】
前記アクティブ化を行うロジックによって、特に前記インタフェースを介して接続されているインタラクション装置において実行されるロジックによって、前記制御装置の前記プロセッサのプログラム処理ポジションを、例えばプログラムカウンタに基づき監視し、前記アクティブ化を、前記プログラム処理ポジションが前記置換すべきプログラムルーチン外のアドレスを示す時点に実施する、請求項７に記載の方法。
【請求項９】
前記アクティブ化を行うロジックによって、特に前記インタフェースを介して接続されているインタラクション装置において実行されるロジックによって、前記置換すべきプログラムルーチン外に配置されているプログラムコードによってセットされるトリガ／割り込みを監視し、前記アクティブ化を、前記トリガ／割り込みの変化が確認された際に実施する、請求項７に記載の方法。
【請求項１０】
前記トリガは変数アクセス又はＩ／Ｏピンの状態変化から成る、請求項９に記載の方法。
【請求項１１】
前記アクティブ化を、前記制御装置のプロセッサによって呼び出されたサブプログラムルーチンによって実行する、請求項７に記載の方法。
【請求項１２】
前記置換すべきプログラムルーチン外又は前記置換すべきプログラムルーチンの部分外の或るプログラムルーチンにおける命令を前記オーバーレイメモリにおけるジャンプ命令によってオーバーレイする、但し、前記前記ジャンプ命令は、プログラムコードのプログラミングが開始されるアドレスを参照する命令であり、前記プログラムコードは、オーバーレイされた命令を再構成し、更に、前記置換すべきプログラムルーチンに関する前記オーバーレイ機能のアクティブ化又はデアクティブ化を行い、また、ジャンプ命令で終了しており、前記ジャンプ命令は、前記置換すべきプログラムルーチン外のプログラムルーチンにおける、前記オーバーレイされた命令に続く命令を参照し、特に、前記アクティブ化を前記プログラムコード内のサブプログラムルーチンの呼び出しによって実施する、請求項７に記載の方法。
【請求項１３】
アクティブな前記オーバーレイメモリに格納されているコードは部分的に、前記永久記憶装置の割り当てられた各メモリアドレスに格納されているコードを正確に再構成する、請求項１に記載の方法。
【請求項１４】
前記割当情報の作成及び前記オーバーレイ機能のアクティブ化を、前記制御装置のインタフェースに接続されているインタラクション装置によって、又は、前記制御装置のインタフェースに接続されているコンピュータによって実施する、請求項１に記載の方法。
【請求項１５】
前記割当情報の作成及び／又は前記オーバーレイ機能のアクティブ化を、前記制御装置のプロセッサによって実行されるプログラムルーチンによって実施する、請求項１に記載の方法。
【請求項１６】
前記制御装置は少なくとも二つのプロセッサコアを有しており、前記割当情報の作成及び／又は前記オーバーレイ機能のアクティブ化を行うプログラムルーチンを第１のプロセッサコアによって処理し、本来のプログラムルーチンを第２のプロセッサコア又は複数の別のプロセッサコアによって処理する、請求項１５に記載の方法。
【請求項１７】
前記バイパスルーチンは、リターン命令で終了する、少なくとも一つの完全な関数を含む、請求項１に記載の方法。
【請求項１８】
前記バイパスルーチン又はバイパスルーチンの一部を、前記制御装置のインタフェースを介して、特に前記制御装置の動作中に、前記プロセッサによってアドレッシング可能なメモリ領域に記憶する、請求項１に記載の方法。
【請求項１９】
プログラムルーチンにおける少なくとも一つの命令を前記オーバーレイメモリにおけるジャンプ命令によってオーバーレイする、但し、前記ジャンプ命令は、プログラムコードのプログラミングが開始されるアドレスを参照する命令であり、前記プログラムコードは、オーバーレイされた命令を再構成し、更に、関数バイパスルーチンを呼び出し、前記プログラムルーチンにおける、前記オーバーレイされた命令に続く命令を参照するジャンプ命令で終了している、請求項１に記載の方法。
【請求項２０】
前記制御装置は少なくとも二つのプロセッサコアを有しており、少なくとも、前記バイパスルーチンの関数コードを一つ又は複数の第１のプロセッサコアによって処理し、本来のプログラムルーチンを一つ又は複数の第２のプロセッサコアによって処理する、請求項１９に記載の方法。
【請求項２１】
オーバーレイ機能がデアクティブ化された際に前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分に割り当てられた論理的なメモリアドレスが、オーバーレイ機能がアクティブ化された際に全体として前記バイパスルーチンの少なくとも一部を含む物理的なメモリアドレスに割り当てられているように、前記制御装置のメモリ管理ユニットのプログラミングによって、オーバーレイメモリを制御装置に形成する、請求項１乃至２０のいずれか一項に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電子的な制御装置のメモリ内のソフトウェアを変更するための方法に関し、メモリは少なくとも一つの永久記憶装置を含み、この永久記憶装置にはソフトウェアの少なくとも一部を成す複数の原始的なプログラムルーチンが記憶されており、それらのプログラムルーチンは、制御装置の少なくとも一つのプロセッサによって実行され、またメモリは一時的なデータを記憶するための少なくとも一つの主記憶装置を有し、更にメモリはオーバーレイメモリを有し、このオーバーレイメモリにおいて各メモリアドレスを、割り当て情報を用いて永久記憶装置のメモリアドレスに割り当てることができ、その結果、プロセッサはオーバーレイ機能がアクティブ化された際に、永久記憶装置における或るアドレスのプログラムルーチン命令の代わりに、オーバーレイメモリの割り当てられたアドレスにおける命令を実行する。
【背景技術】
【０００２】
自動車産業においては、ソフトウェアを使用することによって、純粋に機械的な解決手段では実現できない効率で制御メカニズム及び調整メカニズムを実現している。現代の自動車は、プログラムルーチンを実行するプロセッサと、主記憶装置と、永久記憶装置（通常はフラッシュメモリによって実現されている）とをそれぞれ少なくとも一つずつ備えている複数の電子的な制御装置（ＥＣＵ；Electronic Control Unit）から成るネットワークを有している。
【０００３】
更にはいずれの制御装置もインタフェースを有しており、それらのインタフェースを介して各制御装置はセンサデータを受信し、アクチュエータを駆動制御し、また相互に通信を行う。ソフトウェア産業において一般的に行われているように、ＥＣＵのプログラミングにおいても多数の既存の解決手段が好んで用いられている。新規の制御装置の開発にあたり、既存の制御装置、例えば先行シリーズのエンジンのためのエンジン制御装置が基礎として使用される。その場合、選択的に幾つかのプログラムルーチンが修正されるか、又は新たに開発されるが、古いコードの大部分は残されたままとなる。
【０００４】
択一的に、製造メーカが下請け業者に完全にプログラミングされた開発用制御装置を注文し、その後、それらの開発用制御装置を製造メーカ自身で固有の特別な要求に応じて修正することも頻繁に行われている。このシナリオにおいては、新たに開発されたプログラムルーチンを制御装置の実行可能なバイナリコードに実装し、その際に本来の各プログラムルーチンを置換、変更又は補完しなければならない。この実装プロセスはバイパス処理（Bypassing）とも称される。
【０００５】
バイパスを実現するための手段が多数存在している。良く知られた手段はサービスベースのバイパス処理である。サービスとは、制御装置のメモリにある特別な関数である。プログラムコードにおける特定の個所でサービスが呼び出されると、呼び出されたサービスは、本来のプログラムルーチンに付加的に、又は本来のプログラムルーチンの代わりに、バイパスルーチンを呼び出し、バイパスルーチンの入力パラメータを提供し、またバイパスルーチンの実行後には、そのバイパスルーチンによって記録された値を制御装置のメモリの適切な個所に格納することによって、バイパスの技術的な実行を担う。別の方式ではサービス関数は用いられない。従ってそれらの別の方式ではバイナリコードの修正を基礎としている。例えば、スイッチロジックを埋め込むことによって、或る関数内の変数アクセスを無効にすることができる。
【０００６】
基本的に、バイパスルーチンのコードを外部システム上に設けることができるか、又は制御装置自体に設けることができる。後者で実現した場合、これはいわゆる内部バイパス処理であって、ハードウェアの追加は極僅かなもので十分であり、特別なインタフェースを設ける必要はない。
【０００７】
従来技術によれば、開発用制御装置はバイパスを実行するために事前の準備を必要とする。サービスベースのバイパス処理方式が適用される場合、このことは、置換すべき関数の（方式に応じて）前及び／又は後、及び／又は、置換すべき関数内に、サービス関数の呼び出しがプログラムルーチンのバイナリコードに組み込まれていなければならないことを意味している。理想的な場合には、そのようなサービスの呼び出しはソースコードのレベルで既に実行される。もっとも実際のところは、これは常に実現できるものではない。例えば、制御装置の下請け業者にその用意がないこと、又は、制御装置が既に完成したときになって漸く、所定の関数のバイパスが必要であることが明らかになることも起こり得る。そのようなケースでは、呼び出しを事後的にバイナリコードに組み込むことも可能である。
【０００８】
現在の従来技術によれば、バイパスルーチンのコードを組み込む度に、制御装置のフラッシュメモリへの新たな記録が必要となる。そのような新たな記録は時間が掛かって（数十秒から数分）、実行中の一連のテストが中断されるだけでなく、物理的に限られた回数の記憶プロセスしか処理できないフラッシュメモリを消耗させることにもなる。
【０００９】
サービスベースの内部バイパス処理に関する、従来技術に応じた典型的なシナリオにおいては、本来のプログラムコードの他に、特別なバイパス処理サービス関数もフラッシュメモリに設けられている。或るバイパス処理のために準備されている任意のプログラムルーチンｆが拡張され、サービスが２回呼び出されるようにされる。バイパスルーチンをフラッシュメモリにインストールするユーザは、バイパスルーチンのメモリアドレスをテーブルに登録する。サービス関数の１回目の呼び出しは例えばプログラムルーチンｆの直前に存在している。サービス関数は独立変数としてテーブルポジションを含んでいる。サービス関数がテーブル内でメモリアドレスを発見すると、サービス関数はそのアドレスにあるバイパス関数を呼び出す。それ以外の場合、サービス関数は受動的なままである。バイパスルーチンが実行される場合、バイパスルーチンは生じた全ての値を一時記憶装置に書き込み、特にバイパスルーチンに対して規定されたグローバル変数に書き込む。バイパスルーチンの実行後に、プロセッサは再び本来のプログラムにジャンプする。その後はバイパスルーチンが実行されたか否かに依存せずに、関数ｆが適切に実行される。
【００１０】
関数ｆの実行後にサービス関数の２回目の呼び出しが行われる。独立変数として、サービス関数は第２のテーブルポジションを取得し、またそのテーブルポジションから上書き関数のアドレスを発見する。この上書き関数はバイパスルーチンについて調整されており、さらにはバイパスルーチンと共にインストールされていたものである。上書きルーチンはバイパスルーチンが格納されている一時記憶装置を読み出し、またｆによって記録された変数を上書きする。
【００１１】
ｆによって処理される変数に関する情報は制御装置のＡ２Ｌファイルに存在する。Ａ２Ｌファイルとは、各開発用制御装置に付随する技術的な記録ファイルである。またこのファイルは、殊に、制御装置において実行される関数を、その都度読み出されて記録される変数に割り当てる第１のブロックと、変数のメモリアドレスを指定する第２のブロックとを含んでいる。従ってｆのソースコードの知識は、バイパスルーチンを構想する際に不要である。
【発明の概要】
【発明が解決しようとする課題】
【００１２】
本発明の課題は、特に製造メーカ側で元々変更の用意がなされていなかったソフトウェアの変更を制御装置上で行うことによってソフトウェアを変更すること、特に、サービス関数呼び出しを準備してプログラムルーチン内に含ませる必要がないようにすることである。
【００１３】
更に本発明の課題は、フラッシュメモリのコンテンツには殆ど触れないままにし、若しくはそれどころか完全に触れないままにし、それによって、バイパス処理の際に発生する、上述の問題の大部分（フラッシュメモリに物理的な負荷が掛かること、制御装置の例のように、記録に時間が掛かること、またサービス関数を事前に用意しなければならないこと）が回避されるようにすることである。別の課題は、プログラムルーチンのコードを制御装置の動作中に動的に補完、変更又は置換できるようにし、特に、そのために制御装置を停止する必要がないようにすることである。
【課題を解決するための手段】
【００１４】
この課題は、本発明によれば、制御装置のインタフェースを介して、そのインタフェースに接続されているインタラクション装置を用いて、又は、制御装置プログラムに組み込まれたサービスコードによって、特に、制御装置の動作中に、オーバーレイメモリにおけるアドレス領域に、本来のプログラムルーチンを補完するバイパスルーチンの少なくとも一部が記憶されるか、又は少なくとも部分的に置換すべきバイパスルーチンの少なくとも一部が記憶されることによって解決される。本発明によれば、バイパスルーチンは、制御装置の機能に直接的に作用する関数コードと、関数コードの正常な実行を保証するために、関数コードを必要に応じて補完するオプション補助コードとから構成されている。補助コードの例は、ジャンプ命令、サービス関数及びサービス関数の呼び出しである。
【００１５】
本発明によれば、プログラムルーチン又はその少なくとも一部の置換とは、プログラムルーチン又はその一部が機能的に置換されること、即ち、そのルーチン又はその一部の代わりに、別のルーチン又は別の一部がプロセッサによって処理されることと解される。本発明によれば、本発明による置換でもって永久記憶装置における本来のコードは一切変更されず、従って本来のコードは触れられないままである。本発明によって、本来のコードの代わりに、別のコードがプロセッサによって実行されることになる。
【００１６】
このために本発明は、制御装置が、特に大量生産品として製品に取り付けるためのものではなく、開発を目的として、装置において実行されるソフトウェアのテスト及び較正を行うための開発用制御装置がいわゆるオーバーレイメモリを有していることが多いことを利用する。このオーバーレイメモリは、プログラムコードの個々のフラグメントの高速で複雑ではないオーバーレイに使用される特別なメモリ領域である。
【００１７】
オーバーレイメモリは例えば、プロセッサに組み込まれている固有のメモリモジュールであるか、又は主記憶装置又はフラッシュメモリの確保された領域、若しくは確保可能な領域である。オーバーレイメモリの個々のアドレス又はアドレス領域全体を、特に専用のプロセッサレジスタに記憶される少なくとも一つの割り当て情報を用いて、フラッシュメモリ又は主記憶装置上のアドレス又は同じ大きさのアドレス領域に割り当てることができる。
【００１８】
本発明によれば、制御装置に接続されているコンピュータを用いて、又はコンピュータ上で実行されるソフトウェア及び／又は制御装置に接続されているインタラクション装置を用いて割り当て情報が作成され、この割り当て情報は、その割り当てをアクティブにするため、従ってオーバーレイ機能をアクティブ化するために、専用のプロセッサレジスタに書き込まれる。
【００１９】
この種の制御装置においては、メモリアドレス、特に少なくとも永久記憶装置のメモリアドレスにプロセッサがアクセスする度に、そのアドレスにオーバーレイメモリにおけるアドレスが割り当てられているか否かが検査される。割り当てられている場合には、メモリアドレスの内容が無視され、その代わりに、オーバーレイメモリにおける割り当てられたメモリアドレスへのアクセスが行われる。そこに実行可能な命令が存在する場合には、その命令がプロセッサによって処理される。本方法を実行するロジックは有利には制御装置のプロセッサにハードワイヤ配線されている。
【００２０】
従来技術によれば、オーバーレイメモリは制御装置の較正に使用される。制御装置の較正とは、テストが終わり完成した制御装置ソフトウェアのパラメータを所定の車両モデルに適合させることと解される。制御装置において使用される一般的なフラッシュメモリにおいては、物理的な理由から、個々の値を操作するためにはフラッシュメモリのメモリ領域全体を完全に消去して、その後再び完全に新たなプログラミングを実施しなければならないので、そのような個々の値の操作は大きな手間を伴うことでしか実現できない。そのようにしてフラッシュメモリを消去して絶えず新たな書き込みを行うことは、大抵の場合は、時間的に許容することはできない。これはプログラムの処理が実行中であっても通常は不可能である。何故ならば、プロセッサが、完全に消去されたフラッシュメモリの記憶領域、又は漸く部分的に新たにプログラミングされたフラッシュメモリの記憶領域において、その領域のプログラムコードを実行するか、又はそこに格納されているデータを処理する場合、その領域が予測外の応答を示す可能性があるからである。従って、パラメータはオーバーレイメモリに書き込まれ、その結果、それらのパラメータはフラッシュ上に記憶されている変数をオーバーレイし、またそこにおいて、実行中に高速に操作することができる。従って、従来技術によれば、オーバーレイメモリは変数又はパラメータの上書きのためにしか利用されていない。
【００２１】
本発明による方法では、オーバーレイメモリを利用することによって、新たな機能が導入される。つまり、バイパスルーチンのコードを制御装置プログラムに組み込むためにオーバーレイメモリが利用され、またそのコードによってプログラムルーチンが少なくとも部分的に機能的に置換されるか、又は補完される。
【００２２】
従って、バイパスルーチンが完全に又は少なくとも部分的にオーバーレイメモリに書き込まれ、またオーバーレイ機能に利用されるプロセッサのレジスタは、少なくとも一つの割り当て情報の記憶によって、置換すべき本来のプログラムルーチンの代わりに、バイパスルーチンが実行されるようにコンフィギュレートされる。特別な実施の形態では、オーバーレイメモリに、アクティブなオーバーレイメモリ外にあるメモリアドレスにプロセッサを案内するためのジャンプ命令が記憶され、その案内先のメモリアドレス以降にバイパスルーチンの少なくとも一部が記憶されている。このメモリアドレスは原理的にはオーバーレイメモリの内外にある任意のアドレスでよい。つまり、非常に小さいオーバーレイメモリしか提供しない制御装置を用いても本発明を利用することができる。
【００２３】
本発明において「アクティブなオーバーレイメモリ」とは、割り当て情報に基づき、各メモリアドレスに他の一つのメモリアドレスが一義的に割り当てられており、その結果、オーバーレイ機能がアクティブ化された際に、各メモリアドレスが他の各メモリアドレスを上述のようにオーバーレイするように構成されている、全てのメモリアドレスの総称であると解される。
【００２４】
従来技術から公知のサービスベースのバイパス処理とは異なり、本発明を用いることによって、下請け業者による制御装置の準備はもはや必要なくなる。更には、制御装置を停止させることなく、バイパスルーチンのコードを高速に再ロード又は置換することができる。
【００２５】
これに関して、オーバーレイ関数がアクティブ化されているならば、先ずそのオーバーレイ関数をデアクティブ化し、それにより、制御装置は本来のプログラムルーチンを実行しながら更に処理を行うこともできる。これは例えば、プロセッサレジスタの消去によって、又はプロセッサレジスタに存在する割り当て情報の消去によって行なうことができる。
【００２６】
その間に、オーバーレイメモリにおけるバイパスルーチンのコード又はオーバーレイメモリにおけるジャンプ命令を任意に操作することができ、またこれが終了している場合には、オーバーレイ機能が再びアクティブ化される。その際に、オーバーレイメモリに格納されているオーバーレイされるコードが本来のコードと異なるならば、プロセッサはオーバーレイメモリのアクティブ化の際に、オーバーレイメモリによってオーバーレイされたメモリ領域内の命令を実行しないことが保証されている。
【００２７】
換言すれば、デアクティブ化の時点に、プログラムフローが、オーバーレイされた本来のコードとは異なるバイパスルーチンの一部の中に存在することは許容されない。そうでなければ、プログラムシーケンスの一貫性がなくなり、テスト車両、シミュレータ又はテストベンチが破壊されるほどの予測できない結果も生じるおそれがある。
【００２８】
その種のシナリオは例えば、オーバーレイメモリのアクティブ化（デアクティブ化）が該当する領域外のメモリアドレスに関連付けられることによって阻止される。
【００２９】
ユーザは両関数の切替を直接的に指示することはできないが、ユーザは有利には、接続されているコンピュータ上で実行されるソフトウェアを用いてアクティブ化又はデアクティブ化の要求を通知し、使用されるバイパスツール、例えばインタフェースを介して制御装置と接続されているインタラクション装置は、確実で安全なものとして識別された所定のメモリアドレス、即ち該当する領域外のアドレスにプロセッサが到達すると、アクティブ化又はデアクティブ化を即座に実施する。
【００３０】
このことは例えば、実際に処理されている機械語命令のメモリアドレスを読み出すことができるプログラムカウンタの監視によって実現される。それ以外にも多くの実現手段が存在する。例えば、確実なメモリアドレスにおいて行われることが分かっているトリガとしての変数アクセスの使用、又はＩ／Ｏピンの監視等が考えられる。
【００３１】
有利であって特に信頼の高い実現手段は、プログラムコードに組み込まれており、且つ、本来の関数とバイパスコードの切替を信号に基づき行う特別なサービス関数の使用である。
【００３２】
オーバーレイ機能を用いて、本来のプログラムルーチンのバイパスルーチンのみがオーバーレイされるだけでなく、このオーバーレイのデアクティブ化／アクティブ化もオーバーレイ機能の使用によって行われ、これは例えば、置換すべきプログラムルーチン外の或るプログラムルーチンにおける命令がオーバーレイメモリにおけるジャンプ命令によってオーバーレイされることによって行われる。ジャンプ命令は、オーバーレイされた命令を再構成するプログラムコードのプログラミングが始まっているアドレスを示す。またプログラムコードは、置換すべきプログラムルーチンに関するオーバーレイ機能のアクティブ化／デアクティブ化を実施し、更にはジャンプ命令で終了している。このジャンプ命令は、オーバーレイされた命令に続く、置換すべきプログラムルーチン外のプログラムルーチンにおける命令を表す。特に、このプログラムコード内のサブプログラムルーチンの呼び出しによってアクティブ化／デアクティブ化が行われる。
【００３３】
プロセッサが置換すべきプログラムルーチン外のプログラムコードを処理するときにデアクティブ化／アクティブ化が行われることが常に保証される。デアクティブ化／アクティブ化を担うプログラムコードは例えば、そのために必要とされる、冒頭で述べたようなソフトウェア又はインタラクション装置によって作成された割り当て情報を、プロセッサの専用のレジスタに書き込むことができる。
【００３４】
アクティブなオーバーレイメモリにはジャンプ命令のみが記憶される本発明による解決手段では、オーバーレイメモリ外にあり且つバイパスルーチンの記憶が開始されるメモリアドレスを示すジャンプ命令をオーバーレイメモリに記憶する前に、オーバーレイメモリにおいては、置換すべき全てのプログラムルーチン又は置換すべき全てのプログラムルーチン部分の再構成が記憶され、またオーバーレイ機能が、この再構成による、置換すべき全てのプログラムルーチン又は置換すべき全てのプログラムルーチン部分のオーバーレイのためにアクティブ化されるようにして、アクティブ化が確実に行われる。
【００３５】
この解決手段によって、アクティブ化によって差し当たり機能は変更されず、従って、アクティブ化の後においてもアクティブ化の前と全く同じプログラムコードがプロセッサによって処理される。アクティブなオーバーレイメモリの或るアドレスに上述のジャンプ命令が記憶されると、次のプログラムルーチンの実行時に、プロセッサの処理はオーバーレイメモリ外のバイパスルーチンへと迂回される。即ち、バイパスルーチンへの実際の切替は、オーバーレイ機能のアクティブ化によって行われるのではなく、対応するオーバーレイメモリ領域内の第１のアドレスにジャンプ命令が記憶されることによって行われ、このことは有利には、上述のインタフェースを介して制御装置と接続されているコンピュータにおいて実行されるソフトウェアによって行われる。
【００３６】
少なくとも部分的に置換すべきプログラムルーチンに関するオーバーレイ機能の確実なデアクティブ化／アクティブ化を考慮しながら、本発明はバイパスルーチンの記憶を複数回実行することができる。
【００３７】
例えば、バイパスルーチンが置換すべきプログラムルーチン又は置換すべきプログラムルーチン部分よりも短いプログラムコードを有している場合、置換すべきプログラムルーチン又は置換すべきプログラムルーチン部分によって占有されている、永久記憶装置内の全てのアドレス領域が、オーバーレイメモリにおいて同じ長さのアドレス領域によってオーバーレイされ、そのアドレス領域に、置換するバイパスルーチンが少なくとも部分的に記憶され、有利には完全に記憶される。有利なケースにおいては、バイパスルーチンに対してオーバーレイメモリのみが利用される。
【００３８】
バイパスルーチンが置換すべきプログラムルーチン又は置換すべきプログラムルーチン部分又は利用可能なオーバーレイメモリよりも長いプログラムコードを有している場合、置換すべきプログラムルーチン又は置換すべきプログラムルーチン部分によって占有されている、永久記憶装置内の全てのアドレス領域を、オーバーレイメモリにおいて同じ長さのアドレス領域によってオーバーレイすることができ、アドレス領域には少なくともバイパスルーチンの第１の部分が記憶される。またバイパスルーチンはジャンプ命令で終了する。ジャンプ命令は、そのジャンプ命令によって識別され、且つ、バイパスルーチンの少なくとも一つの別の部分の記憶が開始されるアドレスにおいて、プログラムの処理を継続することをプロセッサに指示する。バイパスルーチンのこの少なくとも一つの別の部分を、例えばオーバーレイメモリ外、例えば主記憶装置に記憶することもできる。
【００３９】
上述の複数の実施の形態では更に、バイパスルーチンによってプログラムルーチン全体が置換される場合、そのバイパスルーチンがジャンプ命令で、特にリターン（return）命令でもって終了する。このジャンプ命令は、プログラムの処理でもって、置換すべきプログラムルーチンを特にサブプログラムルーチンとして呼び出したプログラムルーチンに戻ることをプロセッサに指示する。つまり「ゴーサブ（GoSub）」命令としてサブプログラムが呼び出されたときには、その命令のアドレスに対応するプログラムカウンタ状態がプロセッサによって自動的に記憶されること、また、「リターン」命令によってプロセッサはその番地に続く次の命令へと戻ることは一般的である。
【００４０】
これに対してプログラムルーチンの一部のみが置換される場合でも、本来のプログラムルーチンの、置換すべき部分に続く命令で、プログラムの処理を継続することをプロセッサに指示するジャンプ命令でバイパスルーチンを終了させることができる。ジャンプ命令は通常の場合、絶対アドレス情報又は相対アドレス情報を表す独立変数、つまり、更なるプログラム処理のためにプロセッサがジャンプすべきアドレスを表す独立変数を含んでいる。
【００４１】
また一つの実施の形態では、全てのバイパスルーチンをアクティブなオーバーレイメモリ外のメモリ領域に記憶し、置換すべきプログラムルーチンの或るアドレスにおける命令をオーバーレイメモリにおいてジャンプ命令でオーバーレイすることができる。ジャンプ命令は、そのジャンプ命令によって識別され、且つ、バイパスルーチンの記憶が開始されるアドレスにおいて、処理を継続することをプロセッサに指示する。バイパスルーチンは、上記において既に説明したように、置換すべきプログラムルーチンを特にサブプログラムルーチンとして呼び出したプログラムルーチンに戻ることをプロセッサに指示するリターン命令で終了している。
【００４２】
以下では複数の実施例を図面に基づき説明する。
【図面の簡単な説明】
【００４３】
【図１】バイパスシナリオの技術的な構造を概略的に示す。
【図２】本発明による方法の適用前の開発用制御装置を示す。
【図３】バイパス関数が本来の関数よりも小さい場合の、本発明による方法の適用後の開発用制御装置を示す。
【図４】バイパス関数が本来の関数よりも大きい場合の、本発明による方法の適用後の開発用制御装置を示す。
【図５】少ないオーバーレイメモリリソースでも十分な本発明による方法の一つの実施の形態を示す。
【図６】バイパスコードが完全な関数を表していない場合の、本発明による方法の一つの実施の形態を示す。
【図７】本発明による方法を用いた、サービス関数の制御装置コードへの組み込みの一例を示す。
【図８】本発明による方法を用いた、関数呼び出しの制御装置コードへの補完的な組み込みを示す。
【発明を実施するための形態】
【００４４】
図１には、従来技術による典型的なバイパス処理シナリオが概略的に示されている。電子的な制御装置ＥＣＵがテストされる。この電子的な制御装置ＥＣＵは少なくとも、永久記憶装置ＳＰ、一般的にはフラッシュメモリと、揮発性の主記憶装置ＲＡＭと、それら二つのメモリにデータ線を介してアクセスすることができるプロセッサＣとを有している。永久記憶装置ＳＰには、機械語にコーディングされた、制御装置の機能を決定するコンピュータプログラムが記憶されている。制御装置が例えば自動車に取り付けるためのものである場合、コンピュータプログラムはエンジンを制御するためのプログラムであると考えられる。制御装置は更にインタフェースを有している。このインタフェースを介して、制御装置は複数のセンサからのデータ、又は他の制御装置からのデータを受信することができ、また、永久記憶装置ＳＰに記憶されており、且つ、プロセッサＣによって実行されるコンピュータプログラムを評価することができ、更には、このプログラムによって生成されるデータを他の制御装置及びアクチュエータに転送することができる。
【００４５】
有利には、ＥＣＵは、完成した製品に大量生産品として取り付けるためのものではない開発用制御装置である。従って開発用制御装置は、ソフトウェハ開発者及び検査者が上述の基本機能の枠を超えて制御装置にアクセスすることを実現する、複数の別のインタフェースを有している。それらのインタフェースには、例えば、プロセッサＣをコンフィギュレートするために、又は、実際にプロセッサＣによって処理されるメモリアドレスを出力するプログラムカウンタを読み出すために、又は、ブレークポイント及びウォッチポイントをセット及びコンフィギュレートするために、永久記憶装置ＳＰ及び主記憶装置ＲＡＭへの直接的なアクセスを行うためのインタフェースが含まれる。
【００４６】
典型的なシナリオにおいては、制御装置ＥＣＵが、インタフェースを介してバスＢＵＳに接続されている。制御装置ＥＣＵが例えばテスト車両に取り付けられている場合、バスＢＵＳは別の制御装置のネットワークであってもよい。しかしながらバスＢＵＳは、ハードウェア・イン・ザ・ループ（ＨＩＬ）においてシミュレートされる仮想制御装置のネットワークであってもよい。バスとの通信を、種々のバスシステムを介して行うことができる。大抵の場合、バスは自動車産業において一般的なＣＡＮバスである。しかしながら他の標準、例えばＬＩＮ、イーサネット又はＦｌｅｘＲａｙを用いてもよい。
【００４７】
制御装置ＥＣＵは更にインタラクション装置ＧＳＩと接続されている。このインタラクション装置ＧＳＩ、例えばｄＳＰＡＣＥ  ＤＣＩ−ＧＳＩ１は、ユーザによる上述の開発用インタフェースへのアクセスを実現するハードウェアインタフェースである。このインタラクション装置ＧＳＩを介して、制御装置ＥＣＵはコンピュータＰＣと接続されている。このコンピュータＰＣにおいては、バイパスコードを実施するため、及び、制御装置ＥＣＵをコンフィギュレートするために構成されており、また例えばユーザに相応のグラフィックユーザインタフェースを提供するソフトウェアが実行される。
【００４８】
インタラクション装置ＧＳＩは、制御装置ＥＣＵの制御及び監視、特にプロセッサレジスタのコンフィギュレーション及びプログラムカウンタの読み出しに使用される。接続されているコンピュータＰＣは、制御装置ＥＣＵには直接的にアクセスしない。ユーザによってなされた変更希望、例えばオーバーレイ機能のアクティブ化又はデアクティブ化によって、コンピュータは、インタラクション装置ＧＳＩが制御装置ＥＣＵの相応の新規コンフィギュレーションをスタンドアロンで実施することを、インタラクション装置ＧＳＩに通知する。
【００４９】
図１に示されている構造は例示的なものであり、本発明による方法を限定するものではない。つまり例えば、インタラクション装置ＧＳＩの機能をサービス関数の形態で、部分的に又は完全に制御装置のプロセッサＣに委ねることができる。特に、制御装置ＥＣＵがプロセッサを二つ以上有している場合（マルチコア技術）、一方のプロセッサは製造メーカ側で用意された制御装置の機能の一部である全てのプログラムルーチンを処理し、他方のプロセッサはそれに並列に、上述の一方のプロセッサに影響を及ぼすことなく、バイパス環境に属する、事後的にインストールされたサービス関数を処理する。
【００５０】
適用ケース次第ではあるが、全てのバイパスルーチンがロードされ、且つ、制御装置ＥＣＵが本発明に従い用意されるならば、接続されているコンピュータＰＣを場合によっては省略することも可能である。例えば、オーバーレイ機能のアクティブ化又はデアクティブ化の希望が制御装置又はインタラクション装置ＧＳＩのＩ／Ｏピンの電圧状態に基づき通知されるように、インタラクション装置ＧＳＩ又は担当のサービス関数が構成されている場合には、本来のコードとバイパスルーチンの切り替えを、接続されている電気的なスイッチに基づいて行うこともできる。
【００５１】
「バイパス環境」とは、本発明によれば、制御装置ＥＣＵの基本機能（制御装置コードの実行、バスＢＵＳとの通信）の枠を超える、図１に示したコンポーネント全体、即ち、インタラクション装置ＧＳＩ、コンピュータＰＣ、コンフィギュレーションソフトウェア及びバイパスソフトウェア、並びに、上述のソフトウェアが制御装置と通信する際に用いられるインタフェースを指す。
【００５２】
図２には、プロセッサＣと、永久記憶装置ＳＰ、一般的にはフラッシュメモリと、主記憶装置ＲＡＭとを備えている開発用制御装置ＥＣＵが概略的に示されている。プロセッサＣには、オーバーレイメモリＯＶと、レジスタＲのセットが組み込まれている。プロセッサＣは複数の論理ゲートから成る装置を有しており、この装置は、レジスタＲを用いることによって、プログラムの実行時にプロセッサＣによって無視され、且つ、オーバーレイメモリＯＶからの内容に置換される内容を有している、永久記憶装置ＳＰ及び主記憶装置ＲＡＭにおけるメモリアドレス領域を規定できるように構成されている。
【００５３】
プロセッサは、メモリへのアクセスが行われる度に、目下読み出されている機械語命令のアドレスがレジスタＲによって検出されたメモリ領域内に存在するか否かを検査する。存在する場合には、そのメモリ領域に格納されている内容は無視され、その代わりに、オーバーレイメモリＯＶの割り当てられたアドレスに存在する内容が読み出されて実行される。そのようにして、個々の内容／命令、更には比較的長いシーケンスも一時的にデアクティブ化され、永久記憶装置ＳＰにおける本来のシーケンスを上書きする必要なく、別の内容／命令シーケンスに置換することができる。
【００５４】
図面に示されている構成は例示的なものであり、本発明を限定するものではない。他の構成も考えられる。例えば、オーバーレイメモリＯＶは、そのために確保された、主記憶装置ＲＡＭのアドレス領域、又はプロセッサＣの他のアドレッシング可能なメモリ領域であってもよい。また、主記憶装置ＲＡＭ及び永久記憶装置ＳＰをプロセッサＣに組み込むこともできる。オーバーレイメモリＯＶによってどのメモリ領域を詳細にオーバーレイすることができるかも、制御装置に応じて、又は使用されるプロセッサに応じて変更することができる。メモリ領域は或る装置では、永久記憶装置ＲＡＭ及び外部記憶媒体も含めた、プロセッサによってアドレッシング可能な全てのメモリ領域であり、また別の装置ではアドレッシング可能なメモリの一部分のみであることも考えられる。
【００５５】
永久記憶装置ＳＰには、機械語にコーディングされたプログラムが存在しており、このプログラムはここでは三つのプログラム関数、即ちｆ１、engine_idle_rev及びｆ３から構成されている（三つという数は図面を見やすくするために用いたものに過ぎず、実際の制御装置プログラムは一般的に数百の関数から成る）。
【００５６】
実際のシナリオの一例では、制御装置ＥＣＵはエンジン制御装置であり、また関数engine_idle_revはアイドリング回転数を制御するための関数である。動力用燃料消費量を低減するために、エンジンのアイドリング回転数を可能な限り低く抑えること、即ち、最低限の回転数に厳密に調整してエンジンの駆動を維持することが重要である。しかしながらこの値は、各エンジンモデルに対して規定されている定数ではなく、多くの変化する要因によって決定される可変の値である。これには、エンジンモデルの他に、例えばバッテリの充電状態、電気的な負荷による瞬時バッテリ負荷又はエンジン温度が属する。定量化することが困難な多くの影響要因に応じて、最適化の潜在的な可能性は高いものである。アイドリング回転数を制御するための関数のプログラマであれば、信頼性のあるより良い解決手段の存在を排除するようなことはない。或るシナリオにおいては、下請け業者によってプログラミングの完了した開発用エンジン制御装置を受領した自動車製造メーカが、この制御装置において実施される、アイドリング回転数の制御のための関数を部分的に他の関数に置換することを所望することが考えられる。
【００５７】
別のシナリオにおいては、自動車製造メーカが制御装置の機能の拡張を所望する可能性もある。例えば、自動車製造メーカは自社の自動車モデルに、自動車が停止した際の自動停止装置を装備させたいと考える。制御装置に存在する、アイドリング回転数を制御するための関数はその種の機能を有していないので、自動車製造メーカはその種の機能を、固有の機能に置換しようとし、またそのために自身の固有の関数の多数の変数をテストしようとする。
【００５８】
ソースコードは一般的にユーザの手元にはない。従来技術によれば、ユーザは１６進数のコードをメモリＳＰから呼び出し、バイパスサービスを設け、バイパスコードを追加し、フラッシュメモリに新規の記録を行うことが必要になる。関数の第３の変数によるバイパス関数の置換には、やはりフラッシュメモリの新規の記録等が必要になる。これに要する時間は長い。
【００５９】
本発明による方法でもって、制御装置ＥＣＵの特別な用意を必要とすることなく、またフラッシュメモリＳＰに記憶されているコードを修正する必要なく、関数engine_idle_revを他の関数に置換することができる。図３には、本方法の適用後の制御装置が示されている。レジスタＲは、オーバーレイメモリＯＶのアドレス領域が置換すべき関数engine_idle_revをオーバーレイするようにコンフィギュレートされている。このアドレス領域には、ユーザによって記憶されたバイパス関数eir_bypが存在しており、このバイパス関数eir_bypが本来の関数の代わりにプロセッサによって呼び出される。
【００６０】
オーバーレイ関数がアクティブ化されると、永久記憶装置（又は主記憶装置）における各アドレスに、オーバーレイメモリにおける一つのアドレスが割り当てられる。従って、オーバーレイされるメモリと割り当てられるオーバーレイメモリは常に同じ大きさである。割り当てられたオーバーレイメモリにバイパスコードが適合されており、且つバイパスコードが完全な関数から成る場合には、それにより問題は生じない。バイパス関数は、プロセッサを呼び出した側の親関数に戻るようプロセッサに指示を出すリターン命令で終了し、またプログラムは通常通り継続される。これに対してバイパス関数が本来の関数よりも大きい場合には、バイパス関数を完全にオーバーレイメモリに組み込むことはできない。
【００６１】
図４には、そのようなケースでの考えられる構成が示されている。このケースでは、割り当てられたオーバーレイメモリが小さすぎて、バイパス関数を完全に収容することはできない。従って、バイパス関数の少なくとも一部は主記憶装置に格納される。ジャンプ命令により一貫性のあるプログラム実行が達成される。関数バイパスコードを完全に、オーバーレイメモリとしては設けられていないメモリ領域、例えば主記憶装置ＲＡＭに格納し、アクティブなオーバーレイメモリには専ら、関数バイパスコードを参照するジャンプ命令のみを書き込むことも可能である。
【００６２】
幾つかの開発用制御装置では、オーバーレイメモリが、少数の個々の命令をオーバーレイするためにしか構成されておらず、比較的長いコードシーケンスを記憶するには小さ過ぎることも考えられる。若しくは、関数eir_bypの分割が、例えば関数の翻訳に使用されるコンパイラの制限に基づき技術的に不可能であることも考えられる。図５には、そのようなケースに関する構成が示されている。本来の関数が完全にはオーバーレイされず、有利にはシーケンスの冒頭、又は他の適切な個所を起点にした短いシーケンスのみがオーバーレイされる。オーバーレイメモリ内に割り当てられたメモリ領域は、主記憶装置ＲＡＭに格納されているバイパス関数へのジャンプ命令しか含んでいない。
【００６３】
実際のところ、オーバーレイメモリの割り当ては、図示されている例において暗示的に前提とされているように常に自由に選択できるものではない。ここで多くの開発用制御装置には、例えば、関連するオーバーレイメモリ領域のバイトサイズが２の累乗を表さなければならないか、又は割り当て可能なメモリ領域が、数バイトの分割不可能な複数の区間に分割されているように制限が課されている。本発明による方法の適用にあたり、このことは、割り当てられたオーバーレイメモリが一般的に、実際に所望されるものよりも大きいか又は小さいかのいずれかでなくてはならないことを意味している。本発明の適用範囲に関して、この状況は制限的ではない。割り当てられたオーバーレイメモリが過度に小さい場合には、図４又は図５に示されている方式を適用することができる。割り当てられたオーバーレイメモリが過度に大きい場合には、本発明によるオーバーレイのために設けられているメモリ領域外のメモリアドレスをオーバーレイする、割り当てられたオーバーレイメモリの全てのメモリアドレスが、オーバーレイされたメモリアドレスの内容の正確なコピーでもってそれぞれ満たされると、結果として、本来のコードと割り当てられたオーバーレイメモリに格納されたコードとが同一になるので、プロセッサＣはその個所において、それら二つのコードの内のどちらかを実行しても相異は生じない。本発明においては、オーバーレイメモリの割り当てが最初から適切に行われているか否か、又はオーバーレイメモリの一部の割り当てが差し当たり所望のようには行われておらず、その後、上述のやり方で効果的に同様にデアクティブ化されるか否かは重要ではない。
【００６４】
これまで考察した全ての例においては、バイパスコードが完全な関数から成ることを前提としていた。制御装置コードは複数のソフトウェアコンポーネントから構成されているので、実際のところ、大抵の場合はこれに該当する。それらのソフトウェアコンポーネントは、記録を行う機能及び記録を行うインタフェースを有する、既にコンパイルされた関数であるか又は数個の関数から成るパックであり、それらは、（例えばｄＳＰＡＣＥ  ＳｙｓｔｅｍＤｅｓｋを用いることによって）多くはグラフィックプログラミングの原理に応じて、複数のプログラムに編成される。あるコンポーネントのインタフェース及び本質的な機能が既知であれば（つまり相応の記録が各コンポーネントに付随している）、コンポーネントのコードを知る必要はない。この動作方式は制御装置プログラミングにおいて確立されている。従って一般的には、バイパスコードも複数のコンポーネントから成ること、即ち、少なくとも一つの完全な関数から成ることが前提とされる。しかしながら原則として、本明細書において説明した方式を用いて、完全な関数又はソフトウェアコンポーネントを設けるのではなく、バイパスを備えた比較的短いコードシーケンスのみを設けることを支持しない理由はない。
【００６５】
図６にはその種のバイパスの実行方式が示されている。レジスタＲは、例えば、所定値の計算又は専用の変数の書き込みのような、関数engine_idle_revの部分機能を置換するために、オーバーレイメモリＯＶが関数engine_idle_rev内の一連の機械語命令をオーバーレイするようにコンフィギュレートされている。相応にバイパスコードも完全な関数を表していないので、最終的なリターン命令が欠落している。従って、プロセッサＣを通常のプログラムシーケンスへと再び戻すための最終的なジャンプ命令でバイパスコードを補完する必要がある。この図においては、バイパスコードがオーバーレイされる本来のコードよりも小さい。しかしながら、確保されたオーバーレイメモリはオーバーレイされるメモリと常に同じ大きさであるので、その確保されたオーバーレイメモリの部分には何も書き込まれていないままである。ジャンプ命令が存在しなければ、プロセッサＣが何も書き込まれていない最初のアドレスに到達するやいなや、未定義の振る舞いが生じる恐れがある。
【００６６】
それ以外にも、確保されてはいるが、しかしながら利用されていないオーバーレイメモリを空命令、即ちＮＯＰ（No Operation）又は関数の実行にとってクリティカルではない別の命令で満たすことも可能である。しかしながらそのような命令の実行時間は一般的に、本来のコードの実行時間よりも長いので（プログラムコードはｉｆ文を含み、従って選択的に実行される）、ジャンプ命令を含んでいる図５に示されている方法が一般的に有利である。
【００６７】
バイパスコードシーケンスが本来のコードシーケンスよりも大きい場合には、図４に示されているように、コードの一部が主記憶装置ＲＡＭ又は利用可能な別のメモリに格納される。しかしながらこのケースにおいても、バイパスコードをジャンプ命令で終了するように拡張する必要がある。
【００６８】
上記において説明した全ての方法では、オーバーレイメモリのアクティブ化又はデアクティブ化の時点に、オーバーレイメモリによるオーバーレイに関連し、且つオーバーレイされたコード、若しくはオーバーレイされるコードとは異なるコードは実行されないことが保証されている。図３に概略的に示した例に関して、このことは、関数engine_idle_revに由来するコードはいずれも実行されない場合にしか、オーバーレイメモリのアクティブ化は許可されないことを意味している。それとは反対に、オーバーレイメモリのデアクティブ化は、関数eir_bypに由来するコードはいずれも実行されない場合にしか許可されない。
【００６９】
さもなければ、プロセッサは機能コードの実行の最中に一方の関数から他方の関数にジャンプし、従って実際のところは、その都度二つの関数のコードのそれぞれ一部から形成された、高い確率で無意味な新たな関数を実行することになる。もしくは、プロセッサがeir_bypによってオーバーレイされているメモリ領域を既に離れている場合には、確保されたオーバーレイメモリの何も書き込まれていない領域にジャンプすることも考えられる。それどころか、命令の最中に切替が行われ、本来のコード及びバイパスコードから成る命令部分が、やはり高い確率で意味の無意味な新たな命令を形成することも考えられる。その結果、ほぼ全てのケースにおいて、制御装置の想定不可能な誤機能が、場合によっては深刻な結果をもたらす恐れがある。
【００７０】
このためバイパス環境は、そのバイパス環境のユーザがバイパスルーチンのアクティブ化又はデアクティブ化の要求を通知するように構成されている。
【００７１】
このアクティブ化又はデアクティブ化は、プロセッサが確実なものとして識別されたメモリアドレスを処理する時点に実行される。このことは例えば、プロセッサによって現在処理されているメモリアドレスを表すプログラムカウンタの監視によって、また別の情報内容の評価によって、例えば割り込みによって中断されるプログラムルーチンのリターンアドレスを内容とする専用レジスタ又はコールスタックの評価によって保証することができる。これらの情報を例えば、デバッグインタフェース（例えばＪＴＡＧ−Ｄｅｂｕｇインタフェース）を介して能動的に読み出すことができるか、又はプロセッサが現在実行している命令のメモリアドレスを出力するプログラムトレースインタフェースを介して受動的に監視することができる。
【００７２】
プログラムカウンタの読み出し以外の別の可能性は、オーバーレイメモリのアクティブ化（デアクティブ化）を、確実なものとして識別されたメモリアドレスでしか発生しないことが分かっているトリガイベントに関連付けることである。そのようなトリガイベントとして、例えば、所定の変数へのアクセス又は所定のＩ／Ｏピンの制御が考えられる。オーバーレイメモリをアクティブ化（デアクティブ化）するためにレジスタを新たにコンフィギュレートするための時間は、制御装置の典型的なプログラムサイクルよりも遙かに短い。従って、制御装置を停止させることなく、バイパスコードと本来のコードを切り替えることができる。しかしながらそのために、プロセッサは、オーバーレイに該当する関数に到達するまでの十分な時間的な間隔を保証するアドレスを処理しなければならない。
【００７３】
即ち、オーバーレイ機能のアクティブ化又はデアクティブ化が開始してから、関数が次に呼び出されるまでの期間は、アクティブ化又はデアクティブ化がレジスタＲを新たにコンフィギュレートすることによってそれまでに確実に終了しているほどの長いものでなければならない。従って本方法では、該当する関数の全ての呼び出しを発見し、またオーバーレイ機能を確実にアクティブ化又はデアクティブ化することができるメモリアドレスを識別するために、バイナリコードを先行して解析することが必要になる。択一的に、オーバーレイメモリのアクティブ化（デアクティブ化）には該当しないコードがプロセッサによって処理されると、切替が終了するまで制御装置を停止させることができる。しかしながらそのためには、大抵の場合、システム全体（シミュレータ、テストベンチ又はテスト車両）も停止させなければならなくなるので、従ってプロセッサの停止は一般的に望ましいものではない。例えば、エンジン制御装置は通常の場合、エンジンが依然として動作している間に停止することは許されない。
【００７４】
非常に確実な方式であって、従って有利な方式は、有利にはオーバーレイメモリの利用によって、本来のコードを変更することなくプログラムコードに組み込まれるサービス関数によるオーバーレイ機能のアクティブ化又はデアクティブ化である。
【００７５】
図７には、そのようなサービスの組み込みがどのように機能するかが示されている。主記憶装置ＲＡＭ又は利用可能な別のメモリには、本来のバイパス関数eir_bypの他に、オーバーレイメモリＯＶを利用して、プログラムコードの任意の個所に、特にオーバーレイによって置換すべきルーチン外に埋め込むことができるサービス関数Ｚも存在している。この図においては関数ｆ１への組み込みが示されている。短いコードシーケンスは、オーバーレイによって、主記憶装置ＲＡＭにおけるアドレスを示すジャンプ命令に置換される。そこでは先ず、オーバーレイされたコードが再構成され、サービスＺが呼び出されるように補完される。プロセッサＣを通常のプログラムシーケンスへと再び戻す別のジャンプ命令がそれに続く。サービス関数は、所定の条件、例えばインタフェースを介して書き込み可能な制御変数又は制御装置ＥＣＵの入力ピンの信号レベルに関連付けられているプロセッサレジスタＲをリコンフィギュレートするための命令を含む。本発明のこの実施の形態においては、どの時点にレジスタＲがリコンフィギュレートされるのかをユーザは意識する必要はない。このことは、本来のプログラムコードには属していない組み込まれたサービス関数内で確実に行われる。換言すれば、その時点においては、プログラムに属する関数及びバイパス関数は確実に実行されない。プロセッサにおける割り込み処理によるサービス関数の中断、又はオーバーレイ領域のリコンフィギュレーションにとって重要なサービス関数のシーケンスの中断を阻止するために、サービスコードは、この重要なシーケンスにおいてその種の中断が行われないようにすることができる。
【００７６】
サービス関数Ｚを組み込むためのオーバーレイ機能のアクティブ化は、変更すべきプログラムコードの処理がプロセッサＣによって開始される前に、制御装置ＥＣＵの専用のインタフェースを用いて、例えば制御装置ＥＣＵの起動直後に、又は制御装置プログラムの初期化フェーズの間に行われる。別の実施の形態においては、図７に示されているサービス関数Ｚが、有利には主記憶装置ＲＡＭに格納されているバイパス関数を呼び出す古典的なサービス関数であってもよい。一つの実施の形態においては、バイパス関数がその値を差し当たり一時記憶装置に書き込むことが考えられる。その後、本来の関数が全く通常通りに実行され、その実行後に、サービスの２回目の呼び出しでもって、本来の関数によって書き込まれた値を一時記憶装置からの値で上書きする上書き関数が呼び出されることが考えられる。
【００７７】
制御装置ＥＣＵが複数のプロセッサコアを有している場合、本来の関数engine_idle_rev及びバイパス関数eir_bypを二つのプロセッサコアにおいて並列に計算できることは有利である。即ち、一方のプロセッサコアは、フラッシュメモリＳＰに記憶されており且つ本来の関数engine_idle_revを含んでいる制御プログラムを処理し、それに並列して他方のプロセッサコアは、バイパス関数eir_bypを呼び出した後に、そのバイパス関数eir_bypを処理する。そのようにして、付加的な関数を組み込むことによって発生する、制御装置ＥＣＵのリアルタイム能力を妨げる可能性がある実行時間の延長を最小限にすることができる。特に、エンジン制御のような時間が重要なタスクでは、この構成は有利であるとみなされる。
【００７８】
図８には、本発明による方法の別の有利な実施例が示されている。図７において説明した方式に従い、関数ｆ１から行われた、本来のプログラム関数engine_idle_revの呼び出しが補完され、バイパス関数eir_bypの呼び出しが行えるようになる。そのようにして、プロセッサＣが先ず本来の関数を処理し、続いてバイパス関数を処理することによって、二つの関数が処理され、この場合、制御装置プログラムの更なる処理には、二つの関数の内の一方の出力値のみが使用される。これによって、二つの関数、即ち、制御装置ＥＣＵに元々インストールされている関数engine_idle_revと、それを置換するために設けられたバイパス関数eir_bypとを直接的に相互に比較することができるか、又は、本来の関数engine_idle_revの出力値及びバイパス関数eir_bypの出力値を処理又は検査のために提供することができる。これは、固有の出力値又は本来のプログラム関数の出力値がプログラム処理の更なる経過において使用されるか否かを判定する、バイパス関数eir_bypの範囲の一部であると考えられる。例えば、ユーザによって操作可能なパラメータの値に依存するバイパス関数eir_bypは、その固有の出力値を後続のプログラムルーチンに供給することなく、それらの出力値を後続の解析のために記憶することができるか、又は、本来の関数engine_idle_revによって書き込まれた出力値を上書きすることができる。これは、本来の関数engine_idle_revによって書き込まれた出力値を後続の解析のために記憶する、関数eir_bypの範囲の一部であると考えられる。
【００７９】
本発明の一つのヴァリエーションにおいては、オーバーレイメモリＯＶに先ず、本来の関数の一対一のコピーを書き込むこともできる。続いて、オーバーレイメモリに書き込まれた関数の第１の命令がリターン命令に置換され、その後オーバーレイメモリがアクティブ化される。これによって、置換すべき関数がデアクティブ化される。例えばプログラムカウンタの監視によって、又は単純に短時間の待機によって、オーバーレイメモリにおけるプログラムコードが実行されないことが確認されると、オーバーレイメモリに記憶されている関数はバイパスコードに置換され、その際に、最後にリターン命令が上書きされる。このヴァリエーションは、制御装置の関数が妨害されて危険に晒されることなく、置換すべき関数を簡単にデアクティブ化できる場合にのみ実施することができる。これはよくあるケースである。
【００８０】
別のヴァリエーションでは、オーバーレイメモリＯＶに、本来の関数の一対一のコピーを書き込むことができる。バイパス関数は先ず、オーバーレイメモリとしては設けられていない、利用可能なメモリ領域、有利には主記憶装置ＲＡＭに書き込まれる。第２のステップにおいては、オーバーレイメモリにおけるコードの第１の命令が、バイパス関数へのジャンプ命令で上書きされる。この時点において、本来のコードとバイパスコードはジャンプ命令を除き同一のコードとなっているので、更なる安全対策を講じることなく、それら二つのコードを切り替えることができる。
【００８１】
このヴァリエーションは、ジャンプ命令をアトミックな命令として表すことができ、また本来のプログラムコードにおけるオーバーレイすべき位置において同様にアトミックな命令が存在する場合にのみ実行することができるので、「命令の途中で」切替が行われることはない。これはよくあるケースである。
【００８２】
本発明の一つの実施の形態においては、多くの開発用制御装置が有しているメモリ管理ユニット（ＭＭＵ：Memory Management Unit）の再プログラミングによってオーバーレイメモリを形成することができる。ＭＭＵを用いることによって、論理的なメモリアドレスに物理的なメモリアドレスを割り当てることができる。本発明によれば、フリーの物理的なメモリ領域にバイパスコードを書き込み、続いて、置換すべきコードに割り当てられた論理的なメモリアドレスがＭＭＵの再プログラミング後にはバイパスコードを示すように、ＭＭＵを再プログラミングすることができる。
【００８３】
つまりＭＭＵを用いることによって、特にオーバーレイユニットを用いる場合のようにメモリ領域をオーバーレイすることができ、即ち、論理的なメモリアドレスの二つの異なる割り当てが使用されることによって、メモリ領域をオーバーレイすることができ、その結果、論理的なメモリアドレスの同一のセットは置換すべきコードを示すか、又はバイパスコードを示す。
【００８４】
本明細書において説明した全ての方法は、オーバーレイメモリがもともと存在するか、又はＭＭＵのプログラミングによって形成されるかに依存しない。ＭＭＵに十分な機能が提供されている限りにおいて、オーバーレイ機能をアクティブ化するために、レジスタにプロセッサのオーバーレイ関数が書き込まれるか、又はＭＭＵに割り当て情報が書き込まれるかは本発明にとって重要ではない。殊に、十分な機能とは、ＭＭＵのコンフィギュレーションを制御装置の動作中に変更可能であることと解される。
【図１】
2015115074.tif 000002
【図２】
2015115074.tif 000003
【図３】
2015115074.tif 000004
【図４】
2015115074.tif 000005
【図５】
2015115074.tif 000006
【図６】
2015115074.tif 000007
【図７】
2015115074.tif 000008
【図８】
2015115074.tif 000009
【手続補正書】
【提出日】平成27年1月9日(2015.1.9)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
電子的な制御装置のメモリ内のソフトウェアを変更するための方法であって、
前記メモリは、前記ソフトウェアの少なくとも一部を成し且つ前記制御装置の少なくとも一つのプロセッサによって実行される複数の原始的なプログラムルーチンが記憶されている少なくとも一つの永久記憶装置と、一時的なデータを記憶するための少なくとも一つの主記憶装置と、オーバーレイメモリとを有しており、
前記オーバーレイメモリの各メモリアドレスを、割り当て情報を用いて前記永久記憶装置の一つのメモリアドレスに割り当て、それにより、前記プロセッサはオーバーレイ機能がアクティブ化された際に、前記永久記憶装置における或るアドレスのプログラムルーチン命令の代わりに、前記オーバーレイメモリの割り当てられたアドレスにおける命令を実行する、方法において、
前記制御装置の動作中に、前記オーバーレイメモリのアドレス領域に、本来のプログラムルーチンを少なくとも部分的に置換するバイパスルーチンの少なくとも一つの関数部分を記憶するか、又は、前記オーバーレイメモリに、バイパスルーチンの第１の部分として、前記プロセッサがアクセスできるアドレス領域に記憶される前記バイパスルーチンの第２の部分を直接的又は間接的に参照するジャンプ命令を記憶し、
オーバーレイ機能をアクティブ化するために、前記オーバーレイメモリのアドレス及び／又はアドレス領域を、置換すべきプログラムルーチンのアドレス又はアドレス領域に割り当てるか、又は、置換すべきプログラムルーチンの部分のアドレス又はアドレス領域に割り当てる割当情報を作成し、該割当情報を前記制御装置のインタフェースを介してアクティブ化又はデアクティブ化することを特徴とする、方法。
【請求項２】
前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分によって占有されている、前記永久記憶装置内の全てのアドレス領域を、前記オーバーレイメモリによって、置換を行う前記バイパスルーチンが少なくとも部分的に記憶されている、同じ長さのアドレス領域でオーバーレイする、請求項１に記載の方法。
【請求項３】
バイパスルーチンが前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分よりも長いプログラムコードを有している場合、前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分によって占有されている、前記永久記憶装置内の全てのアドレス領域を、前記オーバーレイメモリにおいて、前記バイパスルーチンの第１の部分が記憶される、同じ長さのアドレス領域によってオーバーレイする、但し、前記バイパスルーチンはジャンプ命令で終了しており、該ジャンプ命令は前記プロセッサに対して、該ジャンプ命令によって識別されており、且つ、前記バイパスルーチンの少なくとも一つの別の部分の記憶が開始されるアドレスにおいて、プログラムの処理を継続することを指示する命令である、請求項１に記載の方法。
【請求項４】
プログラムルーチン全体を置換する場合、前記バイパスルーチンは、プログラムの処理でもって、前記置換すべきプログラムルーチンをサブプログラムルーチンとして呼び出したプログラムルーチンに戻ることを前記プロセッサに指示するリターン命令で終了しているか、又は、
プログラムルーチンの一部のみを置換する場合、前記バイパスルーチンは、本来のプログラムルーチンの、前記置換すべき部分に続く命令で、プログラムの処理を継続することを前記プロセッサに指示するジャンプ命令で終了している、請求項２又は３に記載の方法。
【請求項５】
バイパスルーチンの全ての関数コードをアクティブな前記オーバーレイメモリ外のメモリ領域に記憶し、前記置換すべきプログラムルーチンの或るアドレスにおける命令又はデータを、前記オーバーレイメモリを用いてジャンプ命令でオーバーレイする、但し、該ジャンプ命令は前記プロセッサに対して、該ジャンプ命令によって識別されており、且つ、前記バイパスルーチンの前記関数コードの記憶が開始されるアドレスにおいて、処理を継続することを指示する命令であり、前記バイパスルーチンはリターン命令で終了しており、該リターン命令はプロセッサに対して、前記置換すべきプログラムルーチンをサブプログラムルーチンとして呼び出したプログラムルーチンに戻ることを指示する命令である、請求項１に記載の方法。
【請求項６】
前記バイパスルーチンの関数コードをアクティブな前記オーバーレイメモリ外のメモリ領域に記憶し、前記置換すべきプログラムルーチンの或るアドレスにおける命令を、前記オーバーレイメモリにおいてジャンプ命令でオーバーレイする、但し、該ジャンプ命令は前記プロセッサに対して、該ジャンプ命令によって識別されているアドレスにおいて、処理を継続することを指示する命令であり、且つ、前記バイパスルーチンの前記関数コードの呼び出しを更に行うプログラムコードの記憶が開始されるアドレスを参照する命令である、請求項１に記載の方法。
【請求項７】
前記バイパスルーチンの前記関数コードの呼び出しは、該プログラムコード内で呼び出されたサブプログラムルーチン内で行われる、請求項６に記載の方法。
【請求項８】
前記オーバーレイ機能のアクティブ化を、該オーバーレイ機能のアクティブ化によって置換すべき機械コードが前記制御装置の前記プロセッサによって実行されない時点に行う、請求項１乃至７のいずれか一項に記載の方法。
【請求項９】
前記アクティブ化を行うロジックによって、前記制御装置の前記プロセッサのプログラム処理ポジションを監視し、前記アクティブ化を、前記プログラム処理ポジションが前記置換すべきプログラムルーチン外のアドレスを示す時点に実施する、請求項８に記載の方法。
【請求項１０】
前記アクティブ化を行うロジックによって、前記置換すべきプログラムルーチン外に配置されているプログラムコードによってセットされるトリガ／割り込みを監視し、前記アクティブ化を、前記トリガ／割り込みの変化が確認された際に実施する、請求項８に記載の方法。
【請求項１１】
前記トリガは変数アクセス又はＩ／Ｏピンの状態変化から成る、請求項１０に記載の方法。
【請求項１２】
前記アクティブ化を行うロジックは、前記インタフェースを介して接続されているインタラクション装置において実行されるロジックである、請求項９乃至１１のいずれか一項に記載の方法。
【請求項１３】
前記アクティブ化を、前記制御装置のプロセッサによって呼び出されたサブプログラムルーチンによって実行する、請求項８に記載の方法。
【請求項１４】
前記置換すべきプログラムルーチン外又は前記置換すべきプログラムルーチンの部分外の或るプログラムルーチンにおける命令を前記オーバーレイメモリにおけるジャンプ命令によってオーバーレイする、但し、前記前記ジャンプ命令は、プログラムコードのプログラミングが開始されるアドレスを参照する命令であり、前記プログラムコードは、オーバーレイされた命令を再構成し、更に、前記置換すべきプログラムルーチンに関する前記オーバーレイ機能のアクティブ化又はデアクティブ化を行い、また、ジャンプ命令で終了しており、前記ジャンプ命令は、前記置換すべきプログラムルーチン外のプログラムルーチンにおける、前記オーバーレイされた命令に続く命令を参照する、請求項８に記載の方法。
【請求項１５】
前記アクティブ化を前記プログラムコード内のサブプログラムルーチンの呼び出しによって実施する、請求項１４に記載の方法。
【請求項１６】
アクティブな前記オーバーレイメモリに格納されているコードは部分的に、前記永久記憶装置の割り当てられた各メモリアドレスに格納されているコードを正確に再構成する、請求項１に記載の方法。
【請求項１７】
前記割当情報の作成及び前記オーバーレイ機能のアクティブ化を、前記制御装置のインタフェースに接続されているインタラクション装置によって、又は、前記制御装置のインタフェースに接続されているコンピュータによって実施する、請求項１に記載の方法。
【請求項１８】
前記割当情報の作成及び／又は前記オーバーレイ機能のアクティブ化を、前記制御装置のプロセッサによって実行されるプログラムルーチンによって実施する、請求項１に記載の方法。
【請求項１９】
前記制御装置は少なくとも二つのプロセッサコアを有しており、前記割当情報の作成及び／又は前記オーバーレイ機能のアクティブ化を行うプログラムルーチンを第１のプロセッサコアによって処理し、本来のプログラムルーチンを第２のプロセッサコア又は複数の別のプロセッサコアによって処理する、請求項１８に記載の方法。
【請求項２０】
前記バイパスルーチンは、リターン命令で終了する、少なくとも一つの完全な関数を含む、請求項１に記載の方法。
【請求項２１】
前記バイパスルーチン又はバイパスルーチンの一部を、前記制御装置のインタフェースを介して、前記制御装置の動作中に、前記プロセッサによってアドレッシング可能なメモリ領域に記憶する、請求項１に記載の方法。
【請求項２２】
プログラムルーチンにおける少なくとも一つの命令を前記オーバーレイメモリにおけるジャンプ命令によってオーバーレイする、但し、前記ジャンプ命令は、プログラムコードのプログラミングが開始されるアドレスを参照する命令であり、前記プログラムコードは、オーバーレイされた命令を再構成し、更に、関数バイパスルーチンを呼び出し、前記プログラムルーチンにおける、前記オーバーレイされた命令に続く命令を参照するジャンプ命令で終了している、請求項１に記載の方法。
【請求項２３】
前記制御装置は少なくとも二つのプロセッサコアを有しており、少なくとも、前記バイパスルーチンの関数コードを一つ又は複数の第１のプロセッサコアによって処理し、本来のプログラムルーチンを一つ又は複数の第２のプロセッサコアによって処理する、請求項２２に記載の方法。
【請求項２４】
オーバーレイ機能がデアクティブ化された際に前記置換すべきプログラムルーチン又は前記置換すべきプログラムルーチンの部分に割り当てられた論理的なメモリアドレスが、オーバーレイ機能がアクティブ化された際に全体として前記バイパスルーチンの少なくとも一部を含む物理的なメモリアドレスに割り当てられているように、前記制御装置のメモリ管理ユニットのプログラミングによって、オーバーレイメモリを制御装置に形成する、請求項１乃至２３のいずれか一項に記載の方法。