JP3617847B2 - ジョブの統合方法 - Google Patents
ジョブの統合方法 Download PDFInfo
- Publication number
- JP3617847B2 JP3617847B2 JP00211393A JP211393A JP3617847B2 JP 3617847 B2 JP3617847 B2 JP 3617847B2 JP 00211393 A JP00211393 A JP 00211393A JP 211393 A JP211393 A JP 211393A JP 3617847 B2 JP3617847 B2 JP 3617847B2
- Authority
- JP
- Japan
- Prior art keywords
- job
- flag
- level
- executed
- interrupt
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Combined Controls Of Internal Combustion Engines (AREA)
Description
【0001】
【産業上の利用分野】
本発明は、複数のファイルに記録されたジョブを統合するジョブの統合方法に関する。
【0002】
【従来の技術】
近年、自動車などの車輌にマイクロコンピュータが導入されるようになり、エンジン、パワートレインなどを高精度に制御することが可能となった。これにより、車輌制御システムの開発においては、マイクロコンピュータのソフトウエア開発が大きな比重を占めるようになり、開発環境の効率化、開発期間の短縮化などが重要な課題となっている。
【0003】
このマイクロコンピュータによる車輌制御システムにおいては、例えば、エンジン制御における吸入空気量の算出、燃料噴射量の設定、点火時期の設定などといった各制御ストラテジーに基づく複数のジョブがあり、各制御ストラテジー毎に、変数、定数、マップ、初期値、各ジョブを記録したファイルを作成した後、これらの複数のファイルと、各ジョブの実行呼出し命令を記述した親ファイルとをリンクし、最終的にROM領域及びRAM領域に対する実アドレスが指定された実行形式のファイルを作成するようになっている。
【0004】
【発明が解決しようとする課題】
しかしながら、通常、制御システムの開発においては、仕様変更、バグ発生、改良などによる変更が頻繁に生じ、また、各制御ストラテジー毎に別々の人間によって並行して進められることが多く、各制御ストラテジー毎のファイル間で共通のジョブを使用することも多い。
【0005】
このため、各制御ストラテジー毎のファイルにおいてジョブの削除・追加などが生じると、その度に、親ファイルが書換えられることになり、互いに、どの段階の親ファイルを使用するかで混乱を招き、開発効率が低下する。
【0006】
さらに、ある制御ストラテジー側のファイルでジョブが削除されたにもかかわらず、親ファイルが書換えられないままになると、最終的に各ファイルをリンクしたときエラーとなり、原因究明のため、正常な他の制御ストラテジー側のファイルをも調べなければならなくなり、無駄な労力を費やすことになる。
【0007】
本発明は上記事情に鑑みてなされたもので、複数のファイルに記録されたジョブの統合を容易にし、最終的な車輌制御システムを効率良く開発することのできるジョブの統合方法を提供することを目的としている。
【0008】
【課題を解決するための手段】
上記目的を達成するため、請求項1記載の発明は、各セクション領域を割当ててジョブの実行を管理する基本システムを、親ファイルに記録し、車両制御のための各種のジョブを、該ジョブ毎に上記セクション領域のうち関連するセクション領域名を宣言して、制御ストラテジー毎に複数のファイルに記録し、上記基本システムにより上記各セクション領域の各々に、対応するセクション領域名のジョブを格納して、実行形式のファイルを作成し、上記複数ファイルのジョブを統合することを特徴とする。
【0009】
【作用】
本発明は、各セクション領域を割当ててジョブの実行を管理する基本システムを、親ファイルに記録し、車両制御のための各種のジョブを、該ジョブ毎に上記セクション領域のうち関連するセクション領域名を宣言して、制御ストラテジー毎に複数のファイルに記録する。そして、基本システムにより各セクション領域の各々に、対応するセクション領域名のジョブを格納して、実行形式のファイルを作成し、複数ファイルのジョブを統合する。
【0010】
【実施例】
以下、図面を参照して本発明の実施例を説明する。図面は本発明の一実施例に係り、図1は親ファイルとストラテジーファイルとの関係を示す説明図、図2は0.5ms毎の定期割込み処理のフローチャート、図3はクラセン割込み処理のフローチャート、図4はジョブ優先処理のフローチャート、図5はジョブ実行サブルーチンの部分フローチャート1、図6はジョブ実行サブルーチンの部分フローチャート2、図7はジョブ実行サブルーチンの部分フローチャート3、図8はジョブ実行サブルーチンの部分フローチャート4、図9はジョブの実行状態を示す説明図、図10はジョブフラグの説明図、図11はクランク位置変数の説明図、図12はジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図、図13はシステムシフトバッファの説明図、図14はエンジン系の概略構成図、図15はクランクロータとクランク角センサの正面図、図16はカムロータとカム角センサの正面図、図17は電子制御系の回路構成図である。
【0011】
本実施例における車輌制御システムは、図17に示すマイクロコンピュータを中核とした電子制御装置(ECU)50により、図14に示すエンジン系が制御されるエンジン制御システムであり、上記ECU50のマイクロコンピュータに基本システムとしての新しい概念に基づくオペレーティングシステム(OS)が搭載され、各センサ類からの信号入力処理、エンジン回転数算出処理、吸入空気量算出処理、燃料噴射量設定処理、点火時期設定処理などといった各項目毎のジョブが管理されて効率的に実行され、燃料噴射制御、点火時期制御などが行なわれるようになっている。
【0012】
まず、上記ECU50によって制御されるエンジン系の機器構成について説明すると、図14に示すように、エンジン1(図においては水平対向4気筒型エンジンを示す)は、シリンダヘッド2の吸気ポート2aにインテークマニホルド3が連通され、このインテークマニホルド3の上流にエアチャンバ4を介してスロットル通路5が連通されている。このスロットル通路5の上流側には、吸気管6を介してエアクリーナ7が取付けられ、このエアクリーナ7が吸入空気の取り入れ口であるエアインテークチャンバ8に連通されている。
【0013】
また、上記排気ポート2bにエキゾーストマニホルド9を介して排気管10が連通され、この排気管10に触媒コンバータ11が介装されてマフラ12に連通されている。一方、上記スロットル通路5にスロットルバルブ5aが設けられ、このスロットル通路5の直上流の上記吸気管6にインタークーラ13が介装され、さらに、上記吸気管6の上記エアクリーナ7の下流側にレゾネータチャンバ14が介装されている。
【0014】
また、上記レゾネータチャンバ14と上記インテークマニホルド3とを連通して上記スロットルバルブ5aの上流側と下流側とをバイパスするバイパス通路15に、アイドルスピードコントロールバルブ(ISCV)16が介装されている。さらに、このISCV16の直下流側に、吸気圧が負圧のとき開弁し、またターボチャージャ18によって過給されて吸気圧が正圧になったとき閉弁するチェックバルブ17が介装されている。
【0015】
上記ターボチャージャ18は、上記吸気管6の上記レゾネータチャンバ14の下流側にコンプレッサハウジングが介装され、タービンハウジングが上記排気管10に介装されている。さらに、上記ターボチャージャ18のタービンハウジング流入口には、ウエストゲート弁19が介装され、このウエストゲート弁19には、ウエストゲート弁作動用アクチュエータ20が連設されている。
【0016】
上記ウエストゲート弁作動用アクチュエータ20は、ダイヤフラムにより2室に仕切られ、一方がウエストゲート弁制御用デューティソレノイド弁21に連通される圧力室を形成し、他方が上記ウエストゲート弁19を閉方向に付勢するスプリングを収納したスプリング室を形成している。
【0017】
上記ウエストゲート弁制御用デューティソレノイド弁21は、上記レゾネータチャンバ14と上記吸気管6の上記ターボチャージャ18のコンプレッサハウジング下流とを連通する通路に介装されており、ECU50から出力される制御信号のデューティ比に応じて、上記レゾネータチャンバ14側の圧力と上記コンプレッサハウジング下流側の圧力とを調圧し、上記ウエストゲート弁作動用アクチュエータ20の圧力室に供給する。
【0018】
すなわち、上記ECU50によって上記ウエストゲート弁制御用デューティソレノイド弁21を制御し、上記ウエストゲート弁作動用アクチュエータ20を作動させて上記ウエストゲート弁19による排気ガスリリーフを調整することにより、上記ターボチャージャ18による過給圧を制御するようになっている。
【0019】
また、上記インテークマニホルド3に絶対圧センサ22が通路23を介して連通され、この通路23に、上記絶対圧センサ22と上記インテークマニホルド3あるいは大気とを選択的に連通する吸気管圧力/大気圧切換ソレノイド弁24が介装されている。
【0020】
さらに、上記インテークマニホルド3の各気筒の各吸気ポート2aの直上流側にインジェクタ25が臨まされ、また、上記シリンダヘッド2の各気筒毎に、その先端を燃焼室に露呈する点火プラグ26aが取付けられ、この点火プラグ26aに連設する点火コイル26bにイグナイタ27が接続されている。
【0021】
上記インジェクタ25には、燃料タンク28内に設けたインタンク式の燃料ポンプ29から燃料フィルタ30を経て燃料が圧送され、プレッシャレギュレータ31にて調圧される。
【0022】
また、上記吸気管6の上記エアークリーナ7の直下流に、ホットワイヤ式あるいはホットフィルム式などの吸入空気量センサ32が介装され、上記スロットルバルブ5aに、スロットル開度センサ33aとアイドルスイッチ33bとを内蔵したスロットルセンサ33が連設されている。
【0023】
さらに、上記エンジン1のシリンダブロック1aにノックセンサ34が取付けられるとともに、このシリンダブロック1aの左右両バンクを連通する冷却水通路35に冷却水温センサ36が臨まされ、上記排気管10の上記エキゾーストマニホルド9の集合部にO2 センサ37が臨まされている。
【0024】
また、上記シリンダブロック1aに支承されたクランクシャフト1bにクランクロータ38が軸着され、このクランクロータ38の外周に、電磁ピックアップなどからなるクランク角センサ39が対設されている。さらに、上記エンジン1のカムシャフト1cに連設するカムロータ40に、電磁ピックアップなどからなる気筒判別用のカム角センサ41が対設されている。尚、上記クランク角センサ39及び上記カム角センサ41は、電磁ピックアップなどの磁気センサに限らず、光センサなどでも良い。
【0025】
上記クランクロータ38は、図15に示すように、その外周に突起38a,38b,38cが形成され、これらの各突起38a,38b,38cが、各気筒(#1,#2と#3,#4)の圧縮上死点前(BTDC)θ1,θ2,θ3 の位置に形成されており、本実施例においては、θ1 =97°CA、θ2 =65°CA、θ3 =10°CAである。
【0026】
上記クランクロータ38の各突起は、上記クランク角センサ39によって検出され、BTDC97°,65°,10°のクランク角信号がエンジン1/2回転毎(180°CA毎)に出力される。そして、各信号の入力間隔時間がタイマによって計時され、エンジン回転数が算出される。
【0027】
尚、突起38bは、点火時期設定の際の基準クランク角となり、また、突起38cは、始動時噴射開始時期の基準クランク角となるとともに始動時の固定点火時期を示すクランク角となる。
【0028】
また、図16に示すように、上記カムロータ40の外周には、気筒判別用の突起40a,40b,40cが形成され、突起40aが#3,#4気筒の圧縮上死点後(ATDC)θ4 の位置に形成され、突起40bが3個の突起で構成されて最初の突起が#1気筒のATDCθ5 の位置に形成されている。さらに、突起40cが2個の突起で形成され、最初の突起が#2気筒のATDCθ6 の位置に形成されている。本実施例においては、θ4 =20°CA、θ5 =5°CA、θ6 =20°CAである。
【0029】
そして、上記カムロータ40の各突起が上記カム角センサ41によって検出され、各気筒の燃焼行程順を#1→#3→#2→#4とした場合、この燃焼行程順と、上記カム角センサ41の検出信号をカウンタによって計数した値とのパターンに基づいて、気筒判別がなされる。
【0030】
一方、図17に示すECU50は、燃料噴射制御、点火時期制御などを行なうメインコンピュータ51と、ノック検出処理を行なう専用のサブコンピュータ52との2つのコンピュータを中心として構成され、各部に所定の安定化電源を供給する定電圧回路53や各種の周辺回路が組込まれている。
【0031】
上記定電圧回路53は、ECUリレー54のリレー接点を介してバッテリ55に接続され、このバッテリ55に、上記ECUリレー54のリレーコイルがイグニッションスイッチ56を介して接続されている。また、上記バッテリ55には、上記定電圧回路53が直接接続され、さらに、燃料ポンプリレー57のリレー接点を介して燃料ポンプ29が接続されている。
【0032】
すなわち、上記定電圧回路53は、上記イグニッションスイッチ56がONされ、上記ECUリレー54のリレー接点が閉となったとき、制御用電源を供給し、また、上記イグニッションスイッチ56がOFFされたとき、バックアップ用の電源を供給する。
【0033】
上記メインコンピュータ51は、CPU58(以下、メインCPU58と称する)、ROM59、RAM60、上記イグニッションスイッチ56がOFFされたときにも上記定電圧回路53からバックアップ電源が供給されてデータを保持するバックアップRAM61、カウンタ・タイマ群62、シリアル通信インターフェースであるSCI63、及び、I/Oインターフェース64がバスライン65を介して接続されたマイクロコンピュータである。
【0034】
尚、上記カウンタ・タイマ群62は、フリーランカウンタ、カム角センサ(以下、適宜、カムセンと略記する)信号の入力計数用カムセンカウンタなどの各種カウンタ、燃料噴射タイマ、点火タイマ、後述する0.5ms毎の定期割込みを発生させるための定期割込みタイマ、クランク角センサ(以下、適宜、クラセンと略記する)信号の入力間隔計時用クラセンタイマ、及び、システム異常監視用のウオッチドッグタイマなどの各種タイマを便宜上総称するものであり、上記メインコンピュータ51においては、その他、各種のソフトウエアカウンタ・タイマが用いられる。
【0035】
また、上記サブコンピュータ52も、上記メインコンピュータ51と同様、CPU71(以下、サブCPU71と称する)、ROM72、RAM73、カウンタ・タイマ群74、SCI75、及び、I/Oインターフェース76がバスライン77を介して接続されたマイクロコンピュータであり、上記メインコンピュータ51とサブコンピュータ52とは、上記SCI63,75を介してシリアル通信ラインにより互いに接続されている。
【0036】
上記メインコンピュータ51のI/Oインターフェース64には、入力ポートに、吸入空気量センサ32、スロットル開度センサ33a、水温センサ36、O2 センサ37、絶対圧センサ22、車速センサ42、及び、バッテリ55が、8チャンネル入力のA/D変換器66を介して接続されるとともに、アイドルスイッチ33b、クランク角センサ39、カム角センサ41が接続されており、さらに、始動状態を検出するためにスタータスイッチ43が接続されている。
【0037】
尚、本実施例においては、上記A/D変換器66は、7チャンネル分の入力が使用され、残りの1チャンネルは予備となっている。
【0038】
また、上記I/Oインターフェース64の出力ポートには、イグナイタ27が接続され、さらに、駆動回路67を介して、ISCV16、インジェクタ25、燃料ポンプリレー57のリレーコイル、および、ウエストゲート弁制御用デューティソレノイド弁21、吸気管圧力/大気圧切換ソレノイド弁24が接続されている。
【0039】
一方、上記サブコンピュータ52のI/Oインターフェース76は、入力ポートに、クランク角センサ39、カム角センサ41が接続されるとともに、A/D変換器78、周波数フィルタ79、アンプ80を介してノックセンサ34が接続されており、上記ノックセンサ34からのノック検出信号が上記アンプ80で所定のレベルに増幅された後に上記周波数フィルタ79により必要な周波数成分が抽出され、上記A/D変換器78にてデジタル信号に変換されて入力されるようになっている。
【0040】
上記メインコンピュータ51では、各センサ類からの検出信号を処理し、燃料噴射パルス幅、点火時期などを演算する。すなわち、吸入空気量センサ32の出力信号から吸入空気量を算出し、RAM60及びバックアップRAM61に記憶されている各種データに基づき、吸入空気量に見合った燃料噴射量を演算し、また、点火時期などを算出する。
【0041】
そして、上記燃料噴射量に相応する駆動パルス幅信号を、駆動回路67を介して所定のタイミングで該当気筒のインジェクタ25に出力して燃料を噴射し、また、所定のタイミングでイグナイタ27に点火信号を出力し、該当気筒の点火プラグ26aを点火する。
【0042】
その結果、該当気筒に供給された混合気が爆発燃焼し、エキゾーストマニホルド9の集合部に臨まされたO2 センサ37により排気ガス中の酸素濃度が検出され、この検出信号が波形整形された後、上記メインCPU58で基準電圧(スライスレベル)と比較され、エンジンの空燃比状態が目標空燃比に対し、リッチ側にあるか、リーン側にあるかが判別され、空燃比が目標空燃比となるようフィードバック制御される。
【0043】
一方、上記サブコンピュータ52では、エンジン回転数とエンジン負荷とに基づいてノックセンサ34からの信号のサンプル区間を設定し、このサンプル区間でノックセンサ34からの信号を高速にA/D変換して振動波形を忠実にデジタルデータに変換し、ノック発生の有無を判定する。
【0044】
上記サブコンピュータ52のI/Oインターフェース76の出力ポートは、上記メインコンピュータ51のI/Oインターフェース64の入力ポートに接続されており、上記サブコンピュータ52でのノック判定結果がI/Oインターフェース76に出力される。そして、上記メインコンピュータ51では、上記サブコンピュータ52からノック発生有りの判定結果が出力されると、SCI63を介してシリアル通信ラインよりノックデータを読込み、このノックデータに基づいて直ちに該当気筒の点火時期を遅らせ、ノックを回避する。
【0045】
以上のエンジン制御システムは、アセンブラ言語などによって記述した上記OS本体の親ファイルに、同じくアセンブラ言語などによって記述した各制御ストラテジー毎のファイルをリンクして実行形式のマシン語ファイルを作成し、上記メインコンピュータ51のROM59に書込むことによって実現することができる。
【0046】
上記OSは、車輌制御のための各種マネジメント機能、及び、このマネジメント機能に密着した内部ストラテジーを有しており、各種ジョブを体系的に結合することができる。
【0047】
上記OSのマネジメント機能としては、
(1−1)ジョブの優先処理
(1ー2)セクション定義による各ジョブの分割ファイル対応
(1−3)スタックの使用状況モニタ機能
(1−4)異常割込み動作のモニタ機能
(1−5)ジョブ毎に固有の制約を作らない標準マップ・標準ワークメモリ設定
などの機能があり、制御ストラテジーの開発環境を向上させるとともに、限られたCPU能力を最大限に発揮させ、デジタル制御理論の基本である等時間間隔処理を可能な限り達成することができる。
【0048】
等時間間隔処理としては、0.5ms毎の定期割込みを基本として、2,4,10,50,250ms毎の5種類の等間隔割込みジョブが用意されており、また、エンジン回転に同期した処理として、クランク角信号入力により即割込み実行される高優先クラセンジョブ(以下、単にクラセンジョブと称する)と、より優先順位が高い他のジョブがないときにクランク角信号入力により割込み実行される比較的緊急度の低い低優先クラセンジョブとが用意されている。
【0049】
これらの各ジョブには、クラセンジョブ>2msジョブ>4msジョブ>10msジョブ>低優先クラセンジョブ>50msジョブ>250msジョブの順で、7〜1の優先レベルが高位側から低位側に向かって付けられており、図9に示すように、高速ジョブに対し低速ジョブが分割して処理されるとともに、各ジョブの多重待ち処理が行なわれる。
【0050】
また、上記OSの下で働く各プログラムは、機能別の管理領域すなわちセクション領域毎に順番に配列されており、各セクション領域には機能毎にセクション宣言によって名前が付けられている。各ストラテジーファイル側で使用する主なセクション領域は、
○変数宣言領域
○自己ファイル名、フィル制作時の自動記録領域
○セッティングデータ領域
○クラセンジョブ領域
○2msジョブ領域
○4msジョブ領域
○10msジョブ領域
○低優先クラセンジョブ領域
○50msジョブ領域
○250msジョブ領域
○リセット時初期化ジョブ領域
○エンスト時初期化ジョブ領域
○バックグランドジョブ領域
○プログラム本体の領域
である。
【0051】
すなわち、上記OS下で働く数々のストラテジーファイル(ユーザー側ファイル)をリンクして実行形式のファイルを作成するには、各処理毎にOSと同じ名前のセクション宣言を記述しておくことにより、OS本体の親ファイルとリンクされて最終的なファイルとなったとき、同じ処理は連続した1つの領域に集められ、OSと融合して一体となって処理される。
【0052】
例えば、図1に示すように、開発段階における各ソースファイルF1,F2,F3中で、初期値設定、2ms,4ms,10ms毎の処理、…,バックグランド処理などを、それぞれ、INIT,2ms,4ms,10ms,…,BGJとセクション宣言して各ジョブを記述することにより、親ファイルとリンクされて一つのマシン語ファイルとなったとき、初期値設定のセクション領域にはジョブD1,D2,D3、2msジョブのセクション領域にはジョブJ1,J5,J9、4msジョブのセクション領域にはジョブJ2,J6,J10、10msジョブのセクション領域にはジョブJ3,J7,J11、バックグランドジョブのセクション領域にはジョブJ4,J8,J12といったように、同じセクション領域に別々のファイルで同じセクション宣言がなされたジョブが集められる。
【0053】
従って、各制御ストラテジーに基づく機能毎にファイルを分割してプログラム開発が可能になるとともに、プログラムの構造化記述が可能となり、各ストラテジーファイル中でジョブの追加・削除等の変更が生じても、OS側で各ジョブをそれぞれの管理領域で管理するため、従来のように親ファイルを書換える必要がなく、各制御ストラテジーそれぞれの開発に専念することができ、開発効率を向上することができる。
【0054】
また、上記OSには、以上のマネジメント機能に密着した内部ストラテジーとして、
(2−1)A/D変換処理
(2−2)クランク位置に係る各種情報の算出
(2−3)デバッグ用シュミレーション機能(エンジン回転及びA/D変換)
(2−4)点火タイマのセット
(2−5)燃料噴射タイマのセット
などの機能を備えており、さらに、これらの機能に係る各種サービスルーチンが各ジョブ中に用意されている。
【0055】
従来、このような機能は各ジョブレベルで達成するようになっていたが、本システムにおいては、すべてOS側に用意され、OS側で処理したA/D変換結果、クランク位置情報、エンジン回転数などに基づいて、ユーザー側の各ジョブで、燃料噴射量、点火時期などを設定すると、これらの指示値がOSによって燃料噴射タイマ、点火タイマにセットされるようになっている。
【0056】
次に、上記メインコンピュータ51におけるジョブ処理の機能を、図2〜図8のフローチャートに基づいて説明する。尚、サブコンピュータ52はノック検出処理専用のコンピュータであるため、その動作説明を省略する。
【0057】
まず、イグニッションスイッチ56がONされてシステムに電源が投入されると、リセットに伴うリセット割込みが起動し、各種イニシャライズが行なわれるとともに、0.5ms毎に定期割込みを起動するための定期割込みタイマが起動され、クランク角センサ39からの信号入力毎(BTDC97°,65°,10°CA毎のエンジン1回転に6回)に起動されるクラセン割込みが許可され、その後、バックグランドジョブの実行状態となる。
【0058】
そして、このバックグランドジョブの上で、0.5ms毎の定期割込みと、エンジン1回転に6回のクラセン割込みとにより、7レベルのジョブが優先処理される。この2つの割込みにおいては、各自の処理を実行後、共通のアドレスにジャンプし、ジョブ優先処理を実行する。
【0059】
尚、上記リセット割込みは、内部演算において0による除算を実行した場合や、無限ループが発生した場合など、正常時には発生しない要因によっても、起動される。
【0060】
まず、図2に示す0.5ms毎の定期割込みについて説明する。この定期割込みでは、ステップS100で、OS用ワークエリアを設定し、ステップS101で、ウオッチドッグタイマを初期化すると、ステップS102へ進んで、P−RUNフラグを20回に1回すなわち10ms毎に反転する。このP−RUNフラグは、図示しない保護回路によってシステムが自動的にリセットされないようにするためのフラグであり、システムが正常に動作して一定時間毎(10ms毎)に反転される限り、上記保護回路の作動が阻止される。
【0061】
次いで、ステップS103へ進み、スイッチ出力の転写を行なう。このスイッチ出力は、各ジョブ中でメモリに書き込んだビットのON,OFF値であり、各ジョブからは直接I/Oインターフェース64の出力ポートに出力せず、OS側で0.5ms毎にメモリの値を出力ポートに転写する。
【0062】
次に、ステップS104へ進むと、A/D変換サブルーチンを実行してA/D変換に係る各種設定を行ない、ステップS105で、2,4,10,50,250ms毎の各ジョブ割込み要求を示すジョブフラグJB_FLGを作成した後、ステップS106で、A/D変換をスタートする。
【0063】
上記A/D変換は、基本的に、A/D変換器66の8チャンネル入力が0.5ms毎に所定の変換順番毎に処理され、4ms周期で全入力の変換が行なわれる。但し、特定の1つのチャンネルは、回転脈動が発生する吸入管圧力などをA/D変換するためクランク角90°毎に(0.5msの時間精度で)同期し、変換順番に対して割込んだ形で処理が行なわれ、その後の入力の順番を1つ遅れにする。
【0064】
尚、エンジン回転数3750rpm以上では、A/D変換の最後の順番の入力が完全に停止し、7500rpm以上では、最後から2番目の入力も停止するが、A/D変換の順番は、スロットル開度、吸入空気量など変化の速いものを先として、冷却水温、電圧など比較的変化の遅いものが後になるように設定してあり、且つ、最後のA/D変換順番をクランク同期入力に設定してあるため、特に支障は生じない。
【0065】
また、図10に示すように、上記ジョブフラグJB_FLGは、1バイト変数の各ビットを各ジョブに対応するフラグとして割当てたものであり、複数のジョブ要求が同時に可能なようになっている。この1バイト変数のビット1〜ビット7は優先レベル1〜7に対応し、それぞれ、250msジョブ、50msジョブ、低優先クラセンジョブ、10msジョブ、4msジョブ、2msジョブ、クラセンジョブのフラグに割当てられている。そして、所定のビットが立てられたとき、対応する優先レベルのジョブ割込み要求がなされる。尚、ビット0はバックグランドジョブのフラグに割当てられて通常は参照されない。
【0066】
次に、上記ステップS105でジョブフラグ作成サブルーチンによりジョブフラグJB_FLGを作成し、ステップS106でA/D変換をスタートした後は、ステップS107へ進み、ジョブフラグJB_FLGのいずれかのジョブに対応するビットが立っているか否かを調べる。
【0067】
その結果、上記ステップS107で、ジョブフラグJB_FLGのビットが一つも立っていないときには、どのジョブからも要求がないため割込みを終了し、ジョブフラグJB_FLGのいずれかのビットが立っているときには、ステップS108へ進んで、現状レベル(この定期割込みが実行される時点で所定の優先レベルのジョブが実行されていた状態)以下のフラグがないか否かを調べる。
【0068】
上記ステップS108で、現状レベル以下のフラグがないときには、ラベルWAR_JBで示される図4のジョブ優先処理にジャンプし、現状レベル以下のフラグがあるときには、ステップS109で、現状レベル以下のレベルのオーバーラップカウンタOLCを1増加させる。
【0069】
上記オーバーラップカウンタOLCは、ジョブ要求を記憶するためのカウンタであり、各優先レベル毎に1バイト割当てられ、上記ジョブフラグJB_FLGによるジョブ要求時にインクリメント、ジョブ終了時にデクリメントされる。すなわち、カウンタによってジョブ要求を記憶することによりジョブの多重要求に対応することができるのである。
【0070】
次いで、上記ステップS109からステップS110へ進み、現状レベルより高いフラグがないか否かを調べ、現状レベルより高いフラグがないときには、ルーチンを抜けて割込みを終了し、現状レベルより高いフラグがあるときには、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0071】
一方、この0.5ms毎の定期割込みに対し、図3のクラセンによる割込みでは、ステップS200で、OS用ワークエリアを設定すると、ステップS201で、クランク位置・半回転時間算出のサブルーチンを実行し、現在のクランク位置を判別するためのクランク位置変数、及び、最新の3つのクラセン間隔の和である半回転時間を算出する。
【0072】
上記クランク位置変数は、OS中で用意されるシステム変数であり、図11に示すように、#1〜#4気筒に対するクランク位置を、97°,65°,10°CAによって12の状態に区分し、現在のクランク位置を表わす。
【0073】
すなわち、各気筒毎に、0,1,2の数値でクラセン入力順を示すクラセン順序S_CCAS、#1気筒を0、#3気筒を1、#2気筒を2、#4気筒を3として気筒の燃焼順を示す気筒順序S_RCAS、及び、0〜11の数値でクラセン順序及び気筒順序を総合的に表わす総合位置S_ACASの3変数によって現在のクランク位置を表わし、さらに、クランク位置が確証をもって正常に判別されたときを0、判別結果がつじつまが合わず不安の残る推定状態を1、不明な状態を2とするエラーレベルS_ECASにより、クランク位置の判別状況を表わすようになっている。
【0074】
次いで、上記ステップS201からステップS202へ進むと、クランク位置・半回転時間算出のサブルーチンにおいてクランク位置判定が正常に終了したかあるいは判定不能であったかを、アキュムレータAにストアされているコードを読み出すことにより調べる(エラーコード1、正常終了コード0)。
【0075】
そして、上記ステップS202で、アキュムレータAの値が1であり、クランク位置が判定不能であったときには、割込みを終了し、アキュムレータAの値が0であり、クランク位置が正常に判定されているときには、ステップS203へ進み、エンストフラグを解除する。
【0076】
尚、上記エンストフラグは、クラセン間隔計測タイマがO.5sec以上の時間(約30rpm以下)を計測したときセットされてエンジンがエンスト状態であることを示すフラグであり、このクラセン割込みによりクリアされ、エンスト状態が解除される。
【0077】
次に、ステップS204へ進むと、点火タイマセットのサブルーチンを実行し、ユーザージョブ側で設定した点火時期の指示値に基づいて作成された点火スケジュールに従って点火タイマをセットする。この点火スケジュールは、ドエル開始時期、ドエルオン待ち時間、ドエルオフ待ち時間などをメンバーとする構造体変数であり、10msジョブ中に作成ルーチンが用意され、この点火スケジュールに従って点火シーケンスが決定される。
【0078】
次いで、スップS205で、燃料噴射タイマセットのサブルーチンを実行し、ユーザージョブ側で設定した燃料噴射量の指示値(各気筒毎の噴射幅)に対し、燃料噴射開始時期などを燃料噴射タイマにセットしてステップS206へ進む。
【0079】
ステップS206では、このクラセンが実行された現状のジョブレベルが自身のジョブレベルであるか否かを判別し、現状がクラセンジョブ自身のレベルであるときには、ステップS207、S208で、クラセンジョブ、低優先クラセンジョブのオーバーラップカウンタOLCを、それぞれ1増加させて割込みを終了し、現状のジョブレベルがクラセンジョブのレベルでないときには、ステップS209で、現状のジョブレベルが低優先クラセンジョブのレベル以上であるか否かを調べる。
【0080】
そして、現状のジョブレベルが低優先クラセンジョブ以上であるときには、上記ステップS209からステップS210へ進んで、低優先クラセンジョブのオーバーラップカウンタOLCを1増加させると、ステップS211で、クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0081】
一方、上記ステップS209で、現状のジョブレベルが低優先クラセンジョブ以上でないときには、上記ステップS209からステップS212へ進み、クラセンジョブのジョブフラグをセットすると、ステップS213で、低優先クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0082】
このジョブ優先処理では、ステップS300で、ジョブの優先レベルを示す1バイト変数であるジョブレベルJB_LEVを1つ上げると、ステップS301へ進んで、この優先レベルに対応するジョブフラグが立っていないか調べる。そして、ジョブフラグが立っていないときには、ステップS300へ戻ってさらにジョブレベルJB_LEVを1つ上げ、ジョブフラグが立っているときには、ステップS302へ進み、ジョブフラグの立っているジョブのオーバーラップカウンタOLCを初期値の0から1にし、ステップS303へ進む。
【0083】
ステップS303では、より上のジョブフラグがあるか否かを調べ、より上のジョブがあるときには、ステップS300へ戻って前述の処理を繰り返し、より上のジョブがないときには、ステップS304へ進んで、ジョブ実行中フラグJB_RUNをセットすると、ステップS305で、後述するジョブ実行サブルーチンにより最上位のジョブを実行する。
【0084】
上記ジョブ実行中フラグJB_RUNは、ジョブの実行開始時にセットされ、終了時にクリアされるフラグであり、このフラグにより、処理の途中で、より優先度の高いジョブによって割込まれたジョブを識別することができる。
【0085】
例えば、図12に示すように、JB_LEV=4の10msジョブを実行中、JB_LEV=6の2msジョブの割込み要求がなされると、10msジョブの処理が中断され、より優先度の高い2msジョブが、JB_RUN=1、OLC=1にセットされ、実行される。そして、この2msジョブの処理中に、JB_LEV=5の4msジョブの割込み要求が発生すると、この4msジョブは、JB_RUN=0、OLC=1とされて割込みが受付けられるが、実行はされず待機状態となる。
【0086】
その後、ジョブ実行サブルーチンによるジョブの実行が終了すると、上記ステップS305からステップS306へ進んでオーバーラップカウンタOLCを1減らし、ステップS307で、オーバーラップカウンタOLCがゼロになったか否かを調べる。その結果、オーバラップカウンタOLCがゼロになっておらず、同じ優先レベルでジョブ割込み要求が複数回あるときには、ステップS305へ戻ってジョブを繰返し実行し、オーバラップカウンタOLCがゼロになったとき、ステップS307からステップS308へ進んで、ジョブ実行中フラグJB_RUNをクリアする。
【0087】
次に、ステップS309へ進み、ジョブレベルJB_LEVを1つ下げて次のジョブレベルに移ると、ステップS310で、このジョブレベルJB_LEVがゼロになったか否かを調べる。そして、ジョブレベルJB_LEVがゼロのときには、この割込みを終了し、ジョブレベルJB_LEVがゼロでないときには、ステップS311へ進んで、オーバーラップカウンタOLCがゼロか否かを調べる。
【0088】
上記ステップS311で、オーバーラップカウンタOLCがゼロのときには、このレベルではジョブ要求はないため、上記ステップS311からステップS309へ戻って、ジョブレベルJB_LEVをさらに1つ下げて同様の処理を繰返し、オーバーラップカウンタOLCがゼロでないときには、ステップS312へ進んで、このジョブレベルにおいて、ジョブ実行中フラグJB_RUNがセットされているか否かを調べる。
【0089】
上記ステップS312で、ジョブ実行中フラグJB_RUNがセットされているときには、割込み前にジョブを実行中であったため、割込みを終了して割込み前のジョブへ戻り、ジョブ実行中フラグJB_RUNがセットされていなければ、ステップS304へ戻って、このレベルのジョブを実行し、同様の処理を繰返す。
【0090】
すなわち、図12において、JB_LEV=6の2msジョブが終了し、OLC=0、JB_RUN=0になると、ジョブレベルが1つ下げられ、JB_LEV=5の4msジョブが、JB_RUN=0、OLC=1の待機状態からJB_RUN=1にセットされ、実行される。さらに、4msジョブが終了すると、JB_LEV=4に移り、JB_RUN=1(ジョブ実行中)の状態から、2msジョブ及び4msジョブによって中断されていた10msジョブの処理が再開される。
【0091】
このように、0.5ms毎の定期割込み、クラセン割込みを基本タイミングとして、各ジョブの優先レベル及び実行タイミングを知らせるジョブフラグJB_FLGを作成するため、可能な限り正確に、等時間間隔処理、エンジン回転同期処理を実現し、各ジョブを効率良く処理することができる。さらに、基本タイミングとなる各割込み毎に更新されるジョブフラグJB_FLGによらず、オーバーラップカウンタOLCによってジョブの多重要求を記憶するため、あるジョブの処理時間が長引き、再度、同じジョブを実行すべきタイミングとなった場合においても、処理を途中で放棄することなく、可能な限り最後まで処理を継続することができる。
【0092】
次に、図5〜図8のジョブ実行サブルーチンについて説明する。
まず、ステップS500で、ジョブフラグJB_FLGを参照して実行すべきジョブがクラセンジョブでないか否かを調べ、クラセンジョブでないときには、ラベルALJ10へ分岐し、クラセンジョブのときには、ステップS501へ進んで、気筒判別がついているか否かを調べる。
【0093】
そして、気筒判別がついていないときには、そのままルーチンを抜けてジョブを実行せず、気筒判別がついているとき、上記ステップS501からステップS502へ進んで、オーバーラップカウンタOLCの値を参照して多重待ち状態であるか否かを調べる。
【0094】
上記ステップS502では、多重待ち状態でないとき、ステップS503へ進んで、クラセン割込み毎に算出されるシステム変数S_ACAS(クランク総合位置)をユーザー変数ACASとし、一方、多重待ち状態のときには、ステップS504へ分岐し、ユーザー変数ACASを一つ増やして12で割った剰余をとって新たなユーザー変数ACASとし、このユーザー変数ACASを0,1,2,…,11,0,1,…とソフトウエア的に更新してゆく。
【0095】
すなわち、クラセンジョブ及び低優先クラセンジョブは、自身または優先度の高いジョブに邪魔されて遅れることがあるが、クラセン割込みは正確にクランク角センサ信号に同期して実行され、システム変数S_ACASはジョブの遅れに関係なく更新される。
【0096】
従って、ジョブ中でシステム変数S_ACASを参照してクランク位置を知り、このクランク位置に応じた仕事を行なおうとしても、自身が他のジョブに邪魔されて遅れた場合には、自身の仕事に対応したクランク位置を知ることができなくなる。このため、クラセンジョブ及び低優先クラセンジョブ中では、多重待ち状態でないときにOS用のシステム変数S_ACASをユーザー用変数ACASとして取込み、このユーザー変数ACASをジョブ実行毎に更新して多重要求の場合にもクランク位置に対応した適正な処理がなされるようにするのである。
【0097】
その後、上記ステップS503あるいは上記ステップS504からステップS505へ進み、ジョブのワークエリアを設定すると、ステップS506で、レベルゼロの割込みを許可し、ステップS507で、クラセンジョブのセクションに移る。そして、このクラセンジョブセクションにリンクされた処理を実行し、ステップS508で、割込みを禁止してルーチンを抜ける。
【0098】
次に、ステップS500で、これから実行すべきジョブがクラセンジョブでないときには、ラベルALJ10のステップS510で、2msジョブでないか否か調べ、2msジョブのとき、ステップS511で、ジョブのワークエリアを設定すると、ステップS512で、レベルゼロの割込みを許可し、ステップS513で、2msジョブのセクションに移る。そして、このセクションにリンクされているジョブ本体(ユーザー側の制御ストラテジーに基づくルーチン、あるいは、OS側で用意したサービスルーチン)を実行し、ステップS514で、割込みを禁止してルーチンを抜ける。
【0099】
一方、上記ステップ510で、実行すべきジョブが2msジョブでないときには、ステップS510からステップS520へ分岐し、実行すべきジョブが4msジョブか否かを調べる。そして、4msジョブでないときには、ラベルALJ30へ分岐し、4msジョブのときには、ステップS521で、ジョブのワークエリアを設定すると、ステップS522へ進む。尚、この4msジョブは、A/D変換利用ジョブであり、後述するシステムシフトバッファSSHBを介してA/D変換データを利用する。
【0100】
ステップS522では、レベルゼロの割込みを許可し、次いで、ステップS523へ進むと、スイッチ入力を読み込み、ステップS524で、4msジョブのセクションに移って、リンクされているジョブ本体を実行する。その後、4msジョブのセクションから抜けると、ステップS525で、割込みを禁止し、ステップS526へ進んで、システムシフトバッファSSHBをシフトしてルーチンを抜ける。
【0101】
上記システムシフトバッファSSHBは、図13に示すように、8チャンネルの各A/D変換結果がストアされる先頭オフセットアドレス0,+8,+16,+24,+32,+34,+36,+38番の各メモリ、及び、4ms毎のクランク同期のA/D変換結果がストアされる先頭オフセットアドレス−2番地の1ワードのメモリからなり、0.5ms毎に実行される1回のA/D変換結果が1ワード(2バイト)でストアされる。
【0102】
先頭オフセットアドレス0番地からは、4段のシフトメモリとなっており、90°CA毎のA/D変換結果がストアされ、最新4データ(1回転分)をジョブから参照することができる。また、先頭オフセットアドレス+32,+34,+36,+38番地は、各1ワードのメモリであり、なまし処理機能が選択されたとき、A/D変換結果を加重平均した値がストアされてノイズ除去と精度向上を図ることができるようになっており、これらのメモリのデータは、低速ジョブで利用できる。
【0103】
また、各先頭オフセットアドレス+8,+16,+24番地からは、各4ワードのメモリであり、4msジョブで利用するようになっている。これらの各メモリは、先頭に最新のA/D変換結果がストアされ、4msジョブのオーバーラップカウンタOLCの値に応じて順にシフトされ、先にストアしたデータから読出されるFIFOバッファとなっている。
【0104】
すなわち、A/D変換は、0.5ms毎の定期割込みにより4ms周期で正確に行なわれるが、4msジョブは優先度の高いジョブに邪魔されて遅れることがある。従って、A/D変換の受渡しにFIFOバッファを用い、4msジョブで+8,+16,+24番地の各FIFOバッファのデータを参照後、上記ステップS526で、各FIFOバッファのデータを順にシフトするのである。
【0105】
一方、上記ステップS520で、実行すべきジョブが4msジョブでなく、ラベルALJ30へ分岐したときには、ステップS530で、実行すべきジョブが10msジョブか否かを調べ、10msジョブのとき、ステップS531で、ジョブのワークエリアを設定し、ステップS532で、レベルゼロの割込みを許可すると、ステップS533で、10msジョブのセクションに移って、ジョブ本体を実行し、ステップS534で割込みを禁止してルーチンを抜ける。
【0106】
尚、上記10msジョブのセクションには、半回転時間からエンジン回転数を算出するサービスルーチン、前述した点火スケジュールを作成するサービスルーチンなどがOS側で用意されている。
【0107】
また、上記ステップS530で、実行すべきジョブが10msジョブでないときには、上記ステップS530からステップS540へ分岐し、実行すべきジョブが低優先クラセンジョブであるか否かを調べる。そして、低優先クラセンジョブでないときには、上記ステップS540からラベルALJ50へ分岐し、実行すべきジョブが低優先クラセンジョブのときは、上記ステップS540からステップS541へ進んで、現在の状態が多重待ち状態であるか否かを調べる。
【0108】
そして、現在の状態が多重待ち状態でないときには、上記ステップS541からステップS542へ進んで、システム変数S_ACAS(クランク総合位置)をユーザー変数ACASとしてステップS544へ進み、多重待ち状態のときには、上記ステップS541からステップS543へ分岐し、ユーザー変数ACASを一つ増やして12で割った剰余をとった後、ステップS544へ進む。
【0109】
ステップS544では、ジョブのワークエリアを設定し、ステップS545で、レベルゼロの割込みを許可すると、ステップS546で、低優先クラセンジョブのセクションに移り、ジョブ本体を実行した後、ステップS547で割込みを禁止し、ルーチンを抜ける。
【0110】
さらに、ラベルALJ50では、実行すべきジョブが50msジョブであるか否かを調べ、50msジョブのときには、ステップS551へ進んでジョブのワークエリアを設定し、ステップS552へ進む。
【0111】
ステップS552では、レベルゼロの割込みを許可すると、ステップS553で、50msジョブのセクションに移り、OS側で用意したエンストフラグ作成ルーチン、気筒別の点火時期リタードルーチン、燃料噴射開始時期設定ルーチンなどを実行し、また、ユーザ側の制御ストラテジーに基づくルーチンを実行する。そして、ジョブの終了後、ステップS554で割込みを禁止し、ルーチンを抜ける。
【0112】
一方、上記ステップS550で実行すべきジョブが50msジョブではないときには、上記ステップS550からステップS560へ分岐し、ジョブのワークエリアを設定すると、ステップS561で、レベルゼロの割込みを許可し、ステップS562へ進んで、250msジョブのセクション領域へ移行し、ジョブ本体を実行後、ステップS563で割込みを禁止してルーチンを抜ける。
【0113】
【発明の効果】
以上説明したように本発明によれば、各セクション領域を割当ててジョブの実行を管理する基本システムを、親ファイルに記録し、車両制御のための各種のジョブを、該ジョブ毎に上記セクション領域のうち関連するセクション領域名を宣言して、制御ストラテジー毎に複数のファイルに記録する。そして、基本システムにより各セクション領域の各々に、対応するセクション領域名のジョブを格納して、実行形式のファイルを作成し、複数ファイルのジョブを統合するので、親ファイルとリンクされて一つのファイルとなったとき、同じセクション領域に別々のファイルで同じセクション宣言されたジョブが集められ、各制御ストラテジーに基づく機能毎にファイルを分割してプログラムを開発することができると共に、プログラムの構造化記述が可能となる。また、各ストラテジーファイル中でジョブの追加、削除等の変更が生じても、親ファイルにおいて各ジョブをそれぞれのセクション領域で管理するため、従来のように親ファイルを書換える必要がなく、各制御ストラテジーそれぞれの開発に専念することができ、開発効率を向上することができて、最終的な車両制御システムを効率良く開発できる。
【図面の簡単な説明】
【図1】親ファイルとストラテジーファイルとの関係を示す説明図
【図2】0.5ms毎の定期割込み処理のフローチャート
【図3】クラセン割込み処理のフローチャート
【図4】ジョブ優先処理のフローチャート
【図5】ジョブ実行サブルーチンの部分フローチャート1
【図6】ジョブ実行サブルーチンの部分フローチャート2
【図7】ジョブ実行サブルーチンの部分フローチャート3
【図8】ジョブ実行サブルーチンの部分フローチャート4
【図9】ジョブの実行状態を示す説明図
【図10】ジョブフラグの説明図
【図11】クランク位置変数の説明図
【図12】ジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図
【図13】システムシフトバッファの説明図
【図14】エンジン系の概略構成図
【図15】クランクロータとクランク角センサの正面図
【図16】カムロータとカム角センサの正面図
【図17】電子制御系の回路構成図
【符号の説明】
50 ECU
OS オペレーティングシステム
【産業上の利用分野】
本発明は、複数のファイルに記録されたジョブを統合するジョブの統合方法に関する。
【0002】
【従来の技術】
近年、自動車などの車輌にマイクロコンピュータが導入されるようになり、エンジン、パワートレインなどを高精度に制御することが可能となった。これにより、車輌制御システムの開発においては、マイクロコンピュータのソフトウエア開発が大きな比重を占めるようになり、開発環境の効率化、開発期間の短縮化などが重要な課題となっている。
【0003】
このマイクロコンピュータによる車輌制御システムにおいては、例えば、エンジン制御における吸入空気量の算出、燃料噴射量の設定、点火時期の設定などといった各制御ストラテジーに基づく複数のジョブがあり、各制御ストラテジー毎に、変数、定数、マップ、初期値、各ジョブを記録したファイルを作成した後、これらの複数のファイルと、各ジョブの実行呼出し命令を記述した親ファイルとをリンクし、最終的にROM領域及びRAM領域に対する実アドレスが指定された実行形式のファイルを作成するようになっている。
【0004】
【発明が解決しようとする課題】
しかしながら、通常、制御システムの開発においては、仕様変更、バグ発生、改良などによる変更が頻繁に生じ、また、各制御ストラテジー毎に別々の人間によって並行して進められることが多く、各制御ストラテジー毎のファイル間で共通のジョブを使用することも多い。
【0005】
このため、各制御ストラテジー毎のファイルにおいてジョブの削除・追加などが生じると、その度に、親ファイルが書換えられることになり、互いに、どの段階の親ファイルを使用するかで混乱を招き、開発効率が低下する。
【0006】
さらに、ある制御ストラテジー側のファイルでジョブが削除されたにもかかわらず、親ファイルが書換えられないままになると、最終的に各ファイルをリンクしたときエラーとなり、原因究明のため、正常な他の制御ストラテジー側のファイルをも調べなければならなくなり、無駄な労力を費やすことになる。
【0007】
本発明は上記事情に鑑みてなされたもので、複数のファイルに記録されたジョブの統合を容易にし、最終的な車輌制御システムを効率良く開発することのできるジョブの統合方法を提供することを目的としている。
【0008】
【課題を解決するための手段】
上記目的を達成するため、請求項1記載の発明は、各セクション領域を割当ててジョブの実行を管理する基本システムを、親ファイルに記録し、車両制御のための各種のジョブを、該ジョブ毎に上記セクション領域のうち関連するセクション領域名を宣言して、制御ストラテジー毎に複数のファイルに記録し、上記基本システムにより上記各セクション領域の各々に、対応するセクション領域名のジョブを格納して、実行形式のファイルを作成し、上記複数ファイルのジョブを統合することを特徴とする。
【0009】
【作用】
本発明は、各セクション領域を割当ててジョブの実行を管理する基本システムを、親ファイルに記録し、車両制御のための各種のジョブを、該ジョブ毎に上記セクション領域のうち関連するセクション領域名を宣言して、制御ストラテジー毎に複数のファイルに記録する。そして、基本システムにより各セクション領域の各々に、対応するセクション領域名のジョブを格納して、実行形式のファイルを作成し、複数ファイルのジョブを統合する。
【0010】
【実施例】
以下、図面を参照して本発明の実施例を説明する。図面は本発明の一実施例に係り、図1は親ファイルとストラテジーファイルとの関係を示す説明図、図2は0.5ms毎の定期割込み処理のフローチャート、図3はクラセン割込み処理のフローチャート、図4はジョブ優先処理のフローチャート、図5はジョブ実行サブルーチンの部分フローチャート1、図6はジョブ実行サブルーチンの部分フローチャート2、図7はジョブ実行サブルーチンの部分フローチャート3、図8はジョブ実行サブルーチンの部分フローチャート4、図9はジョブの実行状態を示す説明図、図10はジョブフラグの説明図、図11はクランク位置変数の説明図、図12はジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図、図13はシステムシフトバッファの説明図、図14はエンジン系の概略構成図、図15はクランクロータとクランク角センサの正面図、図16はカムロータとカム角センサの正面図、図17は電子制御系の回路構成図である。
【0011】
本実施例における車輌制御システムは、図17に示すマイクロコンピュータを中核とした電子制御装置(ECU)50により、図14に示すエンジン系が制御されるエンジン制御システムであり、上記ECU50のマイクロコンピュータに基本システムとしての新しい概念に基づくオペレーティングシステム(OS)が搭載され、各センサ類からの信号入力処理、エンジン回転数算出処理、吸入空気量算出処理、燃料噴射量設定処理、点火時期設定処理などといった各項目毎のジョブが管理されて効率的に実行され、燃料噴射制御、点火時期制御などが行なわれるようになっている。
【0012】
まず、上記ECU50によって制御されるエンジン系の機器構成について説明すると、図14に示すように、エンジン1(図においては水平対向4気筒型エンジンを示す)は、シリンダヘッド2の吸気ポート2aにインテークマニホルド3が連通され、このインテークマニホルド3の上流にエアチャンバ4を介してスロットル通路5が連通されている。このスロットル通路5の上流側には、吸気管6を介してエアクリーナ7が取付けられ、このエアクリーナ7が吸入空気の取り入れ口であるエアインテークチャンバ8に連通されている。
【0013】
また、上記排気ポート2bにエキゾーストマニホルド9を介して排気管10が連通され、この排気管10に触媒コンバータ11が介装されてマフラ12に連通されている。一方、上記スロットル通路5にスロットルバルブ5aが設けられ、このスロットル通路5の直上流の上記吸気管6にインタークーラ13が介装され、さらに、上記吸気管6の上記エアクリーナ7の下流側にレゾネータチャンバ14が介装されている。
【0014】
また、上記レゾネータチャンバ14と上記インテークマニホルド3とを連通して上記スロットルバルブ5aの上流側と下流側とをバイパスするバイパス通路15に、アイドルスピードコントロールバルブ(ISCV)16が介装されている。さらに、このISCV16の直下流側に、吸気圧が負圧のとき開弁し、またターボチャージャ18によって過給されて吸気圧が正圧になったとき閉弁するチェックバルブ17が介装されている。
【0015】
上記ターボチャージャ18は、上記吸気管6の上記レゾネータチャンバ14の下流側にコンプレッサハウジングが介装され、タービンハウジングが上記排気管10に介装されている。さらに、上記ターボチャージャ18のタービンハウジング流入口には、ウエストゲート弁19が介装され、このウエストゲート弁19には、ウエストゲート弁作動用アクチュエータ20が連設されている。
【0016】
上記ウエストゲート弁作動用アクチュエータ20は、ダイヤフラムにより2室に仕切られ、一方がウエストゲート弁制御用デューティソレノイド弁21に連通される圧力室を形成し、他方が上記ウエストゲート弁19を閉方向に付勢するスプリングを収納したスプリング室を形成している。
【0017】
上記ウエストゲート弁制御用デューティソレノイド弁21は、上記レゾネータチャンバ14と上記吸気管6の上記ターボチャージャ18のコンプレッサハウジング下流とを連通する通路に介装されており、ECU50から出力される制御信号のデューティ比に応じて、上記レゾネータチャンバ14側の圧力と上記コンプレッサハウジング下流側の圧力とを調圧し、上記ウエストゲート弁作動用アクチュエータ20の圧力室に供給する。
【0018】
すなわち、上記ECU50によって上記ウエストゲート弁制御用デューティソレノイド弁21を制御し、上記ウエストゲート弁作動用アクチュエータ20を作動させて上記ウエストゲート弁19による排気ガスリリーフを調整することにより、上記ターボチャージャ18による過給圧を制御するようになっている。
【0019】
また、上記インテークマニホルド3に絶対圧センサ22が通路23を介して連通され、この通路23に、上記絶対圧センサ22と上記インテークマニホルド3あるいは大気とを選択的に連通する吸気管圧力/大気圧切換ソレノイド弁24が介装されている。
【0020】
さらに、上記インテークマニホルド3の各気筒の各吸気ポート2aの直上流側にインジェクタ25が臨まされ、また、上記シリンダヘッド2の各気筒毎に、その先端を燃焼室に露呈する点火プラグ26aが取付けられ、この点火プラグ26aに連設する点火コイル26bにイグナイタ27が接続されている。
【0021】
上記インジェクタ25には、燃料タンク28内に設けたインタンク式の燃料ポンプ29から燃料フィルタ30を経て燃料が圧送され、プレッシャレギュレータ31にて調圧される。
【0022】
また、上記吸気管6の上記エアークリーナ7の直下流に、ホットワイヤ式あるいはホットフィルム式などの吸入空気量センサ32が介装され、上記スロットルバルブ5aに、スロットル開度センサ33aとアイドルスイッチ33bとを内蔵したスロットルセンサ33が連設されている。
【0023】
さらに、上記エンジン1のシリンダブロック1aにノックセンサ34が取付けられるとともに、このシリンダブロック1aの左右両バンクを連通する冷却水通路35に冷却水温センサ36が臨まされ、上記排気管10の上記エキゾーストマニホルド9の集合部にO2 センサ37が臨まされている。
【0024】
また、上記シリンダブロック1aに支承されたクランクシャフト1bにクランクロータ38が軸着され、このクランクロータ38の外周に、電磁ピックアップなどからなるクランク角センサ39が対設されている。さらに、上記エンジン1のカムシャフト1cに連設するカムロータ40に、電磁ピックアップなどからなる気筒判別用のカム角センサ41が対設されている。尚、上記クランク角センサ39及び上記カム角センサ41は、電磁ピックアップなどの磁気センサに限らず、光センサなどでも良い。
【0025】
上記クランクロータ38は、図15に示すように、その外周に突起38a,38b,38cが形成され、これらの各突起38a,38b,38cが、各気筒(#1,#2と#3,#4)の圧縮上死点前(BTDC)θ1,θ2,θ3 の位置に形成されており、本実施例においては、θ1 =97°CA、θ2 =65°CA、θ3 =10°CAである。
【0026】
上記クランクロータ38の各突起は、上記クランク角センサ39によって検出され、BTDC97°,65°,10°のクランク角信号がエンジン1/2回転毎(180°CA毎)に出力される。そして、各信号の入力間隔時間がタイマによって計時され、エンジン回転数が算出される。
【0027】
尚、突起38bは、点火時期設定の際の基準クランク角となり、また、突起38cは、始動時噴射開始時期の基準クランク角となるとともに始動時の固定点火時期を示すクランク角となる。
【0028】
また、図16に示すように、上記カムロータ40の外周には、気筒判別用の突起40a,40b,40cが形成され、突起40aが#3,#4気筒の圧縮上死点後(ATDC)θ4 の位置に形成され、突起40bが3個の突起で構成されて最初の突起が#1気筒のATDCθ5 の位置に形成されている。さらに、突起40cが2個の突起で形成され、最初の突起が#2気筒のATDCθ6 の位置に形成されている。本実施例においては、θ4 =20°CA、θ5 =5°CA、θ6 =20°CAである。
【0029】
そして、上記カムロータ40の各突起が上記カム角センサ41によって検出され、各気筒の燃焼行程順を#1→#3→#2→#4とした場合、この燃焼行程順と、上記カム角センサ41の検出信号をカウンタによって計数した値とのパターンに基づいて、気筒判別がなされる。
【0030】
一方、図17に示すECU50は、燃料噴射制御、点火時期制御などを行なうメインコンピュータ51と、ノック検出処理を行なう専用のサブコンピュータ52との2つのコンピュータを中心として構成され、各部に所定の安定化電源を供給する定電圧回路53や各種の周辺回路が組込まれている。
【0031】
上記定電圧回路53は、ECUリレー54のリレー接点を介してバッテリ55に接続され、このバッテリ55に、上記ECUリレー54のリレーコイルがイグニッションスイッチ56を介して接続されている。また、上記バッテリ55には、上記定電圧回路53が直接接続され、さらに、燃料ポンプリレー57のリレー接点を介して燃料ポンプ29が接続されている。
【0032】
すなわち、上記定電圧回路53は、上記イグニッションスイッチ56がONされ、上記ECUリレー54のリレー接点が閉となったとき、制御用電源を供給し、また、上記イグニッションスイッチ56がOFFされたとき、バックアップ用の電源を供給する。
【0033】
上記メインコンピュータ51は、CPU58(以下、メインCPU58と称する)、ROM59、RAM60、上記イグニッションスイッチ56がOFFされたときにも上記定電圧回路53からバックアップ電源が供給されてデータを保持するバックアップRAM61、カウンタ・タイマ群62、シリアル通信インターフェースであるSCI63、及び、I/Oインターフェース64がバスライン65を介して接続されたマイクロコンピュータである。
【0034】
尚、上記カウンタ・タイマ群62は、フリーランカウンタ、カム角センサ(以下、適宜、カムセンと略記する)信号の入力計数用カムセンカウンタなどの各種カウンタ、燃料噴射タイマ、点火タイマ、後述する0.5ms毎の定期割込みを発生させるための定期割込みタイマ、クランク角センサ(以下、適宜、クラセンと略記する)信号の入力間隔計時用クラセンタイマ、及び、システム異常監視用のウオッチドッグタイマなどの各種タイマを便宜上総称するものであり、上記メインコンピュータ51においては、その他、各種のソフトウエアカウンタ・タイマが用いられる。
【0035】
また、上記サブコンピュータ52も、上記メインコンピュータ51と同様、CPU71(以下、サブCPU71と称する)、ROM72、RAM73、カウンタ・タイマ群74、SCI75、及び、I/Oインターフェース76がバスライン77を介して接続されたマイクロコンピュータであり、上記メインコンピュータ51とサブコンピュータ52とは、上記SCI63,75を介してシリアル通信ラインにより互いに接続されている。
【0036】
上記メインコンピュータ51のI/Oインターフェース64には、入力ポートに、吸入空気量センサ32、スロットル開度センサ33a、水温センサ36、O2 センサ37、絶対圧センサ22、車速センサ42、及び、バッテリ55が、8チャンネル入力のA/D変換器66を介して接続されるとともに、アイドルスイッチ33b、クランク角センサ39、カム角センサ41が接続されており、さらに、始動状態を検出するためにスタータスイッチ43が接続されている。
【0037】
尚、本実施例においては、上記A/D変換器66は、7チャンネル分の入力が使用され、残りの1チャンネルは予備となっている。
【0038】
また、上記I/Oインターフェース64の出力ポートには、イグナイタ27が接続され、さらに、駆動回路67を介して、ISCV16、インジェクタ25、燃料ポンプリレー57のリレーコイル、および、ウエストゲート弁制御用デューティソレノイド弁21、吸気管圧力/大気圧切換ソレノイド弁24が接続されている。
【0039】
一方、上記サブコンピュータ52のI/Oインターフェース76は、入力ポートに、クランク角センサ39、カム角センサ41が接続されるとともに、A/D変換器78、周波数フィルタ79、アンプ80を介してノックセンサ34が接続されており、上記ノックセンサ34からのノック検出信号が上記アンプ80で所定のレベルに増幅された後に上記周波数フィルタ79により必要な周波数成分が抽出され、上記A/D変換器78にてデジタル信号に変換されて入力されるようになっている。
【0040】
上記メインコンピュータ51では、各センサ類からの検出信号を処理し、燃料噴射パルス幅、点火時期などを演算する。すなわち、吸入空気量センサ32の出力信号から吸入空気量を算出し、RAM60及びバックアップRAM61に記憶されている各種データに基づき、吸入空気量に見合った燃料噴射量を演算し、また、点火時期などを算出する。
【0041】
そして、上記燃料噴射量に相応する駆動パルス幅信号を、駆動回路67を介して所定のタイミングで該当気筒のインジェクタ25に出力して燃料を噴射し、また、所定のタイミングでイグナイタ27に点火信号を出力し、該当気筒の点火プラグ26aを点火する。
【0042】
その結果、該当気筒に供給された混合気が爆発燃焼し、エキゾーストマニホルド9の集合部に臨まされたO2 センサ37により排気ガス中の酸素濃度が検出され、この検出信号が波形整形された後、上記メインCPU58で基準電圧(スライスレベル)と比較され、エンジンの空燃比状態が目標空燃比に対し、リッチ側にあるか、リーン側にあるかが判別され、空燃比が目標空燃比となるようフィードバック制御される。
【0043】
一方、上記サブコンピュータ52では、エンジン回転数とエンジン負荷とに基づいてノックセンサ34からの信号のサンプル区間を設定し、このサンプル区間でノックセンサ34からの信号を高速にA/D変換して振動波形を忠実にデジタルデータに変換し、ノック発生の有無を判定する。
【0044】
上記サブコンピュータ52のI/Oインターフェース76の出力ポートは、上記メインコンピュータ51のI/Oインターフェース64の入力ポートに接続されており、上記サブコンピュータ52でのノック判定結果がI/Oインターフェース76に出力される。そして、上記メインコンピュータ51では、上記サブコンピュータ52からノック発生有りの判定結果が出力されると、SCI63を介してシリアル通信ラインよりノックデータを読込み、このノックデータに基づいて直ちに該当気筒の点火時期を遅らせ、ノックを回避する。
【0045】
以上のエンジン制御システムは、アセンブラ言語などによって記述した上記OS本体の親ファイルに、同じくアセンブラ言語などによって記述した各制御ストラテジー毎のファイルをリンクして実行形式のマシン語ファイルを作成し、上記メインコンピュータ51のROM59に書込むことによって実現することができる。
【0046】
上記OSは、車輌制御のための各種マネジメント機能、及び、このマネジメント機能に密着した内部ストラテジーを有しており、各種ジョブを体系的に結合することができる。
【0047】
上記OSのマネジメント機能としては、
(1−1)ジョブの優先処理
(1ー2)セクション定義による各ジョブの分割ファイル対応
(1−3)スタックの使用状況モニタ機能
(1−4)異常割込み動作のモニタ機能
(1−5)ジョブ毎に固有の制約を作らない標準マップ・標準ワークメモリ設定
などの機能があり、制御ストラテジーの開発環境を向上させるとともに、限られたCPU能力を最大限に発揮させ、デジタル制御理論の基本である等時間間隔処理を可能な限り達成することができる。
【0048】
等時間間隔処理としては、0.5ms毎の定期割込みを基本として、2,4,10,50,250ms毎の5種類の等間隔割込みジョブが用意されており、また、エンジン回転に同期した処理として、クランク角信号入力により即割込み実行される高優先クラセンジョブ(以下、単にクラセンジョブと称する)と、より優先順位が高い他のジョブがないときにクランク角信号入力により割込み実行される比較的緊急度の低い低優先クラセンジョブとが用意されている。
【0049】
これらの各ジョブには、クラセンジョブ>2msジョブ>4msジョブ>10msジョブ>低優先クラセンジョブ>50msジョブ>250msジョブの順で、7〜1の優先レベルが高位側から低位側に向かって付けられており、図9に示すように、高速ジョブに対し低速ジョブが分割して処理されるとともに、各ジョブの多重待ち処理が行なわれる。
【0050】
また、上記OSの下で働く各プログラムは、機能別の管理領域すなわちセクション領域毎に順番に配列されており、各セクション領域には機能毎にセクション宣言によって名前が付けられている。各ストラテジーファイル側で使用する主なセクション領域は、
○変数宣言領域
○自己ファイル名、フィル制作時の自動記録領域
○セッティングデータ領域
○クラセンジョブ領域
○2msジョブ領域
○4msジョブ領域
○10msジョブ領域
○低優先クラセンジョブ領域
○50msジョブ領域
○250msジョブ領域
○リセット時初期化ジョブ領域
○エンスト時初期化ジョブ領域
○バックグランドジョブ領域
○プログラム本体の領域
である。
【0051】
すなわち、上記OS下で働く数々のストラテジーファイル(ユーザー側ファイル)をリンクして実行形式のファイルを作成するには、各処理毎にOSと同じ名前のセクション宣言を記述しておくことにより、OS本体の親ファイルとリンクされて最終的なファイルとなったとき、同じ処理は連続した1つの領域に集められ、OSと融合して一体となって処理される。
【0052】
例えば、図1に示すように、開発段階における各ソースファイルF1,F2,F3中で、初期値設定、2ms,4ms,10ms毎の処理、…,バックグランド処理などを、それぞれ、INIT,2ms,4ms,10ms,…,BGJとセクション宣言して各ジョブを記述することにより、親ファイルとリンクされて一つのマシン語ファイルとなったとき、初期値設定のセクション領域にはジョブD1,D2,D3、2msジョブのセクション領域にはジョブJ1,J5,J9、4msジョブのセクション領域にはジョブJ2,J6,J10、10msジョブのセクション領域にはジョブJ3,J7,J11、バックグランドジョブのセクション領域にはジョブJ4,J8,J12といったように、同じセクション領域に別々のファイルで同じセクション宣言がなされたジョブが集められる。
【0053】
従って、各制御ストラテジーに基づく機能毎にファイルを分割してプログラム開発が可能になるとともに、プログラムの構造化記述が可能となり、各ストラテジーファイル中でジョブの追加・削除等の変更が生じても、OS側で各ジョブをそれぞれの管理領域で管理するため、従来のように親ファイルを書換える必要がなく、各制御ストラテジーそれぞれの開発に専念することができ、開発効率を向上することができる。
【0054】
また、上記OSには、以上のマネジメント機能に密着した内部ストラテジーとして、
(2−1)A/D変換処理
(2−2)クランク位置に係る各種情報の算出
(2−3)デバッグ用シュミレーション機能(エンジン回転及びA/D変換)
(2−4)点火タイマのセット
(2−5)燃料噴射タイマのセット
などの機能を備えており、さらに、これらの機能に係る各種サービスルーチンが各ジョブ中に用意されている。
【0055】
従来、このような機能は各ジョブレベルで達成するようになっていたが、本システムにおいては、すべてOS側に用意され、OS側で処理したA/D変換結果、クランク位置情報、エンジン回転数などに基づいて、ユーザー側の各ジョブで、燃料噴射量、点火時期などを設定すると、これらの指示値がOSによって燃料噴射タイマ、点火タイマにセットされるようになっている。
【0056】
次に、上記メインコンピュータ51におけるジョブ処理の機能を、図2〜図8のフローチャートに基づいて説明する。尚、サブコンピュータ52はノック検出処理専用のコンピュータであるため、その動作説明を省略する。
【0057】
まず、イグニッションスイッチ56がONされてシステムに電源が投入されると、リセットに伴うリセット割込みが起動し、各種イニシャライズが行なわれるとともに、0.5ms毎に定期割込みを起動するための定期割込みタイマが起動され、クランク角センサ39からの信号入力毎(BTDC97°,65°,10°CA毎のエンジン1回転に6回)に起動されるクラセン割込みが許可され、その後、バックグランドジョブの実行状態となる。
【0058】
そして、このバックグランドジョブの上で、0.5ms毎の定期割込みと、エンジン1回転に6回のクラセン割込みとにより、7レベルのジョブが優先処理される。この2つの割込みにおいては、各自の処理を実行後、共通のアドレスにジャンプし、ジョブ優先処理を実行する。
【0059】
尚、上記リセット割込みは、内部演算において0による除算を実行した場合や、無限ループが発生した場合など、正常時には発生しない要因によっても、起動される。
【0060】
まず、図2に示す0.5ms毎の定期割込みについて説明する。この定期割込みでは、ステップS100で、OS用ワークエリアを設定し、ステップS101で、ウオッチドッグタイマを初期化すると、ステップS102へ進んで、P−RUNフラグを20回に1回すなわち10ms毎に反転する。このP−RUNフラグは、図示しない保護回路によってシステムが自動的にリセットされないようにするためのフラグであり、システムが正常に動作して一定時間毎(10ms毎)に反転される限り、上記保護回路の作動が阻止される。
【0061】
次いで、ステップS103へ進み、スイッチ出力の転写を行なう。このスイッチ出力は、各ジョブ中でメモリに書き込んだビットのON,OFF値であり、各ジョブからは直接I/Oインターフェース64の出力ポートに出力せず、OS側で0.5ms毎にメモリの値を出力ポートに転写する。
【0062】
次に、ステップS104へ進むと、A/D変換サブルーチンを実行してA/D変換に係る各種設定を行ない、ステップS105で、2,4,10,50,250ms毎の各ジョブ割込み要求を示すジョブフラグJB_FLGを作成した後、ステップS106で、A/D変換をスタートする。
【0063】
上記A/D変換は、基本的に、A/D変換器66の8チャンネル入力が0.5ms毎に所定の変換順番毎に処理され、4ms周期で全入力の変換が行なわれる。但し、特定の1つのチャンネルは、回転脈動が発生する吸入管圧力などをA/D変換するためクランク角90°毎に(0.5msの時間精度で)同期し、変換順番に対して割込んだ形で処理が行なわれ、その後の入力の順番を1つ遅れにする。
【0064】
尚、エンジン回転数3750rpm以上では、A/D変換の最後の順番の入力が完全に停止し、7500rpm以上では、最後から2番目の入力も停止するが、A/D変換の順番は、スロットル開度、吸入空気量など変化の速いものを先として、冷却水温、電圧など比較的変化の遅いものが後になるように設定してあり、且つ、最後のA/D変換順番をクランク同期入力に設定してあるため、特に支障は生じない。
【0065】
また、図10に示すように、上記ジョブフラグJB_FLGは、1バイト変数の各ビットを各ジョブに対応するフラグとして割当てたものであり、複数のジョブ要求が同時に可能なようになっている。この1バイト変数のビット1〜ビット7は優先レベル1〜7に対応し、それぞれ、250msジョブ、50msジョブ、低優先クラセンジョブ、10msジョブ、4msジョブ、2msジョブ、クラセンジョブのフラグに割当てられている。そして、所定のビットが立てられたとき、対応する優先レベルのジョブ割込み要求がなされる。尚、ビット0はバックグランドジョブのフラグに割当てられて通常は参照されない。
【0066】
次に、上記ステップS105でジョブフラグ作成サブルーチンによりジョブフラグJB_FLGを作成し、ステップS106でA/D変換をスタートした後は、ステップS107へ進み、ジョブフラグJB_FLGのいずれかのジョブに対応するビットが立っているか否かを調べる。
【0067】
その結果、上記ステップS107で、ジョブフラグJB_FLGのビットが一つも立っていないときには、どのジョブからも要求がないため割込みを終了し、ジョブフラグJB_FLGのいずれかのビットが立っているときには、ステップS108へ進んで、現状レベル(この定期割込みが実行される時点で所定の優先レベルのジョブが実行されていた状態)以下のフラグがないか否かを調べる。
【0068】
上記ステップS108で、現状レベル以下のフラグがないときには、ラベルWAR_JBで示される図4のジョブ優先処理にジャンプし、現状レベル以下のフラグがあるときには、ステップS109で、現状レベル以下のレベルのオーバーラップカウンタOLCを1増加させる。
【0069】
上記オーバーラップカウンタOLCは、ジョブ要求を記憶するためのカウンタであり、各優先レベル毎に1バイト割当てられ、上記ジョブフラグJB_FLGによるジョブ要求時にインクリメント、ジョブ終了時にデクリメントされる。すなわち、カウンタによってジョブ要求を記憶することによりジョブの多重要求に対応することができるのである。
【0070】
次いで、上記ステップS109からステップS110へ進み、現状レベルより高いフラグがないか否かを調べ、現状レベルより高いフラグがないときには、ルーチンを抜けて割込みを終了し、現状レベルより高いフラグがあるときには、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0071】
一方、この0.5ms毎の定期割込みに対し、図3のクラセンによる割込みでは、ステップS200で、OS用ワークエリアを設定すると、ステップS201で、クランク位置・半回転時間算出のサブルーチンを実行し、現在のクランク位置を判別するためのクランク位置変数、及び、最新の3つのクラセン間隔の和である半回転時間を算出する。
【0072】
上記クランク位置変数は、OS中で用意されるシステム変数であり、図11に示すように、#1〜#4気筒に対するクランク位置を、97°,65°,10°CAによって12の状態に区分し、現在のクランク位置を表わす。
【0073】
すなわち、各気筒毎に、0,1,2の数値でクラセン入力順を示すクラセン順序S_CCAS、#1気筒を0、#3気筒を1、#2気筒を2、#4気筒を3として気筒の燃焼順を示す気筒順序S_RCAS、及び、0〜11の数値でクラセン順序及び気筒順序を総合的に表わす総合位置S_ACASの3変数によって現在のクランク位置を表わし、さらに、クランク位置が確証をもって正常に判別されたときを0、判別結果がつじつまが合わず不安の残る推定状態を1、不明な状態を2とするエラーレベルS_ECASにより、クランク位置の判別状況を表わすようになっている。
【0074】
次いで、上記ステップS201からステップS202へ進むと、クランク位置・半回転時間算出のサブルーチンにおいてクランク位置判定が正常に終了したかあるいは判定不能であったかを、アキュムレータAにストアされているコードを読み出すことにより調べる(エラーコード1、正常終了コード0)。
【0075】
そして、上記ステップS202で、アキュムレータAの値が1であり、クランク位置が判定不能であったときには、割込みを終了し、アキュムレータAの値が0であり、クランク位置が正常に判定されているときには、ステップS203へ進み、エンストフラグを解除する。
【0076】
尚、上記エンストフラグは、クラセン間隔計測タイマがO.5sec以上の時間(約30rpm以下)を計測したときセットされてエンジンがエンスト状態であることを示すフラグであり、このクラセン割込みによりクリアされ、エンスト状態が解除される。
【0077】
次に、ステップS204へ進むと、点火タイマセットのサブルーチンを実行し、ユーザージョブ側で設定した点火時期の指示値に基づいて作成された点火スケジュールに従って点火タイマをセットする。この点火スケジュールは、ドエル開始時期、ドエルオン待ち時間、ドエルオフ待ち時間などをメンバーとする構造体変数であり、10msジョブ中に作成ルーチンが用意され、この点火スケジュールに従って点火シーケンスが決定される。
【0078】
次いで、スップS205で、燃料噴射タイマセットのサブルーチンを実行し、ユーザージョブ側で設定した燃料噴射量の指示値(各気筒毎の噴射幅)に対し、燃料噴射開始時期などを燃料噴射タイマにセットしてステップS206へ進む。
【0079】
ステップS206では、このクラセンが実行された現状のジョブレベルが自身のジョブレベルであるか否かを判別し、現状がクラセンジョブ自身のレベルであるときには、ステップS207、S208で、クラセンジョブ、低優先クラセンジョブのオーバーラップカウンタOLCを、それぞれ1増加させて割込みを終了し、現状のジョブレベルがクラセンジョブのレベルでないときには、ステップS209で、現状のジョブレベルが低優先クラセンジョブのレベル以上であるか否かを調べる。
【0080】
そして、現状のジョブレベルが低優先クラセンジョブ以上であるときには、上記ステップS209からステップS210へ進んで、低優先クラセンジョブのオーバーラップカウンタOLCを1増加させると、ステップS211で、クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0081】
一方、上記ステップS209で、現状のジョブレベルが低優先クラセンジョブ以上でないときには、上記ステップS209からステップS212へ進み、クラセンジョブのジョブフラグをセットすると、ステップS213で、低優先クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0082】
このジョブ優先処理では、ステップS300で、ジョブの優先レベルを示す1バイト変数であるジョブレベルJB_LEVを1つ上げると、ステップS301へ進んで、この優先レベルに対応するジョブフラグが立っていないか調べる。そして、ジョブフラグが立っていないときには、ステップS300へ戻ってさらにジョブレベルJB_LEVを1つ上げ、ジョブフラグが立っているときには、ステップS302へ進み、ジョブフラグの立っているジョブのオーバーラップカウンタOLCを初期値の0から1にし、ステップS303へ進む。
【0083】
ステップS303では、より上のジョブフラグがあるか否かを調べ、より上のジョブがあるときには、ステップS300へ戻って前述の処理を繰り返し、より上のジョブがないときには、ステップS304へ進んで、ジョブ実行中フラグJB_RUNをセットすると、ステップS305で、後述するジョブ実行サブルーチンにより最上位のジョブを実行する。
【0084】
上記ジョブ実行中フラグJB_RUNは、ジョブの実行開始時にセットされ、終了時にクリアされるフラグであり、このフラグにより、処理の途中で、より優先度の高いジョブによって割込まれたジョブを識別することができる。
【0085】
例えば、図12に示すように、JB_LEV=4の10msジョブを実行中、JB_LEV=6の2msジョブの割込み要求がなされると、10msジョブの処理が中断され、より優先度の高い2msジョブが、JB_RUN=1、OLC=1にセットされ、実行される。そして、この2msジョブの処理中に、JB_LEV=5の4msジョブの割込み要求が発生すると、この4msジョブは、JB_RUN=0、OLC=1とされて割込みが受付けられるが、実行はされず待機状態となる。
【0086】
その後、ジョブ実行サブルーチンによるジョブの実行が終了すると、上記ステップS305からステップS306へ進んでオーバーラップカウンタOLCを1減らし、ステップS307で、オーバーラップカウンタOLCがゼロになったか否かを調べる。その結果、オーバラップカウンタOLCがゼロになっておらず、同じ優先レベルでジョブ割込み要求が複数回あるときには、ステップS305へ戻ってジョブを繰返し実行し、オーバラップカウンタOLCがゼロになったとき、ステップS307からステップS308へ進んで、ジョブ実行中フラグJB_RUNをクリアする。
【0087】
次に、ステップS309へ進み、ジョブレベルJB_LEVを1つ下げて次のジョブレベルに移ると、ステップS310で、このジョブレベルJB_LEVがゼロになったか否かを調べる。そして、ジョブレベルJB_LEVがゼロのときには、この割込みを終了し、ジョブレベルJB_LEVがゼロでないときには、ステップS311へ進んで、オーバーラップカウンタOLCがゼロか否かを調べる。
【0088】
上記ステップS311で、オーバーラップカウンタOLCがゼロのときには、このレベルではジョブ要求はないため、上記ステップS311からステップS309へ戻って、ジョブレベルJB_LEVをさらに1つ下げて同様の処理を繰返し、オーバーラップカウンタOLCがゼロでないときには、ステップS312へ進んで、このジョブレベルにおいて、ジョブ実行中フラグJB_RUNがセットされているか否かを調べる。
【0089】
上記ステップS312で、ジョブ実行中フラグJB_RUNがセットされているときには、割込み前にジョブを実行中であったため、割込みを終了して割込み前のジョブへ戻り、ジョブ実行中フラグJB_RUNがセットされていなければ、ステップS304へ戻って、このレベルのジョブを実行し、同様の処理を繰返す。
【0090】
すなわち、図12において、JB_LEV=6の2msジョブが終了し、OLC=0、JB_RUN=0になると、ジョブレベルが1つ下げられ、JB_LEV=5の4msジョブが、JB_RUN=0、OLC=1の待機状態からJB_RUN=1にセットされ、実行される。さらに、4msジョブが終了すると、JB_LEV=4に移り、JB_RUN=1(ジョブ実行中)の状態から、2msジョブ及び4msジョブによって中断されていた10msジョブの処理が再開される。
【0091】
このように、0.5ms毎の定期割込み、クラセン割込みを基本タイミングとして、各ジョブの優先レベル及び実行タイミングを知らせるジョブフラグJB_FLGを作成するため、可能な限り正確に、等時間間隔処理、エンジン回転同期処理を実現し、各ジョブを効率良く処理することができる。さらに、基本タイミングとなる各割込み毎に更新されるジョブフラグJB_FLGによらず、オーバーラップカウンタOLCによってジョブの多重要求を記憶するため、あるジョブの処理時間が長引き、再度、同じジョブを実行すべきタイミングとなった場合においても、処理を途中で放棄することなく、可能な限り最後まで処理を継続することができる。
【0092】
次に、図5〜図8のジョブ実行サブルーチンについて説明する。
まず、ステップS500で、ジョブフラグJB_FLGを参照して実行すべきジョブがクラセンジョブでないか否かを調べ、クラセンジョブでないときには、ラベルALJ10へ分岐し、クラセンジョブのときには、ステップS501へ進んで、気筒判別がついているか否かを調べる。
【0093】
そして、気筒判別がついていないときには、そのままルーチンを抜けてジョブを実行せず、気筒判別がついているとき、上記ステップS501からステップS502へ進んで、オーバーラップカウンタOLCの値を参照して多重待ち状態であるか否かを調べる。
【0094】
上記ステップS502では、多重待ち状態でないとき、ステップS503へ進んで、クラセン割込み毎に算出されるシステム変数S_ACAS(クランク総合位置)をユーザー変数ACASとし、一方、多重待ち状態のときには、ステップS504へ分岐し、ユーザー変数ACASを一つ増やして12で割った剰余をとって新たなユーザー変数ACASとし、このユーザー変数ACASを0,1,2,…,11,0,1,…とソフトウエア的に更新してゆく。
【0095】
すなわち、クラセンジョブ及び低優先クラセンジョブは、自身または優先度の高いジョブに邪魔されて遅れることがあるが、クラセン割込みは正確にクランク角センサ信号に同期して実行され、システム変数S_ACASはジョブの遅れに関係なく更新される。
【0096】
従って、ジョブ中でシステム変数S_ACASを参照してクランク位置を知り、このクランク位置に応じた仕事を行なおうとしても、自身が他のジョブに邪魔されて遅れた場合には、自身の仕事に対応したクランク位置を知ることができなくなる。このため、クラセンジョブ及び低優先クラセンジョブ中では、多重待ち状態でないときにOS用のシステム変数S_ACASをユーザー用変数ACASとして取込み、このユーザー変数ACASをジョブ実行毎に更新して多重要求の場合にもクランク位置に対応した適正な処理がなされるようにするのである。
【0097】
その後、上記ステップS503あるいは上記ステップS504からステップS505へ進み、ジョブのワークエリアを設定すると、ステップS506で、レベルゼロの割込みを許可し、ステップS507で、クラセンジョブのセクションに移る。そして、このクラセンジョブセクションにリンクされた処理を実行し、ステップS508で、割込みを禁止してルーチンを抜ける。
【0098】
次に、ステップS500で、これから実行すべきジョブがクラセンジョブでないときには、ラベルALJ10のステップS510で、2msジョブでないか否か調べ、2msジョブのとき、ステップS511で、ジョブのワークエリアを設定すると、ステップS512で、レベルゼロの割込みを許可し、ステップS513で、2msジョブのセクションに移る。そして、このセクションにリンクされているジョブ本体(ユーザー側の制御ストラテジーに基づくルーチン、あるいは、OS側で用意したサービスルーチン)を実行し、ステップS514で、割込みを禁止してルーチンを抜ける。
【0099】
一方、上記ステップ510で、実行すべきジョブが2msジョブでないときには、ステップS510からステップS520へ分岐し、実行すべきジョブが4msジョブか否かを調べる。そして、4msジョブでないときには、ラベルALJ30へ分岐し、4msジョブのときには、ステップS521で、ジョブのワークエリアを設定すると、ステップS522へ進む。尚、この4msジョブは、A/D変換利用ジョブであり、後述するシステムシフトバッファSSHBを介してA/D変換データを利用する。
【0100】
ステップS522では、レベルゼロの割込みを許可し、次いで、ステップS523へ進むと、スイッチ入力を読み込み、ステップS524で、4msジョブのセクションに移って、リンクされているジョブ本体を実行する。その後、4msジョブのセクションから抜けると、ステップS525で、割込みを禁止し、ステップS526へ進んで、システムシフトバッファSSHBをシフトしてルーチンを抜ける。
【0101】
上記システムシフトバッファSSHBは、図13に示すように、8チャンネルの各A/D変換結果がストアされる先頭オフセットアドレス0,+8,+16,+24,+32,+34,+36,+38番の各メモリ、及び、4ms毎のクランク同期のA/D変換結果がストアされる先頭オフセットアドレス−2番地の1ワードのメモリからなり、0.5ms毎に実行される1回のA/D変換結果が1ワード(2バイト)でストアされる。
【0102】
先頭オフセットアドレス0番地からは、4段のシフトメモリとなっており、90°CA毎のA/D変換結果がストアされ、最新4データ(1回転分)をジョブから参照することができる。また、先頭オフセットアドレス+32,+34,+36,+38番地は、各1ワードのメモリであり、なまし処理機能が選択されたとき、A/D変換結果を加重平均した値がストアされてノイズ除去と精度向上を図ることができるようになっており、これらのメモリのデータは、低速ジョブで利用できる。
【0103】
また、各先頭オフセットアドレス+8,+16,+24番地からは、各4ワードのメモリであり、4msジョブで利用するようになっている。これらの各メモリは、先頭に最新のA/D変換結果がストアされ、4msジョブのオーバーラップカウンタOLCの値に応じて順にシフトされ、先にストアしたデータから読出されるFIFOバッファとなっている。
【0104】
すなわち、A/D変換は、0.5ms毎の定期割込みにより4ms周期で正確に行なわれるが、4msジョブは優先度の高いジョブに邪魔されて遅れることがある。従って、A/D変換の受渡しにFIFOバッファを用い、4msジョブで+8,+16,+24番地の各FIFOバッファのデータを参照後、上記ステップS526で、各FIFOバッファのデータを順にシフトするのである。
【0105】
一方、上記ステップS520で、実行すべきジョブが4msジョブでなく、ラベルALJ30へ分岐したときには、ステップS530で、実行すべきジョブが10msジョブか否かを調べ、10msジョブのとき、ステップS531で、ジョブのワークエリアを設定し、ステップS532で、レベルゼロの割込みを許可すると、ステップS533で、10msジョブのセクションに移って、ジョブ本体を実行し、ステップS534で割込みを禁止してルーチンを抜ける。
【0106】
尚、上記10msジョブのセクションには、半回転時間からエンジン回転数を算出するサービスルーチン、前述した点火スケジュールを作成するサービスルーチンなどがOS側で用意されている。
【0107】
また、上記ステップS530で、実行すべきジョブが10msジョブでないときには、上記ステップS530からステップS540へ分岐し、実行すべきジョブが低優先クラセンジョブであるか否かを調べる。そして、低優先クラセンジョブでないときには、上記ステップS540からラベルALJ50へ分岐し、実行すべきジョブが低優先クラセンジョブのときは、上記ステップS540からステップS541へ進んで、現在の状態が多重待ち状態であるか否かを調べる。
【0108】
そして、現在の状態が多重待ち状態でないときには、上記ステップS541からステップS542へ進んで、システム変数S_ACAS(クランク総合位置)をユーザー変数ACASとしてステップS544へ進み、多重待ち状態のときには、上記ステップS541からステップS543へ分岐し、ユーザー変数ACASを一つ増やして12で割った剰余をとった後、ステップS544へ進む。
【0109】
ステップS544では、ジョブのワークエリアを設定し、ステップS545で、レベルゼロの割込みを許可すると、ステップS546で、低優先クラセンジョブのセクションに移り、ジョブ本体を実行した後、ステップS547で割込みを禁止し、ルーチンを抜ける。
【0110】
さらに、ラベルALJ50では、実行すべきジョブが50msジョブであるか否かを調べ、50msジョブのときには、ステップS551へ進んでジョブのワークエリアを設定し、ステップS552へ進む。
【0111】
ステップS552では、レベルゼロの割込みを許可すると、ステップS553で、50msジョブのセクションに移り、OS側で用意したエンストフラグ作成ルーチン、気筒別の点火時期リタードルーチン、燃料噴射開始時期設定ルーチンなどを実行し、また、ユーザ側の制御ストラテジーに基づくルーチンを実行する。そして、ジョブの終了後、ステップS554で割込みを禁止し、ルーチンを抜ける。
【0112】
一方、上記ステップS550で実行すべきジョブが50msジョブではないときには、上記ステップS550からステップS560へ分岐し、ジョブのワークエリアを設定すると、ステップS561で、レベルゼロの割込みを許可し、ステップS562へ進んで、250msジョブのセクション領域へ移行し、ジョブ本体を実行後、ステップS563で割込みを禁止してルーチンを抜ける。
【0113】
【発明の効果】
以上説明したように本発明によれば、各セクション領域を割当ててジョブの実行を管理する基本システムを、親ファイルに記録し、車両制御のための各種のジョブを、該ジョブ毎に上記セクション領域のうち関連するセクション領域名を宣言して、制御ストラテジー毎に複数のファイルに記録する。そして、基本システムにより各セクション領域の各々に、対応するセクション領域名のジョブを格納して、実行形式のファイルを作成し、複数ファイルのジョブを統合するので、親ファイルとリンクされて一つのファイルとなったとき、同じセクション領域に別々のファイルで同じセクション宣言されたジョブが集められ、各制御ストラテジーに基づく機能毎にファイルを分割してプログラムを開発することができると共に、プログラムの構造化記述が可能となる。また、各ストラテジーファイル中でジョブの追加、削除等の変更が生じても、親ファイルにおいて各ジョブをそれぞれのセクション領域で管理するため、従来のように親ファイルを書換える必要がなく、各制御ストラテジーそれぞれの開発に専念することができ、開発効率を向上することができて、最終的な車両制御システムを効率良く開発できる。
【図面の簡単な説明】
【図1】親ファイルとストラテジーファイルとの関係を示す説明図
【図2】0.5ms毎の定期割込み処理のフローチャート
【図3】クラセン割込み処理のフローチャート
【図4】ジョブ優先処理のフローチャート
【図5】ジョブ実行サブルーチンの部分フローチャート1
【図6】ジョブ実行サブルーチンの部分フローチャート2
【図7】ジョブ実行サブルーチンの部分フローチャート3
【図8】ジョブ実行サブルーチンの部分フローチャート4
【図9】ジョブの実行状態を示す説明図
【図10】ジョブフラグの説明図
【図11】クランク位置変数の説明図
【図12】ジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図
【図13】システムシフトバッファの説明図
【図14】エンジン系の概略構成図
【図15】クランクロータとクランク角センサの正面図
【図16】カムロータとカム角センサの正面図
【図17】電子制御系の回路構成図
【符号の説明】
50 ECU
OS オペレーティングシステム
Claims (1)
- 各セクション領域を割当ててジョブの実行を管理する基本システムを、親ファイルに記録し、
車両制御のための各種のジョブを、該ジョブ毎に上記セクション領域のうち関連するセクション領域名を宣言して、制御ストラテジー毎に複数のファイルに記録し、
上記基本システムにより上記各セクション領域の各々に、対応するセクション領域名のジョブを格納して、実行形式のファイルを作成し、上記複数ファイルのジョブを統合することを特徴とするジョブの統合方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP00211393A JP3617847B2 (ja) | 1993-01-08 | 1993-01-08 | ジョブの統合方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP00211393A JP3617847B2 (ja) | 1993-01-08 | 1993-01-08 | ジョブの統合方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH06200821A JPH06200821A (ja) | 1994-07-19 |
JP3617847B2 true JP3617847B2 (ja) | 2005-02-09 |
Family
ID=11520301
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP00211393A Expired - Fee Related JP3617847B2 (ja) | 1993-01-08 | 1993-01-08 | ジョブの統合方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3617847B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3343509B2 (ja) * | 1998-05-06 | 2002-11-11 | 株式会社日立製作所 | 空気流量計測装置 |
-
1993
- 1993-01-08 JP JP00211393A patent/JP3617847B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH06200821A (ja) | 1994-07-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP0908613B1 (en) | Engine exhaust gas control system having NOx catalyst | |
JP3617847B2 (ja) | ジョブの統合方法 | |
US4690122A (en) | Ignition control system for internal combustion engines | |
JP3645576B2 (ja) | エンジンの回転時間算出方法 | |
JP3337149B2 (ja) | エンジンのクランク位置判別方法 | |
JP3442806B2 (ja) | ジョブの優先処理方法 | |
JP3324818B2 (ja) | エンジンのクランク位置情報利用方法 | |
JP3555689B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JPH06200819A (ja) | マイクロコンピュータのワークエリアの設定方法 | |
JP3455243B2 (ja) | アナログ/デジタル変換結果の利用方法 | |
JP3294366B2 (ja) | エンジンの点火制御における点火コイルの通電状態判別方法 | |
JP3442807B2 (ja) | エンジン回転のシミュレーション方法 | |
JP3294365B2 (ja) | エンジンの点火制御方法 | |
JP3530549B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JP3384498B2 (ja) | エンジンの点火制御における処理遅れ解消方法 | |
JPH06249054A (ja) | 車輌制御用コンピュータにおけるスイッチ入力データの読込み方法 | |
JPH06249053A (ja) | アナログ/デジタル変換方法 | |
JP3331237B2 (ja) | 多気筒エンジンの気筒別噴射開始区間設定方法 | |
JPH06257500A (ja) | エンジン運転状態の把握方法 | |
JP3530551B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JPH06257501A (ja) | エンジンの半回転時間推定方法 | |
JPH06257502A (ja) | エンジン回転数の算出方法 | |
JP3530550B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JPH07103052A (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JPH06272651A (ja) | エンジンの点火制御における通電シーケンスの設定方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20041105 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |