노트 / 펌웨어 설계와 품질
모듈화와 인터페이스: 헤더로 경계 긋기
.h는 바깥에 보여 줄 것만, .c는 내부를 숨깁니다. static, 불투명 타입, 초기화 함수로 모듈을 설계하는 방법.
좋은 모듈의 모양
/* 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를 스스로 포함)
- 모듈 하나는 한 가지 책임: "모터 드라이버"와 "속도 제어"는 별도 모듈
인터페이스부터 쓰기
구현 전에 헤더를 먼저 쓰고 팀과 합의하면, 구현이 끝나기 전에도 다른 사람이 그 인터페이스를 써서 개발과 테스트를 시작할 수 있습니다.