LoginSignup
6

More than 5 years have passed since last update.

Atollic TrueSTUDIOでCppUTestを試す

Last updated at Posted at 2018-10-06

準備

  • Microsoft Windows 10 Pro
  • STMicro STM32F4 Discovery (STM32F407VG)

TrueSTUDIO for STM32のインストール

最近? Free to download になったようなのでTrueSTUDIOを使ってみる。
CppUTestはフットプリントがちょっと大きい気がするので32 KBの制限があると辛い。
なお、TrueSTUDIOのセットアップはこの辺りを見てもらうとして割愛する。(使用したバージョンはTrueSTUDIO for STM32 Version 9.0.1)

参考にしたサイトなど

ワークスペースの作成

ここでは新しくワークスペースを作るものとする。
スペースとか入ると後々ややこしい事が起こることを経験的に知っているのでパスの中にスペースが入らないようなネーミングとした。

image.png

最初のInformation centerを閉じるとこのような画面になる。
標準的に編集用とデバッグ用のパースペクティブがアイコンで選択できるようになっている。

image.png

ライブラリの生成

使い回せるよう、今回はCppUTestはStatic Libraryで生成する。

ライブラリプロジェクト作成

ファイル→新規作成→C++Projectを選んでプロジェクトを新規作成する。

image.png

まず、CppUTestライブラリを作る。
プロジェクト名はCppUTestとした。
これがライブラリ名になる。
Project TypeはEmbedded C++ Libraryとした。

image.png

ハードウェア構成を候補から選択できる。
これは便利すぎる!
フィルターにSTM32F4辺りまで入力すると候補を絞り込める。
終了を押すとプロジェクトが生成される。

image.png

CppUTestのインポート

srcフォルダを右クリックからインポートを選択してCppUTestのコードをインポートする。
CppUTestは https://cpputest.github.io から落としてくる。(今回はRelease 3.8 as .zipを利用した)

image.png

CppUTestを既に解凍してある場合はファイル・システムを使える。

image.png

取り込むソースコードは次の通りとした。

image.png

プロジェクトの設定

プロジェクト→C/C++の設定でプロパティダイアログを開き、Tool Settingsタブで設定していく。
今回はMemory Leak Detectionを使わないので次のシンボルを定義しておく。'CPPUTEST_STD_CPP_LIB_DISABLED'

CPPUTEST_STD_CPP_LIB_DISABLED
CPPUTEST_MEM_LEAK_DETECTION_DISABLED

image.png

インクルードパスを通しておく。
ワークスペースからの相対パスで設定するとフォルダ移動でも問題なくビルドできる。
ワークスペースのブラウズボタンを使えば簡単に設定できる。

image.png

設定後はこんな感じ。

image.png

例外処理を使っている部分があるのでDisable exception handlingのチェックマークを外しておく。
ここで最適化レベルを指定しておくとよい。(今回はサイズ優先を選んだ)

image.png

ビルド

Ctrl+BでフルビルドするとlibCppUTest.aが出来上がる。

image.png

テストの作成

テストケースのコードを書いていく。

プロジェクトの追加

プロジェクト名はtestcaseとした。
Project TypeはEmbedded C++ Projectを選択した。

image.png

ハードウェア構成を選択する。
この時、コード配置をRAMに設定すればRAM上で実行できる。
目的がTDDだとすると頻繁にテストする筈なのでRAM上でどんどん実行させた方がいいのではないかと思う。

image.png

ソフトウェアの設定では「システムコールファイルの生成」にチェックを入れておく。
後から追加することもできるが、ここでやるとクリック一つの操作で済む。

image.png

デバッガ設定ではST-LINKが選ばれていることを確認する。
STM32F4 DiscoveryはST-LINKが同じボード上に実装されている。

image.png

今回Releaseは使わないのでここではチェックを外した。(任意)

image.png

プロジェクトの設定

プロジェクト→C/C++の設定でプロパティダイアログを開き、Tool Settingsタブで設定していく。
CPPUTESTの為のシンボルを定義しておく。

CPPUTEST_STD_CPP_LIB_DISABLED
CPPUTEST_STD_C_LIB_DISABLED
CPPUTEST_MEM_LEAK_DETECTION_DISABLED

image.png

CppUTestへのインクルードパスを通しておく。
Workspaceブラウズボタンを使うと簡単に設定できる。

image.png

image.png

例外処理を使う設定にする。

image.png

ライブラリパスを通す。

image.png

ライブラリを指定する。
ファイル名は「libCppUTest.a」なのだが、最初のlibと拡張子 a を除いた部分「CppUTest」を指定する必要がある。
ここハマりどころ。

image.png

image.png

テキスト出力の設定

テキスト出力をITMに接続する。

syscalls.cの_write()システムコールに次のようにITM_SendChar()に文字列を送り込むコードを記述する。

syscalls.c

#include "stm32f4xx.h"

int _write(int32_t file, uint8_t *ptr, int32_t len)
{
    /* Implement your write code here, this is used by puts and printf for example */
    /* return len; */

    /* ADD */
    int i;
    for (i = 0; i < len; i++)        ITM_SendChar(*ptr++);

    errno = ENOSYS;
    return -1;
}

ヒープサイズの調整

ヒープ領域を増やしておく。
リンカーコマンドファイルstm32f4_ram.ldを編集する。
FLASH上に配置した場合はstm32f4_flash.ldになっていると思う。

stm32f4_ram.ld
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x2000; /* required amount of heap  */
_Min_Stack_Size = 0x400; /* required amount of stack */

テストケースの記述

テストケースを書いていく。

image.png

ビルド

Ctrl+Bでビルドしてみる。
思ったよりコードサイズが大きい。(半分くらいに収まって欲しい)
ちょっと調査している時間がないので後日時間があれば調べたい。

image.png

デバッグ構成の設定

デバッグ状態でテストを実行する。

image.png

シリアルワイヤビューアを有効にする。
結果はこのSWVを通して知ることになる。

image.png

SWVの設定

デバッグボタンで実行するとRAM上にプログラムがダウンロードされmain関数の入り口で一旦停まる。
ここで、SWVの設定を行う。
まずトレースの設定を行う。

image.png

Write関数で接続したITMをここでSWVに接続する。
具体的にはITM Stimulusポートの有効なポートを設定する。
ここではポート0にチェックを入れた。

image.png

SWVコンソールにポート0が現れる。
この状態でStart Traceをオンにする。(表示がわかりにくい)

image.png

テストの実行

プログラムを実行すると結果が出力される。

image.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6