JP2012226445A - 情報処理装置及びプログラム - Google Patents
情報処理装置及びプログラム Download PDFInfo
- Publication number
- JP2012226445A JP2012226445A JP2011091470A JP2011091470A JP2012226445A JP 2012226445 A JP2012226445 A JP 2012226445A JP 2011091470 A JP2011091470 A JP 2011091470A JP 2011091470 A JP2011091470 A JP 2011091470A JP 2012226445 A JP2012226445 A JP 2012226445A
- Authority
- JP
- Japan
- Prior art keywords
- cpu
- simulator
- target
- timer
- simulation
- 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.)
- Withdrawn
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
【課題】複数のCPUシミュレータ間の切り替えを迅速に行うことができる情報処理装置を提供する。
【解決手段】情報処理装置は、ターゲットコードを実行するターゲットCPUの動作を模擬する複数のCPUシミュレータ101、104と、ターゲットCPUの制御対象装置の動作を模擬する装置シミュレータ103と、ターゲットCPUで動作するオペレーティングシステムの動作を模擬し、装置シミュレータ103の模擬動作に応じて、複数のCPUシミュレータ101、104からターゲットCPUの模擬動作を行わせるCPUシミュレータを選択する管理部102と、を備えており、管理部102は、選択したCPUシミュレータへの切り替えを、オペレーティングシステムへのシステムコールが発生したタイミングで行う。
【選択図】図1
【解決手段】情報処理装置は、ターゲットコードを実行するターゲットCPUの動作を模擬する複数のCPUシミュレータ101、104と、ターゲットCPUの制御対象装置の動作を模擬する装置シミュレータ103と、ターゲットCPUで動作するオペレーティングシステムの動作を模擬し、装置シミュレータ103の模擬動作に応じて、複数のCPUシミュレータ101、104からターゲットCPUの模擬動作を行わせるCPUシミュレータを選択する管理部102と、を備えており、管理部102は、選択したCPUシミュレータへの切り替えを、オペレーティングシステムへのシステムコールが発生したタイミングで行う。
【選択図】図1
Description
本発明は、装置への組込みソフトウェアの検証をコンピュータ上で行うためのシミュレーション技術に関する。
装置への組込みソフトウェア(ターゲットコード)の検証のため、コンピュータ上でのシミュレーションが用いられている。コンピュータによるシミュレーションは、システム開発時におけるシステム構成の妥当性確認、実行速度の見積にも用いられる。さらに、システム開発完了後においては、システム利用者のための操作・運用訓練などにも用いられる。以下、シミュレーションを実行するコンピュータをホストPCと呼ぶ。
検証対象のターゲットコードをターゲットCPUの命令セット・アーキテクチャ(ISA)レベルでシミュレーションする必要がある場合、CPUシミュレータは、構成要素として命令セット・シミュレータ(ISS)を通常備えている。なお、ターゲットCPUとは、検証対象の装置に組み込まれており、ターゲットコードを実行して、検証対象の装置を制御するCPUである。しかしながら、ISSは、ターゲットコードの1命令を実行するために、ホストPCの複数の命令を実行する必要があるためシミュレーション速度の低下が問題となる。
そこで、特許文献1は、ターゲットコードの検証を総てISSで実行するのではなく、ホストネイティブでのシミュレーションと、ISSでのシミュレーションを切り替えて動作させる構成を開示している。特許文献1によると、ホストネイティブでは実行できないハードウェアに密接したシミュレーションをISSで実行している。なお、ホストネイティブでのシミュレーションとは、ターゲットコードをホストPCの機械語命令に変換して実行するシミュレーションである。
ネイティブシミュレータによる模擬動作の進行は、模擬時間とは無関係である。ここで、模擬時間とは、ターゲットCPU及びターゲットCPUの制御対象装置での模擬動作に応じて進行している時間を意味する。つまり、例えば、ターゲットCPUの制御対象装置の動作を模擬する装置シミュレータが、制御対象装置のAミリ秒間の動作を模擬したとすると、この模擬動作に実際にかかった時間に拘わらず、Aミリ秒が模擬時間である。
ネイティブシミュレータは、この模擬時間を認識しないため、ネイティブシミュレータによる模擬動作は、制御対象装置の動作を模擬する装置シミュレータにおける模擬時間とは非同期になる。このため、プログラム命令の実行量に基づき制御対象装置の動作を制御するような処理については、ネイティブシミュレータを使用することはできない。なお、プログラム命令の実行量に基づく制御とは、ラウンドロビン処理の様な、ターゲットCPUの速度に依存して制御間隔を管理しているような処理である。
よって、例えば、プログラム命令の実行量により制御を行う処理については、CPUシミュレータとしてISSを使用し、それ以外の場合には、ネイティブシミュレータを使用してシミュレーションを行うことを考えることができる。しかしながら、ネイティブシミュレータとISSの切り替えには、CPUシミュレータ間において以下の情報の受け渡しを行う必要がある。
・記憶部(RAM)情報
・プログラムカウンタ情報
・CPUレジスタ情報
・周辺回路情報
・割り込み情報
CPUシミュレータの切り替え時に、上記総ての情報の受け渡しをCPUシミュレータ間で行うと、切り替え時の処理負荷が大きくなる。これは、切り替え時間が長くなることを意味し、よって、シミュレーション効率が低下することになる。
・記憶部(RAM)情報
・プログラムカウンタ情報
・CPUレジスタ情報
・周辺回路情報
・割り込み情報
CPUシミュレータの切り替え時に、上記総ての情報の受け渡しをCPUシミュレータ間で行うと、切り替え時の処理負荷が大きくなる。これは、切り替え時間が長くなることを意味し、よって、シミュレーション効率が低下することになる。
本発明は、複数のCPUシミュレータ間の切り替えを迅速に行うことができる情報処理装置を提供するものである。
本発明による情報処理装置は、ターゲットコードを実行するターゲットCPUの動作を模擬する複数のCPUシミュレータと、ターゲットCPUの制御対象装置の動作を模擬する装置シミュレータと、ターゲットCPUで動作するオペレーティングシステムの動作を模擬し、装置シミュレータの模擬動作に応じて、複数のCPUシミュレータからターゲットCPUの模擬動作を行わせるCPUシミュレータを選択する選択手段と、を備えており、選択手段は、前記選択したCPUシミュレータへの切り替えを、前記オペレーティングシステムのシステムコールが発生したタイミングで行うことを特徴とする。
オペレーティングシステムのシステムコールが発生したタイミングでCPUシミュレータの切り替えを行うことで、切り替えによりCPUシミュレータ間で受け渡す情報を削減でき、よって、CPUシミュレータ間の切り替えを迅速に行うことができる。
(第一実施形態)本発明の第一実施形態について、以下では図面を用いて詳細に説明する。なお、以下の説明において、特に明記しない限り、或いは、文脈から明らかである場合を除き、時間とは模擬時間を意味するものとする。
本実施形態における情報処理装置は、装置に組み込まれたターゲットCPUで動作するプログラムであるターゲットコードを検証するものである。情報処理装置は、パーソナルコンピュータ、ワークステーション等(以下、ホストPCと記す)で実行されるプログラムとして実現され得る。
図2は、ホストPCのハードウェア構成の概略図である。図2のホストPC200のCPU201は、バス210を介して、ROM202、RAM203、入力インタフェース204、出力インタフェース206、外部記憶装置インタフェース208と接続されている。CPU201は、ROM202、RAM203に記憶されたプログラムに従い動作する。また、CPU201は、入力インタフェース204、外部記憶装置インタフェース208経由で受け取る外部入力に対する情報処理を行い、結果を出力インタフェース206、外部記憶装置インタフェース208経由で出力する。入力インタフェース204は、キーボード、マウス等の入力装置205を介してユーザからの入力を受け取る。出力インタフェース206は、LCDや、プリンタ、プロッタ等の出力装置207に対しデータの表示や出力を行う。外部記憶装置インタフェース208は、ハードディスクやCD−ROM等の外部記憶装置209に対するデータの入出力を行う。
CPU201は、外部記憶装置209に保存される設定データ209b内のデータを使用して、処理プログラム209aを実行することで、本実施形態による情報処理装置として機能する。なお、検証対象のプログラムであるターゲットコード209cも外部記憶装置209に保存される。なお、外部記憶装置209は、図示しないが、CPU201で動作する基本ソフトウェアであるオペレーティングシステム(以下、ホストOSと記す)を保存している。なお、処理プログラム209aは、ホストOS上で動作する。
続いて、本実施形態における情報処理装置について、図1を用いて説明する。図1において、ネイティブシミュレータ101(第1のCPUシミュレータ)及び命令セットシミュレータ(ISS)104(第2のCPUシミュレータ)は、それぞれ、制御対象装置に組み込まれたターゲットCPUの動作を模擬するものである。なお、以下の説明において、ネイティブシミュレータ101及びISS104を区別する必要がないときには、単にCPUシミュレータと呼ぶ。
なお、CPU周辺回路シミュレータ105は、ターゲットCPUの周辺回路の動作を模擬する。また、装置シミュレータ103は、ターゲットCPUが制御する制御対象装置の動作を模擬する。情報処理装置は、さらに、上記各シミュレータ間を接続し、上記各シミュレータ間の動作を協調させる管理部102を備えている。なお、管理部102は、各CPUシミュレータからターゲットCPUの模擬動作を行わせるCPUシミュレータを選択する、CPUシミュレータの選択部として機能する。
まず、ネイティブシミュレータ101について説明する。ターゲット命令実行部108は、ターゲットコードの実行を模擬するものであり、ターゲットコード209cのソースコードをホストPCの機械語命令に変換して実行する。また、ターゲット命令実行部108は、CPU周辺回路シミュレータ105のタイマシミュレータ111及びI/Oシミュレータ112へのアクセスを行う。具体的には、例えば、ターゲット命令実行部108は、制御対象装置への出力信号の状態をI/Oシミュレータ112に通知する。また、ターゲット命令実行部108は、装置シミュレータ103が模擬する制御対象装置の例えばセンサ出力の状態等をI/Oシミュレータ112から取得する。さらに、ターゲット命令実行部108は、タイマイベントを発生させる必要が有る場合、タイマシミュレータ111に必要な通知を行う。つまり、例えば、制御対象装置の所定のセンサ出力の状態が変化したことに応じて所定の時間後に出力信号を変化させなければならない場合、この所定の時間後のタイマイベントをタイマシミュレータ111に通知する。割込み制御部109は、CPU周辺回路シミュレータ105からの割込み要求を受けて、ターゲットCPUの割込み処理を模擬する。すなわち、割込み制御部109は、CPU周辺回路シミュレータ105から要求を受けた割込み番号に応じてターゲットコード上の割込みベクタを参照する。そして、ターゲット命令実行部108によるターゲットコード上の命令参照位置を、所定の割込み処理の位置に移行させる。また、割込み制御部109は、必要に応じて割込み禁止設定への対応、割込み優先度設定への対応、レジスタバンクの切り替え等、ターゲットCPUの割込み動作仕様に準じた処理を行う。
続いて、ISS104について説明する。ターゲット命令実行部118は、ターゲットプログラムの実行を模擬するものであり、ターゲットコード209cのターゲットCPUの機械語命令をソフトウェアで解釈して実行する。また、ターゲット命令実行部118は、ターゲット命令実行部108と同様に、CPU周辺回路シミュレータ105のタイマシミュレータ111及びI/Oシミュレータ112へのアクセスを行う。割込み制御部119は、CPU周辺回路シミュレータ105からの割込み要求を受けて、ターゲットCPUの割込み処理を模擬する。すなわち、割込み制御部119は、CPU周辺回路シミュレータ105から要求を受けた割込み番号に応じてターゲットコード上の割込みベクタを参照する。そして、ターゲット命令実行部118によるターゲットコード上の命令参照位置を、所定の割込み処理の位置に移行させる。また、割込み制御部119は、必要に応じて割込み禁止設定への対応、割込み優先度設定への対応、レジスタバンクの切り替え等、ターゲットCPUの割込み動作仕様に準じた処理を行う。さらに、実行サイクル数計測部133は、ターゲット命令実行部118による模擬動作の実行サイクルを計数する。つまり、ターゲット命令実行部118における模擬時間の進行を管理する。
続いて、CPU周辺回路シミュレータ105について説明する。CPU周辺回路シミュレータ105は、タイマ、入出力ポート、アナログデジタル変換器(以下、ADCと記す。)、シリアル通信機能といったCPU周辺回路の動作を模擬するものである。基準タイマ106は、タイマシミュレータ111をはじめとするCPU周辺回路シミュレータ105における時間進行の基準となるタイマである。なお、基準タイマ106の値はネイティブシミュレータ101の動作時は、管理部102からの設定のみによって値が更新される。一方、ISS104の動作時は、管理部102及びISS104からの設定によって値が更新される。
I/Oシミュレータ112は、ターゲットCPUへの入出力ポートを模擬するものである。タイマシミュレータ111は、ターゲットCPUの各タイマユニットの設定に応じた個々のタイマの動作を模擬する。さらに、タイマシミュレータ111は、各タイマユニットに対する割込み発生条件を監視し、割込み発生条件が成立した場合、割り込要求を、ネイティブシミュレータ101又はISS104に通知する。なお、タイマシミュレータ111の模擬動作における時間進行は基準タイマ106の値に従う。なお、タイマイベント管理テーブル158については後述する。
続いて、装置シミュレータ103の説明を行う。なお、本実施形態において、装置シミュレータ103は、画像形成装置を模擬するものとする。まず、模擬対象の画像形成装置301の概略について、図3を用いて説明する。
カセット302に収容されている記録材(シート材)は、ピックアップローラ303によりピックアップされ、給紙ローラ304により搬送路に送り出される。給紙ローラ304の搬送路下流側には、記録材の存在を検出する給紙センサ305が設けられている。給紙センサ305の下流には、搬送ローラ306が配置され、さらにその下流にはレジストローラ307が配置されている。レジストローラ307は、搬送される記録材の斜行を矯正するものである。レジストローラ307の下流には、画像形成前の記録材の位置を確定するため、レジストセンサ308が設けられている。レジストセンサ308の下流には、レーザスキャナ部310からのレーザ光により感光ドラム上にトナー像を形成する画像形成部309が配置されている。また、画像形成部309の感光ドラムは、通過する記録材にトナー像を転写する。画像形成部309の下流には定着器311が配置されており、定着器311の下流には複数の排紙搬送ローラ312が配置されており、その下流に排紙トレイ316が配置されている。
装置シミュレータ103は、ネイティブシミュレータ101及びISS104が出力する仮想信号、つまり、模擬上の信号に応じて用紙搬送、画像形成の状況を解析し、図示しない表示部に表示する。また、装置シミュレータ103は、ネイティブシミュレータ101及びISS104に、解析した状況を通知する仮想信号を出力する。なお、装置シミュレータ103とネイティブシミュレータ101及びISS104の仮想信号の交換は、管理部102の仮想信号伝達部154、157が、CPU周辺回路シミュレータ105のI/Oシミュレータ112経由で行う。ここで、仮想信号伝達部154がネイティブシミュレータ101に対する仮想信号の処理を行い、仮想信号伝達部157がISS104に対する仮想信号の処理を行う。
装置シミュレータ103のシミュレーション実行部140は、管理部102から、時間指定と共にシミュレーションの実行指示を受けると、指定された時間分の模擬動作を実行する。そして、指定された時間の模擬が終了すると、管理部102に対して、模擬の終了と、その時点の模擬時間を通知する。また、シミュレーション実行部140は、指定された時間の到達前に仮想信号の変化があった場合、その時点でシミュレーションを終了する。そして、終了時点の模擬時間、変化があった信号の種別及びその値の情報と共にシミュレーション終了を管理部102に通知する。その後、シミュレーション実行部140は、管理部102からシミュレーションの実行指示を受けると、前回の模擬動作が終了した時点における模擬時間から模擬動作を開始する。
シミュレーション実行部140による模擬は、模擬時間軸において、単位時間毎の画像形成装置301の動作状態の解析を繰り返すことで行われる。すなわち、シミュレーション実行部140は、画像形成装置301のある時点の状態から1単位時間後の状態を解析し、その結果を図示しない表示部に画面表示し、CPUシミュレータへの仮想信号に反映させ、模擬時間を1単位時間進行させる。シミュレーション実行部140は、この単位時間毎の解析処理を指定された時間分だけ実行することで、画像形成装置301の動作を模擬する。なお、シミュレーション時間管理部141は、装置シミュレータ103の模擬時間を管理する。
続いて、シミュレーション実行部140の模擬処理の詳細について、図4のフローチャートを用いて説明する。模擬処理は、管理部102からの実行指示により開始する。S501において、シミュレーション実行部140は、管理部102からの実行指示に含まれている時間を、シミュレーション時間管理部141が保持する現在時刻に加えて終了時刻を設定する。S502において、シミュレーション実行部140は、現在時刻と終了時刻を比較する。現在時刻が終了時刻と同じか、終了時刻より後であれば、シミュレーション実行部140は、S507において、シミュレーション時間管理部141が保持する現在時刻と共に模擬動作の終了を管理部102に通知する。S502において、現在時刻が終了時刻に達していなければ、シミュレーション実行部140は、S503において、1単位時間後の画像形成装置301の状態を解析し、図示しない表示装置への出力画像を更新すると共に、仮想信号値の変化を設定する。解析終了後、シミュレーション実行部140は、S504において、シミュレーション時間管理部141が保持する時刻を1単位時間だけ進める。その後、S505において、シミュレーション実行部140は、仮想信号に変化があったかどうかを判定する。仮想信号に変化がなければ、シミュレーション実行部140は、S502に戻って処理を繰り返す。一方、S505において、仮想信号に変化があると、シミュレーション実行部140は、S506において、模擬動作の終了を、シミュレーション時間管理部141が保持する現在時刻、変化した信号種別及びその値と共に管理部102に通知する。
次に、管理部102の組み込みOSシミュレーション部1の動作概要について図5を用いて説明する。本実施形態において、組み込みOSシミュレーション部1は、ターゲットCPUで動作するオペレーティングシステム(OS)の動作を模擬するものである。組み込みOSシミュレーション部1は、ターゲットCPUの模擬を行うCPUシミュレータを選択し、切り替える切り替え制御部152を備えている。本実施形態においては、通常は、ネイティブシミュレータ101でターゲットCPUの模擬動作を行い、プログラム命令の実行量により制御を行う処理についてはISS104でターゲットCPUの模擬動作を行う。具体的には、装置シミュレータ103から通知される、プログラム命令の実行量により制御を行う処理のトリガとなる特定の信号の変化や記憶領域の変化が発生すると、ネイティブシミュレータ101からISS104への切り替えを行う。このため、切り替えトリガ生成部161が、装置シミュレータ103から通知される、これら信号の変化等を判定して組み込みOSシミュレーション部1に通知する。なお、ISS104は、それぞれの処理により決まる模擬時間分の模擬動作を行うものであり、切り替えトリガ生成部161は、所定の模擬時間が経過後、ネイティブシミュレータ101に再び切り替えるためのトリガを発生する。図5においては、当初、ネイティブシミュレータ101が模擬を行い、その後、ISS104に切り替えられ、さらに、その後、ネイティブシミュレータ101に再び切り替えされている状態が示されている。なお、切り替えは、組み込みOSシミュレーション部1において、OSへのシステムコールが発生するタイミングで行う。OSへのシステムコールが発生するタイミングでCPUシミュレータを切り替えることで、OSが管理するRAM情報、プログラムカウンタ情報、CPUレジスタ情報、周辺回路情報、割り込み情報については、CPUシミュレータ間で受け渡す必要がなくなる。よって、CPUシミュレータの切り替えを迅速に行うことができる。
続いて、図6及び7を用いてネイティブシミュレータ101が動作時の装置シミュレータ管理部160及びシミュレータ接続部150における処理を説明する。CPUタイマ管理部117は、タイマイベント管理テーブル155の生成及び更新を行う。タイマイベント管理テーブル155とは、ネイティブシミュレータ101の模擬動作における確定したタイマイベントの発生タイミングを発生順に保存したものであり、その概要を図6に示す。なお、タイマイベントとは、CPU周辺回路によって実行される特定のタイミング(時刻)に対応した処理である。つまり、例えば、タイマユニットによるタイマ割り込み、パルスジェネレータによる指定されたタイミングにおける信号出力、複数チャネルのアナログデジタル変換器の一巡の変換処理終了後の割り込み等である。
なお、タイマイベントの発生有無、及び、その時刻については、CPUシミュレータのタイマシミュレータ111へのアクセス内容により判断できる。CPUタイマ管理部117は、ネイティブシミュレータ101に対してタイマイベントが発生する場合、そのタイマイベントをタイマイベント管理テーブル155に登録する。なお、CPUタイマ管理部117は、新たなタイマイベントの時刻と、既に登録されているタイマイベントの時刻を比較しタイマイベント管理テーブル155への登録イベントが発生時間順に並ぶように登録する。
また、CPUタイマ管理部117は、装置シミュレータ103が模擬動作の終了を通知した場合、その通知に含まれる時刻を取得する。そして、CPUタイマ管理部117は、取得した時刻と、タイマイベント管理テーブル155の先頭のタイマイベントの時刻とを比較する。取得した時刻が、先頭のタイマイベントの時刻より早い場合、CPUタイマ管理部117は、取得した時刻を、基準タイマ106に設定する。一方、取得した時刻が、先頭のタイマイベントの時刻以後の時刻である場合、先頭のタイマイベントの時刻を基準タイマ106に設定し、先頭のイベントを消去する。このとき、2番目以降のタイマイベントがあれば順次繰り上げる。CPUタイマ管理部117によって基準タイマ106の値が更新されると、タイマシミュレータ111は、基準タイマ106の変化に応じた模擬動作を行う。
装置シミュレータ管理部160は、タイマイベント管理テーブル155に応じて、装置シミュレータ103の模擬動作を管理する。また、装置シミュレータ管理部160は、装置シミュレータ103からのイベント通知に含まれる、あらかじめ決められた、特定の信号の状態を切り替えトリガ生成部161に通知する。切り替えトリガ生成部161は、あらかじめ決められた、特定の信号の状態の変化を検出した場合、切り替えのトリガ信号を組み込みOSシミュレーション部1に通知する。
図7は、ネイティブシミュレータ101動作時の、装置シミュレータ管理部160の処理を示すフローチャートである。なお、装置シミュレータ管理部160は、ネイティブシミュレータ101からの命令実行イベントの通知をトリガに処理を開始する。ネイティブシミュレータ101は、この命令実行イベントを適当な間隔で繰り返し実行する。なお、命令実行イベントの間隔は一定である必要はない。処理が開始されると、装置シミュレータ管理部160は、S701でタイマイベント管理テーブル155の先頭のタイマイベントの時刻(以下、対象時刻と記す。)と、装置シミュレータ103のその時点の時刻(以下、装置時刻と記す。)を比較する。対象時刻が装置時刻以下(より早い)の場合、装置シミュレータ管理部160は、S709において、装置時刻と共に、装置シミュレータの模擬処理の終了をCPUタイマ管理部117に通知して処理を終了する。
一方、S701で対象時刻が装置時刻よりも大きい場合、装置シミュレータ管理部160は、S702において、現在の装置時刻と対象時刻との差から装置シミュレータの模擬動作の時間を求める。そして、装置シミュレータ管理部160は、S703で装置シミュレータ103に求めた時間分の模擬動作の実行を指示し、S704において、装置シミュレータ103からの終了通知を待つ。
装置シミュレータ管理部160は、装置シミュレータ103から終了通知を受けると、S705において、装置シミュレータ103の時刻を通知された時刻に更新する。さらに、装置シミュレータ管理部160は、S706において、装置シミュレータ103の出力信号変化の有無を確認する。S706で出力信号の変化がない場合、S709に進む。一方、S706で出力信号の変化がある場合、装置シミュレータ管理部160は、S707で仮想信号伝達部154に発生した信号種別及びその値を通知し、S708で仮想信号伝達部154の応答を待つ。装置シミュレータ管理部160は、S708において、仮想信号伝達部154からの応答を受けた後にS709に進む。装置シミュレータ管理部160は、S709において、CPUタイマ管理部117に装置シミュレータ103の時刻と共に、装置シミュレータ103の模擬処理の終了を通知して処理を終了する。
続いて、ISS104動作時の装置シミュレータ管理部160及びシミュレータ接続部151における処理を説明する。時間同期部156は、同期単位時間を保持している。装置シミュレータ管理部160は、ISS104の動作時、ISS104及び装置シミュレータ103に対して、同期単位時間を単位とした処理を実行させる。つまり、ネイティブシミュレータ101が動作しているときとは異なり、ISS104は、模擬時間を認識しているため装置シミュレータ103と時間同期で動作する。
また、ISS104は時間同期で動作するため、シミュレータ接続部151には、シミュレータ接続部151のCPUタイマ管理部117に相当するものを設ける必要がない。よって、本実施形態においては、ISS104の模擬動作における確定したタイマイベントの発生タイミングについては、CPU周辺回路シミュレータ105のタイマイベント管理テーブル158で管理する。タイマイベント管理テーブル158は、タイマイベント管理テーブル155と同様に、ISS104の模擬動作における確定したタイマイベントの発生タイミングを発生順に保存したものである。なお、タイマイベント管理テーブル158は、ISS104のターゲット命令実行部118が更新する。なお、タイマイベント管理テーブル158の生成、更新等は、タイマイベント管理テーブル155と同様である。また、基準タイマ106の値は、実行サイクル数計測部133の値に基づきターゲット命令実行部118が設定する。
続いて、情報処理装置が模擬対象とする画像形成装置301におけるカセット302からレジストセンサ308までの記録材の搬送(以下、給紙搬送と記す。)制御について説明する。
まず、図8及び図9を用いて、画像形成装置301の給紙搬送制御に関する制御機能を説明する。図8は、ターゲットCPU側のOSと、各タスクと、各CPU周辺回路の関係を示す図である。また、図9は、ターゲットCPU側の各タスクと、画像形成装置301の給紙搬送に係る機構との関係を示す図である。なお、図9において、太破線は駆動力の伝達関係を示している。
図9において、メインモータ802は、レジストローラ307や、搬送経路においてその下流にある図示しない各要素の駆動源である。メインモータ802の駆動力は、レジストローラクラッチ804を介してレジストローラ307へ伝達される。給紙モータ803は、ピックアップローラ303、給紙ローラ304、給紙センサ305、搬送ローラ306の駆動源である。給紙モータ803の駆動力は、搬送ローラ306へは直接伝達され、給紙ローラ304へは給紙クラッチ805を介して伝達される。また、給紙ローラ304に伝達された給紙モータ803の回転力は、ベルト810を介してピックアップローラ303に伝達される。
ピックアップソレノイド806は、ピックアップローラ303をカセット302上に積載された用紙の表面と接離させるためのピックアップ機構を駆動するものである。ピックアップ機構は、ピックアップレバー807、ピックアップロッド808、ばね809から構成されている。ピックアップソレノイド806が非通電状態のときは、ばね809の力によりピックアップロッド808が上方に引っ張られ、ピックアップローラ303は用紙と離間する。ピックアップソレノイド806が通電状態になると、ピックアップレバー807を介してピックアップロッド808が下方に引っ張られ、ピックアップローラ303が用紙の最上面に接する。
従って、給紙モータ803が回転状態で、給紙クラッチ805が連結態の時に、ピックアップソレノイド806を作動させることにより、カセット302から、ピックアップローラ303によって給紙ローラ304まで用紙が繰り出される。この用紙は、レジストローラ307方向に向かって搬送される。
画像形成装置301の制御は、画像形成装置301に搭載されたターゲットCPUによって行われる。ターゲットCPUの給紙搬送制御に関連する機能として、画像形成制御タスク、搬送停止処理、給紙搬送制御タスク、給紙モータ停止処理、システムタイマ生成処理、ラウンドロビン処理がある。
画像形成制御タスクは、画像形成装置301への画像形成指示に応じて画像形成を行うものである。メインモータ802は、画像形成部や定着器の駆動源となっているため、画像形成制御タスクは、メインモータ802を画像形成開始時に起動し、画像形成終了時に停止する。また、画像形成制御タスクは、1ページの画像形成処理毎に給紙搬送制御タスクに画像形成ジョブ発生を通知する。
給紙搬送制御タスクは、画像形成制御タスクからの画像形成ジョブに応じて、先行紙との紙間をとりながら1枚の用紙に対する給紙搬送制御を行う。給紙搬送制御タスクは、給紙モータ803、給紙クラッチ805、ピックアップソレノイド806を制御してカセット302から用紙を送りだす。その後、給紙搬送制御タスクは、給紙センサ305で用紙先端が検知された時点でピックアップソレノイドを停止しピックアップローラ303を用紙表面から離間させる。その後、給紙搬送制御タスクは、所定の先行紙との紙間調整処理を行いつつレジストセンサ308までの用紙搬送を制御し、搬送停止処理を介してレジストセンサ308による用紙先端検知によって用紙搬送を停止し、給紙搬送処理を完了する。
ラウンドロビン処理は、タスク管理部(組み込みOS)のタスク1周期に1度実行される処理であり、給紙センサ305のチャタリング除去処理などに使用されている。給紙搬送制御タスクは、給紙センサ305のチャタリング除去処理を行った結果により動作を決定する。なお、チャタリングとは、センサがオンからオフや、オフからオンに変化するタイミングにおいて、機械的又は電気的なばらつきにより、センサの値が確定しない現象である。ターゲットコードは、このチャタリングを除去するために、ラウンドロビン処理により、センサ値を複数回検出し、所定の回数だけ同じ信号値であれば、センサの値を確定する処理を行っている。
搬送停止処理は、レジストセンサ308による用紙先端検知に応じて給紙搬送を停止する機能で、外部割込み生成機能に対する割込み設定機能と、外部割込み生成機能からの割込み要求に応じて実行される割込み処理とで構成される。給紙搬送制御タスクは、給紙開始後の所定タイミングにおいて搬送停止処理に対して、処理実行許可通知を出す。これに応じて、搬送停止処理は外部割込み生成機能に対してレジストセンサ308の信号入力を外部入力とし、レジストセンサ308の信号の紙無しレベルから紙有りレベルへの変化をトリガとする外部割込みを有効とする設定を行う。給紙搬送中の用紙先端がレジストセンサ308に到達し、レジストセンサ308の信号が紙無しレベルから紙有りレベルに変化すると、外部割込み生成機能は、搬送停止処理の指定に基づき割込み要求を発生させる。この割込み要求に応じて、搬送停止処理の割込み処理が起動される。搬送停止処理の割込み処理では、クラッチ804の連結解除と共に給紙モータ停止処理の起動処理を行う。
給紙モータ停止処理は、レジストローラクラッチ804の連結解除から所定時間後に給紙モータを停止する処理を行う機能である。具体的には、給紙モータ停止処理は、搬送停止処理から呼び出され、タイマAに対する割込み設定をおこなう機能と、タイマAからの割込み要求に応じて実行される割込み処理とで構成される。給紙モータ停止処理は、搬送停止処理から呼び出されるとタイマAに対して所定時間後に割込みを発生させる設定を行う。そして、タイマAによる設定時間後の割込み要求に対応する割込み処理において、給紙モータ803の停止処理を行った後に、給紙搬送制御タスク813に停止処理終了を通知する。
給紙搬送制御タスクは、停止処理終了通知を所定時間以内に受けた場合、正常に給紙搬送が完了したと判断し、画像形成制御タスクに給紙搬送終了を通知する。一方、給紙搬送制御タスクは、所定時間経過までに停止処理終了通知がない場合、ジャム発生と判断し、不図示の状態管理タスクに給紙遅延ジャム発生を通知する。
画像形成制御タスクは、給紙搬送制御タスクからの給紙搬送終了通知を受けた後、所定の画像形成準備が完了した時点で給紙モータを駆動し、クラッチ804を連結して用紙に画像を形成するための搬送を開始する。画像形成制御タスクは、搬送開始から所定タイミング後に外部装置へTOP信号を出力する。外部装置はTOP信号に同期して画像データを出力するため、TOP信号の出力タイミングに対する用紙の搬送位置の精度が用紙上への画像形成位置精度に影響する。従って、搬送開始時の用紙先端位置、すなわち、給紙搬送終了時の用紙の一時停止位置の精度が重要になる。給紙搬送終了時の一時停止処理をレジストセンサ308信号に応じた外部割込みで処理するのはこのためである。
また、搬送を開始するため画像形成制御タスクによって給紙モータ803が駆動される際に、クラッチ805の連結よりも給紙モータ803の立ち上がりが遅いと搬送ローラ306による用紙の引っ張りが発生し、用紙搬送にずれが生じる恐れがある。給紙搬送終了時にクラッチ804の連結解除から時間差をつけて給紙モータ803の停止を行うのは、これにより搬送ローラ306とレジストローラ307の間に用紙のたるみを持たせて、搬送開始時に引っ張りが生じないようにするためである。
システムタイマ生成処理は、ファームウェアの制御において各種タイミングで制御を行うための基準となるシステムタイマを生成する機能で、機能の大部分はタイマBからの割込み要求によって実行されるタイマ割込み処理として構成される。システムタイマ生成処理はタイマBに対してシステムタイマの単位時間の間隔でタイマ割込みが発生するように設定し、タイマ割込みの発生毎にシステムタイマをカウントアップする。
タスクタイマ管理部は、タスク毎に割り当てられるタイマの管理を行い、タスクからの指示に応じてタイマのカウント開始、停止、クリア、タスクタイマイベントの発生通知、タイマカウント値の通知などを行う。タスクタイマ管理部によるタスク毎のタイマ管理はシステムタイマを基準として行われる。給紙搬送制御タスクによる搬送停止処理に対する処理実行許可の通知、給紙遅延ジャム検出は、タスクタイマ管理部に登録した各々のタスクタイマイベントに応じて行っている。
図8の制御構成において、タイマイベントを発生させるCPU周辺回路の機能はタイマAとタイマBである。よって、本実施形態による情報処理装置は、タイマA及びBの制御レジスタに対するアクセスイベントに応じてタイマイベント管理テーブル155や、タイマイベント管理テーブル158を更新する。
続いて、一般的なマルチタスク処理を行う組み込みOSの動作説明を行う。図10は、タスク管理部と、画像形成制御タスク、給紙搬送制御タスク、ラウンドロビン処理の3つのタスクのソフトウェア構成を示したものである。タスク管理部、つまり、組み込みOSが3つのタスクの処理を切り替えながら、処理をすることにより、マルチタスク動作を行う。
図11は、タスク管理部が、タスクの実行順番・タイミングを管理しながら、タスク実行を行っていることを示したものである。なお、上段がタスク管理部の動作、下段が各タスクの動作タイミングを示している。続いて、タスク管理部の処理について、図12を用いて説明する。タスク管理部は、S901において、ラウンドロビン処理への切り替えを行い、S902において、ラウンドロビンからの復帰処理を行う。続いて、タスク管理部は、S903において、画像形成タスク切り替えタイミングであるかを判断する。切り替えタイミングである場合、タスク管理部は、S904において、画像形成制御タスクへの切り替えを行い、S905において画像形成制御タスクからの復帰処理を行う。一方、S903において、切り替えタイミングでは無い場合、タスク管理部は、S904及びS905の処理を省略する。続いて、タスク管理部は、S906において、給紙搬送タスク切り替えタイミングかを判断する。切り替えタイミングである場合、タスク管理部は、S907において、給紙搬送制御タスクへの切り替えを行い、S908において給紙搬送制御タスクからの復帰処理を行う。一方、S906において、切り替えタイミングでは無い場合、タスク管理部は、S907及びS908の処理を省略する。その後、タスク管理部は、S901から処理を繰り返す。
図13は、タスク管理部の処理から、画像形成制御タスクへの切り替え時の処理フローを示した例である。タスク管理部は、S911で、組み込みOSのレジスタ領域を保持し、S912で組み込みOSプログラムカウンタを保持する。そして、タスク管理部は、S913で組み込みOS管理の記憶領域の保持を行い、S914でプログラムカウンタを書き換えることにより、画像形成タスクに実行権を移す。
図14は、画像形成制御タスクからタスク管理部に処理を引き渡すときのタスク管理部のフローチャートである。タスク管理部は、S915で画像形成タスクのレジスタ領域を保持し、S916で画像形成タスクのプログラムカウンタを保持する。そして、タスク管理部は、S917で画像形成タスクのタスク管理記憶領域を保持し、S918で画像形成タスクの次回実行タイミングを保持する。このように、装置の制御においては、マルチタスク構成を使用し、処理を行っている。
従来、組込みOSのシミュレータは、ネイティブシミュレータの機能としてネイティブシミュレータ101内に設けられていた。なお、ISS104に関しては、OSの機械語命令をそのまま実行することで組込みOSの機能を模擬している。しかしながら、本実施形態においては、組み込みOSシミュレーション部1を、ネイティブシミュレータ101ではなく管理部102に配置する。
続いて、図15を用いて、本実施形態の制御構成を示す。なお、図15も、OSの模擬動作を行う組み込みOSシミュレーション部1と、画像形成制御タスク、給紙搬送制御タスク、ラウンドロビン処理の3つのタスクのソフトウェア構成を示している。組み込みOSシミュレーション部1は、ネイティブシミュレータ101の動作時には、ネイティブシミュレータ101で、画像形成制御タスク、給紙搬送制御タスク、ラウンドロビン処理をコールする。一方、組み込みOSシミュレーション部1は、ISS104の動作時には、ISS104で、画像形成制御タスク、給紙搬送制御タスク、ラウンドロビン処理をコールする。
続いて、本実施形態におけるタスク切り替えを、図16を用いて説明する。なお、図16においては、まず、ネイティブシミュレータ101が動作しているものとする。切り替え制御部152は、切り替えトリガ生成部161からのトリガ信号を監視しており、トリガ信号が切り替えを示すと、CPUシミュレータの切り替え、つまり本例では、ネイティブシミュレータ101からISS104への切り替えを行う。なお、切り替え制御部152は、CPUシミュレータが処理を組み込みOSシミュレーション部1に処理を戻したタイミング、つまり、システムコールのタイミングで切り替えを行う。図16においては、ネイティブシミュレータ101が実行中の画像形成制御タスクを終了して、組み込みOSシミュレーション部1に処理を戻したタイミングで切り替え処理を行っている。その後、組み込みOSシミュレーション部1は、例えば、次の給紙搬送制御タスク処理をISS104対して指示する。
本実施形態において、CPUシミュレータから、組み込みOSシミュレーション部1に処理を引き渡す際の処理を、図17を用いて説明する。組み込みOSシミュレーション部1は、処理を行っていたタスクのレジスタ領域を保持し、S922でタスクのプログラムカウンタを保持する。続いて、組み込みOSシミュレーション部1は、S923でタスクのタスク管理記憶領域を保持し、S924でタスクの次回実行タイミングを保持する。その後、組み込みOSシミュレーション部1は、切り替えトリガ生成部161からのトリガ信号を確認する。トリガ信号が切り替えを示していた場合、S926において、切り替え制御部152は、CPUシミュレータ、つまり、ネイティブシミュレータ101とISS104との切り替え処理を行う。
続いて、図18を用いて、図17のS926における切り替え制御部152による切り替え処理の説明を行う。切り替え制御部152は、S931で、基準タイマ106の値を、切り替え後のCPUシミュレータが使用する値に変更する。つまり、ネイティブシミュレータ101と、ISS104では時間の表現方法が異なるため、表現している時間そのものを変更することなく、切り替え後のCPUシミュレータが使用している時間基準による値に変更する。その後、切り替え制御部152は、S932で実行するシミュレータの切り替え処理を行う。
このように、組み込みOSのタスクの切り替えタイミングで、ネイティブシミュレータとISSを切り替える。これにより、OSが管理するRAM情報、プログラムカウンタ情報、レジスタ情報、周辺回路情報、割り込み情報については、CPUシミュレータ間で受け渡す必要がなくなる。よって、CPUシミュレータの切り替えを迅速に行うことができる。
なお、CPUシミュレータの切り替え時、切り替え元のCPUシミュレータに対応するタイマ管理テーブルに、未だ発生していないタイマイベント(残留イベント)が含まれている場合がある。この場合、この残留イベントを切り替え先のCPUシミュレータに引き継ぐことにより、切り替え先におけるタイマ管理テーブルの処理を軽減することができる。
図19に、残留イベントの引き継ぎを行う場合における、切り替え制御部152の切り替え処理を示す。図18のフローチャートとの相違点は、S942におけるタイマ管理テーブルの移行処理のみである。例えば、ネイティブシミュレータ101からISS104に切り替えるものとする。この場合、切り替え制御部152は、S942において、タイマイベント管理テーブル155の残留イベントを判定し、残留イベントをタイマイベント管理テーブル158に登録する。なお、ネイティブシミュレータ101とISS104では時間の計数方法が異なるため、基準タイマ106の換算処理と同様に、タイマイベント管理テーブル158への登録においては時間の換算を行う。
最後にCPUシミュレータの切り替えトリガについて説明する。図20に、装置シミュレータ103の給紙センサ305において、チャタリングが発生した場合のシミュレーション動作を示す。なお、センサ305の仮想信号は、ネイティブシミュレータ101から、ISS104への切り替えトリガとして使用する信号の1つである。センサ305の変化により、切り替えトリガ生成部161は、例えば、ネイティブシミュレータ101から、ISS104への切り替えを指示する。
ここで、センサ305にチャタリングが発生すると、切り替えトリガ生成部161には、切り替えのトリガとなるイベントが複数回通知されることになる。ここで、組み込みOSシミュレーション部1は、最初のトリガの通知に基づき、システムコールのタイミングにてISS104への切り替えを行う。ISS104にも、仮想信号伝達部157経由でセンサ305の変化が複数回入力されるが、ISS104は、シミュレーション動作によりチャタリング除去を行う。一方、切り替えトリガ生成部161は、最後にセンサ305の変化が発生してからの模擬時間を監視する。なお、センサ305の出力による切り替え時、ISS104は模擬時間txの模擬動作を行うものと予め定義されているものとする。この場合、切り替えトリガ生成部161は、最後にセンサ305の変化が発生してからの模擬時間がtxを経過した場合、組み込みOSシミュレーション部1に対し、ISS104から、ネイティブシミュレータ101へ切り替えトリガを出力する。この動作により、センサのチャタリング除去のシミュレーションを正確に行うことが可能となる。
以上、複数のCPUシミュレータ間の切り替えをオペレーティングシステムへのシステムコールが発生したタイミングで行う。この構成により、切り替え先のCPUシミュレータに引き渡す必要がある情報を、それ以外のタイミングで切り替える場合と比較して削減することができる。また、切り替え先のCPUシミュレータに対して切り替え前のCPUにおいて確定したタイマイベントを引き渡すことで、切り替え後における処理を減らし、速やかに切り替え処理を行うことが可能になる。
以上の構成により、例えば、模擬時間とは非同期であるネイティブシミュレータ101と、模擬時間と同期するISS104間を切り替えながら模擬動作を行うことができる。この組み合わせにより、シミュレーションを効率よく行うことができる。
Claims (6)
- ターゲットコードを実行するターゲットCPUの動作を模擬する複数のCPUシミュレータと、
前記ターゲットCPUの制御対象装置の動作を模擬する装置シミュレータと、
前記ターゲットCPUで動作するオペレーティングシステムの動作を模擬し、前記装置シミュレータの模擬動作に応じて、前記複数のCPUシミュレータから前記ターゲットCPUの模擬動作を行わせるCPUシミュレータを選択する選択手段と、
を備えており、
前記選択手段は、前記選択したCPUシミュレータへの切り替えを、前記オペレーティングシステムへのシステムコールが発生したタイミングで行うことを特徴とする情報処理装置。 - タイマイベントの発生を判定する基準となる時刻を保持する基準タイマを、さらに、備えており、
前記選択手段は、前記選択したCPUシミュレータへの切り替え時、前記基準タイマの値を、前記選択したCPUシミュレータが使用している時間基準による値に換算して、前記基準タイマに設定することを特徴とする請求項1に記載の情報処理装置。 - 前記ターゲットCPUの模擬動作で確定したタイマイベントを管理するタイマイベント管理テーブルが、各CPUシミュレータに対応して設けられ、
前記選択手段は、前記選択したCPUシミュレータへの切り替え時、切り替え前のCPUシミュレータに対応するタイマイベント管理テーブルに含まれるタイマイベントのうち、切り替え時に発生していないものを特定し、前記選択したCPUシミュレータに対応するタイマイベント管理テーブルに前記特定したタイマイベントを設定することを特徴とする請求項1又は2に記載の情報処理装置。 - 前記複数のCPUシミュレータは、第1のCPUシミュレータと、第2のCPUシミュレータを含み、
前記第1のCPUシミュレータは、前記ターゲットコードを、前記第1のCPUシミュレータが有するCPUの機械語命令に変換して実行し、
前記第2のCPUシミュレータは、前記ターゲットコードを、前記ターゲットCPUの機械語命令に変換して実行し、
前記第1のCPUシミュレータから前記第2のCPUシミュレータへの切り替えは、前記装置シミュレータが出力する所定の信号の変化により行われ、前記第2のCPUシミュレータから前記第1のCPUシミュレータへの切り替えは、前記第2のCPUシミュレータが模擬動作を行った模擬時間により行われることを特徴とする請求項1から3のいずれか1項に記載の情報処理装置。 - 前記制御対象装置は、シート材を搬送する装置であり、
前記所定の信号は、搬送されるシート材を検出するセンサが出力する信号であることを特徴とする請求項4に記載の情報処理装置。 - 請求項1から5のいずれか1項に記載の情報処理装置としてコンピュータを機能させることを特徴とするプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011091470A JP2012226445A (ja) | 2011-04-15 | 2011-04-15 | 情報処理装置及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011091470A JP2012226445A (ja) | 2011-04-15 | 2011-04-15 | 情報処理装置及びプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2012226445A true JP2012226445A (ja) | 2012-11-15 |
Family
ID=47276564
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2011091470A Withdrawn JP2012226445A (ja) | 2011-04-15 | 2011-04-15 | 情報処理装置及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2012226445A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6076576B1 (ja) * | 2016-06-07 | 2017-02-08 | 三菱電機株式会社 | シミュレーション装置およびシミュレーションプログラム |
-
2011
- 2011-04-15 JP JP2011091470A patent/JP2012226445A/ja not_active Withdrawn
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6076576B1 (ja) * | 2016-06-07 | 2017-02-08 | 三菱電機株式会社 | シミュレーション装置およびシミュレーションプログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9088678B2 (en) | Image processing device, non-transitory computer readable recording medium and operational event determining method | |
JP2014006801A (ja) | 表示入力装置および画像形成装置 | |
JP2012030575A5 (ja) | 印刷装置、印刷方法及びプログラム | |
US11046538B2 (en) | Image forming apparatus | |
JP5448768B2 (ja) | 情報処理装置及びその制御方法 | |
EP3037883B1 (en) | Printing system, printing system control method, and program | |
JP2010128722A (ja) | シミュレーションシステム、シミュレーション方法及びプログラム | |
JP2012226445A (ja) | 情報処理装置及びプログラム | |
JP5686609B2 (ja) | 情報処理装置及びプログラム | |
JP2007328548A (ja) | シミュレータ装置、シミュレーション方法およびコンピュータプログラム | |
JP2015078067A (ja) | シート綴じ処理装置、画像形成システム、及び綴じ処理方法 | |
JP2007026309A (ja) | 画像形成装置及びその制御方法 | |
JP5814597B2 (ja) | 情報処理装置及びプログラム | |
JP6311509B2 (ja) | 画像形成装置 | |
JP5885420B2 (ja) | 情報処理装置及びプログラム | |
JP2013205899A (ja) | 印刷制御装置、印刷システムおよびプログラム | |
JP2015133083A (ja) | 情報処理装置、その制御方法、プログラム、及び記憶媒体 | |
JP2017204779A (ja) | 電子機器及び画像形成装置 | |
JP5066013B2 (ja) | シミュレーション装置およびプログラム | |
JP2021111850A5 (ja) | 画像処理装置、画像処理装置の制御方法、並びにプログラム | |
JP2019066913A (ja) | ソフトウエア検証装置 | |
JP2016168707A (ja) | 画像形成装置及びプログラム | |
JP2015197815A (ja) | 情報処理装置、その制御方法、及びプログラム | |
US8971788B2 (en) | Image forming apparatus | |
JP4280698B2 (ja) | 設計支援プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Withdrawal of application because of no request for examination |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20140701 |