車両の制御処理を実施する制御部と、前記制御処理を指定する処理IDを算出する処理ID算出部と、前記処理ID算出部が前記処理IDを算出するために用いる鍵識別子を前記処理ID毎に格納する鍵識別子記憶部と、を備え、前記処理ID算出部は、前記制御部が前記制御処理に対する呼び出しを受け取る際に前記鍵識別子を併せて受け取り、その鍵識別子を用いて前記処理IDを算出し、前記制御部は、前記処理ID算出部が算出した前記処理IDに対応する前記鍵識別子を前記鍵識別子記憶部から読み出し、前記鍵識別子記憶部から読み出した前記鍵識別子と、前記制御処理に対する呼び出しを受け取る際に受け取った前記鍵識別子とが一致する場合は、前記処理ID算出部が算出した前記処理IDに対応する前記制御処理を実施し、一致しない場合は実施しないことを特徴とする車両制御装置。前記制御処理において用いる制御パラメータを前記処理ID毎に格納する制御パラメータ記憶部を備え、前記制御部は、前記処理ID算出部が算出した前記処理IDに対応する前記制御パラメータを前記制御パラメータ記憶部から読み出し、その制御パラメータを用いて前記制御処理を実施することを特徴とする請求項1記載の車両制御装置。前記制御パラメータ記憶部は、前記制御処理において用いる変数が正常であるか否かを判定するために用いる閾値を前記制御パラメータとして格納しており、前記制御部は、前記処理ID算出部が算出した前記処理IDに対応する前記閾値を前記制御パラメータ記憶部から読み出し、その閾値を用いて、前記変数が正常であるか否かを判定することを特徴とする請求項2記載の車両制御装置。前記制御処理毎に固有の固有識別子を格納する固有識別子記憶部を備え、前記処理ID算出部は、前記制御部が前記制御処理に対する呼び出しを受け取る際に受け取った前記鍵識別子と、前記固有識別子記憶部が格納している前記固有識別子とを用いて、前記処理IDを算出することを特徴とする請求項1記載の車両制御装置。前記固有識別子は、前記制御処理を記述した制御プログラム毎に固有な値を有することを特徴とする請求項4記載の車両制御装置。前記固有識別子は、前記車両制御装置毎に固有な値を有することを特徴とする請求項4記載の車両制御装置。前記制御部は、前記前記制御処理を実施する前に、前記鍵識別子記憶部から読み出した前記鍵識別子と、前記制御処理に対する呼び出しを受け取る際に受け取った前記鍵識別子とが一致するか否かを検証し、さらに、前記制御処理を実施している間にも、前記鍵識別子記憶部から読み出した前記鍵識別子と、前記制御処理に対する呼び出しを受け取る際に受け取った前記鍵識別子とが一致するか否かを検証することを特徴とする請求項1記載の車両制御装置。前記制御部は、前記制御処理内で異常が発生したときは、前記固有識別子を上位装置に通知することを特徴とする請求項1記載の車両制御装置。前記制御部は、前記制御処理内で異常が発生したときは、前記制御処理に対する呼び出しを受け取る際に受け取った前記鍵識別子を上位装置に通知することを特徴とする請求項1記載の車両制御装置。上記特許文献1に記載されている技術では、固有情報や暗号鍵を用いて、制御ソフトウェアの実行可否を判定している。しかし、このような手法を実装すると、メモリ容量を比較的多く消費する。車両制御装置は一般に、搭載するメモリ容量に対する制約が大きいため、メモリ容量を多く消費するような手法は望ましくない。本発明は、上記のような課題を解決するためになされたものであり、メモリ容量の消費を抑えつつ、制御ソフトウェアの不正実行を防止することを目的とする。本発明に係る車両制御装置は、制御処理を指定する処理ID毎に鍵識別子を保持しており、制御処理を呼び出す際に指定された鍵識別子を用いて処理IDを算出し、その処理IDに対応する鍵識別子と、制御処理を呼び出す際に指定された鍵識別子とが一致する場合に限り、その制御処理を実施する。本発明に係る車両制御装置によれば、暗号鍵などの複雑な手法を用いることなく、制御ソフトウェアの不正実行を防止することができる。これにより、メモリ使用容量を抑えつつ、車両制御装置の安全性を高めることができる。<実施の形態1>図1は、本発明の実施形態1に係る車両制御装置100の構成図である。車両制御装置100は、車両の動作を制御する装置である。ここでは車両が備えるモータ200を制御する例を示したが、制御対象はこれに限られるものではない。車両制御装置100は、マイクロコントローラ110、インバータ120、センサ131~133を備える。マイクロコントローラ110は、インバータ120を制御するための制御プログラムを実行する演算装置である。インバータ120は、直流電力を所望周波数の交流電力に変換してモータ200を駆動する装置である。センサ131~133は、モータ200を駆動する駆動電流または電圧を検出してマイクロコントローラ110に通知する。マイクロコントローラ110は、CPUCentralProcessingUnit111、フラッシュROMReadOnlyMemory112、RAMRandomAccessMemory113、AD変換器114、インバータ制御部115を備える。CPU111は、フラッシュROM112が格納しているプログラムを実行する。フラッシュROM112は、後述の図2で説明するプログラムおよびデータを格納する。RAM113は、CPU111がプログラムを実行する際に一時的にデータを格納するメモリ装置である。AD変換器114は、センサ131~133の検出結果をアナログ信号からデジタル値に変換してCPU111に出力する。インバータ制御部115は、インバータ120を介してモータ200を制御する。以下では、記載の便宜上、プログラムを動作主体として説明する場合があるが、プログラムを実際に実行するのはCPU111などの演算装置であることを付言しておく。図2は、フラッシュROM112が格納するデータを示す図である。フラッシュROM112は、制御プログラム1121、KEYIDテーブル1122、パラメータテーブル1123、固有IDテーブル1124を格納する。これらの他にも、AD変換器114を駆動するAD変換器ドライバソフトウェア、インバータ制御部115を駆動するインバータ制御部ドライバソフトウェア、タスクや割り込みを制御するオペレーティングシステムなどを格納することもできる。制御プログラム1121は、センサ131~133の検出結果を用いてモータ200を制御するプログラムである。制御プログラム1121は、複数の制御処理を記述することができる。CPU111は、制御プログラム1121が記述している制御処理のうちいずれを起動するかを、KEYIDによって指定する。KEYIDテーブル1122は、CPU111が制御プログラム1121を起動する際に指定する識別子KEYIDを保持するテーブルである。パラメータテーブル1123は、制御プログラム1121が制御処理を実施する際に用いる制御パラメータを保持するテーブルである。固有IDテーブル1124は、制御プログラム1121毎に固有のIDを保持するテーブルである。これら各テーブルの詳細は、後述の図4で説明する。本発明に係る制御部処理ID算出部は、CPU111と制御プログラム1121が相当する。同等の機能を、回路デバイスなどのようなハードウェアを用いて実現することもできる。図3は、RAM113が格納するデータを示す図である。RAM113は、AD変換器114およびセンサ131~133の状態を記憶しておく状態バッファ1131を格納する。RAM113は、その他にも制御プログラム1121が動作する際に用いるデータを一時的に格納するスタックなどを保持することができる。図4は、フラッシュROM112とRAM113が格納している各データの詳細を示す図である。以下、各データの用途などについて説明する。KEYIDテーブル1122が格納しているKEYIDは、制御処理毎に固有の値である。CPU111は、制御プログラム1121を起動するとき、いずれの制御処理を起動しようとしているかを指定するため、KEYIDを併せて指定する。図4では、3種類の制御処理に対応する3種類のKEYIDを例示したが、これに限られるものではない。パラメータテーブル1123は、制御処理内で用いられる制御パラメータを、制御処理毎に記述している。ここでは、制御パラメータが規定範囲内に収まっているか否かをチェックするために用いる上限値と下限値を制御パラメータとして保持している例を示しているが、これに限られるものではない。例えば、制御処理の動作モードを制御パラメータとして記述しておき、動作モードを切り替えることができる。固有IDテーブル1124は、制御プログラム1121を起動する際に指定されたKEYIDに基づき、制御処理の番号を算出する際に用いる識別子である。制御処理の番号とは、制御プログラム1121が記述している各制御処理を識別するための番号である。この制御処理番号のことを、本明細書では処理IDと呼ぶ。処理IDは、KEYIDテーブル1122およびパラメータテーブル1123がそれぞれ格納している各データを照会する際に用いられる。詳細は後述する。固有IDの値は、制御プログラム1121毎に設けることができる。ここでは制御プログラム1121を1つのみ例示したため、固有IDの値も1つである。状態バッファ1131は、AD変換器114およびセンサ131~133の状態が正常であるか否かを示す状態値を、処理ID毎に格納する。すなわち、ある制御処理については正常範囲である値が、別の制御処理においては異常である場合もあり得るので、制御処理毎に状態値を保持することとした。図5は、CPU111が制御プログラム1121を実行する処理フローである。本制御処理は、周期的に実行してもよいし、例えばセンサ131~133の検出結果を取得する際などに実行してもよい。以下、図5の各ステップについて説明する。図5:ステップS500CPU111は、KEYIDとセンサ検出値を指定して、制御プログラム1121を起動する。KEYIDの値は、制御プログラム1121を呼び出す他の処理などから指定される。センサ検出値は、センサ131~133の検出結果をAD変換器114がデジタル値に変換したものである。図5:ステップS501制御プログラム1121は、起動時に受け取ったKEYIDを処理IDに変換する。本ステップの詳細は、後述の図6で説明する。処理IDは、制御プログラム1121が記述している制御処理を指定するIDである。すなわち、制御プログラム1121を呼び出すときは、KEYIDを指定することにより、間接的に制御処理番号処理IDを指定することになる。図5:ステップS501:補足本処理フローでは、制御処理を不正に呼び出すことを防止するため、処理IDそのものを用いて制御処理を呼び出すのではなく、制御プログラム1121を呼び出すときにはKEYIDを指定し、これを処理IDに変換することにより間接的に制御処理を指定する。これにより、処理IDそのものを秘匿することができる。図5:ステップS502制御プログラム1121は、起動時に受け取ったKEYIDが正しい値であるか否かをチェックする。具体的には、ステップS501で算出した処理IDに対応するKEYIDをKEYIDテーブル1122から読み出し、起動時に受け取ったKEYIDと一致するか否かを確認する。両者が一致すれば、起動時に受け取ったKEYIDは正常である。両者が一致しない場合、起動時に受け取ったKEYIDは不正な値である。図5:ステップS502:補足制御プログラム1121を呼び出すときに指定したKEYIDが不正な値である場合、原則として制御処理を実施することはできない。ただし、KEYIDを処理IDに変換する処理によっては、偶然に正しい処理IDが得られる可能性がある。そこで本ステップでは、ステップS501で算出した処理IDを用いて、あらかじめKEYIDテーブル1122に格納しておいた正しいKEYIDを照会し、KEYIDを2重にチェックすることとした。本ステップの具体例は、後述の図6で改めて説明する。図5:ステップS503KEYIDが正常であればステップS504へ進み、正常でなければステップS505へ進む。図5:ステップS504制御プログラム1121は、通常の制御処理を実施する。本ステップの詳細は、後述の図7で説明する。図5:ステップS505制御プログラム1121は、異常処理を実施する。本ステップの詳細は、後述の図8で説明する。図5:ステップS506制御プログラム1121は、状態バッファ1131に格納されている、AD変換器114および各センサの状態値をリターンする。本ステップの具体例は、後述の図6で改めて説明する。図6は、ステップS501の詳細を示す図である。以下、図6の各ステップについて説明する。図6:ステップS5011制御プログラム1121は、起動時に受け取ったKEYIDと、固有IDテーブル1124が格納している固有IDとを足す。例えば、KEYIDが0xFFFCである場合、図4で示したデータ例では固有IDは0x0004なので、これらを足すと0x10000となる。図6:ステップS5012制御プログラム1121は、ステップS5011で算出した結果の下位16ビット分を処理IDとしてリターンする。上記例の場合、0x10000の下位16ビット分である0x0000が処理IDとなる。以上、ステップS501の詳細を説明した。次に、処理IDとKEYIDの対応関係について補足する。制御プログラム1121は、図5のステップS502において、処理IDの値をキーとしてKEYIDテーブル1122を照会する。上記例では、処理IDは0x0000であるので、KEYIDテーブル1122の0番目の値を照会する。図4に示したデータ例では0番目のKEYIDは0xFFFCであるので、起動時に受け取ったKEYIDが0xFFFCであればそのKEYIDは正常であるということになる。ステップS5011の処理内容によっては、制御プログラム1121の起動時に受け取ったKEYIDが不正な値であっても、ステップS5011において正常な処理IDに変換される場合がある。例えば、ステップS5011においてKEYIDを3で除算した余りを処理IDとする場合、ステップS5011の処理結果は0から2のいずれかの値となる。図4のデータ例では、正常な処理IDは0x0000~0x0002の範囲であるため、偶然に正しい処理IDが得られる可能性がある。かかる事態を防止するため、図5のステップS502において、処理IDをキーにしてKEYIDテーブル1121を照会することにより、あらかじめ格納しておいたKEYIDを用いて制御プログラム1121が呼び出されたか否かをチェックすることとした。これにより、ステップS5011で算出した処理IDが偶然正しい値となっても、KEYIDが正しくない限りは制御処理を起動することができない。なお、KEYIDテーブル1122、パラメータテーブル1123、状態バッファ1131は、処理IDをキーにして照会されるため、これらテーブルは処理ID毎にデータを保持していることになる。図7は、ステップS504のうち制御パラメータをチェックする処理を示す図である。以下、図7の各ステップについて説明する。図7:ステップS5041制御プログラム1121は、処理IDをキーにして、状態バッファ1131が格納している状態値を読み出す。図4のデータ例では、処理IDが0x0000であれば状態値は故障であり、処理IDが0x0001であれば状態値は正常である。図7:ステップS5042ステップS5041で読み出した状態値が正常であればステップS5043へ進み、正常でなければ本処理フローを終了する。図7:ステップS5043制御プログラム1121は、処理IDをキーにして、パラメータテーブル1123から下限値と上限値を読み出す。図4のデータ例では、処理IDが0x0001であれば、下限値は0x0080、上限値は0x2000である。図7:ステップS5044制御プログラム1121は、センサ131~133の検出値が、ステップS5043で読み出した下限値と上限値の範囲内にあるか否かをチェックする。検出値が閾値の範囲内にある場合は、センサ検出値は正常であり、本処理フローを終了する。閾値の範囲内になければ、状態バッファ1131を書き換えるため、ステップS5045へ進む。図7:ステップS5045制御プログラム1121は、状態バッファ1131を書き換えるに先立ち、起動時に受け取ったKEYIDが正常であるか否かをチェックする。チェック手順はステップS502と同様である。KEYIDが正常であればステップS5046へ進み、正常でなければ本処理フローを終了する。図7:ステップS5045:補足本発明では、状態バッファ1131の内容が安全性や信頼性などの観点から重要であると仮定している。そこで、プログラムが暴走したときなどに、不正なアドレスへ処理がジャンプすることによって、KEYIDとは全く関連のない処理がRAM130の内容を書き換えてしまうことを防止するため、本ステップにおいてKEYIDを改めてチェックすることとした。状態バッファ1131が不正に書き換えられることを防止する以外に、例えばフラッシュROM112を書き換えるときなどの重要な処理を実行する前にも本ステップと同様にKEYIDをチェックすることにより、制御処理の安全性を向上させることができる。その他の例としては、モータ200を危険な回転速度まで上げるときなどの危険度の高い処理を実行する前に、KEYIDをチェックすることが考えられる。すなわち、KEYIDをチェックする処理は、制御処理を起動するときの他、制御処理中において重要な処理を実施する前にも実施することが有用である。図7:ステップS5046制御プログラム1121は、処理IDに対応する状態バッファ1131の状態値を故障に更新する。図7:ステップS5047制御プログラム1121は、本処理フローを終了すると、通常の制御処理を実施する。図8は、ステップS505の詳細を示す図である。以下、図8の各ステップについて説明する。図8:ステップS5051制御プログラム1121は、固有IDとKEYIDをエラー管理モジュールに通知し、エラー履歴として記録する。エラー履歴を残すことにより、故障要因を特定するときの手がかりに有効である。エラー管理モジュールは、エラーID毎にエラー履歴を残し、エラーID毎の所定の異常処理を起動する。例えばモータ異常の場合は、モータ200を停止する処理を実行する。図8:ステップS5051:補足その1本ステップにおいてKEYIDを通知するのは、どのようなKEYIDを用いているときにエラーが発生したのかを特定したいからである。KEYIDを通知することにより、例えば、不正なKEYIDを指定して制御処理を起動しようとしたのか、それともプログラムの暴走によって不正なアドレスへ処理がジャンプしたことによりKEYIDが空のままであったのか、といったエラー原因の詳細を特定することができる。ここで通知するKEYIDは、制御処理を呼び出す際に指定されたKEYIDでもよいし、処理IDを算出する際に用いられたKEYIDでもよいし、これら双方でもよい。図8:ステップS5051:補足その2本ステップにおいて固有IDを通知するのは、正しい固有IDが用いられたか否かをチェックする意義がある。例えば、固有IDテーブル1124が破損していれば固有IDの値も破損していると考えられる。本ステップにおいて固有IDを通知することにより、エラー原因の詳細を特定することができる。<実施の形態1:まとめ>以上のように、本実施形態1に係る車両制御装置100は、パラメータテーブル1123上で処理ID毎に制御パラメータを保持している。これにより、処理の内容が同一で制御パラメータのみが異なる制御処理については、同じ制御プログラム1121を異なるKEYIDで起動することにより、制御プログラム1121を共通化することができる。したがって、制御プログラム1121を格納するための記憶容量を抑えることができる。また、本実施形態1に係る車両制御装置100は、制御処理を起動する際に指定したKEYIDと、KEYIDを用いて算出した処理IDをキーにしてKEYIDテーブル1122から読み出したKEYIDとを照合する。これにより、不正なKEYIDを指定して制御処理を呼び出すことを防止し、制御処理のセキュリティを高めることができる。また、本実施形態1に係る車両制御装置100は、制御処理を呼び出す際に指定したKEYIDと、固有IDテーブル1124が格納している固有IDとを用いて、処理IDを算出する。これにより、処理IDや固有IDは車両制御装置100の外部に出力されないことになるので、制御処理のセキュリティを高めることができる。また、本実施形態1において、固有IDの値は、車両制御装置100毎に異なる値とすることができる。これにより、車両制御装置100を解析した得た固有IDは他の車両制御装置100上では無効な値となるので、車両制御装置100個々のセキュリティを高めることができる。同様に、固有IDの値は、制御処理を呼び出す側と申し合わせた上で、例えば制御処理を呼び出す毎に変更したり、制御処理を実行している途中で変更したりしてもよい。これにより、固有IDを解析することを困難にすることができる。<実施の形態2>実施形態1では、固有IDとKEYIDを用いて処理IDを算出しているが、固有IDを設けないようにしてもよい。固有IDを設けない場合は、KEYIDと所定の値、例えば0x000Cを加算して処理IDを求める、などの変換規則を適宜設ければよい。この場合は、制御処理毎にその変換規則を設け、その変換規則を制御プログラム1121内などに記述しておけばよい。例えば、ある制御処理についてはKEYIDと0x000Cを加算して処理IDとする、別の制御処理についてはKEYIDを0x0003で割った余りを処理IDとする、などが考えられる。