일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- raspberry
- 디자인패턴
- Android
- dynamodb
- YMODEM
- STM32
- 펌웨어
- 전기차
- 파이썬
- AWS
- flask
- 보안
- thread
- 전기차충전
- 안드로이드
- 완속충전기
- 에버온
- 충전기
- homeassistant
- OCPP
- 전기차충전기
- 급속충전기
- IOT Core
- 라즈베리파이
- 플라스크
- everon
- 서버리스
- 홈어시스턴트
- lambda
- esp8266
- Today
- Total
Louie NRT Story
[펌웨어] FreeRTOS - EventFlag 본문
작성일: 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://www.keil.com/pack/doc/CMSIS/RTOS2/html/group__CMSIS__RTOS__EventFlags.html
'전기차충전기' 카테고리의 다른 글
[에너지교육] 전기차 충전인프라와 운영시스템 구조 - 02 (0) | 2022.08.26 |
---|---|
[전기차충전기 사업] 단기적, 중장기적 시장 분석 (0) | 2022.08.14 |
[에너지교육] ESS설치와 운영 (0) | 2022.07.21 |
[전기차 충전기] 에버온 충전기 연구 및 제조 (0) | 2022.06.29 |
[디자인패턴] 어댑터(Adapter) (0) | 2022.06.14 |