[nRF52] 2. Modularization

Dongsik·2022년 3월 29일
0

목적

SDK example 에서 제공하는 프로젝트의 경우, main 에 모든게 박혀있다.
이 시리즈의 목적은 재사용성이 좋은 base code 를 만드는 것이기 때문에 기능 구현을 하고 리팩토링을 하는 것이 아니라, 모듈화를 먼저 진행해볼 것이다.

Git

https://github.com/tlaehdtlr/nrf52_ble_base

  • 4 commit : [Refactor] generate mmi module
  • 5 commit : [Refactor] generate timer module
  • 6 commit : [Refactor] generate mmi hw module
  • 7 commit : [Refactor] rename module
  • 8 commit : [Refactor] generate ble module
  • 9 commit : [Refactor] generate gap module
  • 10 commit : [Refactor] generate gatt module
  • 11 commit : [Fix] Add header file missed in main.c

1. Main.c 분석

main 함수에서 init 하는 함수들을 분석하면 모듈화를 진행하는데 편리할 것이다. 우선적으로 함수들의 기능을 확인해보겠다.

1-1. Log

printf를 찍는 soft debugging 은 빠른 개발하기에 유용하다. printf 역할을 하는 nrf log 가 있다. 얘는 SDK 함수의 log 를 찍어주도록 많이 작성되어있어 유용하다.

  • log init
    • nrf_log_init
      • nrf ringbuf 를 이용하고 있다는 점만 참고하겠다.
    • nrf_log_default_backend_init
      • uart, asynchronous mode 를 이용
      • nrf_log_backend_uart_tx_pin 을 이용(config 에서 선언), 현재 pca10100 이므로 6번 pin 을 이용중이고, 실제로 uart 를 연결해보면 아래와 같이 log 를 볼 수 있게 된다. (DK보드라 usb cdc 로도 잡을 수 있다.)

디버깅을 위해 log 를 찍는 부분이고, 앞으로 Command Line Interface (CLI)을 만드는 것과 함께 MMI module을 만들어야겠다. (man-machine interface이다.)


1-2. Timer

App timer 기능 활성화만 시키고 있고, 사용자가 추가해라고만 되어 있다.
app timer 는 주기적인 실행이 필요하거나 혹은 타이밍을 맞추기 위해 사용되는 것이다.

개발에 있어서 동시에 돌아가는 타이머가 아니라면 굳이 많은 app timer 를 만들 필요는 없을 것이다.
그러므로 이것도 PJT_timer module로 만들겠다. (프로젝트 명은 일단 base로 하겠다)


1-3. Button, LED

Button, LED pin 활성화와 event handler 를 등록한다. 사용자가 원하는 시점에 이벤트를 발생시키고자 사용한다.
MMI HW module로 만들어야겠다.


1-4. Power management

power 에 대해서는 잘 모르겠다.(ToDo) 우선 지금은 sleep, standby mode 에 따라서 power 공급을 제어할 수 있다는 점만 인지하겠다.
모듈화는 진행하지 않겠다.


1-5. BLE stack

BLE host & controller 를 제공하는 softdevice 를 활성화한다.

  • ram 할당하는 것이 중요해보이는데 custom 하려면 좀 더 깊게 파고들 필요가 있어보인다. 우선은 default 로 사용.
  • ble host 부분의 event 를 처리할 handler 가 활성화된다.

당연히 PJT ble module 만든다.


1-6. GAP parameter

  • Advertisement, connetion 의 설정값이다.
  • 뒤에 나오는 advertising, conn_params 와 함께 모듈화

PJT GAP module


1-7. GATT

GATT 설정이고, service 와 연관있으므로 함께 모듈화
PJT GATT module


1-8. peer manager

Connection 에서 bonding, security 등을 담당하는 것이므로 GAP 와 관련이 있다.
PJT GAP module 포함


2. Main.c 쪼개기

분석을 마쳤으니 뚱뚱했던 main.c 를 아래와 같이 모듈화를 진행하였다.

  • commit 4 ~ 11 으로 실시했다.
  • 빠르게 쪼개기 위해서 MMI_HW module을 만들 때, DK 보드를 제어하는 부분을 제한했지만 상관없다. 어차피 로그보면서 할거니까.
  • 또한 전처리기 지시어를 통해 겹치는 부분을 일단 넘어가는 방향으로 모듈화를 진행했다.
  • 작은 에러
    • bla 관련 module definition 에서 expected ')' before numeric constant 이런 것을 만났다.
    • Devzone 참고 헤더파일 include 로 해결

아직 다듬어야할 부분이 남았지만 738 line 의 main.c 를 187 line 으로 바꾸고 나름 기능별로 윤곽을 잡는데 성공했다!


3. 참고

Memory usage

앞으로 모듈 추가 등 메모리 관리를 위해 빌드 후 정보를 남기도록 하겠다!


3-1) Queue module

3-2) Message sequence charts

profile
There is a plenty of room at the bottom.

0개의 댓글