App state machine 개요

펌웨어를 처음 개발할 때 수많은 절차와 처리들을 어떻게 일목요연하고 보기 쉽게 코딩해야하는지 막막하게 느껴집니다. 이럴 때 보통 디자인 패턴이라는 프로그래밍의 오래된 습관 혹은 관습을 이용하여 해결할 수 있습니다.

state machine은 이런 디자인 패턴중에 하나로 아주 사용하기 쉽고 유용하며 소프트웨어 개발자라면 꼭 알아야 할 디자인 패턴 기법입니다.

single core 안에서 동작 중인 application은 반드시 하나의 상태(state)안에 있습니다. 각각의 이벤트나 어떠한 처리는 state 안에서 이루어 지며 여러개의 state 끼리 서로 전환하며 프로그램이 동작하게 됩니다.

아래 다이어그램에서 우리가 만들 app state machine 을 좀 더 구체적으로 알아보겠습니다.

app state machine

① app.c 의 역할

  • app state 등록, 삭제
  • app state 들 간의 active 상태 전환
  • active 상태의 state에 메시지 전달
  • active 상태의 state의 loop 실행

② main.c

  • 메시지 큐를 검색하여 실행해야 할 메시지 app에 전달
  • active된 app 실행
  • 주기적으로 ⑤polling function 프로세싱

③ message.c

  • 인터럽트에서 받은 메시지 수신
  • app state 들에서 받은 메시지 수신
  • 그 외 모든 전역적으로 메시지 수신

④ interrupt

  • 인터럽트에서 필요할 경우 메시지 송신

⑤ polling function

  • 프로세싱 처리
  • 필요한 경우 메시지 송신

⑥⑦⑧ app states

  • 자기가 active 된 app 일 경우 메시지 처리
  • 자기가 active 된 app 일 경우 loop 처리

위에 간단하게 각 요소에 대해 설명하였습니다. 여러분들의 어플리케이션에 따라 각 요소들이 더 많아 질 수도 있습니다. app state machine을 만들 때 app states를 어떻게 만들지, 몇 개를 만들지가 아주 중요합니다.

예를 들어 LCD를 가지고 있는 경우에는 화면 별로 app state를 구분하여 만들 수도 있고, 네트워크 어플리케이션의 경우 connection에 따라 구분하여 만들 수도 있습니다. 결국 어플리케이션에 따라 상태를 구분하고 조합해야 좋은 프로그램이 될 수 있습니다.

다음 포스팅 부터는 코드에 대한 설명으로 이어집니다.

전체 소스 : https://github.com/soloungos/h7_state_machine