Event Control Blocks (ECB)란? 실시간 운영체제(RTOS)에서의 역할과 활용

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의 주요 요소

  1. OSEventType: 세마포어, 뮤텍스, 메일박스, 메시지 큐 등을 구분하는 타입 값.
  2. OSEventGrp & OSEventTbl: 대기 중인 태스크 리스트.
  3. OSEventCnt: 세마포어일 경우 카운트 값.
  4. 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의 구조와 기능을 잘 이해하면, 보다 안정적인 태스크 스케줄링과 이벤트 관리를 구현할 수 있습니다!

Leave a Comment