[FreeRTOS]이벤트 플래그

seopppio·2024년 11월 4일

FreeRTOS

목록 보기
9/14

이벤트 플래그 활용 예시


메인테스크
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되지 않고, 바로 .을 찍는다

★타임아웃★

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


결과값
각 Bit Set Done 사이는 거의 1초
그럼 1초 사이에 타임아웃이 0.5초는 맥시멈으로 1번 밖에 못 일어나니, 1번 일어나는 것( 아슬아슬하게 2번은 못 한다)

*vTaskDelay를 2초로 했을 때
처음에 Set 되고 총 3번의 타임아웃이 발생 가능하다 4번 TimeOut은 2초를 넘기니, 3번 타임아웃발생하고 그 이후애 Delay가 끝나서 다시 Set될 것

0개의 댓글