以下、本発明の実施形態を図に基づいて説明する。本実施形態は、本発明である処理装置をECU100に設けられたマイコン10に適用している。なお、ECUは、Electronic Control Unitの略である。
図1に示すように、ECU100は、要部として、マイコン10、出力IF20、入力IF30を備えて構成されている。また、ECU100は、センサ200及び制御対象300などの外部装置と電気的に接続されている。そして、ECU100は、入力IF30を介して、センサ200からの検出信号を取得することができる。また、ECU100は、出力IF20を介して、制御対象300に対して制御信号を出力することができる。なお、ECU100は、センサ200のかわりに、ECU100以外のECUから信号を取得するものであってもよい。また、制御対象300は、モータなどのアクチュエータや、ECU100以外のECUなどを採用することができる。
このECU100は、例えば、車両の搭載機器を電子的に制御する各種の電子制御装置に適用することができる。また、電子制御装置が制御対象とする車両の搭載機器は、エンジン、変速機、ブレーキ等のパワートレイン系機器、エアコン、シート、ドアロック等のボディ系機器、ナビ、ETC、ラジオ等の情報系機器、及びエアバック等のセイフティ系機器などである。
図1に示すように、マイコン10は、要部として、CPU11、記憶部12を備えて構成されている。なお、マイコン10は、浮動小数点演算を行うFPU13を備えていてもよい。つまり、マイコン10は、浮動小数点演算を行う場合、FPU13を備えて構成される。このFPU13は、本発明の特許請求の範囲における演算部に相当する。また、FPUは、Floating Point number processing Unitの略である。
CPU10は、本発明の特許請求の範囲における演算部に相当する。CPU11は、記憶部12に記憶されたオペレーティングシステム(以下、OS)用のプログラムや各種データを読み出して所定の演算を実行するものであり、演算結果を一時的に記憶部12に記憶しつつ演算を行うことで、各種処理を実行する。なお、CPUは、Central Processing Unitの略である。
本実施形態においては、OSとして、複数のタスクを並行して処理するとともに、リアルタイムにタスクスケジュールを行うリアルタイムOS(以下、RTOS)を採用している。このRTOSは、処理をリアルタイムに実行することを重視して設計されている。そのため、記憶部20や、図示しない周辺回路(A/D、タイマ、バッファなど)などのリソース管理などにおいても、時間制約を守ることが重要視される。
複数のタスクは、予め優先度が設定されている。CPU11は、この優先度に基づいて、タスクの切り換えを行う。つまり、タスクの切り換えは、予め設定されたタスク優先度に基づいて行われ、実行可能状態なタスクのうち最も高い優先度のタスクが実行される。従って、マイコン10は、優先度が設けられた複数のタスクを並行して処理するマルチタスク方式の処理装置と称することができる。
さらに、図5に示すように、マイコン10は、初期化中フラグ11aと更新フラグ11bを有し、この二つのフラグにおけるデータを管理する。つまり、CPU11は、後ほど説明するデータ領域12aが初期化中であることを示す初期化中情報と、データ領域12aが初期化中でないことを示す非初期化情報とのいずれかがセットされる初期化中フラグ11aを備えている。初期化中フラグ11aは、データ領域12aに対して一つ設けられている。本実施形態では、初期化中情報として1、非初期化情報として0を採用している。しかしながら、本発明はこれに限定されるものではない。このように、初期化中フラグ11aを設けることによって、CPU11は、データ領域12aが初期化中であるか否かを把握(認識)することができる。
また、CPU11は、後ほど説明する初期化単位毎に設けられ、各初期化単位が初期化済みであることを示す初期化済情報と、各初期化単位が初期化済みでないことを示す未初期化情報とのいずれかがセットされる更新フラグ11bを備えている。つまり、更新フラグ11bは、初期化単位毎に一つ設けられている。言い換えると、更新フラグ11bは、各初期化単位に含まれるデータに対して一つ設けられている。
例えば、一つのデータを初期化単位とする場合、各データに対して一つの更新フラグ11bが設けられる。また、二つのデータを初期化単位とする場合、二つのデータに対して一つの更新フラグ11bが設けられる。よって、初期化が終了した初期化単位に含まれるデータに対応する更新フラグとは、初期化が終了したデータに対応した更新フラグを示す。なお、各更新フラグ11bは、データ領域12aの各データのデータ番号に対応して設けられていると称することもできる。
本実施形態では、初期化済情報として1、未初期化情報として0を採用している。しかしながら、本発明はこれに限定されるものではない。このように、更新フラグ11bを設けることによって、CPU11は、各初期化単位のデータが初期化済みであるか否かを把握することができる。また、一部のデータだけが初期化されていないという状態を回避できる。
なお、CPU11は、例えば、記憶部12からデータを読み出す読み出し処理、記憶部12にデータを書き込む書き込み処理、記憶部12のデータ領域の初期化を行う初期化処理、割り込みを禁止する禁止処理、禁止を解除する解除処理などの処理を実行する。このCPU11の処理動作に関しては、後ほど詳しく説明する。
記憶部12は、ROM、RAM、レジスタを備えて構成されている。この記憶部12は、例えば、ROM、RAM、レジスタを一つのアドレス空間として一括管理されている。記憶部12は、上述のように、RTOS用のプログラムや各種データや、演算処理の際のデータが記憶される。なお、ROMは、Read Only Memoryの略であり、RAMは、Random Access Memoryである。
また、図5に示すように、記憶部12の一部には、複数のデータが記憶されたデータ領域12aが設けられている。言い換えると、記憶部12は、まとまったデータ領域12aが確保されている。このデータ領域12aには、データ番号1〜NまでのN個のデータが記憶されている。Nは、2以上の自然数である。なお、データ領域12aには、例えば、あるタスクで利用する纏まった複数のデータ、又は、一体で処理するべき複数のデータが記憶されている。また、データ領域12aに記憶されている複数のデータとして、データサイズが大きく、全てを初期化するのに時間がかかるデータを採用すると、本発明の効果が顕著になる。
なお、データ領域12aに記憶されている複数のデータとしては、自動コード生成で作ったプログラムの中間データ(浮動小数点)、外部記憶装置のバッファデータ(制御用学習値)、ダイアグ検出時のフリーズフレームデータなど採用することができる。これらのデータは、データサイズが大きく、全てを初期化するのに時間がかかるという特徴がある。
なお、浮動小数点演算で非数が発生した場合、後続の演算結果が全て非数になるため、全データ初期化が必要である。よって、中間データを採用する場合、CPU11は、浮動小数点演算で非数の発生を検出したときに、後ほど説明する図2に示すフローチャートの処理を開始する。また、バッファデータを採用する場合、CPU11は、バッファデータの異常(上下限範囲外など)を検出した時、又はECU100の外部装置からデータをリセットする指示があったときに、後ほど説明する図2に示すフローチャートの処理を開始する。さらに、フリーズフレームデータを採用する場合、CPU11は、ECU100の外部装置からデータをクリアする指示があったときに、後ほど説明する図2に示すフローチャートの処理を開始する。
また、図5に示すように、記憶部12の一部(例えば、ROM)には、データ領域12aの各データの初期値が記憶された初期値テーブル12bが設けられている。つまり、初期値テーブル12bには、データ領域12aの各データの夫々に対応する複数の初期値データが記憶されている。
ここで、図2〜図7を用いて、マイコン10におけるCPU11の処理動作に関して説明する。CPU11は、データ領域12aに記憶されている全データの初期化を実行することを示す初期化条件が成立した場合、図2のフローチャートで示す初期化処理を実行する。なお、上述のように、データ領域12aに記憶されているデータの異常を検出した場合や、外部装置からの初期化指示を受けた場合に、初期化条件が成立したとみなすことができる。つまり、CPU11は、複数のタスクのうちの一つとして、データ領域12aに記憶されている複数のデータの初期化処理を行う。
ステップS10では、更新フラグ11bの全要素に0をセットする(第1更新手段)。CPU11は、データ領域12aに記憶された全データの初期化を開始する際に、全ての更新フラグ11bに0をセットする。言い換えると、CPU11は、初期化条件が成立した場合、後ほど説明するデータ初期化ループを実行する前に、全ての更新フラグ11bに0をセットする。これは、データ領域12aに記憶されている各データが初期化済みであるか否かを把握できるようにするためである。
ステップS20では、初期化中フラグ11aに1をセットする(第2更新手段)。CPU11は、データ領域12aに記憶された全データの初期化を開始する際に、初期化中フラグ11aに1をセットする。言い換えると、CPU11は、初期化条件が成立した場合、後ほど説明するデータ初期化ループを実行する前に、初期化中フラグ11aに1をセットする。これは、データ領域12aが初期化中であるか否かを把握できるようにするためである。よって、CPU11は、初期化中フラグ11aの値を確認することで、データ領域12aが初期化中であるか否かを把握することができる。
このように、CPU11は、初期化条件が成立した場合、まず、全ての更新フラグ11bに0をセットすると共に、初期化中フラグ11aに1をセットする。その後、CPU11は、ステップS30以降の処理を実行する。
ステップS30からS70では、データ初期化ループを実行する。CPU11は、データ領域12aのデータのうちの少なくとも一つのデータを初期化単位として、初期化単位での初期化を繰り返し行なうことで、データ領域に記憶された全データを初期化する(データ初期化ループ手段)。つまり、CPU11は、データ領域12aの全データの初期化が完了するまで、ステップS40からステップS60の処理を繰り返し実行する。
言い換えると、CPU11は、データ領域12aに記憶されたデータを複数に分割して、分割された各データ(又は、各データ群)を順番に初期化することで、データ領域12aに記憶された全てのデータを初期化する。CPU11は、データ領域12aに記憶された複数のデータを、少なくとも一つのデータを含む初期化単位に分割して、分割されたデータ毎に順番に初期化することで、データ領域12aに記憶された全てのデータを初期化すると言い換えることもできる。また、初期化単位は、CPU11が一度に初期化する単位と称することもできる。なお、ステップS30は、データ初期化ループの開始を示すループ端であり、ステップS70は、データ初期化ループの終了を示すループ端である。
また、本実施形態では、一例として、図5に示すように、一つのデータを初期化単位としている。つまり、本実施形態のCPU11は、各データ番号に対応するデータを初期化単位として、データ領域12aに記憶された全てのデータを初期化する。詳述すると、データ領域12aには、データ番号1からNまでの複数のデータが記憶されている。CPU11は、各データ番号のデータを初期化単位として、単位初期化処理をN回行うことで、データ領域12aに記憶された全てのデータを初期化する。
しかしながら、初期化単位としては、少なくとも一つのデータが含まれていればよい。よって、二つ以上のデータを初期化単位とすることもできる。ただし、データ領域12aに記憶されている全てのデータを一つの初期化単位にすることはできない。
データ初期化ループでは、まずステップS40の処理を実行する。このステップS40では、割り込み禁止を開始する(禁止手段)。CPU11は、各初期化単位での初期化を行う際に、タスクの割り込みを禁止する。つまり、CPU11は、ステップS50での処理を実行する前に、データ領域12aに記憶されている複数のデータの初期化処理である本タスクよりも、優先度が高いタスクの割り込みを禁止する。
ステップS50では、単一データ初期化処理を実行する(第1単位初期化手段)。CPU11は、ステップS40でタスクの割り込みが禁止された後に、初期化単位での初期化を行う。なお、ステップS50は、初期化単位での初期化を行う処理である。しかしながら、本実施形態では、一つのデータを初期化単位としているため、単一データ初期化処理と記載している。
この単一データ初期化処理に関しては、図3のフローチャートを用いて説明する。図3のステップS51では、初期化対象データの更新フラグを判定する。CPU11は、初期化対象データに対応する更新フラグ11bに0がセットされていると判定した場合、初期化が必要であるとみなしてステップS52へ進む。CPU11は、初期化対象データに対応する更新フラグ11bに1がセットされていると判定した場合、初期化の必要がないとみなして、図3のフローチャートに示す処理を終了する。なお、初期化対象データとは、データ領域12aに記憶されている複数のデータのうちの一つであり、今回の単一データ初期化処理で初期化の対象となっているデータである。
このように、CPU11は、初期化対象データに対応する更新フラグ11bに1がセットされていた場合、後ほど説明するステップS52からステップS54の処理は実行しない。ステップS10で全ての更新フラグ11bに0をセットしたにもかかわらず、初期化対象データに対応する更新フラグ11bに1がセットされているのは、初期化対象データが初期化される前に更新されているためである。後ほど詳しく説明するが、CPU11は、初期化対象データを初期化する前に、他のタスクを実行して、このタスクを実行することによって、初期化対象データを更新することができる。よって、ここでは、初期値よりも、初期化する前に他のタスクを実行している間に更新された値を優先するために、ステップS52からステップS54の処理は実行しないようにする。なお、この点に関しては、後ほど図7を用いて説明する。
なお、CPU11は、ループカウンタなどを使うことによって、データ領域12aに記憶されている複数のデータの中から、今回の初期化対象である初期化対象データを把握(特定)することができる。つまり、CPU11は、ループカウンタなどを使うことによって、各単一データ初期化処理で初期化を行うデータ(又は、データ番号)を把握することができる。
ステップS52では、初期値を読み出す。CPU11は、初期値テーブル12bから初期化対象データに対応する初期値データを読み出す。ステップS53では、初期値を書き込む。CPU11は、ステップS52で読み出した初期値データを書き込む。つまり、CPU11は、初期化対象データを、ステップS52で読み出した初期値データに書き換える(更新する)。これによって、今回の初期化対象である初期化対象データを初期化することができる。
ステップS54では、更新フラグ11bに1をセットする(第1更新手段)。CPU11は、単一データ初期化処理での初期化が終了した初期化対象データに対応する更新フラグ11bに1をセットする。言い換えると、CPU11は、初期化が終了したデータのデータ番号に対応する更新フラグ11bに1をセットする。また、CPU11は、単一データ初期化処理での初期化が終了した初期化単位に対応する更新フラグに1をセットするとも言い換えることができる。
例えば、図5において、今回の単一データ初期化処理での対象が、データ番号3のデータであった場合、データ番号3のデータの初期化が終了すると、データ番号3に対応する更新フラグ11bに1をセットする。よって、図5は、データ番号1〜3のデータは初期化済みであり、データ番号4〜Nのデータは初期化済みでないことを示している。なお、図5におけるデータ領域12aには、図面を分かりやすくするために、○(マル)と×(バツ)を図示している。○は、初期化済みであることを示しており、×は、未初期化であることを示している。
このように、CPU11は、上述のステップS10で全ての更新フラグ11bに0をセットすると共に、ステップS54で初期化が終了したデータに対応する更新フラグ11bに1をセットする。これによって、CPU11は、各更新フラグ11bを確認することで、各更新フラグ11bに対応するデータが初期化済みであるか否かを把握することができる。つまり、CPU11は、データ領域12aに記憶されている各データが初期化済みであるか否かを把握することができる。なお、ステップS54での処理が終了すると、図2に示すフローチャートのステップS60に戻る。
ステップS60では、割り込み禁止を終了する(解除手段)。CPU11は、ステップS50での単一データ初期化処理での初期化が終了した後に、ステップS40で禁止していたタスクの割り込みの禁止を解除する。なお、CPU11は、割り込み禁止状態でステップS50を実行するので、データの初期化と更新フラグ11bの操作の途中で、より優先度が高いタスクを実行して、データ領域12aにアクセスすることを抑制できる。つまり、CPU11がより優先度が高いタスクを実行することによって、データ領域12aからデータが読み出したり、データ領域12aにデータが書き込んだりするのを抑制できる。
このように、CPU11は、データ初期化ループの内側で、割り込み禁止状態にした後、単一データ初期化処理を呼び出し、単一データ初期化処理が終了すると、割り込み許可状態に戻す。つまり、本発明は、単一データ初期化処理を行っている間だけ、割り込み禁止状態が維持され、次のデータの初期化を行う前に割り込みが可能となる。
CPU11は、このように、初期化単位での初期化を繰り返し行って、データ領域12aの全データの初期化が完了すると、ステップS80での処理を実行する。ステップS80では、初期化中フラグ11aに、非初期化情報である0をセットする(第2更新手段)。
このように、マイコン10は、データ領域12aに記憶された複数のデータを初期化する場合、初期化単位での初期化を繰り返し行うことで、データ領域12aに記憶された全てのデータを初期化する。また、マイコン10は、データ領域12aに記憶された複数のデータを初期化する場合、タスクの割り込みを禁止する。しかしながら、マイコン10は、各初期化単位での初期化が終了した後に、割り込みの禁止を解除する。よって、本発明は、データ領域12aに記憶された複数のデータを初期化する場合、割り込みの禁止、初期化単位での初期化、割り込み禁止の解除を繰り返し行うことで、データ領域12aに記憶された全てのデータを初期化する。
つまり、マイコン10は、データ領域12aに記憶された全てのデータを初期化している間、ずっと割り込みを禁止するものではない。このように、マイコン10は、各初期化単位での初期化が終わるたびに、割り込みの禁止を解除するので、長時間割り込み禁止が継続することを防止でき、リアルタイム応答性の低下を抑制できる。
ここで、このマイコン10の効果に関して、比較例のマイコンと比較しつつ説明する。比較例のマイコンは、CPU、記憶部などを備えて構成されており、以下比較例マイコンと称する。また、比較例マイコンは、データ領域12aと同様のデータ領域を備えている。そして、比較例マイコンのCPUは、マイコン10と同様に、データ領域に記憶されている全データの初期化を実行することを示す初期化条件が成立した場合、図8のフローチャートで示す初期化処理を実行する。
ステップS300では、割り込み禁止を開始する。比較例マイコンのCPUは、各初期化単位での初期化を行う前に、タスクの割り込みを禁止する。
ステップS310からS330では、データ初期化ループを実行する。比較例マイコンのCPUは、データ領域のデータのうちの少なくとも一つのデータを初期化単位として、初期化単位での初期化を繰り返し行なうことで、データ領域に記憶された全データを初期化する。つまり、比較例マイコンのCPUは、データ領域の全データの初期化が終了するまで、ステップS310からS330の処理を実行する。
そして、ステップS340では、割り込み禁止を終了する。比較例マイコンのCPUは、データ領域の全データの初期化が終了した後に、初めてステップS300で禁止していたタスクの割り込みの禁止を解除する。
よって、比較例マイコンは、図9に示すように、タイミングt1からタイミングt2の間で、データ領域に記憶されている複数のデータを初期化する場合、タイミングt1からタイミングt2の全期間でタスクの割り込みを禁止する。
これに対して、マイコン10は、図4に示すように、タイミングt1からタイミングt2の間で、データ領域12aに記憶された複数のデータを初期化する場合、各初期化単位の初期化が終了するたびに割り込み禁止を解除する。よって、マイコン10は、タイミングt1からタイミングt2の間であっても、タスクの割り込みが可能となる。このように、マイコン10は、比較例マイコンに比べて、長時間割り込み禁止が継続することを防止でき、リアルタイム応答性の低下を抑制できる。つまり、マイコン10は、初期化中の割り込み禁止期間を全データではなく、各初期化単位に含まれるデータの初期化中に限定することにより、リアルタイム応答性の低下を抑制できる。
よって、例えば、初期化対象のデータとして中間データを採用した場合、この中間データを初期化している途中でも通常通りの演算が可能となる。また、初期化対象のデータとしてバッファデータを採用した場合、このバッファデータを初期化している途中でも通常通りの制御が可能となる。また、初期化対象のデータとしてフリーズフレームデータを採用した場合、このフリーズフレームデータを初期化している途中でもデータ領域12aへの書き込みが可能となる。
また、上述のように、比較例のマイコンの場合、初期化すべきデータの量に比例して割り込み禁止時間が長くなり、リアルタイム応答性が低下するという問題がある。さらに、このマイコンは、例えば、車両のエンジンを電子的に制御する電子制御装置(以下、エンジンECU)に適用することも考えられる。エンジンECUは、エンジン回転センサのパルス発生数がエンジン回転30°あたり1個である場合、エンジンが毎分6000回転のときは1/(6000/60)/(360/30)=830[μs]毎にパルス入力処理を行う必要がある。しかしながら、比較例のマイコンは、初期化以外の処理が動作しないよう割り込み禁止にしてしまう。よって、比較例のマイコンでは、初期化に数百μsかかるような量のデータを初期化する場合、パルス入力処理が間に合わず、ひいてはエンジン制御が誤動作する可能性がある。
これに対して、マイコン10は、データ領域12aに記憶された複数のデータを初期化する場合であっても、各初期化単位の初期化が終了するたびに割り込み禁止を解除する。よって、マイコン10では、エンジンECUに適用して、初期化に数百μsかかるような量のデータを初期化する場合であっても、パルス入力処理が間に合わず、エンジン制御が誤動作することを抑制できる。
また、従来技術ではないが、初期化が実行中かどうかを示す状態変数を設け、CPUは、記憶部にアクセスする前(データアクセスの前)にその状態変数を確認し、初期化中の場合はデータ領域への読み書きを行わずに延期するという方法も考えられる。しかしこの方法では、初期化実行中は必要なデータの読み書きができないため、通常の制御の実行ができなくなるという制約が生じる。
例えば、ガソリンエンジン制御装置では、燃料噴射量や点火タイミングを補正するための学習値が外部記憶装置のバッファの役割を持つデータ領域に格納されている場合がある。データ領域初期化中に、学習値を読み出せないからといって点火装置や噴燃料射装置の制御を延期すると、エンジンが停止してしまう。
また、一般的に、マイコンは、自身が搭載されている制御装置内部のデータを、通信手段を通じて制御装置の外部装置に定期的に送信する場合がある。定期的に送信するデータの一例としては、エンジン制御装置における、エンジン冷却水温や空燃比補正用学習値などをあげることができる。この送信すべきデータが初期化中のデータ領域に記憶されていた場合、初期化が終わるまでデータの送信を止めることになる。よって、このデータを定期的に受信する外部装置は、タイムアウトとみなして、通信異常と判定する可能性がある。
これに対して、マイコン10は、データ領域12aに記憶されている複数のデータを初期化する場合であっても、各初期化単位の初期化が終了するたびに割り込み禁止を解除する。つまり、マイコン10は、データ領域12aに記憶されている複数のデータを初期化する場合であっても、データ領域12aへのデータの書き込み、データ領域12aからのデータの読み込みが行える。
よって、マイコン10は、上述のような燃料噴射量や点火タイミングを補正するための学習値であるデータや、送信すべきデータなどがデータ領域12aに記憶されていた場合であっても、上述のような不具合が発生することを抑制できる。つまり、マイコン10は、データ領域12aに記憶されている学習値であるデータを初期化する場合であっても、初期化対象である全データの初期化が終わるまで点火装置や噴燃料射装置の制御を延期する必要がなく、エンジンが停止してしまうことを抑制できる。また、マイコン10は、データ領域12aに記憶されている送信すべきデータを初期化する場合であっても、初期化対象である全データの初期化が終わるまでデータの送信を止める必要がなく、外部装置から通信異常と判定されることを抑制できる。このように、マイコン10は、初期化実行中に必要なデータの読み書きができなくなったり、通常の制御の実行ができなくなるという不具合を抑制できる。
上述のように、CPU11は、タスクの割り込みの禁止を解除している間、初期化処理のタスクよりも優先度が高いタスクの割り込みを行ない、このタスクの処理を行うことによってデータ領域12aからデータを読み出すことが可能である。また、CPU11は、タスクの割り込みの禁止を解除している間、初期化処理のタスクよりも優先度が高いタスクの割り込みを行ない、このタスクの処理を行うことによってデータ領域12aへのデータの書き込みが可能である。
ここで、このように、初期化中にタスクの割り込みを行った場合の処理に関して説明する。まず、図6を用いて、CPU11の読み出し処理に関して説明する。図6は、読み出し要求処理のフローチャートである。CPU11は、データの読み出し要求があると、図6のフローチャートで示す処理を実行する。この読み出し要求とは、データ領域12aからデータを読み出すことを示す要求である。
ステップS110では、初期化中フラグ11aを判定する。CPU11は、初期化中フラグ11aに0がセットされているか、1がセットされているかを判定する。これは、データ領域12aが初期化中であるか否か、すなわち、ステップS10以降の処理が実行されている途中であるか否かを判定するためである。そして、CPU11は、初期化中フラグ11aに0がセットされていると判定した場合、データ領域12aは初期化中でないとみなしてステップS160に進む。一方、CPU11は、初期化中フラグ11aに1がセットされていると判定した場合、データ領域12aは初期化中であるとみなしてステップS120に進む。
ステップS120では、読み出し対象データの更新フラグを判定する。CPU11は、読み出し対象データに対応する更新フラグ11bに0がセットされていた場合、データ領域12aは初期化中であるが、まだ、読み出し対象データは初期化されていないとみなしてステップS130へ進む。一方、CPU11は、読み出し対象データに対応する更新フラグ11bに1がセットされていた場合、データ領域12aは初期化中であり、既に、読み出し対象データは初期化されているとみなしてステップS160に進む。なお、読み出し対象データは、本発明の特許請求の範囲における対象データに相当する。本実施形態では、読み出し対象データとして、データ領域12aに記憶されている複数のデータのうちの一つのデータを採用する。
なお、ステップS130からS150での処理は、上述のステップS40からS60での処理と同様である。つまり、ステップS130〜S150では、CPU11は、割り込み禁止を開始してから、単一データ(ここでは、読み出し対象データ)の初期化を行い、その後、割り込み禁止を終了する。そして、ステップS160では、値を読み出す。このとき、CPU11は、データ領域12aから読み出し対象データを読み出す。
つまり、CPU11は、データ領域12aの初期化中にタスクの割り込みを行い、読み出し対象データを読み出す際に、タスクの割り込みを禁止する(第2禁止手段)。そして、CPU11は、タスクの割り込みが禁止されている間に、読み出し対象データの初期化を行う(第2単位初期化手段)。そして、CPU11は、読み出し対象データの初期化が終了した後に、第2禁止手段にて禁止していたタスクの割り込みの禁止を解除する(第2解除手段)。さらに、CPU11は、タスクの割り込みの禁止を解除すると、読み出し対象データを読み出す(読み出し手段)。これによって、割り込み処理中に読み出し対象データを読み出す際に、より優先度が高いタスクの割り込みを禁止でき、データ領域12aを保護することができる。
このように、CPU11は、初期化中フラグ11aに1がセットされており、且つ読み出し対象データに対応する更新フラグ11bに0がセットされていた場合、読み出し対象データの初期化を行う(第2単位初期化手段)。このとき、CPU11は、読み出し対象データが含まれる初期化単位の初期化を行う。そして、CPU11は、初期化がなされた後の読み出し対象データを読み出す(読み出し手段)。
例えば、図5に示す例において、データ番号2のデータが読み出し対象データであった場合、CPU11は、データ番号2のデータは既に初期化済みであるため、このデータを読み出す。一方、データ番号Nのデータが読み出し対象データであった場合、CPU11は、データ番号Nのデータは未初期化であるため、このデータを初期化してから読み出す。なお、CPU11は、ステップS120とステップS160の処理を実行した後、又はステップS120からS160の処理を実行した後、図2のステップS30に戻ることになる。
このように、CPU11は、高優先度のタスクを実行することによって、初期化中のデータ領域12aからデータを読み出す際に、読み出し対象データが未初期化であると、読み出し対象データを初期化してから読み出すようにする。初期化中フラグ11aに1がセットされているということは(ステップS110で1と判定した場合)、データ領域12aに記憶されているデータの初期化が必要ということを示している。よって、上述のように、初期化がなされた後の読み出し対象データを読み出すことで、初期化の必要があるデータを、初期化せずに読み出すことを抑制できる。
これに対して、データ領域12aが初期化中でない場合、及び、読み出し対象データが既に初期化されていた場合は、読み出し対象データを再度初期化する必要がない。よって、CPU11は、ステップS110で0がセットされていると判定した場合、ステップS120〜S150の処理を行うことなく、ステップS160を行い、読み出し対象データを読み出す。また、CPU11は、ステップS120で1がセットされていると判定した場合、ステップS130〜S150の処理を行うことなく、ステップS160へ進んで読み出し対象データを読み出す。
次に、図7を用いて、CPU11の書き込み処理に関して説明する。図7は、書き込み要求処理のフローチャートである。CPU11は、データの書き込み要求があると、図7のフローチャートで示す処理を実行する。この書き込み要求とは、データ領域12aにおける所定のデータ番号のデータを、別のデータで書き換えることを示す要求である。言い換えると、データ領域12aにおける所定のデータ番号のデータを、別のデータで更新することを示す要求である。なお、データ領域12aに対して書き込むデータを書き込みデータとも称する。また、本実施形態では、書き込みデータとして一つのデータを採用する。
ステップS210では、初期化中フラグ11aを判定する。CPU11は、初期化中フラグ11aに0がセットされているか、1がセットされているかを判定する。これは、データ領域12aが初期化中であるか否か、すなわち、ステップS10以降の処理が実行されている途中であるか否かを判定するためである。そして、CPU11は、初期化中フラグ11aに0がセットされていると判定した場合、データ領域12aは初期化中でないとみなしてステップS220に進む。一方、CPU11は、初期化中フラグ11aに1がセットされていると判定した場合、データ領域12aは初期化中であるとみなしてステップS230に進む。
ステップS220では、値を更新する。言い換えると、所定のデータ番号のデータを、書き込みデータに書き換える。つまり、CPU11は、データ領域12aが初期化中でないため、特別な処理はせずに、データ領域12aに書き込みデータを書き込む。
一方、ステップS230では、割り込み禁止を開始する(第3禁止手段)。このように、CPU11は、データ領域12aの初期化中にタスクの割り込みを行い、このタスクを実行することによってデータを書き込む際、まず、タスクの割り込みを禁止する。
ステップS240では、書き込みデータの正しさをチェックする(チェック手段)。つまり、CPU11は、データ領域12aにデータを書き込む際に、初期化中フラグに1がセットされていた場合、書き込みデータの正しさをチェックする。これは、正しくないデータをデータ領域12aに書き込むことを抑制するためである。また、CPU11は、ステップS230で割り込みを禁止している間に、データの正しさチェックを行う。そして、CPU11は、データが正しいと判定した場合はステップS250へ進み、データが正しくないと判定した場合はステップS260へ進む。なお、この正しさチェックに関しては、後ほど説明する。
ステップS250では、値を更新する(書き込み手段)。CPU11は、書き込みデータが正しいと判断した場合は、正しいと判断された書き込みデータをデータ領域12aに書き込む。これによって、正しいデータをデータ領域12aに書き込むことができる。なお、CPU11は、ステップS230で割り込みを禁止している間に、書き込みデータを書き込む。
なお、ステップS250では、複数のデータを初期化単位とする場合、初期化単位における一部のデータのみを更新することもありうる。つまり、初期化単位における一部のデータのみを、正しいと判断された書き込みデータに書き換えることもありうる。このような場合、初期化単位に含まれる複数のデータのうち、書き込みデータで更新されるデータ以外のデータは、初期値に書き換えると好ましい。言い換えると、初期化単位に含まれる複数のデータにおいて、書き込みデータに対応するデータ以外のデータは、初期値に書き換えると好ましい。
ステップS260では、単一データの初期化を行う(書き込み手段)。CPU11は、書き込みデータが正しくないと判断した場合は、データ領域12aに正しくないデータが書き込まれることを抑制するために、データ領域12aにおける、書き込みデータに対応するデータを初期化する。このとき、CPU11は、書き込みデータに対応するデータを含む初期化単位での初期化を行う。これによって、書き込もうとしているデータが正しくない場合であっても、正しくないデータが書き込まれることを抑制することができる。なお、CPU11は、ステップS230で割り込みを禁止している間に、データの初期化を行う。
このステップS260での処理は、上述のステップS50と同様である。ただし、ステップS50では、ループカウンタなどで特定された初期化対象データを含む初期化単位での初期化を行うのに対して、ステップS260では、書き込みデータに対応するデータを含む初期化単位での初期化を行う。
ステップS270では、更新フラグ11bに1をセットする。CPU11は、初期化中であるデータ領域12aにおいて、まだ初期化されてないデータが、更新されたことを記録するために、更新フラグ11bに1をセットする。
ステップS280では、割り込み禁止を終了する(第3解除手段)。CPU11は、ステップS260での初期化、又はステップS250での書き込みが終了した後に、ステップS230で禁止していたタスクの割り込みの禁止を解除する。
なお、CPU11は、ステップS280の処理を実行した後、図2のステップS30に戻ることになる。また、CPU11は、ステップS280を実行した後に、図2のフローチャートに戻った場合、ステップS260で初期化したデータ、又はステップS250で書き込んだデータを初期化対象データとすることもありうる。このような場合、CPU11は、上述のステップS51の判定で、更新フラグ11bに1がセットされていると判定することになる。よって、CPU11は、上述のように、ステップS51で更新フラグ11bに1がセットされていると判定した場合はステップS52からS54の処理は実行せずに、ステップS260で初期化したデータ、又はステップS250で書き込んだデータを優先する。
例えば、図5に示す例において、データ番号Nのデータが書き込み対象のデータであった場合、CPU11は、データ番号Nのデータを初期化するか、又は、書き込みデータに更新する。そして、CPU11は、更新フラグ11bに1をセットする。
このように、マイコン10は、データ領域12aの初期化中にデータを書き込む場合、まず、割り込み禁止の状態にしてから、ステップS260での初期化、又はステップS250での書き込みを行う。これによって、ステップS260での初期化、又はステップS250での書き込みを行う際に、より優先度が高いタスクの割り込みを禁止でき、データ領域12aを保護することができる。
なお、ステップS230での正しさチェック方法はいくつか考えられる。ここで、正しさチェック方法の一例を説明する。
まず、マイコン10がFPU13を備えており、データ領域12aに複数のデータとして浮動小数点数が記憶されている場合に関して説明する。この場合、FPU13は、書き込みデータが非数の場合に正しくないと判断し、書き込みデータが非数でない場合に正しいと判断する(チェック手段)。
別の方法としては、CPU11は、書き込みデータが所定の範囲内でない場合に正しくないと判断し、書き込みデータが所定の範囲内である場合に正しいと判断する(チェック手段)。このようにしても、書き込みデータが正しいか否かを判断することができる。
なお、本実施形態においては、データ領域12aを初期化する際に、初期値テーブル12bに記憶された初期値データで初期化する例を採用した。しかしながら、本発明はこれに限定されるものではない。データ領域12aにおける全てのデータの初期値が同じデータ(例えば、0などの固定初期値)の場合、この固定初期値で初期化するようにしてもよい。このように、固定初期値で初期化することによって、初期値テーブル12bを設ける必要がない。よって、初期化に要する処理時間を低減できると共に、初期値テーブル12bの分だけ記憶部12の使用量を削減することができる。
以上、本発明の好ましい実施形態について説明した。しかしながら、本発明は、上述した実施形態に何ら制限されることはなく、本発明の趣旨を逸脱しない範囲において、種々の変形が可能である。