Atollic TrueSTUDIOでCppUTestを試す

#準備

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

## TrueSTUDIO for STM32のインストール

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

### 参考にしたサイトなど

* https://atollic.com/truestudio/
* [010 atollic開発ツールをまずは起動してSTM32-DISCOVERYをつないでみる](https://sites.google.com/site/stm32datasheet/home/how-to-use-tools/atollic-howtouse)
* [CppUTest in Atollic TrueSTUDIO for ARM - Google Groups](https://groups.google.com/forum/#!topic/cpputest/DyfPPLrIU04)

## ワークスペースの作成

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/4c28d948-6e99-4e9b-4580-5f88ffd4b32f.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/c6c4c037-c273-d77e-c02b-5e5dff4fc808.png)

## ライブラリの生成

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

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/9411a0a8-5881-2306-39d1-0c368e130fd9.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/8cd1633d-e979-cc98-bd26-610f162b4392.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/142fa571-ce66-685f-8c44-3cf23c7ac895.png)

### CppUTestのインポート

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/72f02a05-2126-4096-409f-ca4880f0faad.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/2e037460-12ac-8a8d-cc67-6a121b2be68b.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/89f6366a-cf32-b20e-0312-d60fad551ad0.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](https://qiita-image-store.s3.amazonaws.com/0/21786/b7d2686b-5956-b268-3ca3-357648ba9455.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/0f7b2719-77f6-d396-9724-170e1fae702d.png)

設定後はこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/f03d99ca-fc40-60b2-babf-8d88873dd4e8.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/d5e571c1-75b3-e271-455a-228c881d370b.png)

### ビルド

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/5001b5db-63f8-0b92-7a92-4fa82216f683.png)

# テストの作成

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

## プロジェクトの追加

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/e62aa2be-416d-e323-cb5f-c5ed00d6b97b.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/956556f6-a49c-2dcb-86ba-9a8c16501f57.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/d86b60a0-59db-124a-65b5-edcc6dc588d8.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/012ab4e8-add5-8324-d4a4-cc9b351e5491.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/df3b1aec-73c9-8fdf-6e6c-966b77b9312a.png)

### プロジェクトの設定

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

```
CPPUTEST_STD_CPP_LIB_DISABLED
CPPUTEST_STD_C_LIB_DISABLED
CPPUTEST_MEM_LEAK_DETECTION_DISABLED
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/bb3bad55-3d4a-5d48-5ba3-74f040b29e40.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/a7fb2f40-3aea-3f9a-246f-24227b0c878f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/4e41a33d-68f5-2f8c-40c6-18329e76489a.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/72c79bc0-7b19-4633-e8ba-ddc92c6b46ed.png)

ライブラリパスを通す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/700db6bc-9c4c-674f-eb23-bb4d86448267.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/2ed5e1f3-be63-6f47-0f44-481316bd1f97.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/23bcc86c-f7bb-3f45-60a6-0c2f2f8527f7.png)

### テキスト出力の設定

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

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

```c: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になっていると思う。

```c: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](https://qiita-image-store.s3.amazonaws.com/0/21786/a62e504d-970c-44fe-8ddf-650ebfb0ce87.png)

### ビルド

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/ddbe67c8-aa9e-0f54-ee2c-66e04aea873a.png)

### デバッグ構成の設定

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/1a69b640-c9b1-5300-5d52-39be64672d2b.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/6cc88172-abf0-db68-9815-48f317e43e51.png)

### SWVの設定

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/086091f9-5dab-9869-a4ee-16a0c82ef6fa.png)


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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/8612ddc8-f42c-3fab-92d9-fa40055ecb7e.png)


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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/43018231-6272-b07a-dea4-cc9d911e31e8.png)

### テストの実行

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21786/dc178cac-e009-adbd-e1f5-4515dcb3f5bb.png)