SlideShare a Scribd company logo
1 of 40
IoT 개발자를 위한
Embedded C에서 TDD를 해보자
nRF51-DK에서 TDD test result 추출하기
• 평범한 학부생이 Embedded C에서 TDD를 실천하기 위해 시도했던 경험과 결과물입니
다.
• 정답이 아닐 수도 있지만, 임베디드 개발을 하면서 느꼈던 폐쇄적인 정보 공유가 조금이
라도 개방 되었으면 하는 바람으로 작성하였습니다.
• 개발 환경
• Windows 10
• 타깃 보드 : nRF51-DK
• 타깃 시스템 환경
■ SDK version : SDK 10
■ Soft Device version : soft device 110
■ Compiler : arm-none-eabi-gcc 4.9.3
• TDD를 시작하기에 앞서 타깃 시스템 개발 환경이 구축되어있지 않다면, 먼저 다른 예제
를 통해 환경을 구축하고 시작 하시는 것을 권장합니다.
• nRF51-DK 환경 구축(Link1, Link2)
TDD 실행에 앞서 Embedded C에서 쓰이는 unit test framework는 뭐가 있을까요?
TDD Framwork
UNITY
사이트
Embedded C에는 대표적으로 2가지 unit test framwork가 있습
니다.
Cpputest
사이트
TDD Framwork
UNITY
Unity는 C언어 기반의 framwork 이고
Cpputest는 C++언어 기반의 framwork 입니다.
C C++
Cpputest
TDD Framwork
Cpputes
t
사이트
UNITY
사이트
Unity는 테스트 결과를 확인하기 위해서 4개의 파일이 필요하고,
main.c
LedDriver
.c
LedDriver
Test
.c
LedDriver
Test
Runner
.c
TDD Framwork
UNITY
사이트
Cpputest
사이트
Cpputest는 3개의 파일을 만들면 됩니다.
main.c
LedDriver
.c
LedDriver
Test
.c
TDD Framwork
UNITY
여기서는 Unity를 사용합니다.
Unity는 Ceedling이라는 훌륭한 Bootstrapping tool을 지원하고
Embedded C와 호환이 좋기 때문입니다.
Bootstrapping Tool인 Ceedling이란 무엇일까요?
Ceedling - TDD Bootstrapping tool
• Ceedling은 명령 프롬프트 창에서 TDD 실행 자동화를 지원합니다.
• 여기를 참고해서 설치를 완료해주세요.
CEEDLING
설치를 완료하셨다면 앞으로 “30초”, TDD 테스트 결과를 확인할 수 있습니다.
Ceedling - 프로젝트 생성
• 명령 프롬프트 창에서 프로젝트를 관리하는 임의의 폴더로 이동한 뒤,
• $ceedling new TDD
Ceedling – TDDModule 모듈 생성
• $cd TDD
• $rake module:create[TDDModule/TDDModule]
Ceedling - 테스트
● $rake test:all
이제 호스트 시스템(PC)에서 테스트 결과를 확인할 수 있습니다!
앞에서 사용한 Ceedling에 대해 조금 더 설명을 드리자면,
Ceedling - 명령어 도움말
• $rake -T
Ceedling - 테스트
• 테스트 코드 입니다.
• ..../TDD/test/test_LedDriver.c
Ceedling - TDD
• ..../TDD/test/support에 테스트에 필요한 파일을 추가 해주면 별도의 경로
지정 없이 code 내에서 include 가능합니다.
• Assert 함수는 ..../TDD/vendor/ceedling/vendor/unity/src/unity.h에서
확인 가능합니다.
• SUT와 Test code를 수정하면서 TDD를 진행하면 됩니다.
• Ceedling의 자세한 사용법은 여기를 참고해주세요.
Ceedling은 프로젝트 생성, 모듈 추가 그리고 테스트 환경 구축까지
빠른 주기로 실행 가능한 강력한 Bootstrapping Tool입니다.
그렇다면, 호스트 시스템(PC)이 아닌 타깃 시스템(nRF51-DK)에서 실행되는 테스트 코드는
어떻게 실행 결과를 확인할 수 있을까요?
타깃 시스템 - Unity framework
• 복잡한 동작 방식과는 관계없이 최종적으로 Unity framework는 출력 함수
putchar() 를 통해 테스트 결과를 출력하는 기능을 가지고 있습니다.
UNITY
타깃 시스템 - 출력 함수
• 그렇기 때문에, 테스트 결과를 PC에서 출력하는 방법은 간단합니다.
• 타깃 시스템이 putchar() 함수를 지원하도록 하거나,
• Unity framwork에서 출력 함수 putchar() 를 타깃 시스템이 지원하는 출력 함수로 대체 합
니다.
UNITY
putchar() write()
타깃 시스템 - nRF51-DK
• nRF51-DK는 <stdio.h> 파일을 include 하여 putchar()함수를 지원합니
다.
putchar()
nRF51-DK에서 putchar() 함수로 출력 되는 테스트 결과를 어떻게 PC에서 확인하면 될까요?
• putchar() 함수를 통해 출력 되는 결과는 UART 통신을 통해 호스트 시스템
(PC)에서 확인이 가능하게 됩니다.
UART 통신
UNITY
시리얼 터미널
• 시리얼 통신이 가능한 프로그램을 자유롭게 설치해주세요.
• 여기서는 Teraterm을 사용하도록 하겠습니다.
시리얼 터미널
• nRF51-DK를 연결하고,
• Teraterm 메뉴에서 설정 - 시리얼 포트를 클릭 한 뒤에 위와 같이 설정합니
다.
• 포트는 동일하지 않을 수 있습니다.
이제 nRF51-DK에서 구동 가능한 프로젝트 구성을 하고,
최종적으로 nRF51-DK를 통해 테스트 결과를 PC에서 확인해보도록 하겠습니다.
프로젝트 구성
• https://github.com/KimmTY/nRF51_Unit_Testing 에서 repository를 다운 받거나,
• 명령 프롬프트창에서 원하는 폴더로 이동 후,
• git clone https://github.com/KimmTY/nRF51_Unit_Testing.git 입력합니다.
프로젝트 구성 - 환경구축
• https://github.com/KimmTY/nRF51_Unit_Testing 에서 Need section은 모두 충족
시켜주세요.
nRF51-DK에서 TDD를 해보자 - Compile
• nRF51-DK를 연결한 상태에서,
• 명령 프롬프트 창을 실행하고,
• $cd nRF51_Unit_Testing
• $make all
nRF51-DK에서 TDD를 해보자 - Soft Device
• $make flash_softdevice
nRF51-DK에서 TDD를 해보자 - Application
• $make flash nrf51422_xxac_s110
Application까지 Flash하고 Teraterm 터미널을 확인해보면,
테스트 결과
마지막 절차인 타깃 시스템이 보낸 테스트 결과를 시리얼 터미널로 확인 가능하게 되었습니다!
이제는 하드웨어에 의존적인 부분까지도 TDD를 실천할 수 있습니다.
Text color, 출력 옵션, Test code 추가 등 TDD를 진행하면서 궁금한 점은 여기를 참고해주세
요.
임베디드 시스템에서 TDD를 실천하는 것은 도전적이라고 생각합니다.
열악한 디버깅 환경에서
SW로부터 발생하는 문제인지,
HW로부터 발생하는 문제인지,
확인조차 되지 않는 일이 매일 같이 발생합니다.
TDD를 실천함으로써 HW와 SW 경계가 명확해지고,
설계는 더욱 개선됩니다.
이 자료가 정답이 아닐 수도 있지만,
조금이라도 도움이 되어 즐거운 TDD 라이프가 만들어지면 좋겠습니다.
또한, 임베디드 개발자는 컴파일러, 타깃 시스템 등 특성을 많이 타고
범용적이지 않은 상황을 자주 마주하게 됩니다.
그때마다 서로의 경험을 공유하고 지식을 나눈다면,
더 많은 임베디드 개발자분들이 더 신뢰가 가고 안정적인 프로젝트를 만들지 않을까 싶습니다.
감사합니다.
김태엽
ktim610sw@gmail.com

More Related Content

What's hot

淺談編譯器最佳化技術
淺談編譯器最佳化技術淺談編譯器最佳化技術
淺談編譯器最佳化技術Kito Cheng
 
Conan.io - The C/C++ package manager for Developers
Conan.io - The C/C++ package manager for DevelopersConan.io - The C/C++ package manager for Developers
Conan.io - The C/C++ package manager for DevelopersUilian Ries
 
Zynq mp勉強会資料
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料一路 川染
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングTomoya Hibi
 
Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1inside-BigData.com
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるAtsushi KOMIYA
 
Adding a BOLT pass
Adding a BOLT passAdding a BOLT pass
Adding a BOLT passAmir42407
 
The internals and the latest trends of container runtimes
The internals and the latest trends of container runtimesThe internals and the latest trends of container runtimes
The internals and the latest trends of container runtimesAkihiro Suda
 
Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph Ceph Community
 
Ovs dpdk hwoffload way to full offload
Ovs dpdk hwoffload way to full offloadOvs dpdk hwoffload way to full offload
Ovs dpdk hwoffload way to full offloadKevin Traynor
 
Automated Testing for Embedded Software in C or C++
Automated Testing for Embedded Software in C or C++Automated Testing for Embedded Software in C or C++
Automated Testing for Embedded Software in C or C++Lars Thorup
 
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台Bo-Yi Wu
 
강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노chcbaram
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法NVIDIA Japan
 
Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Will Huang
 
icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介Kito Cheng
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門Yuichi Ito
 
HamaCTF WriteUp (Unpack category)
HamaCTF WriteUp (Unpack category)HamaCTF WriteUp (Unpack category)
HamaCTF WriteUp (Unpack category)Shota Shinogi
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and moreBrendan Gregg
 

What's hot (20)

淺談編譯器最佳化技術
淺談編譯器最佳化技術淺談編譯器最佳化技術
淺談編譯器最佳化技術
 
Conan.io - The C/C++ package manager for Developers
Conan.io - The C/C++ package manager for DevelopersConan.io - The C/C++ package manager for Developers
Conan.io - The C/C++ package manager for Developers
 
Zynq mp勉強会資料
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
 
Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1Introduction to EasyBuild: Tutorial Part 1
Introduction to EasyBuild: Tutorial Part 1
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
Adding a BOLT pass
Adding a BOLT passAdding a BOLT pass
Adding a BOLT pass
 
The internals and the latest trends of container runtimes
The internals and the latest trends of container runtimesThe internals and the latest trends of container runtimes
The internals and the latest trends of container runtimes
 
Microblaze loader
Microblaze loaderMicroblaze loader
Microblaze loader
 
Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph
 
Ovs dpdk hwoffload way to full offload
Ovs dpdk hwoffload way to full offloadOvs dpdk hwoffload way to full offload
Ovs dpdk hwoffload way to full offload
 
Automated Testing for Embedded Software in C or C++
Automated Testing for Embedded Software in C or C++Automated Testing for Embedded Software in C or C++
Automated Testing for Embedded Software in C or C++
 
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
 
강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法
 
Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)
 
icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門
 
HamaCTF WriteUp (Unpack category)
HamaCTF WriteUp (Unpack category)HamaCTF WriteUp (Unpack category)
HamaCTF WriteUp (Unpack category)
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and more
 

Similar to IoT 개발자를 위한 Embedded C에서 TDD를 해보자

빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기Chris Ohk
 
Bdd 개요 및 Karma 도입 예
Bdd 개요 및 Karma 도입 예Bdd 개요 및 Karma 도입 예
Bdd 개요 및 Karma 도입 예Seulgi Choi
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Samsung Electronics
 
CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)DONGSU KIM
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트Chanwoong Kim
 
강좌 03 개발환경 구축
강좌 03 개발환경 구축강좌 03 개발환경 구축
강좌 03 개발환경 구축chcbaram
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해중선 곽
 
242 naver-2
242 naver-2242 naver-2
242 naver-2NAVER D2
 
Visual studio 사용 설명서(기초 과정)
Visual studio 사용 설명서(기초 과정)Visual studio 사용 설명서(기초 과정)
Visual studio 사용 설명서(기초 과정)Lusain Kim
 
델파이 소스코드의재발견
델파이 소스코드의재발견델파이 소스코드의재발견
델파이 소스코드의재발견Devgear
 
DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기SeungYong Baek
 
개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2Daniel Lim
 
Deploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptxDeploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptxwonyong hwang
 
Kubernetes on GCP
Kubernetes on GCPKubernetes on GCP
Kubernetes on GCPDaegeun Kim
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기hanbeom Park
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈NAVER D2
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018Shengzhe Li
 

Similar to IoT 개발자를 위한 Embedded C에서 TDD를 해보자 (20)

빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
TDD
TDDTDD
TDD
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
Bdd 개요 및 Karma 도입 예
Bdd 개요 및 Karma 도입 예Bdd 개요 및 Karma 도입 예
Bdd 개요 및 Karma 도입 예
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900
 
CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트
 
강좌 03 개발환경 구축
강좌 03 개발환경 구축강좌 03 개발환경 구축
강좌 03 개발환경 구축
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해
 
242 naver-2
242 naver-2242 naver-2
242 naver-2
 
Visual studio 사용 설명서(기초 과정)
Visual studio 사용 설명서(기초 과정)Visual studio 사용 설명서(기초 과정)
Visual studio 사용 설명서(기초 과정)
 
델파이 소스코드의재발견
델파이 소스코드의재발견델파이 소스코드의재발견
델파이 소스코드의재발견
 
DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기
 
개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2
 
Deploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptxDeploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptx
 
Tdd ver.2
Tdd ver.2Tdd ver.2
Tdd ver.2
 
Kubernetes on GCP
Kubernetes on GCPKubernetes on GCP
Kubernetes on GCP
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
 

IoT 개발자를 위한 Embedded C에서 TDD를 해보자

  • 1. IoT 개발자를 위한 Embedded C에서 TDD를 해보자 nRF51-DK에서 TDD test result 추출하기
  • 2. • 평범한 학부생이 Embedded C에서 TDD를 실천하기 위해 시도했던 경험과 결과물입니 다. • 정답이 아닐 수도 있지만, 임베디드 개발을 하면서 느꼈던 폐쇄적인 정보 공유가 조금이 라도 개방 되었으면 하는 바람으로 작성하였습니다.
  • 3. • 개발 환경 • Windows 10 • 타깃 보드 : nRF51-DK • 타깃 시스템 환경 ■ SDK version : SDK 10 ■ Soft Device version : soft device 110 ■ Compiler : arm-none-eabi-gcc 4.9.3 • TDD를 시작하기에 앞서 타깃 시스템 개발 환경이 구축되어있지 않다면, 먼저 다른 예제 를 통해 환경을 구축하고 시작 하시는 것을 권장합니다. • nRF51-DK 환경 구축(Link1, Link2)
  • 4. TDD 실행에 앞서 Embedded C에서 쓰이는 unit test framework는 뭐가 있을까요?
  • 5. TDD Framwork UNITY 사이트 Embedded C에는 대표적으로 2가지 unit test framwork가 있습 니다. Cpputest 사이트
  • 6. TDD Framwork UNITY Unity는 C언어 기반의 framwork 이고 Cpputest는 C++언어 기반의 framwork 입니다. C C++ Cpputest
  • 7. TDD Framwork Cpputes t 사이트 UNITY 사이트 Unity는 테스트 결과를 확인하기 위해서 4개의 파일이 필요하고, main.c LedDriver .c LedDriver Test .c LedDriver Test Runner .c
  • 8. TDD Framwork UNITY 사이트 Cpputest 사이트 Cpputest는 3개의 파일을 만들면 됩니다. main.c LedDriver .c LedDriver Test .c
  • 9. TDD Framwork UNITY 여기서는 Unity를 사용합니다. Unity는 Ceedling이라는 훌륭한 Bootstrapping tool을 지원하고 Embedded C와 호환이 좋기 때문입니다.
  • 11. Ceedling - TDD Bootstrapping tool • Ceedling은 명령 프롬프트 창에서 TDD 실행 자동화를 지원합니다. • 여기를 참고해서 설치를 완료해주세요. CEEDLING
  • 12. 설치를 완료하셨다면 앞으로 “30초”, TDD 테스트 결과를 확인할 수 있습니다.
  • 13. Ceedling - 프로젝트 생성 • 명령 프롬프트 창에서 프로젝트를 관리하는 임의의 폴더로 이동한 뒤, • $ceedling new TDD
  • 14. Ceedling – TDDModule 모듈 생성 • $cd TDD • $rake module:create[TDDModule/TDDModule]
  • 15. Ceedling - 테스트 ● $rake test:all
  • 16. 이제 호스트 시스템(PC)에서 테스트 결과를 확인할 수 있습니다! 앞에서 사용한 Ceedling에 대해 조금 더 설명을 드리자면,
  • 17. Ceedling - 명령어 도움말 • $rake -T
  • 18. Ceedling - 테스트 • 테스트 코드 입니다. • ..../TDD/test/test_LedDriver.c
  • 19. Ceedling - TDD • ..../TDD/test/support에 테스트에 필요한 파일을 추가 해주면 별도의 경로 지정 없이 code 내에서 include 가능합니다. • Assert 함수는 ..../TDD/vendor/ceedling/vendor/unity/src/unity.h에서 확인 가능합니다. • SUT와 Test code를 수정하면서 TDD를 진행하면 됩니다. • Ceedling의 자세한 사용법은 여기를 참고해주세요.
  • 20. Ceedling은 프로젝트 생성, 모듈 추가 그리고 테스트 환경 구축까지 빠른 주기로 실행 가능한 강력한 Bootstrapping Tool입니다.
  • 21. 그렇다면, 호스트 시스템(PC)이 아닌 타깃 시스템(nRF51-DK)에서 실행되는 테스트 코드는 어떻게 실행 결과를 확인할 수 있을까요?
  • 22. 타깃 시스템 - Unity framework • 복잡한 동작 방식과는 관계없이 최종적으로 Unity framework는 출력 함수 putchar() 를 통해 테스트 결과를 출력하는 기능을 가지고 있습니다. UNITY
  • 23. 타깃 시스템 - 출력 함수 • 그렇기 때문에, 테스트 결과를 PC에서 출력하는 방법은 간단합니다. • 타깃 시스템이 putchar() 함수를 지원하도록 하거나, • Unity framwork에서 출력 함수 putchar() 를 타깃 시스템이 지원하는 출력 함수로 대체 합 니다. UNITY putchar() write()
  • 24. 타깃 시스템 - nRF51-DK • nRF51-DK는 <stdio.h> 파일을 include 하여 putchar()함수를 지원합니 다. putchar()
  • 25. nRF51-DK에서 putchar() 함수로 출력 되는 테스트 결과를 어떻게 PC에서 확인하면 될까요?
  • 26. • putchar() 함수를 통해 출력 되는 결과는 UART 통신을 통해 호스트 시스템 (PC)에서 확인이 가능하게 됩니다. UART 통신 UNITY
  • 27. 시리얼 터미널 • 시리얼 통신이 가능한 프로그램을 자유롭게 설치해주세요. • 여기서는 Teraterm을 사용하도록 하겠습니다.
  • 28. 시리얼 터미널 • nRF51-DK를 연결하고, • Teraterm 메뉴에서 설정 - 시리얼 포트를 클릭 한 뒤에 위와 같이 설정합니 다. • 포트는 동일하지 않을 수 있습니다.
  • 29. 이제 nRF51-DK에서 구동 가능한 프로젝트 구성을 하고, 최종적으로 nRF51-DK를 통해 테스트 결과를 PC에서 확인해보도록 하겠습니다.
  • 30. 프로젝트 구성 • https://github.com/KimmTY/nRF51_Unit_Testing 에서 repository를 다운 받거나, • 명령 프롬프트창에서 원하는 폴더로 이동 후, • git clone https://github.com/KimmTY/nRF51_Unit_Testing.git 입력합니다.
  • 31. 프로젝트 구성 - 환경구축 • https://github.com/KimmTY/nRF51_Unit_Testing 에서 Need section은 모두 충족 시켜주세요.
  • 32. nRF51-DK에서 TDD를 해보자 - Compile • nRF51-DK를 연결한 상태에서, • 명령 프롬프트 창을 실행하고, • $cd nRF51_Unit_Testing • $make all
  • 33. nRF51-DK에서 TDD를 해보자 - Soft Device • $make flash_softdevice
  • 34. nRF51-DK에서 TDD를 해보자 - Application • $make flash nrf51422_xxac_s110
  • 35. Application까지 Flash하고 Teraterm 터미널을 확인해보면,
  • 37. 마지막 절차인 타깃 시스템이 보낸 테스트 결과를 시리얼 터미널로 확인 가능하게 되었습니다! 이제는 하드웨어에 의존적인 부분까지도 TDD를 실천할 수 있습니다. Text color, 출력 옵션, Test code 추가 등 TDD를 진행하면서 궁금한 점은 여기를 참고해주세 요.
  • 38. 임베디드 시스템에서 TDD를 실천하는 것은 도전적이라고 생각합니다. 열악한 디버깅 환경에서 SW로부터 발생하는 문제인지, HW로부터 발생하는 문제인지, 확인조차 되지 않는 일이 매일 같이 발생합니다. TDD를 실천함으로써 HW와 SW 경계가 명확해지고, 설계는 더욱 개선됩니다. 이 자료가 정답이 아닐 수도 있지만, 조금이라도 도움이 되어 즐거운 TDD 라이프가 만들어지면 좋겠습니다.
  • 39. 또한, 임베디드 개발자는 컴파일러, 타깃 시스템 등 특성을 많이 타고 범용적이지 않은 상황을 자주 마주하게 됩니다. 그때마다 서로의 경험을 공유하고 지식을 나눈다면, 더 많은 임베디드 개발자분들이 더 신뢰가 가고 안정적인 프로젝트를 만들지 않을까 싶습니다.