이벤트란 특정 트리거가 발생했을 해당 트리거를 기반으로 취하는 행동을 의미한다.

 

트리거 -> 핸들러 -> 동작

패턴을 가지기 때문에 인터럽트와 매우유사한 패턴을 수있다. 하지만 이벤트는 인터럽트와 달리 Task사이의 메시지 전달 등의 용도로 많이 사용된다.

 

예를들어 안드로이드 프로그래밍을 하다보면 버튼을 만들고 버튼을 눌렀을 동작을 처리하기위해 이벤트 핸들러를 작성하는데 여기서 말하는 이벤트는 이와 같다. 인터럽트와 이벤트는 동작하는 패턴면에서 차이를 보이지 않으나 시스템 H/W제어를 하는 역할과 비교적 가벼운 메시지전달 역할자로써 구분지을 있다.

(꼭 메시지 전달용이아닌 개발자 자유롭게 사용하면 된다.)

 

1. Event 정의

모든 이벤트는 미리 정의 사용되며 보통 하나의 헤더파일(event.h) 열거형으로 동작은 정의되어있다.

이벤트를 정의할 때는 bit mask 이용하는 것이 편하다. 이유는 동시에 여러 개의 이벤트를 set하여 변수 하나로 처리할 있고 헷갈려 실수하게되는 것도 막을 있기 때문이다.

 

Event 열거형으로 정의한 후에는 하나의 변수를 만들어 flag역할을 진행한다.

기본적으로 해당 변수를 이용하여 bit값을 set해주고 check해주는 방식으로 이벤트를 set하고 read 있다.

앞서 바와 같이 bit masking 이용하여 Event 정의하게되면 flag 변수의 bit 만큼 이벤트 갯수가 존재할 있고

Bit 코딩을통해 flag bit 살펴봄으로써 이벤트를 구분지을 있다.

 

 

2. Event 통한 Task대화

Event 통한 Task 처리는 쉽다. 특정 Task 동작할 (버튼이 눌릴때) 미리 정의한 Event bit set해준다.

그리고 Event handler 담당하는 task Event flag 지속적으로 관찰하고 있다가 set 것을 확인하고 이벤트 동작을 처리해주면 된다.

 

이러한 처리를 위해서 Event handler 역할을 하는 Task 해당 이벤트를 받았을 처리할 동작을 코딩하고 추가로 이벤트 플래그를 계속 checking 있도록 코딩이 필요하다.

 

3. Event Flag 동시처리

앞서 언급한바와 같이 bit mask 이용해서 이벤트를 처리하면 동시에 이벤트 flag set하고 전달할 있다.

하지만 이벤트 핸들러 입장에서는 동시에 처리하도록 bit값을 확인한다고해도 결국 flag에서 먼저 읽는 bit값이 존재할 것이고 어떤걸 먼저읽고 처리하냐에 따라 이벤트의 우선순위를 결졍해줄 있다.

 

또한 3개의 이벤트가 존재하고 2개의 핸들러가 있다고 가정하자

이벤트 핸들러1 = 처리가능 이벤트 A,B

이벤트 핸들러2 = 처리가능 이벤트 C

처럼 이벤트 코딩을 진행했을 만약 이벤트 A,B,C 모두 set되고 이벤트 핸들러1 먼저 dispatch 올라왔을때 이벤트 A,B 우선순위 높은 개만 처리하고 context switch를진행해서 C처리 다시 남은 이벤트를 처리할지 혹은 하나의 Task disaptch올라왔을 처리할 있는 set 이벤트를 모두 처리하고 context switch 발생하게 할지 등의 소스코드 설계가 필요하다.

 

  • Ref

임베디드 OS 만들기

 

+ Recent posts