산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 임베디드

Nucleus RTOS의 세마포어: 유틸리티 서비스 및 데이터 구조

Nucleus RTOS의 세마포어: 유틸리티 서비스 및 데이터 구조
RTOS Revealed 시리즈 보기

이 기사는 세마포어에 대한 탐구를 이어갑니다.

세마포어 유틸리티 서비스

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 반환 코드를 할당한 뒤, 우선순위 스케줄러가 활성화된 경우 리스케줄을 트리거합니다.

while (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SEMAPHORE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Semaphore_Blocking_Count[semaphore]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif

모든 일시 중단된 태스크가 적절한 반환 코드와 함께 준비 상태로 전환됩니다. 우선순위 스케줄러가 활성화되면 NUSE_Reschedule()이 높은 우선순위 태스크가 낮은 우선순위 태스크를 선점할 수 있게 보장합니다.

세마포어 정보

이 서비스 콜은 세마포어에 대한 주요 세부 정보를 검색합니다. Nucleus SE에서는 객체 명명, 일시 중단 순서, 태스크 일시 중단이 지원되지 않을 수 있으므로 더 적은 필드가 반환됩니다.

세마포어 정보를 위한 Nucleus RTOS API 콜

서비스 콜 프로토타입:

STATUS NU_Semaphore_Information(NU_SEMAPHORE *semaphore,
CHAR *name, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);

매개변수:

semaphore – 요청된 세마포어 컨트롤 블록 포인터.

name – 세마포어 이름 대상 버퍼(8자 + null 종결자).

current_count – 현재 세마포어 카운터 값 수신.

suspend_type – 일시 중단 정책 수신(예: NU_FIFO 또는 NU_PRIORITY).

tasks_waiting – 세마포어에서 일시 중단된 태스크 수 수신.

first_task – 첫 번째 일시 중단된 태스크의 컨트롤 블록 포인터 수신.

반환:

NU_SUCCESS – 콜 성공.

NU_INVALID_SEMAPHORE – 세마포어 포인터 무효.

세마포어 정보를 위한 Nucleus SE API 콜

서비스 콜 프로토타입:

STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE semaphore,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task);

매개변수:

semaphore – 세마포어 인덱스.

current_count – 현재 카운터 값 수신.

tasks_waiting – 일시 중단된 태스크 수 수신(태스크 일시 중단 활성화 시).

first_task – 첫 번째 일시 중단된 태스크 인덱스 수신(태스크 일시 중단 활성화 시).

반환:

NUSE_SUCCESS – 콜 성공.

NUSE_INVALID_SEMAPHORE – 세마포어 인덱스 무효.

NUSE_INVALID_POINTER – 하나 이상의 포인터 인수 무효.

Nucleus SE의 세마포어 정보 구현

구현은 간결합니다: 크리티컬 섹션에 진입해 카운터 값을 복사하고, 블로킹이 활성화되면 태스크 테이블을 열거해 대기 태스크 수와 첫 번째 일시 중단 태스크를 식별합니다. 그렇지 않으면 대기 카운트와 첫 태스크를 0으로 설정.

NUSE_CS_Enter(); *current_count = NUSE_Semaphore_Counter[semaphore]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif NUSE_CS_Exit(); return NUSE_SUCCESS;

세마포어 개수 획득

이 서비스는 애플리케이션에 정의된 총 세마포어 수를 반환합니다. Nucleus RTOS에서는 런타임에 변경 가능; Nucleus SE에서는 빌드 타임에 고정.

세마포어 개수를 위한 Nucleus RTOS API 콜

서비스 콜 프로토타입:

UNSIGNED NU_Established_Semaphores(VOID);

반환:

애플리케이션에서 생성된 세마포어 수.

세마포어 개수를 위한 Nucleus SE API 콜

서비스 콜 프로토타입:

U8 NUSE_Semaphore_Count(void);

반환:

애플리케이션에서 구성된 세마포어 수.

Nucleus SE의 세마포어 개수 구현

루틴은 단순히 컴파일 타임 상수 NUSE_SEMAPHORE_NUMBER 값을 반환합니다.

2페이지 계속: “데이터 구조” >>

임베디드

  1. 클라우드 vs 온프레미스 서버: 올바른 호스팅 솔루션 선택하기
  2. 마이크로소프트 Azure, 블록체인 토큰화 & 데이터 관리 서비스 발표
  3. 디지털 메모리 기초: 어드레싱, 접근 방식, 휘발성
  4. C# 변수와 기본 데이터 타입 완벽 가이드
  5. C++ 구조체 vs 클래스: 임베디드 개발자를 위한 실용 가이드
  6. Nucleus SE의 메일박스: 구성 및 사용 실용 가이드
  7. Nucleus SE의 세마포어: 개요, 구성, API 핵심
  8. 이벤트 플래그 그룹 마스터하기: Nucleus RTOS/SE의 유틸리티 서비스와 데이터 구조
  9. Nucleus SE의 이벤트 플래그 그룹: 구성 및 API 사용 입문 가이드
  10. Nucleus SE 큐: 소개와 핵심 서비스 콜