그라운드 임베디드 유튜브 구독

노트 / 펌웨어 설계와 품질

모듈화와 인터페이스: 헤더로 경계 긋기

.h는 바깥에 보여 줄 것만, .c는 내부를 숨깁니다. static, 불투명 타입, 초기화 함수로 모듈을 설계하는 방법.

GROUND EMBEDDED · 정리 노트설계·품질 02모듈화와 인터페이스 1/* motor.h : 바깥에 보여 줄 것만 */ 2typedef enum { MOTOR_OK, MOTOR_FAULT } … 3void motor_init(void); 4void motor_set_duty(int16_t duty_permil…// -1…

좋은 모듈의 모양

/* motor.h : 바깥에 보여 줄 것만 */
typedef enum { MOTOR_OK, MOTOR_FAULT } motor_status_t;
void motor_init(void);
void motor_set_duty(int16_t duty_permille);   // -1000 ~ 1000
motor_status_t motor_status(void);
/* motor.c : 내부 */
static int16_t s_duty;            // 바깥에서 못 건드림
static void apply_pwm(void) { ... }

원칙

  • 전역 변수를 extern으로 노출하지 않고 함수로 읽고 씁니다. 값 범위 검사와 로그를 한 곳에서 할 수 있습니다.
  • 내부 함수와 변수에는 static
  • 단위를 이름이나 주석에 명시합니다: duty_permille, speed_rpm, current_mA
  • 헤더는 자기만으로 컴파일되게(필요한 include를 스스로 포함)
  • 모듈 하나는 한 가지 책임: "모터 드라이버"와 "속도 제어"는 별도 모듈

인터페이스부터 쓰기

구현 전에 헤더를 먼저 쓰고 팀과 합의하면, 구현이 끝나기 전에도 다른 사람이 그 인터페이스를 써서 개발과 테스트를 시작할 수 있습니다.