Nucleus RTOS는 세마포어 관리를 위한 필수 유틸리티를 제공하는 4가지 API 콜을 제공합니다: 세마포어 리셋, 상세 세마포어 정보 조회, 애플리케이션 내 총 세마포어 수 세기, 모든 세마포어 객체 포인터 획득. 처음 세 함수는 Nucleus SE에서 완전히 구현됩니다.
세마포어 리셋
대부분의 커널 객체와 달리, 세마포어 리셋은 단순히 컴파일 타임 값으로 재초기화하는 것이 아니라 지정된 초기 카운트로 복원합니다. 세마포어에서 블로킹된 모든 태스크는 즉시 깨어나 반환 코드 NUSE_SEMAPHORE_WAS_RESET(Nucleus RTOS에서는 NU_SEMAPHORE_RESET)을 받습니다.
세마포어 리셋을 위한 Nucleus RTOS API 콜
서비스 콜 프로토타입:
STATUS NU_Reset_Semaphore(NU_SEMAPHORE *semaphore, UNSIGNED initial_count);
매개변수:
semaphore – 사용자 제공 세마포어 컨트롤 블록 포인터.
initial_count – 세마포어 카운터를 설정할 값.
반환:
NU_SUCCESS – 작업 성공.
NU_INVALID_SEMAPHORE – 세마포어 포인터가 유효하지 않음.
세마포어 리셋을 위한 Nucleus SE API 콜
서비스 콜 프로토타입:
STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE semaphore, U8 initial_count);
매개변수:
semaphore – 리셋할 세마포어 인덱스(ID).
initial_count – 세마포어 카운터를 설정할 값.
반환:
NUSE_SUCCESS – 작업 성공.
NUSE_INVALID_SEMAPHORE – 세마포어 인덱스가 유효하지 않음.
Nucleus SE의 세마포어 리셋 구현
NUSE_Semaphore_Reset() 루틴은 인수를 검증한 후 새 카운트를 NUSE_Semaphore_Counter[] 배열에 씁니다. 블로킹이 활성화되면 태스크 테이블을 순회해 세마포어에서 일시 중단된 태스크를 찾아 준비 상태로 표시하고 NUSE_SEMAPHORE_WAS_RESET 반환 코드를 할당한 뒤, 우선순위 스케줄러가 활성화된 경우 리스케줄을 트리거합니다.