State Machine
일반적인 상태 머신 구현
• 스위치 케이스문을 이용하여 구현하는 것이 일반적
switch (currentState) {
case ST_IDLE:
// do something in the idle state
break;
case ST_STOP:
// do something in the stop state
break;
// etc...
}
문제점
• 어떤 상태가 유요한지, 유효하지 않은지 구분이 어려움
• 상태 사이에서 데이터를 주고받기가 어려움
• 멀티 스레드 환경에 적합하지 않음
어렵게 바꿔서 문제를 해결해봄
• 외부 이벤트/ 내부 이벤트 구분
• 이벤트 데이터
• 상태 전이 유효성 검사
• 상태를 함수단위로 묶음
• 상태 맵을 생성
• 전이 맵을 생성
• 세마포 락
외부 이벤트/ 내부 이벤트
• 버튼이 눌리는 등 자극이 들어옴
• 현재 상태를 기반으로 전이가 일어남
• 실행이 끝나면 내부 이벤트가 발생했는지 검사함
• 내부 이벤트를 타고타고 계속 실행함
• 모든 과정이 끝나기 전 까진 외부이벤트 영향 x
이벤트 데이터
• 이벤트가 생성될 때 데이터를 가지고 갈 수 있음
• 상태 실행이 끝나면 이벤트 데이터는 삭제됨
• new를 통해 힙 영역에 올라가야 함
• 데이터가 많으면 부하가 생길듯..
상태 전이 유효성 검사
• 외부 이벤트가 생성되면 검색을 함
• 새로운 상태, 이벤트 무시, 실행될 수 없음 결과가 나옴
• 새로운 상태가 아닐 경우 실행되지 않음
• 이렇게 현재 상태가 valid 한지 검사할 수 있음
상태 함수
• 각 상태 함수는 매칭되는 enum으로 관리함
상태 맵
• 현재 상태를 저장하는 변수
• 상태 머신이 상태 맵을 참조하여 실행할 상태를 찾음
트랜지션 맵
• 상태 머신이 다음으로 어떤 상태를 가져와야 할지 알려줌
• 각 이벤트별로 이렇게 맵을 가지고 있음
static const BYTE TRANSITIONS[] = {
EVENT_IGNORED, // ST_IDLE
CANNOT_HAPPEN, // ST_STOP
ST_STOP, // ST_START
ST_STOP, // ST_CHANGE_SPEED
};

c++ 상태 머신 디자인

  • 1.
  • 2.
    일반적인 상태 머신구현 • 스위치 케이스문을 이용하여 구현하는 것이 일반적 switch (currentState) { case ST_IDLE: // do something in the idle state break; case ST_STOP: // do something in the stop state break; // etc... }
  • 3.
    문제점 • 어떤 상태가유요한지, 유효하지 않은지 구분이 어려움 • 상태 사이에서 데이터를 주고받기가 어려움 • 멀티 스레드 환경에 적합하지 않음
  • 4.
    어렵게 바꿔서 문제를해결해봄 • 외부 이벤트/ 내부 이벤트 구분 • 이벤트 데이터 • 상태 전이 유효성 검사 • 상태를 함수단위로 묶음 • 상태 맵을 생성 • 전이 맵을 생성 • 세마포 락
  • 5.
    외부 이벤트/ 내부이벤트 • 버튼이 눌리는 등 자극이 들어옴 • 현재 상태를 기반으로 전이가 일어남 • 실행이 끝나면 내부 이벤트가 발생했는지 검사함 • 내부 이벤트를 타고타고 계속 실행함 • 모든 과정이 끝나기 전 까진 외부이벤트 영향 x
  • 6.
    이벤트 데이터 • 이벤트가생성될 때 데이터를 가지고 갈 수 있음 • 상태 실행이 끝나면 이벤트 데이터는 삭제됨 • new를 통해 힙 영역에 올라가야 함 • 데이터가 많으면 부하가 생길듯..
  • 7.
    상태 전이 유효성검사 • 외부 이벤트가 생성되면 검색을 함 • 새로운 상태, 이벤트 무시, 실행될 수 없음 결과가 나옴 • 새로운 상태가 아닐 경우 실행되지 않음 • 이렇게 현재 상태가 valid 한지 검사할 수 있음
  • 8.
    상태 함수 • 각상태 함수는 매칭되는 enum으로 관리함
  • 9.
    상태 맵 • 현재상태를 저장하는 변수 • 상태 머신이 상태 맵을 참조하여 실행할 상태를 찾음
  • 10.
    트랜지션 맵 • 상태머신이 다음으로 어떤 상태를 가져와야 할지 알려줌 • 각 이벤트별로 이렇게 맵을 가지고 있음 static const BYTE TRANSITIONS[] = { EVENT_IGNORED, // ST_IDLE CANNOT_HAPPEN, // ST_STOP ST_STOP, // ST_START ST_STOP, // ST_CHANGE_SPEED };