---
title: 組み込みソフトウェア基礎_【連続講座 #7】TDD#3 LEDドライバ(ターゲット編)
tags:  #tdd  
author: [k-abe@組み込みソフトウェアの人](https://convert.docswell.com/user/juraruming)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/G755PM1M74.jpg?width=480
description: 2022/12/15 社内勉強会向け資料です。 TDDでLEDドライバをターゲットマイコンで実施する考えをまとめました。
published: December 15, 22
canonical: https://convert.docswell.com/s/juraruming/KN4MW5-2022-12-15-210619
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/G755PM1M74.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/9J2N691RER.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/DEYP94Z5EM.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/VJN5LY3478.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/YE9Y4P94J3.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GE86QD9V7D.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/LEL9XMWRJR.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4JMZLY9PEW.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/PJR6K9GY79.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/PEXMLQX47X.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/3EKGL9WPJD.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/L73N3W1475.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/87DW4KX5JG.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/VJP9MKPDE8.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/2EVM9V2GEQ.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/57GGZLLD7L.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4EQXLYYX7P.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/KJ46DWW271.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/LE1VZYYK7G.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/GEWL9GGP72.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/47ZM9LL6E3.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/YJ6NKWWLJV.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/GJ55PMMMJ4.jpg)

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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/9E2N699R7R.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/D7YP94457M.jpg)

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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/VEN5LYY4J8.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/Y79Y4PP4E3.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/G786QDDVJD.jpg)

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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/L7L9XMMRER.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/4EMZLYYP7W.jpg)

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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/PER6K99YJ9.jpg)

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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/P7XMLQQ4JX.jpg)

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


# Page. 33

![Page Image](https://bcdn.docswell.com/page/37KGL99PED.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/LJ3N3WW4J5.jpg)

ターゲットで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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/8JDW4KK5EG.jpg)

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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/VEP9MKKD78.jpg)

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


# Page. 37

![Page Image](https://bcdn.docswell.com/page/27VM9VVG7Q.jpg)

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


# Page. 38

![Page Image](https://bcdn.docswell.com/page/5JGGZL1DJL.jpg)

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


# Page. 39

![Page Image](https://bcdn.docswell.com/page/47QXLYDXJP.jpg)

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


# Page. 40

![Page Image](https://bcdn.docswell.com/page/KE46DWZ2J1.jpg)

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


# Page. 41

![Page Image](https://bcdn.docswell.com/page/L71VZYRKJG.jpg)

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


