Louie NRT Story

[펌웨어] FreeRTOS - EventFlag 본문

전기차충전기

[펌웨어] FreeRTOS - EventFlag

hyeok0724.kim@gmail.com 2022. 7. 29. 16:45
반응형

작성일: 22년 7월 29일

 

Contents

1. 이벤트 플래그(EVENT FLAG)

2. EventFlag 생성하기

3. Set Event Flag 위한 Task01 생성하기

4. Get Event Flag 위한 Task02 생성하기

5. 화면 출력

6. Wait Event Flag 위한 Task03 만들기

 

 

1. 이벤트 플래그(EVENT FLAG)

 - 이벤트 플래그를 만들어서 디바이스의 상태를 점검하는 용도로 씀

 - Bit0 -> 엔진, Bit1 -> 미션 등 Bit 하나하나가 디바이스의 상태를 나타냄

 - 아래의 예제에서는 진단 결과 하나라도 "0" 으로 되어 있다면 주행을 못하게 함

 

 

2. EventFlag 생성하기

 - FreeRTOS를 활성화 하여 Interface는 CMSIS_V2로 설정함

 - Events 탭에서 "Add" 버튼을 이용하여 새로운 Event Flag 를 생성하고 저장함

 

 

3. Set Event Flag 위한 Task01 생성하기

 - osEventFlagsSet() 함수를 이용하여 2초 간격으로 위에서 생성한 event Flag ID, 즉, ex_event_flagHandle을 이용하여 0x00000001 위치의 Bit 값을 변경 시켜줌

void task01_main() {    
    for(;;) {
    	osEventFlagsSet(ex_event_flagHandle, 0x00000001);
        osDelay(2000);
    }
}

 

 

4. Get Event Flag 위한 Task02 생성하기

 - osEventFlagsGet() 함수를 이용하여 1초 간격으로 위에서 생성한 event Flag ID, 즉, ex_event_flagHandle을 이용하여 해당 Bit의 값을 확인함

 - 해당 Bit의 값이 "1"일 경우 "Event Flag" 라는 값을 로그로 찍음

 - osEventFlagsClear 함수를 이용하여 해당 값을 초기화 해주어야 해당 Bit의 값이 "0"으로 초기화됨

 - 초기화 하지 않을 경우 항상 "1"로 남아 있음

void task02_main() {
    uint32_t result_eventFlag = 0;
    
    result_eventFlag = osEventFlagsGet(ex_event_flagHandle);
    if ((result_eventFlag & 0x00000001U) == 0x00000001U) {
    	printf("Event Flag \n");
        osEventFlagsClear(ex_event_flagHandle, 0x00000001U);
    }
    osDelay(1000);
}

 

 

5. 출력 화면

 - 2초 간격으로 Event Flag가 찍히는 것을 확인 할 수 있음

 

 

6. Wait Event Flag 위한 Task03 만들기

 1) 함수에 대한 설명

 - osEventFlagWait() 함수를 이용하여 Blocking 상태로 만들 수 있음

 - 해당 parameter에 대한 값들은 아래에 정의 되어 있으므로 참고해야함

 ※ 해당 함수는 자동으로 Reset 됨

/// Wait for one or more Event Flags to become signaled.
/// \param[in]     ef_id         event flags ID obtained by \ref osEventFlagsNew.
/// \param[in]     flags         specifies the flags to wait for.
/// \param[in]     options       specifies flags options (osFlagsXxxx).
/// \param[in]     timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
/// \return event flags before clearing or error code if highest bit set.
uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout);

 - parameter 들에 대한 옵션

// Timeout value.
#define osWaitForever         0xFFFFFFFFU ///< Wait forever timeout value.

// Flags options (\ref osThreadFlagsWait and \ref osEventFlagsWait).
#define osFlagsWaitAny        0x00000000U ///< Wait for any flag (default).
#define osFlagsWaitAll        0x00000001U ///< Wait for all flags.
#define osFlagsNoClear        0x00000002U ///< Do not clear flags which have been specified to wait for.

// Flags errors (returned by osThreadFlagsXxxx and osEventFlagsXxxx).
#define osFlagsError          0x80000000U ///< Error indicator.
#define osFlagsErrorUnknown   0xFFFFFFFFU ///< osError (-1).
#define osFlagsErrorTimeout   0xFFFFFFFEU ///< osErrorTimeout (-2).
#define osFlagsErrorResource  0xFFFFFFFDU ///< osErrorResource (-3).
#define osFlagsErrorParameter 0xFFFFFFFCU ///< osErrorParameter (-4).
#define osFlagsErrorISR       0xFFFFFFFAU ///< osErrorISR (-6).

2) Blocking 없는 Task03 Main 코드

void task03_main() {
    uint32_t evntFlag = 0;
	evntFlag = osEventFlagsWait(EVNT_FLG_COMMHandle, 0x00000001, osFlagsWaitAny, 0);

	switch(evntFlag) {
		case osFlagsError :
			break;
		case osFlagsErrorUnknown:
			break;
		case osFlagsErrorTimeout :
			break;
		case osFlagsErrorResource :
			break;
		case osFlagsErrorParameter :
			break;
		case osFlagsErrorISR :
			break;
		default :
			printf("DEFAULT %d \n", evntFlag);
			break;
		}
    }
    printf("Done Event Flag\n");
}

3) Non Blocking 출력 화면

 - 2초 간격으로 Event Flag 값을 확인함

 - paramter에서 Timeout = 0으로 설정에서 Blocking 되지 않고 실행되는 것을 알 수 있음

4) Blocking 있는 Task04 Main 코드

void task04_main() {
    uint32_t evntFlag = 0;
	evntFlag = osEventFlagsWait(EVNT_FLG_COMMHandle, 0x00000001, osFlagsWaitAny, osWaitForever);

	switch(evntFlag) {
		case osFlagsError :
			break;
		case osFlagsErrorUnknown:
			break;
		case osFlagsErrorTimeout :
			break;
		case osFlagsErrorResource :
			break;
		case osFlagsErrorParameter :
			break;
		case osFlagsErrorISR :
			break;
		default :
			printf("DEFAULT %d \n", evntFlag);
			break;
		}
    }
    printf("Done Event Flag\n");
}

5) Blocking 출력화면

 - 2초마다 EvantFlag 값이 변경되므로 들어올때까지 기다렸다가 출력함

 

 

Refererece:

https://inf.run/pmMg

 

FreeRTOS 프로그래밍 - 인프런 | 강의

RTOS를 사용하기만 하면 실시간 처리가 된다고 믿고 계시나요? 이 강의를 보시고 확인해보세요. 까다로운 인터럽트, 우선순위, 상호배제, 포팅에 대한 통찰력을 만들어드립니다., - 강의 소개 | 인

www.inflearn.com

https://www.keil.com/pack/doc/CMSIS/RTOS2/html/group__CMSIS__RTOS__EventFlags.html

 

반응형
Comments