반응형
이벤트 그룹의 개념과 활용 사례
이벤트 그룹은 FreeRTOS에서 여러 태스크 간의 동기화를 위해 사용되는 강력한 도구입니다. 이벤트 그룹은 비트 필드 형식으로 구성되며, 각각의 비트가 특정 이벤트를 나타냅니다. 이를 통해 여러 이벤트를 관리하고, 태스크 간의 협업을 쉽게 구현할 수 있습니다.
이벤트 그룹의 주요 특징
- 비트 기반 동기화: 각 비트는 고유의 이벤트를 나타냅니다.
- 여러 이벤트 처리: 하나의 함수 호출로 여러 이벤트를 동시에 처리할 수 있습니다.
- 효율적인 태스크 관리: 이벤트를 통해 태스크 간의 협업이 간소화됩니다.
활용 사례
- 센서 데이터 수집: 여러 센서에서 데이터를 수집한 후 이벤트로 태스크를 트리거.
- 네트워크 통신: 데이터 송수신이 완료된 시점을 동기화.
- UI 업데이트: 특정 작업이 완료된 후 UI 갱신.
osEventFlagsSet() 및 osEventFlagsWait() 함수
CMSIS-RTOS API에서 이벤트 그룹을 사용하는 핵심 함수는 osEventFlagsSet()
과 osEventFlagsWait()
입니다.
osEventFlagsSet()
이 함수는 이벤트 플래그의 특정 비트를 설정하여 해당 이벤트가 발생했음을 알립니다.
uint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags);
매개변수
ef_id
: 이벤트 플래그의 ID.flags
: 설정할 비트의 값 (1로 설정).
반환값
- 현재 이벤트 플래그의 값.
- 오류 시 반환 값:
osFlagsError
.
사용 예제
osEventFlagsSet(event_flags_id, SENSOR_DATA_READY);
osEventFlagsWait()
이 함수는 이벤트 플래그의 특정 비트가 설정될 때까지 대기합니다.
uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout);
매개변수
ef_id
: 이벤트 플래그의 ID.flags
: 대기할 비트의 값.options
: 이벤트 조건 (모든 비트 대기, 일부 비트 대기 등).timeout
: 대기 제한 시간 (ms 단위).
반환값
- 이벤트 플래그 값.
- 오류 시 반환 값:
osFlagsErrorTimeout
,osFlagsErrorResource
, 등.
사용 예제
osEventFlagsWait(event_flags_id, SENSOR_DATA_READY, osFlagsWaitAny, osWaitForever);
이벤트 기반 태스크 간 동작 예제
다음은 여러 센서 데이터를 처리하는 예제입니다. 이벤트 플래그를 사용해 센서 태스크와 데이터 처리 태스크 간의 동작을 동기화합니다.
전체 구조
- 센서 데이터 준비 이벤트를 각 센서 태스크에서 생성.
- 데이터 처리 태스크가 모든 센서 데이터 준비 이벤트를 대기.
주요 상수 및 변수 정의
#include "cmsis_os2.h"
#define SENSOR1_READY (1 << 0)
#define SENSOR2_READY (1 << 1)
#define SENSOR3_READY (1 << 2)
osEventFlagsId_t event_flags_id;
이벤트 플래그 초기화
void init_event_flags(void) {
event_flags_id = osEventFlagsNew(NULL);
if (event_flags_id == NULL) {
// 오류 처리
printf("이벤트 플래그 생성 실패\n");
while (1);
}
}
센서 태스크 구현
void sensor1_task(void *argument) {
while (1) {
// 센서 데이터 수집 시뮬레이션
osDelay(1000);
printf("Sensor 1 데이터 준비 완료\n");
osEventFlagsSet(event_flags_id, SENSOR1_READY);
}
}
void sensor2_task(void *argument) {
while (1) {
osDelay(1500);
printf("Sensor 2 데이터 준비 완료\n");
osEventFlagsSet(event_flags_id, SENSOR2_READY);
}
}
void sensor3_task(void *argument) {
while (1) {
osDelay(2000);
printf("Sensor 3 데이터 준비 완료\n");
osEventFlagsSet(event_flags_id, SENSOR3_READY);
}
}
데이터 처리 태스크 구현
void data_processing_task(void *argument) {
while (1) {
// 모든 센서 데이터 준비 이벤트 대기
uint32_t flags = osEventFlagsWait(event_flags_id,
SENSOR1_READY | SENSOR2_READY | SENSOR3_READY,
osFlagsWaitAll,
osWaitForever);
if ((flags & (SENSOR1_READY | SENSOR2_READY | SENSOR3_READY)) ==
(SENSOR1_READY | SENSOR2_READY | SENSOR3_READY)) {
printf("모든 센서 데이터 처리 중\n");
osDelay(500);
printf("데이터 처리 완료\n");
}
}
}
main 함수
int main(void) {
osKernelInitialize();
init_event_flags();
osThreadNew(sensor1_task, NULL, NULL);
osThreadNew(sensor2_task, NULL, NULL);
osThreadNew(sensor3_task, NULL, NULL);
osThreadNew(data_processing_task, NULL, NULL);
osKernelStart();
while (1);
}
정리
이벤트 그룹은 태스크 간의 동기화 문제를 간단하고 효과적으로 해결할 수 있는 도구입니다. 위의 예제에서는 센서 데이터 처리 워크플로우에서 이벤트 플래그를 활용해 태스크 간의 협업을 구현했습니다. 이를 바탕으로 다양한 시나리오에 맞는 이벤트 기반 동작을 설계해보세요!
반응형
'FreeRTOS' 카테고리의 다른 글
FreeRTOS Idle Task와 Power Management (0) | 2025.01.16 |
---|---|
FreeRTOS 타이머와 시간 관리 (0) | 2025.01.15 |
FreeRTOS Semaphore와 Mutex 활용하기 (0) | 2025.01.14 |
FreeRTOS Queue와 데이터 통신 (0) | 2025.01.13 |
FreeRTOS Task (0) | 2025.01.12 |