Event Control Blocks (ECB)란? 실시간 운영체제(RTOS)에서의 역할과 활용
1. Event Control Blocks (ECB) 개요
실시간 운영체제(RTOS)에서 **태스크(Task)와 인터럽트 서비스 루틴(ISR)**은 **이벤트 컨트롤 블록(ECB, Event Control Block)**을 통해 신호를 주고받습니다. 즉, 태스크 간 동기화 및 메시지 전달을 수행하는 중요한 커널 오브젝트입니다.
✅ ECB의 주요 기능
- 세마포어 관리 (Semaphore Management)
- 상호배제 세마포어 (Mutex) 관리
- 메시지 메일박스 관리 (Message Mailbox Management)
- 메시지 큐 관리 (Message Queue Management)
2. ECB 데이터 구조
uC/OS-II
와 같은 RTOS에서는 이벤트 컨트롤 블록을 관리하기 위해 OS_EVENT
구조체를 사용합니다.
typedef struct {
INT8U OSEventType; /* 이벤트 타입 (Semaphore, Mutex, Mailbox, Queue) */
INT8U OSEventGrp; /* 대기 리스트 그룹 */
INT16U OSEventCnt; /* 세마포어 카운트 */
void *OSEventPtr; /* 메시지 또는 큐 구조체 포인터 */
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* 이벤트 발생 대기 중인 태스크 리스트 */
} OS_EVENT;
📌 ECB의 주요 요소
- OSEventType: 세마포어, 뮤텍스, 메일박스, 메시지 큐 등을 구분하는 타입 값.
- OSEventGrp & OSEventTbl: 대기 중인 태스크 리스트.
- OSEventCnt: 세마포어일 경우 카운트 값.
- OSEventPtr: 메시지 또는 메시지 큐의 포인터.
3. ECB 대기 리스트 관리
✅ 태스크를 ECB 대기 리스트에 삽입하는 코드
pevent->OSEventGrp |= OSMapTbl[prio >> 3];
pevent->OSEventTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
✅ 태스크를 ECB 대기 리스트에서 제거하는 코드
if ((pevent->OSEventTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0) {
pevent->OSEventGrp &= ~OSMapTbl[prio >> 3];
}
4. 자유 ECB 리스트 관리
RTOS에서 할당할 수 있는 ECB의 개수는 응용 프로그램에서 사용하는 세마포어, 뮤텍스, 메일박스, 메시지 큐 개수에 따라 결정됩니다.
OS_MAX_EVENTS (OS_CFG.H)
에서 정의됨OSInit()
함수 호출 시, 모든 ECB가 단일 연결 리스트 형태로 초기화됨
📌 ECB가 수행하는 일반적인 작업
- ECB 초기화 (
OSEventWaitListInit()
) - 태스크를 대기 상태로 만들기 (
OSEventTaskWait()
) - 타임아웃 시 태스크를 준비 상태로 만들기 (
OSEventTO()
)
5. ECB 관련 함수 분석
✅ OSEventWaitListInit() (ECB 초기화)
ECB가 생성될 때, 대기하는 태스크가 없도록 초기화하는 함수입니다.
void OSEventWaitListInit (OS_EVENT *pevent) {
pevent->OSEventGrp = 0x00;
pevent->OSEventTbl[0] = 0x00;
}
✅ OSEventTaskRdy() (대기 중인 태스크를 준비 상태로 변경)
세마포어나 메시지 큐에서 신호가 오면 대기 중인 태스크 중 가장 높은 우선순위 태스크를 실행 가능 상태로 변경하는 함수입니다.
void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk) {
if ((pevent->OSEventTbl[y] &= ~bitx) == 0) {
pevent->OSEventGrp &= ~bity;
}
OSTCBPrioTbl[prio]->OSTCBStat &= ~msk;
}
✅ OSEventTaskWait() (태스크를 이벤트 대기 상태로 전환)
해당 ECB를 기다리는 태스크를 대기 리스트에 삽입하는 함수입니다.
void OSEventTaskWait (OS_EVENT *pevent) {
OSTCBCur->OSTCBEventPtr = pevent;
pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
}
✅ OSEventTO() (타임아웃 시 태스크를 준비 상태로 변경)
타임아웃이 발생하면 ECB 대기 리스트에서 태스크를 제거하고 준비 상태로 변경합니다.
void OSEventTO (OS_EVENT *pevent) {
if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBStat = OS_STAT_RDY;
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
}
6. RTOS에서 ECB의 중요성
실시간 운영체제(RTOS)에서 **Event Control Block (ECB)**은 태스크 간 동기화 및 인터럽트 관리에 필수적인 역할을 합니다. 세마포어, 메시지 큐, 메일박스, 뮤텍스를 효과적으로 관리하여 시스템의 성능과 안정성을 향상시킵니다.
✅ ECB의 핵심 역할 요약
- 세마포어, 메시지 큐, 메일박스, 뮤텍스 관리
- 태스크 간 이벤트 신호 전달
- 태스크 대기 리스트 및 준비 상태 관리
- 타임아웃 시 태스크의 상태 변경
RTOS 기반 시스템을 개발할 때 ECB의 구조와 기능을 잘 이해하면, 보다 안정적인 태스크 스케줄링과 이벤트 관리를 구현할 수 있습니다!