이벤트란 특정 트리거가 발생했을 때 해당 트리거를 기반으로 취하는 행동을 의미한다.
트리거 -> 핸들러 -> 동작
의 패턴을 가지기 때문에 인터럽트와 매우유사한 패턴을 볼 수있다. 하지만 이벤트는 인터럽트와 달리 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 만들기
'OS > Firmware Project' 카테고리의 다른 글
[MOON OS] Moon OS Project (2) - GPIO (0) | 2021.09.20 |
---|---|
[MOON OS] Moon OS Project (1) - Barebone code (0) | 2021.08.21 |
[OS] Firmware Project (7) - Task (0) | 2021.07.25 |
[OS] Firmware Project (6) - Interrupt (0) | 2021.07.17 |
[OS] Firmware Project (5) - 입출력 (0) | 2021.06.28 |