OSEK 이벤트는 OSEK OS에서 태스크를 동기화하는 수단이다. 이벤트는 독립된 객체가 아니라 extended 태스크에 딸리며, 그 태스크만 자기 이벤트를 기다릴 수 있다.[1] 다른 RTOS의 이벤트 플래그는 이벤트 플래그에서 다룬다.
소유와 설정
이벤트를 가진 extended 태스크를 그 이벤트의 소유자라 한다. extended 태스크마다 정해진 수의 이벤트가 있고, 이벤트 하나는 소유 태스크와 이름(또는 마스크)으로 가린다. 시스템 서비스는 이벤트를 비트로 다루며 이벤트 마스크를 인자로 받는다.[1]
어느 태스크든, 그리고 category 2 ISR도 SetEvent로 suspended가 아닌 extended 태스크의 이벤트를 설정할 수 있다. 설정하는 쪽은 basic 태스크여도 된다. 이벤트를 지우는 ClearEvent와 기다리는 WaitEvent는 소유 태스크만 부를 수 있다. GetEvent는 extended 태스크의 모든 이벤트 비트의 현재 상태를 돌려준다. SetEvent는 마스크에 없는 이벤트를 바꾸지 않으며, hook 루틴에서는 부를 수 없다.[1]
extended status에서는 extended 태스크가 아닌 태스크가 WaitEvent나 ClearEvent를 부르면 E_OS_ACCESS를 돌려주고, suspended 상태의 태스크에 SetEvent를 부르면 E_OS_STATE를 돌려준다. extended 태스크가 아닌 태스크에 SetEvent를 부르면 E_OS_ACCESS를, suspended 상태의 태스크에 GetEvent를 부르면 E_OS_STATE를 돌려준다.[1] extended status는 OSEK hook 루틴에서 다룬다.
기다림과 깨어남
WaitEvent를 부른 태스크는 마스크에 지정한 이벤트 가운데 하나라도 설정될 때까지 waiting 상태로 머문다. 기다리던 이벤트 가운데 하나가 설정되면 태스크는 waiting에서 ready로 옮긴다. WaitEvent로 재스케줄링이 일어나면, 태스크가 waiting에 있는 동안 그 태스크의 internal resource가 풀린다.[1]
비선점 스케줄링에서는 이벤트를 설정한 직후에 재스케줄링이 일어나지 않는다. 기다리던 태스크의 우선순위가 더 높아도, 이벤트를 설정한 태스크는 다음 재스케줄링 지점까지 계속 돈다.[1]
WaitEvent를 부를 때 지정한 이벤트 가운데 하나가 이미 설정되어 있으면, 기다릴 필요가 없으므로 태스크는 그대로 실행을 이어 가고, 재스케줄링도 없다. 설정된 이벤트는 태스크가 깨어난 뒤에도 저절로 지워지지 않고, 이벤트를 지울 수 있는 것은 소유 태스크뿐이다. 그래서 같은 이벤트를 다시 기다리려면 먼저 ClearEvent로 지워야 한다.[1]
extended 태스크가 suspended에서 ready로 활성화되면, 운영체제가 그 태스크의 이벤트를 모두 지운다.[1]
이벤트를 받는 쪽은 언제나 extended 태스크다. 그래서 ISR과 basic 태스크는 이벤트를 기다릴 수 없다. basic 태스크에는 waiting 상태가 없다.[1]
설정
OSEK/VDX OIL 2.5 명세는 EVENT 객체를 마스크로 나타내고, 이벤트 이름을 그 마스크의 다른 이름으로 둔다. 이름이 같은 이벤트는 같은 이벤트라 마스크도 같지만, 마스크가 같다고 같은 이벤트는 아니다. MASK 속성은 UINT64 정수이거나 AUTO이며, AUTO면 그 이벤트를 참조하는 태스크들 사이에서 겹치지 않는 비트 하나가 자동으로 배정된다.[2]