Event Flag

공부기록·2023년 10월 15일
0
post-thumbnail

event flag

  • 여러 이벤트에 대한 동기화에 쓰인다.
  • 이벤트 발생시 특정 비트를 1이나 0으로 설정한다.
  • 메세지의 전달은 불가하다.
  • 관련 함수
    • OSFlagCreate(OS_FLAGS flags, INT8U err)
    • OSFlagDel()
    • OSFlagPend(OS_FLAG pgrp, OS_FLAGS flags, INT8U wait_type, INT8U timeout, INT8U err)
    • OSFlagPost(OS_FLAG_GRP pgrp, OS_FLAGS flags, INT8U opt, INT8U err)
    • OSFlagAccept()
    • OSFlagQuery()

  • 사용예시
    • 우선 순위 높은 task를 우선순위가 낮은 2개의 task가 blocking하는데 사용
      • H : PEND(flag_grp, 0x03)
      • M : POST(flag_grp, 0x01)
      • L : POST(flag_grp, 0x02)

Event Flags Group Structure

	typedef struct {
    	INT8U OSFlagType;
        void *OSFlagWaitList; //Wait List의 첫번째를 가르키는 포인터
        OS_FLAGS OSFlagFlags; //몇비트로 설정한건지
    } OS_FLAG_GRP;

Event Flags Node Structure

	typedef struct {
    	void *OSFlagNodeNext;
        void *OSFlagNodePrev;
        void *OSFlagNodeTCB; 
        void *OSFlagNodeFlagGrp; //EventFlagGroupt을 가르키는 포인터
        OS_FALGS OSFlagNodeFlags; //대기중인 event flag
        INT8U OSFlagNodeWaitType;
    } OS_FLAG_NODE;



구조



두번째는 OS_FLAG_GRP아니고 OS_FLAG_NODE임

  • OS_FLAG_GRP의 FLAGS는 task가 호출한 OSFlagPost()로 인하여 설정이 가능하다. OSFlagCreate()함수 호출 시 생성된다.

  • OS_FLAG_NODE의 FLAGS는 task가 호출한 OSFlagPend()로 생성된 구조체로 GRP의 Flag가 해당 구초체의 Flag 조건과 같을 때 함수를 호출한 task가 깨어난다.


    OSFlagCreate()수행시 OS_FLAG_GRP 구조체를 생성한다. OSFlagPend()함수 실행시 조건으로 flag가 생성되는데 이를 만족시키기 전까지는 wait상태가 된다. OSFlagPost()함수를 이용하여 grp의 flag값을 설정하여 wait상태의 task를 ready상태로 변경할 수 있다.



관련함수


  • OSFlagCreate(OS_FLAGS flags, INT8U err) : OS_FLAG_GRP 생성
  • OSFlagPend(OS_FLAG pgrp, OS_FLAGS flags, INT8U wait_type, INT8U timeout, INT8U err)
    • option
      • OS_FLAG_WAIT_SET_ALL, OS_FLAG_WAIT_SET_ANY, 1의 조건
      • OS_FLAG_WAIT_CLR_ALL, OS_FLAG_WAIT_CLR_ANY, 0의조건
      • OS_FLAG_CONSUME : 호출 이후에 flag 비트를 모두 0으로 바꾸는 옵션
    • 호출하는 커널 함수
      • OS_FlagBlock : flag wail list에 추가하고 후에 OS_Sched() 호출한다.
      • OSFlagUnlink : timeout에 의한 만료로 링크를 해제한다.
  • OSFlagPost(OS_FLAG_GRP pgrp, OS_FLAGS flags, INT8U opt, INT8U err)
    • 플래그를 키거나 끄는 역할
    • option
      • OS_FLAG_SET
      • OS_FLAG_CLEAR

  • 예시
	OS_FLAG_GRP *e_grp;
    INT8U err;
    
    e_grp = OSFlagCreate(0x00, &err);
    
    OSFlagPend(e_grp, 0x01, OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, 0, &err);
    
    OSFlagPost(e_grp, 0x01, OS_FLAG_SET, &err)
    

0개의 댓글

관련 채용 정보