Nucleus SE의 이벤트 플래그 그룹: 구성 및 API 사용 입문 가이드
RTOS Revealed 시리즈 보기
이벤트 플래그 그룹은 Nucleus SE에서 시그널과 유사하지만 더 풍부한 기능을 제공하는 경량, 유연한 태스크 간 통신 메커니즘입니다.
이벤트 플래그 사용하기
Nucleus SE에서 이벤트 플래그는 빌드 타임에 구성됩니다. 최대 16개 그룹을 정의할 수 있습니다. 구성하지 않으면 RTOS가 관련 데이터 구조와 API 코드를 모두 생략합니다.
이벤트 플래그 그룹 구성
이벤트 플래그 그룹 수
구성은 nuse_config.h의 #define 지시어로 제어됩니다. 핵심 매크로 NUSE_EVENT_GROUP_NUMBER는 애플리케이션이 사용할 그룹 수를 설정합니다(기본값 0). 16 초과 또는 음수 값은 nuse_config_check.h가 생성하는 컴파일 타임 #error를 유발합니다.
0이 아닌 값으로 설정하면 이벤트 플래그 서브시스템이 활성화되어 데이터 구조가 할당되고 API 인에이블이 고려됩니다.
API 활성화
각 서비스 콜은 nuse_config.h에 인에이블 매크로를 가집니다:
NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT
기본적으로 모두 FALSE로 해당 기능 비활성화. API 사용을 위해 원하는 매크로를 TRUE로 설정. NUSE_EVENT_GROUP_NUMBER가 0인데 API를 활성화하면 컴파일 타임 에러 발생(NUSE_Event_Group_Count()는 항상 사용 가능).
기본 nuse_config.h 발췌:
#define NUSE_EVENT_GROUP_NUMBER 0 /* 이벤트 그룹 수 – 0‑16 */ #define NUSE_EVENT_GROUP_SET FALSE /* 서비스 콜 인에이블러 */ #define NUSE_EVENT_GROUP_RETRIEVE FALSE /* 서비스 콜 인에이블러 */ #define NUSE_EVENT_GROUP_INFORMATION FALSE /* 서비스 콜 인에이블러 */ #define NUSE_EVENT_GROUP_COUNT FALSE /* 서비스 콜 인에이블러 */
활성화되지 않은 API를 코드에서 참조하면 링커가 구현 생략으로 에러를 냅니다.
이벤트 플래그 서비스 콜
Nucleus SE는 이벤트 플래그 관련 7개 서비스 콜을 제공하지만 4개만 구현:
NUSE_Event_Group_Set() – 플래그 설정 또는 클리어.
NUSE_Event_Group_Retrieve() – 현재 플래그 상태 읽기.
NUSE_Event_Group_Information() – 그룹 상태 쿼리.
NUSE_Event_Group_Count() – 구성된 그룹 수 획득.
생성, 삭제, 열거는 SE에서 미구현.
전용 리셋 함수는 없으며, NUSE_Event_Group_Set()에 제로 플래그 마스크로 OR 연산해 전체 제로로 리셋 가능.
설정 및 검색 연산
이벤트 플래그는 비트이므로 이진 값으로 표현하는 것이 최적입니다. Nucleus SE는 nuse_binary.h를 제공해 b01010101 같은 모든 8비트 패턴 매크로를 정의합니다.
이벤트 플래그 설정
RTOS와 SE 모두 유사한 API 노출. RTOS 프로토타입:
STATUS NU_Set_Events(NU_EVENT_GROUP *group, UNSIGNED event_flags, OPTION operation);
매개변수:
group – 이벤트 플래그 컨트롤 블록 포인터.
event_flags – 조작할 플래그 비트마스크.
operation – NU_OR(설정) 또는 NU_AND(클리어).
반환 값:
NU_SUCCESS
NU_INVALID_GROUP
NU_INVALID_OPERATION
SE 대응:
STATUS NUSE_Event_Group_Set(NUSE_EVENT_GROUP group, U8 event_flags, OPTION operation);
매개변수와 반환 코드는 RTOS 버전과 유사하며 NUSE_SUCCESS, NUSE_INVALID_GROUP, NUSE_INVALID_OPERATION.
구현 하이라이트
핵심 루틴은 operation을 확인하고 마스크 적용:
NUSE_CS_Enter(); if (operation == NUSE_OR) { NUSE_Event_Group_Data[group] |= event_flags; } else { /* NUSE_AND */ NUSE_Event_Group_Data[group] &= event_flags; }
블로킹이 활성화된 경우(NUSE_BLOCKING_ENABLE), 함수는 모든 태스크를 순회하며 이 그룹에서 일시 중단된 태스크를 깨우고 블로킹 카운터 업데이트. 이후 우선순위 스케줄러 활성화 시 리스케줄 발생 가능.
일시 중단된 태스크는 플래그 상태 변경 시 재개되어 대기 조건을 평가할 수 있습니다.
2페이지 계속 >>