728x90
반응형
이벤트 플래그는 플래그에 특정한 값이 설정될때까지 태스크들을 대기 시키는 일을 한다.
이벤트 플래그를 구현하기위한 구조로 아래와 같은 자료를 포함하는 구조체를 만들었다
TCB* wait_head
TCB* Wait_last
uint32_t Flag
wait_head와 wait_last는 이벤트 플래그를 대기하는 태스크들을 링크드리스트로 만들기 위한 것이고
Flag는 현재 설정된 플래그값을 저장하기 위한 것이다.
이벤트 대기리스트는 우선수위와 무관하게 대기하는 순서대로 차례대로 추가될 것이고
플레그가 설정(SET)될 때는 들어온 순서대로 처리하게되는 FIFO 방식으로 동작하게 된다.
구현한 함수목록으로는 아래와 같다.
1) uint8_t Create_EF(void)
2) uint32_t Delete_EF(uint8_t handle)
3) uint32_t Set_EF(uint8_t handle, uint32_t flag)
4) uint32_t Wait_EF(uint8_t handle, uint32_t flag, uint8_t condition)
5) uint32_t Clear_EF(uint8_t handle)
1) Create_EF
이벤트 플래그를 생성하고 생성한 이벤트플래그에 접근하기위한 핸들을 리턴한다
이벤트 플래그를 사용하기위해서는 가장먼저 이벤트 플래그를 생성해야 할 것이다.
2) Delete_EF
생성되어있는 이벤트 플래그를 삭제한다.
삭제를 한다고해서 해당 이벤트 플래그가 메모리상에서 사라지는 것은 아니다.
삭제할때 해당 이벤트플래그에 대해서 대기하고 있는 태스크가 있다면 이 함수는 에러를 리턴하게 될 것이다.
그렇지 않으면 대기하는 태스크는 영원히 깨어나지 못하게 된다.
3) Set_EF
이벤트 플래그를 설정하는 함수이다
해당 이벤트 플래그에 대기하는 태스크가 없다면 단지 플래그 값만 설정하고 함수는 종료 될 것이다.
하지만 대기하는 태스크가 있다면 태스크가 기다리는 플래그값과 조건에 따라서
대기하는 태스크들을 다시 실행상태로 돌리게 될 것이다.
5) Wait_EF
이벤트 플래그를 대기하는 함수이다.
여기서 중요한건 단지 똑같은 플래그를 대기 하는게 아니라 3번째 인자로 들어오는 조건 값이다
조건 값은 아래와 같다.
EF_AND
EF_OR
EF_CLR
해당 조건값은 여러개를 쓸수 있으나 EF_AND와 EF_OR은 같이 쓸수 없다
AND조건은 말그대로 기다리는 플래그 값과 이벤트 플래그가 가지는 플래그값이 완전 일치했을경우에만
대기상태에서 벗어날 수 있다.
OR 조건은 기대리는 플래그값이 이벤트 플래그에 설정만되어있으면 대기상태에서 벗어날 수 있다.
CLR 조건은 AND/OR 조건이 만족했을경우 해당 이벤트 플래그의 값을 초기화 할 때 쓸 수 있다.
6) Clear_EF
말그대로 해당 이벤트 플래그값을 초기화 한다.
728x90