이벤트 플래그 활용 예시

메인테스크
1. 시동 시작
2. 엔진, 미션, 조향, 제동, 에어백 테스크 생성
3. 각 태스크 진단 결과 대기 -> 이벤트 플래그로 구현
4. 주행시작
EventGroupHandle_t group_id; 로 복수개의 이벤트 플래그를 저장할 수 있다
이벤트 플래그 개념도

xEventGroupSetBits():

- xEventGroup : 어떤 이벤트 그룹
- uxBitsToSet : 그 이벤트 그룹에서 뭘 Set할지
ex) 0x08로 하면 그 이벤트 그룹의 3번 비트가 set 된다
xEventGroupWaitBits():

- xEventGroup : 어떤 이벤트 그룹 기다리는지
- uxBitsToWaitFor : 어떻게 설정된 비트를 기다리는지
- xClearOnExit : PdTRUE로 되어있으면, 자동으로 원래값으로 초기화한다
- xWaitAllBits : And연산, Or 연산을 결정한다. pdFALSE면 or 연산
- xTicksToWait : 비트가 설정되기 까지 기다리는 맥시멈 시간
플래그 실습

플래그 비트 설정 및 그룹 이벤트 플레그 선언
메인 테스크

그룹플래그 생성

OIL_PRES_OK, OIL_TEMP_OK 를 기다린다
설정된 비트를 일단 초기화하고, or연산 한다
맥스로 기다린다
Task1

OIL_PRES를 세팅한다.
논리 구조
메인테스크에서 Wait 호출 하였다 -> Set 될 때 까지 메인 테스크 Blocked
이제 낮은 우선 순위인 Task1이 선점하고 Set한다 -> 메인 테스크가 깨어나서 마저 진행
만약에 3번째 인자를 pdFALSE한다면?

먼저 메인테스크에서 기다리는 두 비트가, Set되어있지 않기 때문에 처음 한 번은 Blocked이 된다
이후 테스크1에서 비트 하나를 Set해주고, 이후 기다리는 비트 조건이 만족했기 때문에 MainTask가 깨어난다

이후 무한 루프이니 계속해서 저 Wait을 만나자마자 Blocked되지 않고, 바로 .을 찍는다
★타임아웃★


- 시작하면 MainTask에서 WaitBits를 만나고, Set을 만나기전까지 Blocked
- Task1에서 Set되고, MainTask의 WaitBits의 조건을 만족하니, MainTask가 Ready로 변하면서 선점
- 메인테스크에서 uxBits에 OIL_PRES_OK가 1이어서 uxBits = 1 담기고 이벤트그룹은 초기화된다
- if문에서 uxBits가 1이니 else에 해당해서 Bit Set Done 되고 무한 루프여서 다시 Wait 및 메인 테스크 Blocked
- Task1이 선점하는데, Set이후부터 다시 진행되니 vTaskDelay를 만나 1초동안 Blocked
- MainTask는 0.5초 이상 Set을 받지 못하였으니 타임아웃 일어나면서 메인테스크가 Ready되고, 메인테스크 실행 된다. 이후 값이 할당되지 않은 이벤트 그룹(3번에서 초기화된 이벤트그룹)을 uxBits에 할당함(uxBits=0), if문에서 uxBits ==0을 만족하니 TimeOut을 출력
- 반복

결과값
각 Bit Set Done 사이는 거의 1초
그럼 1초 사이에 타임아웃이 0.5초는 맥시멈으로 1번 밖에 못 일어나니, 1번 일어나는 것( 아슬아슬하게 2번은 못 한다)
*vTaskDelay를 2초로 했을 때
처음에 Set 되고 총 3번의 타임아웃이 발생 가능하다 4번 TimeOut은 2초를 넘기니, 3번 타임아웃발생하고 그 이후애 Delay가 끝나서 다시 Set될 것
