組み込みソフトウェア基礎_【連続講座 #7】TDD#3 LEDドライバ(ターゲット編)

1.1K Views

December 15, 22

tdd

スライド概要

2022/12/15 社内勉強会向け資料です。
TDDでLEDドライバをターゲットマイコンで実施する考えをまとめました。

profile-image

組込みソフトウェアエンジニア。 技術バックボーンはC言語・ベアメタル。 CQ EVカートのオーナーで、ハード・ソフトウェアの改造を通じて自身のスキルアップを日々考え中・・・。 LAPRASポートフォリオ: https://lapras.com/public/k-abe GitHub: http://github.com/grace2riku Qiita: https://qiita.com/juraruming Zenn: https://zenn.dev/k_abe よろしくね。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

組み込みソフトウェア基礎 【連続講座 #7】TDD #3 LED ライ (ター ゲット編) 2022/12/15 パーソルテクノロジースタッフ株式会社 バ ド 阿部耕二 koji.abe@persol.co.jp

2.

目次 • 自己紹介 • 参加者一言コメント • 講座開催の背景・目的 • 本日のテーマ【LED ライ (ターゲット編)】 • TDD学習の参考 • 参加者感想 • 次回予告 バ ド 2

3.

自己紹介 • 阿部 耕二(あべ こうじ) • 技術本部 機電技術部 首都圏2G • koji.abe@persol.co.jp • 医療機器開発 • 組込みソフトウェア開発。C言語、ベアメタルの開発業務経験がほとんど。 • LAPRASポートフォリオ:https://lapras.com/public/k-abe • twitter: @juraruming 3

4.

参加者一言コメント ご自由に一言コメントいただけますとありがたいです。 例) お名前 例) 今回の講座に期待すること 例) お仕事内容(話せる範囲で) 例) ソフトウェア開発担当工程(要求仕様の定義?設計?実装?テスト?) 4

5.

講座開催の背景・目的 • なにかテーマを決めて、ソフトウェア開発の上流工程から下流工程まで説 明する講座を開催し、スキルアップを図る。 ■#1 要求仕様の理解 資料・記事 ■#2 要求仕様の仕様化 資料・記事 ■設計 ●#3 概要 資料・記事 ●#4 詳細 資料・記事 ■TDD ●#5 テスト駆動開発#1 はじめの一歩 資料・記事 ●#6 テスト駆動開発#2 LEDドライバ(ホストPC編) 資料・記事 ●#7 テスト駆動開発#3 LEDドライバ(ターゲット編) ★いまここ ●#8 ●#9 5

6.

講座開催の背景・目的 テーマ: 【既存組込み製品(CQ EVカート)の マイコンを移植する】 6

7.

講座開催の背景・目的 テーマ:【既存組込み製品のマイコンを移植する】 対象装置:CQ EVカート 背景: ・講師が持っており、対象装置のドメイン知識を理解している。 ・ソフトウェアの構造を理解している。 ・対象装置のマイコンが新規採用非推奨品になった。 ⇛学習・スキルアップのため別マイコンに移植してみよう!!! 7

8.

本日のテーマ 【LED ライ (ターゲット編)】 • LED ライ (ターゲット編)とは何か? • ターゲットでTDDをするメリット・デメリット • 組込みソフトウェアのテスト戦略 • ターゲットでTDDする具体的方法 バ バ ド ド 8

9.

本日のテーマ 【LED ライ (ターゲット編)】 • LED ライ (ターゲット編)とは何か? • ターゲットでTDDをするメリット・デメリット • 組込みソフトウェアのテスト戦略 • ターゲットでTDDする具体的方法 バ バ ド ド 9

10.

LED ライ (ターゲット編)とは何か? • ターゲットとは? マイコンターゲットボードでTDDすることを指す。 前回はマイコンをコンパイルするPC(ホスト)でTDDした。 • LEDドライバとは? • マイコンターゲットボードとは? 次ページ以降に書きます。 バ ド 10

11.

・LEDドライバとは? ▪EVカートのLEDを点灯・消灯する機能を持つデバイスドライバとする。 モーター現在位置と制御の状況を9つのLEDで視覚化できる。 11

12.

●ターゲットマイコンの選定 STマイクロエレクトロニクスのSTM32マイコンボード【NUCLEOF446RE】に決めた。 ・STM32F446RET6 64ピン ・Arm Cortex-M4コア 180MHz ・フラッシュ: 512Kbyte ・SRAM: 128Kbyte ・Arm Mbed対応 12

13.

本日のテーマ 【LED ライ (ターゲット編)】 • LED ライ (ターゲット編)とは何か? • ターゲットでTDDをするメリット・デメリット • 組込みソフトウェアのテスト戦略 • ターゲットでTDDする具体的方法 バ バ ド ド 13

14.

ターゲットでTDDをするメリット・デメリット 【メリット】 ▪ターゲットでも動作確認でき安心できる ▪ホスト、ターゲットの違いを確認できる。 ●ハードウェアの初期化 ●アーキテクチャの違い ●実行環境の違い(スタック、その他) ●コンパイラの違い ●ライブラリの挙動の違い 14

15.

ターゲットでTDDをするメリット・デメリット 【メリット】 ▪ホスト、ターゲットの違いを確認できる。 ●ハードウェアの初期化 ホストではハードウェアを初期化するコードを書かない。 ターゲットではハードウェアをテストするためには初期化の実装が必 要 (LEDドライバであればGPIOの出力ポートの設定など)。 15

16.

ターゲットでTDDをするメリット・デメリット 【メリット】 ▪ホスト、ターゲットの違いを確認できる。 ●アーキテクチャの違い 例) int型のアドレス演算 ホスト) 32bit・64bitのCPU int型のサイズ 4バイト ターゲット) 16bitマイコン int型のサイズ2byte もし、int型のポインタアドレス演算などしていたら挙動が異なる。 例) エンディアン ビッグ・リトルエンディアンに依存するコードだったら挙動が異なる。 16

17.

ターゲットでTDDをするメリット・デメリット 【メリット】 ▪ホスト、ターゲットの違いを確認できる。 ●実行環境の違い(スタック、その他) ターゲットマイコンの開発環境に付属しているスタートアップルーチンで デフォルトで設定しているスタックサイズ500byteだったと仮定。 ある関数の内部変数で500byteの配列を宣言した場合。 ホストであれば動くと思うがターゲットマイコンではバグる可能性あ り。 ホストであれば考慮しなくても良いことが(問題にならないことが多い)、 ターゲットマイコンでは考慮が必要な場合がある。 17

18.

ターゲットでTDDをするメリット・デメリット 【メリット】 ▪ホスト、ターゲットの違いを確認できる。 ●コンパイラの違い ・最適化によりホスト・ターゲットで挙動が異なる場合。 ・メモリのアライメント ●ライブラリの挙動の違い ・標準ライブラリの挙動の違い・バグなど。 例) sprintfがホスト・ターゲットで動きが違うなど。 18

19.

ターゲットでTDDをするメリット・デメリット 【デメリット】 デメリットはあんまり思いつきませんでした。 ターゲットでもTDDできるのであればした方が良いとは思う。 ▪テストコードを書くので時間がかかる。 【テストを書かないから時間がなくなる】という名言もあります。 19

20.

本日のテーマ 【LED ライ (ターゲット編)】 • LED ライ (ターゲット編)とは何か? • ターゲットでTDDをするメリット・デメリット • 組込みソフトウェアのテスト戦略 • ターゲットでTDDする具体的方法 バ バ ド ド 20

21.

組込みソフトウェアのテスト戦略 ▪組込みソフトウェア開発現場の悩み ●1つのハードでテスターが複数 いかにハードウェアを使わずにテストできるかがポイント。 ●参考になった記事 オブジェクト指向の本質 ・依存性の低いソフトウェアモジュールの設計。 ・シミュレータを使用したテスト環境の構築 TDDをやる場合ホストでやること、ターゲットでやることを明確化しテストの 21 戦略を立てることが重要と感じた。

22.

本日のテーマ 【LED ライ (ターゲット編)】 • LED ライ (ターゲット編)とは何か? • ターゲットでTDDをするメリット・デメリット • 組込みソフトウェアのテスト戦略 • ターゲットでTDDする具体的方法 バ バ ド ド 22

23.

ターゲットでTDDする具体的方法 ▪ターゲットの環境 ▪方針 ▪実装例の紹介 ▪動作確認結果 23

24.

ターゲットでTDDする具体的方法 ▪ターゲットの環境 ▪方針 ▪実装例の紹介 ▪動作確認結果 24

25.

ターゲットでTDDする具体的方法 ▪ターゲットの環境 ・STM32CubeIDE Version: 1.11.0 ・テストフレームワーク: CppUTest 4.0 25

26.

ターゲットでTDDする具体的方法 ▪ターゲットの環境 ▪方針 ▪実装例の紹介 ▪動作確認結果 26

27.

ターゲットでTDDする具体的方法 ▪方針 ・ホストとテストコードを共有する。 ・ホストとターゲットでコードの切り替えはマクロで行う。 ・LED点灯はSTM32のハードウェア抽象化レイヤー(通称:HAL)のコード を使用する。 メリット) 組込み簡単 デメリット) ・処理の冗長化、速度の問題(があるかもしれない・・・) ・ハードウェア抽象化レイヤのコード自体のバグがあるかもしれない。 27

28.

ターゲットでTDDする具体的方法 ▪方針 >ハードウェア抽象化レイヤー GPIOのWriteの例) 28

29.

ターゲットでTDDする具体的方法 ▪ターゲットの環境 ▪方針 ▪実装例の紹介 ▪動作確認結果 29

30.

ターゲットでTDDする具体的方法 ▪実装例の紹介 ホストでTDDしたときのディレクトリ構成 30

31.

ターゲットでTDDする具体的方法 ▪実装例の紹介 ホスト・ターゲットでTDDするときのディレクトリ構成案(ビルド・動作未確認) host: ホストでTDDするときのファイルを格納する。 target: ターゲットでTDDするときのファイルを格納する。 include: インクルードファイル格納用。ホスト・ターゲットで共通で使用する。 src: ソースファイル格納用。ホスト・ターゲットで共通で使用する。 tests: テストコード格納用。ホスト・ターゲットで共通で使用する。 ●ホスト・ターゲットで共通で使用するものはhost, targetディレクトリの外に置くという方針。 TDD学習の参考(4)を参考にさせていただいた。 31

32.

ターゲットでTDDする具体的方法 ▪実装例の紹介 ターゲットディレクトリ構成案(ビルド・動作未確認) ▪446re_test: メインプロジェクト。マイコンに書き込 むファイルを作成する。 32

33.

ターゲットでTDDする具体的方法 テストコード(HallSensorLedDriverTest.cpp)をターゲット向けに修正する必要あり // ドライバを初期化したら、すべてのLEDが消灯している TEST(HallSensorLedDriver, LedsOffAfterCreate) { unsigned char virtualLeds = 0xff; HallSensorLedDriver_Create(&virtualLeds); BYTES_EQUAL(0, virtualLeds); } ホストの場合はvirtualLedsは任 意のアドレスで良かった(LEDがな いため)。 // ホールセンサーUが1の場合、ホールセンサーLEDをオンにする TEST(HallSensorLedDriver, TurnOnHallULed) { unsigned char virtualLeds; HallSensorLedDriver_Create(&virtualLeds); HallSensorLedDriver_TurnOn(0x04); BYTES_EQUAL(0x04, virtualLeds); } // ホールセンサーUが0の場合、ホールセンサーLEDをオフにする TEST(HallSensorLedDriver, TurnOffHallULed) { unsigned char virtualLeds; HallSensorLedDriver_Create(&virtualLeds); HallSensorLedDriver_TurnOn(0x04); HallSensorLedDriver_TurnOff(0x04); BYTES_EQUAL(0x00, virtualLeds); } 33

34.

ターゲットでTDDする具体的方法 プロダクトコード(HallSensorLedDriver.c)をターゲット向 けに修正 void HallSensorLedDriver_Create(unsigned char* address) { // *address = 0; hallSensorLedsAddress = address; *hallSensorLedsAddress = 0; } ・ターゲットの場合は*_Createで LEDを消灯する初期化処理が必 要。 void HallSensorLedDriver_Destroy(void) { } void HallSensorLedDriver_TurnOn(unsigned char ledBitNumber) { *hallSensorLedsAddress = 0x04; } void HallSensorLedDriver_TurnOff(unsigned char ledBitNumber){ *hallSensorLedsAddress = 0x00; } 34

35.

ターゲットでTDDする具体的方法 ▪方針 ▪実装例の紹介 ▪動作確認結果 35

36.

ターゲットでTDDする具体的方法 ▪動作確認結果 期待いただいていたら申し訳ありません。 ターゲットでTDDを動作確認するまで至りませんでした。 36

37.

TDD学習の参考 1. テスト駆動開発による組み込みプログラミング 2. [動画で解説]和田卓人の“テスト駆動開発”講座 記事一覧 3. 『テスト駆動開発による組み込みプログラミング』を読んで学んだこと 4. TDDによるマイコンのLチカ開発(1) 5. TDDによるマイコンのLチカ開発(2)(完) 37

38.

参加者感想 • 是非とも講座の感想を一言お願いします。 38

39.

考 え 中 次回予告 TDDの講座の次回は【1/xx(x) 19:30〜20:30】で開催予定です。 ・ 【連続講座 #8】テスト駆動開発#4 xxx 参加の方、是非ともよろしくおねがいします。 ・ ・ 39

40.

参考【テーマの前提説明】 • テーマの前提説明 【CQ EVカート】とは??? ・動画1: 走行中 ・動画2: 基板を拡大 過去に書いた技術書(EV カート 始めるモ ル ース開発)をベースに説明します。 記載箇所:【第1章 EVカートとは何か】 ベ デ で 40

41.

終わり ご静聴ありがとう ございました。 41