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

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

Published on June 14, 2016

Author: TaeyeopKim1

Source: slideshare.net

Content

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와 호환이 좋기 때문입니다.

10. Bootstrapping Tool인 Ceedling이란 무엇일까요?

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 터미널을 확인해보면,

36. 테스트 결과

37. 마지막 절차인 타깃 시스템이 보낸 테스트 결과를 시리얼 터미널로 확인 가능하게 되었습니다! 이제는 하드웨어에 의존적인 부분까지도 TDD를 실천할 수 있습니다. Text color, 출력 옵션, Test code 추가 등 TDD를 진행하면서 궁금한 점은 여기를 참고해주세 요.

38. 임베디드 시스템에서 TDD를 실천하는 것은 도전적이라고 생각합니다. 열악한 디버깅 환경에서 SW로부터 발생하는 문제인지, HW로부터 발생하는 문제인지, 확인조차 되지 않는 일이 매일 같이 발생합니다. TDD를 실천함으로써 HW와 SW 경계가 명확해지고, 설계는 더욱 개선됩니다. 이 자료가 정답이 아닐 수도 있지만, 조금이라도 도움이 되어 즐거운 TDD 라이프가 만들어지면 좋겠습니다.

39. 또한, 임베디드 개발자는 컴파일러, 타깃 시스템 등 특성을 많이 타고 범용적이지 않은 상황을 자주 마주하게 됩니다. 그때마다 서로의 경험을 공유하고 지식을 나눈다면, 더 많은 임베디드 개발자분들이 더 신뢰가 가고 안정적인 프로젝트를 만들지 않을까 싶습니다.

40. 감사합니다. 김태엽 [email protected]

Related presentations