ホーム > ユーザーサポート > FAQ カバレッジマスターwinAMS

FAQ / カバレッジマスターwinAMS

ツール起動・スタートアップに関する問題

301_01 : I/O 制御で、while()ループでハードウェアの信号待ちを行っている関数をテストするには?

【質問】
関数の処理に、I/O 制御でハードウェアの信号待ちを行っているwhile()ループがあり、ループをブレイクするためには、関数実行中にi/oポートの値を変化させる必要があります。どのようにすれば、while()ループのハードウェアの信号待ちを抜けることができますか?


【回答】
関数の中で、I/O レジスタの信号を監視している個所があるとき、シミュレーションではこの部分は永久ループとなり、そのままでは検証することができません。I/O レジスタの信号監視によるループが存在する場合、処理の形態によってテストデータCSV の記述で対策できるケースと、スタートアップコマンドファイルに細工をしてループから抜けるように対策しなければならないケースがあります。

(1)I/O レジスタの信号がON になるのを単に待っている場合

#define PORT1 *(volatile unsigned char *)0xffffff50 // port1 入力
void sample ()
{
    : 処理
  while ((PORT1 & 0x01) == 0) ; // 信号がON になるまで待つ!
    : 処理
}

上記の様な場合であれば、i/oポートPORT1の値をテストケースの1つとして0x01にセットするだけで、while()ループを抜けることができます。PORT1は直接アドレスがキャストされており、シンボル情報がないため、このPORT1をCSVファイルの入力項目とするためには、CSV雛形作成画面にてINPUTへの変数追加に「i/o作成」ボタンを使用します。

i/o作成の画面にて、種別に「アドレス」を指定し、アドレスに「0xffffff50」、型に「unsigned char」を指定することで、入力変数としてPORT1を扱うことができます。この際に、CSVファイルの変数欄には、「0xffffff50#U1#1」と記載されます。

 

(2)関数内でI/O レジスタをクリアしてから、信号がON になるのを待っている場合

#define PORT1 *(volatile unsigned char *)0xffffff50 // port1 入力
void sample ()
{
    : 処理
  PORT1 = 0 ; // I/O レジスタをクリア
  while ((PORT1 & 0x01) == 0) ; // 信号がON になるまで待つ!
    : 処理
}

この場合、信号の監視をする直前で、I/O レジスタをクリアしていますので、上記(1)の方法でI/O レジスタへのデータを入力しても効果はありません。この場合には、シミュレータの機能を使用して、関数実行途中にPORT1の値を書き換える動作を行わせます。これは、スタートアップコマンドファイルに、I/O レジスタが参照されたタイミングでPORT1の値を1に変化させるコマンド(シミュレータのスクリプト)を定義することにより行います。

スタートアップコマンドファイルに以下の処理を追加します。このコマンドは、PORT1(0ffffff50h番地)の参照(read)をトリガーにして、datasetに定義した“PORT1”へ信号0x01 を設定するマクロを実行するものです。

; “dataset”マクロの定義
macro dataset
store/loc=1 0ffffff50h = 01h ;“PORT1”へ信号0x01 を設定
mend

; 0xffffff50 番地を参照しようとしたら、”dataset”マクロを実行するように定義
set do/read=0ffffff50h#1 dataset

 

【参考情報】
スタートアップのマクロコマンドの仕様一覧は、以下のメニュー操作より参照が可能です。

SSTManager の ヘルプメニューより[ヘルプ]→[シミュレータマニュアル]にて、ヘルプファイルを表示します。
ヘルプファイルの目次 の シートより[デバッガ]→[コマンド/メッセージ]→[SystemG]→[デバッガコマンド一覧]に、
解説がございます。

各コマンドの リファレンスについては[デバッガコマンド一覧] 配下の [コマンド解説] を 参照してください。

【マクロの使用方法:参考技術情報】
ユーザー向け技術サポート情報のページに、マクロ(シミュレータコマンド)の使い方(上級者ユーザー向け)がPDFファイルで掲載されています。スタートアップコマンドファイルに設定するマクロコマンド(スクリプト)の使用方法を、ご質問の多い例を上げて解説しています。

【無限ループ自動化支援ツール】
無限ループのマクロ定義の設定のため、無限ループ自動化支援ツールを提供しております。無限ループ自動化支援ツールの使用方法は、下記ダウンロードよりファイルを展開頂き「無限ループ自動化支援ツールマニュアル.pdf」をご参照下さい。

 

関連サポート情報検索

【サポート情報サイト内Google検索】

検索キーワード: 永久ループ | whileループ

他のキーワード検索

 


参考情報・リンク