CppUTest
ライブラリを作成する際のPlatformはGCCじゃなくてiarでいいのだろうか,
まぁ試してみるが吉なきがする.
TrueStudioなら前例あるからMakefileで試したい.
CubeIDE上で静的ライブラリを作ってみることにする.MCUを指定してCppUTestを入れてビルドすればarm-none-eabi-gccでビルドできた.
このときのコードはGccでなくGccNoStdCってやつで行った(GCCだとエラー出た)
GccNoStdCだとビルドできたしテストしたいコードとリンクもできたけどDebug時にヌルポで死ぬのでダメそう.
GitHubから動くコード見つけてきた(https://github.com/embeddedmz/UnitTestSTM32)
でも参照のソースコードiarにしてあるかつ少し変更を加えていた.
GitからCppUTestのコードを拾ってくる以上そっちのコードには手を付けたくないしどうしようかなぁ
G4で試したせいでそもそもG4でなんか動かないのかどうかすらわからない.
本来テストを回すならビルド時にテスト結果見たいんだけどアーキテクチャが違う以上不可能なのだろうか…
デバッグで本体つないでその結果をUARTしかりSWVで見ればすでに例があるみたいだけどそれだと組み込みに対してのテスト駆動開発の美味しさがない気もする.
C,C++両方対応してる.
テスト駆動開発による組み込みプログラミングでも例がのってる.
浮動小数点のテスト
Starter Project
少しのMakefileを書くと試せるようになる環境あり
テスト駆動開発による組み込みプログラミングの著者がCppUTestを始めるためのサンプルプロジェクトを作ってくれている
https://matheusmbar.com/bugfree-robot/2019/06/05/a_robot_with_a_purpose.html
CppUTestを使ってPC上でテストコードの実行,そこからドライバIOのMock作成まで試している記事.
cpputest-starter-projectと併用するとわりかし楽にできた.
ビルドするアーキテクチャには注意する.stm32は32bitなので,stm32で動くコードのテストがしたかったらホストでテストするときも32bitでビルドする.
32bitのGCCを使うか,-m32
オプションをつける.
Windowsで環境環境を作ってみる
MSYS2上のMinGW64で環境を作る
https://github.com/jwgrenning/cpputest-starter-project
cd /close-to-your-production-code/cpputest autoreconf . -i ./configure make tdd
Autotoolsをインストールしておく。インストールはMSYS2 MinGW(64bit)で入れておく。
上記のコマンドはMSYS2 MinGW x64で起動すること
CubeIDE
Unit Testing in STM32CubeIDE
この記事の方法が現状良さそう.開発しているパソコンの上で動作テストできて,ハードウェアやアーキテクチャの変わる部分はどうしようかと悩んでいたが,全部実行するアーキテクチャの上で走らせて,その結果を読み取れるようにする.
ユニットテストなので,関数で分けて時間依存しないコードとして作る努力をしていけばいいかも.
上記記事の方法で一通りなぞれたのでメモ
CubeIDEを使って,stm32上でCppUtestを走らせる
CppUtestの静的ライブラリ(.aファイル)を作る. 新規プロジェクト作成より,動かすstm32デバイスを選択して,
- argeted Language: C++
- Targeted Binary Type: Static Library
- Targeted Project Type: Empty
- Finish
CppUtestの中身をインクルードし,src/Platforms/Gcc/UTestPlatfrom.cpp
を追加する.Gcc
とNoStdGcc
とある.
あとはCppUtestのオプションを定義に追加する.
CPPUTEST_STD_CPP_LIB_DISABLED
最適化オプションを編集する.
IEEE754ExceptionsPlugin.cpp
内のCPPUTEST_HAVE_FENV
を無効化し,ビルドする中身を切り替える.
IEEE754ExceptionsPlugin.cpp
ではfenv.h
をインクルードして,浮動小数点の例外(ゼロ割,オーバーフロー,アンダーフローなど)検出をテストする.
しかし,ARMのGCC(GNU Arm Embedded Toolchain)に含まれている.fenv.h
には浮動小数点計算に使う例外のマクロが無効になっている.
これはCortex-MのFPUにおいて例外処理がハードウェア実装されてることも関係していると思う.(といってもゼロ割だけ)
以上から,ARMでの浮動小数点例外のテストはできないということに注意.
(2023/02/17更新)
arm用のGCCのバージョンが上がったことで、fenv.h
の中身も更新された模様。
10-2020-q4-majorでは上記のように例外のマクロがコメントアウトされていたが、10.3-2021.07ではマクロが存在していた。
ということはこのバージョン以降からはIEEE754の浮動小数点例外のテストも実施可能となる?
CubeMXで吐いたコードをもとに静的ライブラリフファイルを出力するMakefileを書いてみた.
出力は上記のCubeIDEでやったおものと同じようなものが出来上がるはず.