큐와 이벤트 그룹: 태스크끼리 대화하기
전역 변수 대신 큐로 데이터를 넘기고, 이벤트 그룹으로 여러 조건을 한꺼번에 기다립니다.
큐
데이터를 복사해서 넘기는 FIFO입니다. 큐가 비어 있으면 받는 태스크는 잠들어 기다리고, 데이터가 들어오면 깨어납니다.
typedef struct { int16_t ax, ay, az; } imu_t;
QueueHandle_t q = xQueueCreate(8, sizeof(imu_t));
// 생산자
xQueueSend(q, &sample, 0);
// 소비자
imu_t s;
if (xQueueReceive(q, &s, pdMS_TO_TICKS(10)) == pdTRUE) { /* 처리 */ }
- 전역 변수와 뮤텍스 조합보다 실수할 여지가 적습니다.
- 큰 데이터는 복사 비용이 크니 포인터나 버퍼 번호를 넘기고 소유권을 명확히 합니다.
- 가득 찼을 때 버릴지, 기다릴지, 덮어쓸지 정합니다.
이벤트 그룹
비트 여러 개로 된 플래그 묶음입니다. "IMU 준비 그리고 GPS 준비"처럼 여러 조건을 동시에 기다리거나, 하나라도 오면 깨어나게 할 수 있습니다.
태스크 알림 (Task Notification)
FreeRTOS에서 특정 태스크 하나에 신호나 값 하나를 보낼 때는 태스크 알림이 세마포어보다 빠르고 메모리도 적게 씁니다.
고르는 기준
| 필요 | 도구 |
|---|---|
| 데이터 전달 | 큐 |
| 일이 생겼다는 신호 하나 | 태스크 알림, 이진 세마포어 |
| 여러 조건 조합 | 이벤트 그룹 |
| 자원 독점 | 뮤텍스 |