このセクションでは 単体テスト およびアプリケーション検証について説明します。

セクションの内容:

一般的な構成

デフォルトの設定では、Keil uVision プロジェクトをテストするための C/C++test プロジェクトは、オリジナルの Keil uVision プロジェクトと同じ場所に作成されることを前提としています。この方法は必須ではありませんが、セットアップを大幅に簡略化できます。また、Keil uVision プロジェクト用のテスト コンフィギュレーションはすべて、同じ前提の下に作成されています。

単体テストやアプリケーション検証を正しく実行するには、オリジナルのプロジェクトを変更してプログラム スタック サイズやプログラム ヒープ サイズを拡張しなければならない場合もあります。これは通常、スタックとヒープにそれぞれ 0x1000 バイトを追加すれば十分なはずです。必要なヒープとスタックのサイズは、テスト コンフィギュレーションによって異なります。また、プロジェクト構成によっても異なる場合があります。

ランタイム ライブラリと通信チャネル

uVision プロジェクト用のすべてのテスト コンフィギュレーションには、ランタイム ライブラリを自動的にビルドする特別なステップがあります。このため、ランタイム ライブラリを外部的にビルドしたり、ビルドの生成物をリンカー コマンド ラインに追加したりする必要はありません。 

事前にビルド済みのランタイム ライブラリを使用してテストする場合は、手動でライブラリをビルドし、[C/C++testビルド設定] > [リンカーフラグ] に追加する必要があります。詳細については、「C/C++test ランタイム ライブラリのビルド」 を参照してください。

自動生成のライブラリを使用しない場合

uVision ツール用のランタイム ライブラリをビルドするには、次の操作を行います (必要な環境が正しく構成済みであることを前提とします)。

  1. <CPPTEST_INSTALL_DIR>/bin/engine/runtime に移動します。
  2. uVision3 の場合、make TARGET_CFG=ARM_armcc3_1_uV3.mk を実行します。 uVision4 の場合、make TARGET_CFG=ARM_armcc4_0_uV4.mk を実行します。

この他に、次のディレクトリにあるプロジェクト ファイルを使用して Keil uVision からランタイム ライブラリを直接ビルドすることもできます。 <CPPTEST_INSTALL_DIR>/bin/engine/runtime/projects/Keil_uV

Keil uVision のランタイム ライブラリは、次のものを使用するよう、あらかじめ構成されています。

ITM ベースの通信チャネルの実装は、 CMSIS ヘッダー ファイルに基づき、特定のハードウェアに依存しません。ARM Core Sight デバッグおよび計装トレース マクロセルを利用するトレース テクノロジーをサポートする Cortex M3/M4 マイクロコントローラーであれば、すべての Cortex M3/M4 マイクロコントローラーで動作するはずです。これは C++test バージョン 7.3.2.x から推奨されるソリューションです。ほとんどの場合、通信チャネルの実装を変更する必要はないはずです。 

シリアル通信チャネルは STM32F103 チップ用に実装されています (デフォルトで USART2 が使用されます)。別のチップでテストを実行する場合、あるいは別の通信チャネルを使用する場合は、通信チャネルの定義を変更するか、新しい通信チャネルを追加しなければならないことがあります。STM32F103ZE チップ用通信チャネルのデフォルトの実装は、プロジェクトで提供されているハードウェア初期化ルーチンによって UART が初期化されることを前提としています。このため、次の通信チャネル初期化関数の実装は、空のままになっています。

  int localRsInitInternalSerial(CppTestStreamParameters *par)

C/C++test ランタイム ライブラリ内で UART を初期化するには、このルーチンに初期化コードを追加します。UART パラメーターは CppTestStreamParameters 構造体によって提供され、関数引数として 渡されます。CppTestStreamParameters は CppTestTransportRS232Common.h ファイルに定義されています。この構造体は、TestRunnerGenerationStep 実行フロー ステップ (Keil 専用テスト コンフィギュレーションのテスト フロー定義を参照してください) で定義された値で初期化されます。

ハードウェア固有の初期化

テスト ケースを呼び出す前に、ハードウェア固有の初期化コードを呼び出す必要がある場合、次の関数を定義すると、ハードウェアの初期化関数がテスト実行可能ファイルの早い段階で呼び出されるようにできます。void CppTest_Initialize(void); 詳細については 「初期化と終了処理」 を参照してください。

セミホスティングとリターゲティング

MDK-ARM 4.6 から、セミホスティングのすべての依存関係をドロップするために、アプリケーションをリターゲットする必要があります (「Known Limitations」を参照)。テスト対象アプリケーションの C++test のインストゥルメントとそのランタイム ライブラリは、ARM ライブラリからのセミホスティングの呼び出しを強制します。そのため、正常な実行を可能にするには、完全なセミホスティングのリターゲティングをテスト アプリケーションに適用する必要があります。

アプリケーションのリターゲティングを容易にするために、ARM コンパイラ ツールには __use_no_semihosting インポート プラグマ (または以前のバージョンでは __use_no_semihosting_swi) とアセンブリ シンボルが用意されています。インポートがアプリケーションの 1 つのコンパイル単位にだけ含まれている場合でも、ARM リンカーはすべてのセミホストされたルーチン/シンボルについてエラーをレポートします。テスト対象アプリケーションがすでに __use_no_semihosting を含む場合、インポートはテスト アプリケーションにも適用されます。テスト対象アプリケーション中のカスタマイズされたリターゲティング シンボルもテスト アプリケーションに適用されます。テスト アプリケーションは、より多くのセミホスト依存関係を生成する場合があり、したがって、さらにリターゲティングを必要とします。 

リターゲットされないコードまたは部分的にリターゲットされるコードのためのテスト アプリケーションのリターゲティングを容易にするために、C++test は以下の処理を行います。

セミホスティングとリターゲティングの詳細については、ARM または Keil のドキュメントを参照してください。

実行時テスト用の uVision 構成

シミュレーター モードまはた実機モードのどちらのテスト モードでも、uVision デバッガー スクリプトによって C/C++test が生成したテスト実行可能ファイルが自動的に起動されます。テスト セッションの実行を完全に自動化するには、テスト実行可能ファイルのロードと実行を自動的に行う C/C++test 生成のデバッガー スクリプトを発見できるように uVision を構成する必要があります。 

C/C++test 生成のデバッガー スクリプトによるテスト実行可能ファイルの自動実行を可能にするには、次の操作を行って、オリジナルの uVision プロジェクトを変更します。 

  1. アクティブ ターゲットのオプションに移動し、[Debug] タブを開きます。



  2. [Debug] タブでデバッガー ターゲットを [Use Simulator] (あるいはニーズによっては実機)に変更し、[Initialization File] の下で .\cpptest.ini を指定します。cpptest.ini はテストの実行中に (uVision の起動の前に) 生成されます。 

シミュレーター上でのテスト

シミュレーター用のテスト コンフィギュレーションは、uVision のシミュレーション機能を使用して準備済みのテスト実行可能ファイルを実行します。テスト結果は次のいずれかの方法で送られます。

どちらのテスト コンフィギュレーションの場合も、uVision IDE はテスト結果をファイルに保存するための使いやすいインターフェイスを提供します。結果をファイルに保存するために、シリアルまたは ITM の出力をファイルにリダイレクトするための uVision デバッガー スクリプトを利用します。テスト コンフィギュレーションは、必要なテスト実行可能ファイルおよびコンポーネントのコンパイルおよびリンクを行い、uVision と実行時に生成されるデバッガー スクリプトを使用して準備済みのテスト実行可能ファイルを実行します。

デバッガー スクリプトのテンプレートは次の場所にあります。 UART 通信チャネル用: <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_sim.tja ITM ベースの通信チャネル用: <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulinkPro_itm.tja

デバッガー スクリプト テンプレートは、ユーザー固有のデバッガー スクリプトを含めたり、特定の環境でのニーズに合うようカスタマイズすることができます。「ビルトイン テスト コンフィギュレーションのカスタマイズ」を参照してください。

ULINKPro/ULINK2 インターフェイスを使用した実機でのテスト

実際のターゲット デバイス上でのテスト用のコンフィギュレーションは、 ULINKPro または ULINK2 デバッグおよびトレース アダプターを持つ uVision を使用して、用意されたテスト実行可能ファイルを実行します。テスト結果は次のいずれかの方法でターゲット プラットフォームから送られます。

テスト コンフィギュレーションは、必要なテスト実行可能ファイルおよびコンポーネントのコンパイルおよびリンクを行い、uVision と実行時に生成されるデバッガー スクリプトを使用して準備済みのテスト実行可能ファイルを実行します。

[Run Keil uVision Tests - ULINK2 (UART)] テスト コンフィギュレーションの場合、C/C++test は小さなユーティリティ プログラムを使用します。テストから送られるすべてのデータをキャプチャしてファイルに保存するシリアル ポート リスナーです。ITM ベースの通信を使用して結果を転送するコンフィギュレーションは、uVision のインターフェイスによって、uVision デバッガ― スクリプトを使用してテスト結果をファイルに保存します。 

デバッガー スクリプトのテンプレートは次の場所にあります。 UART 通信チャネル用: <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulink.tja ITM ベースの通信チャネル用:
<CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulinkPro_itm.tja

デバッガー スクリプト テンプレートは、ユーザー固有のデバッガー スクリプトを含めたり、特定の環境でのニーズに合うようカスタマイズすることができます。「ビルトイン テスト コンフィギュレーションのカスタマイズ」を参照してください。

ビルトイン テスト コンフィギュレーションのカスタマイズ

uVision プロジェクトの実行時テストを行うためのテスト コンフィギュレーションは、環境に合わせてカスタマイズしなければならない場合があります。[ビルトイン] > [Embedded Systems] > [Keil uVision] カテゴリのすべてのテスト コンフィギュレーションは、C++test プロジェクトがオリジナルの uVision プロジェクトと同じ場所に作成されていると想定します。ただし、この場所は必須ではありません。よくあるカスタマイズは、テスト コンフィギュレーションごとにあるテスト フロー定義プロパティを利用することです ( [実行] > [全般] > [実行の詳細])。 

下記の表は、MDK-ARM 用ビルトイン テスト コンフィギュレーションのためのテスト フロー プロパティの一覧です。

名前デフォルト値説明
uVision project executable location${uvision:project_executable}uVision プロジェクトのビルド成果物 (通常は実行可能ファイル) の場所に自動的に展開されます。この変数は、C/C++test によって生成されるテスト実行可能ファイルでオリジナルの実行可能ファイルを置き換えるために使用されます。通常、この値は変更するべきではありません。
uVision project project file${uvision:project_file}uVision プロジェクト ファイルの場所に自動的に展開されます。この変数は、生成されるデバッガー スクリプトを使ってテスト実行を自動化するために使用されます。通常、この値は変更するべきではありません。
uVision IDE executable fileUv4.exeuVision IDE 実行可能ファイルの場所。これは自動テストを開始するために必要です。C/C++test によってこの実行可能ファイルが自動検出されない場合、ユーザーが手動で指定する必要があります。
uVision project directory${uvision:project_directory}uVision プロジェクト ディレクトリの場所に自動的に展開されます。C/C++test によって生成されるデバッガー スクリプトのデフォルトの格納場所として使用されます。通常、この値は変更するべきではありません。
Uvision debugger initialization scriptC/C++test によって生成されるデバッガー スクリプトの先頭にインクルードされるデバッガー スクリプト ファイルへのフル パス (任意)。  デバッグ インターフェイスのプラットフォーム固有の初期化に使用できます。特別な初期化が必要ない場合、このプロパティは空のままにするべきです。
uVision project's target${uvision:project_target}uVision プロジェクトの現行ターゲットに自動的に展開されます。テストのために uVision プロジェクトで特別なターゲットが作成される場合、そのターゲットはこのプロパティの値として手動で指定されるべきです。 
Executable exit point_sys_exitテスト実行のエンド ポイントとして認識される関数の名前またはメモリ アドレス。C/C++test のデフォルト構成は、テスト実行可能ファイルから呼び出される最後の関数が _sys_exit であると想定します。C++test によって生成されるデバッガー スクリプトは、実行中のテスト プログラムが _sys_exit 関数 (またはここで指定される他の関数) に到達すると、テストの実行を終了させます。 
Serial comm: target portUSART1UART ポート ラベル。C/C++test ランタイム ライブラリ内で条件付きの初期化を実装するために使用できます。
Serial comm: host port1ターゲット マシンに接続されるホスト マシンの COM ポート番号。
Serial comm: baud rate9600シリアル転送ボーレート。
Serial comm: byte size8シリアル転送バイト サイズ。
Serial comm: parityEシリアル転送パリティ。 none (N), odd (O), even (E), mark (M), または space (S)
Serial comm: stop bits
シリアル転送ストップ ビット数。

シリアル ポート リスナー

実際のハードウェア デバイス上で、UART から発行された結果を使ってテストを実行する場合、ホスト側での結果の受け取りは、シリアル ポート リスナー ユーティリティを利用して行われます。シリアル ポート リスナーの詳細については、「RS232 リスナー」を参照してください。

単体テスト

次のテスト コンフィギュレーションは、単体テストのプロセスを容易にするために提供されています。

ターゲットまたはシミュレーター上で単体テストを実行するには、次の操作を行います。

  1. テスト ケースを手動で作成するかまたは自動生成します。
  2. Keil uVision テスト コンフィギュレーションのいずれかを複製します。
  3. 必要に応じてテスト コンフィギュレーションを変更します。詳細については 「一般的な構成」 を参照してください。
  4. 目的のテスト コンテキストを選択します。
  5. 上記のステップでカスタマイズしたテスト コンフィギュレーションを使ってテストを実行します。

テスト ケースのデバッグ

外部組込みデバッグ モードを使用します。詳細については以下を参照してください。

アプリケーション検証

アプリケーション検証のプロセスを容易にするために、次のテスト コンフィギュレーションが用意されています。

ターゲット上でアプリケーション検証を実行するには、次の操作を行います。

既知の制限事項

サポートされるすべての MDK-ARM バージョン

テスト アプリケーションを実行する前に、実行中の uVision インスタンスをすべてクローズすることを推奨します。これは uVision をデバッグ モードで起動します。インスタンスを実行中のままにすると (たとえば開発)、デバッガーが正しく動作しない可能性があります。

MDK-ARM 4.6x 以降

デバッガーおよびコンパイラのライブラリ (特に Sys I/O ライブラリ モジュール - sys_io.o) の変更のため 、 テスト用実行モジュールをビルドするときにセミホスティングを無効化する必要があります。標準シンボル (_ttywrch および _sys_exit) およびすべての I/O _sys_... と __std..._name シンボルはリターゲットする必要があります。