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

세마포어:소개 및 기본 서비스


RTOS 공개 시리즈 보기

세마포어는 이전 기사에서 소개되었습니다. 주요 용도는 리소스에 대한 액세스를 제어하는 ​​것입니다.

세마포 사용

Nucleus SE에서 세마포어는 빌드 시 구성됩니다. 응용 프로그램에 대해 최대 16개의 세마포가 구성될 수 있습니다. 세마포어가 구성되어 있지 않으면 세마포어와 관련된 데이터 구조 또는 서비스 호출 코드가 애플리케이션에 포함되지 않습니다.

세마포어는 단순히 U8 유형의 카운터입니다. , 여러 작업에서 안전하게 사용할 수 있도록 액세스가 제어됩니다. 작업은 세마포어를 감소(획득)하고 증가(릴리스)할 수 있습니다. 값이 0인 세마포어를 얻으려고 하면 API 호출 및 Nucleus SE 구성에서 선택한 옵션에 따라 오류 또는 작업 일시 중단이 발생할 수 있습니다.

세마포 구성

세마포어 수

Nucleus SE의 대부분의 측면과 마찬가지로 세마포어의 구성은 주로 #define에 의해 제어됩니다. nuse_config.h의 문 . 주요 설정은 NUSE_SEMAPHORE_NUMBER입니다. , 애플리케이션에 대해 구성된 세마포어 수를 결정합니다. 기본 설정은 0(즉, 세마포어가 사용되지 않음)이며 최대 16까지 값을 설정할 수 있습니다. 잘못된 값은 nuse_config_check.h<의 테스트에 의해 생성되는 컴파일 시간 오류를 발생시킵니다. /강한> (이것은 nuse_config.c에 포함되어 있습니다. 따라서 이 모듈로 컴파일됨) 결과로 #오류 컴파일 중입니다.

0이 아닌 값을 선택하는 것은 세마포어에 대한 "마스터 활성화"입니다. 이에 따라 일부 데이터 구조가 그에 따라 정의되고 크기가 조정되며, 이에 대한 자세한 내용은 이 문서의 뒷부분에서 설명합니다. API 활성화 설정도 활성화합니다.

API 사용

Nucleus SE의 모든 API 기능(서비스 호출)에는 활성화된 #define이 있습니다. nuse_config.h의 기호 . 세마포어의 경우 다음과 같습니다.

NUSE_SEMAPHORE_OBTAIN
NUSE_SEMAPHORE_RELEASE
NUSE_SEMAPHORE_RESET
NUSE_SEMAPHORE_INFORMATION
NUSE_SEMAPHORE_COUNT

기본적으로 모두 FALSE로 설정되어 있습니다. , 따라서 각 서비스 호출을 비활성화하고 구현 코드의 포함을 금지합니다. 애플리케이션에 대한 세마포를 구성하려면 사용하려는 API 호출을 선택하고 활성화 기호를 TRUE로 설정해야 합니다. .

다음은 기본 nuse_config.h에서 발췌한 것입니다. 파일.

#define NUSE_SEMAPHORE_NUMBER 0 /* 시스템의 세마포어 수 - 0-16 */#define NUSE_SEMAPHORE_OBTAIN FALSE /* 서비스 호출 인에이블러 */#define NUSE_SEMAPHORE_RELEASE FALSE /* 서비스 호출 인에이블러 */#define NUSE_ETS 호출 인에이블러 */#define NUSE_SEMAPHORE_INFORMATION FALSE /* 서비스 호출 인에이블러 */#define NUSE_SEMAPHORE_COUNT FALSE /* 서비스 호출 인에이블러 */

세마포어 API 기능이 활성화되어 있고 세마포어가 구성되어 있지 않으면 컴파일 시간 오류가 발생합니다(NUSE_Semaphore_Count() 제외). 항상 허용됨). 코드가 활성화되지 않은 API 호출을 사용하는 경우 애플리케이션에 구현 코드가 포함되지 않았기 때문에 링크 시간 오류가 발생합니다.

세마포어 서비스 호출

Nucleus RTOS는 다음 기능을 제공하는 세마포어와 관련된 8개의 서비스 호출을 지원합니다.

  • 세마포어를 얻습니다. NUSE_Semaphore_Obtain()에 의해 구현됨 Nucleus SE에서.

  • 세마포어를 해제합니다. NUSE_Semaphore_Release()에 의해 구현됨 Nucleus SE에서.

  • 중단된 작업 없이(재설정) 세마포어를 사용되지 않은 상태로 복원합니다. NUSE_Semaphore_Reset()에 의해 구현됨 Nucleus SE에서.

  • 지정된 세마포어에 대한 정보를 제공합니다. NUSE_Semaphore_Information()에 의해 구현됨 Nucleus SE에서.

  • 애플리케이션에 대해 (현재) 구성된 세마포 수를 반환합니다. NUSE_Semaphore_Count()에 의해 구현됨 Nucleus SE에서.

  • 애플리케이션에 새 세마포어를 추가합니다(만들기). Nucleus SE에서는 구현되지 않습니다.

  • 애플리케이션에서 세마포어를 제거합니다(삭제). Nucleus SE에서는 구현되지 않습니다.

  • 응용 프로그램의 모든 세마포어(현재)에 대한 포인터를 반환합니다. Nucleus SE에서는 구현되지 않습니다.

이러한 각 서비스 호출의 구현을 자세히 조사합니다.

세마포어 가져오기 및 릴리스 서비스

세마포어에서 수행할 수 있는 기본 작업은 획득(감소) 및 해제(증가)입니다. Nucleus RTOS와 Nucleus SE는 각각 이러한 작업에 대해 두 가지 기본 API 호출을 제공하며 여기에서 설명합니다.

세마포어 얻기

세마포어를 얻기 위한 Nucleus RTOS API 호출은 매우 유연하여 작업을 즉시 완료할 수 없는 경우 무기한 또는 시간 초과로 일시 중단할 수 있습니다. 즉, 현재 값이 0인 세마포어를 얻으려고 합니다. Nucleus SE는 작업 일시 중단이 선택 사항이고 타임아웃이 구현되지 않는다는 점을 제외하고는 동일한 서비스를 제공합니다.

세마포어 획득을 위한 Nucleus RTOS API 호출

서비스 요청 프로토타입:

상태 NU_Obtain_Semaphore(NU_SEMAPHORE *세마포어,
중단)

매개변수:

세마포어 – 사용자 제공 세마포어 제어 블록에 대한 포인터

일시중지 – 작업 일시 중단에 대한 사양 NU_NO_SUSPEND일 수 있음 또는 NU_SUSPEND 또는 시간 초과 값

반품:

NU_SUCCESS – 통화가 성공적으로 완료되었습니다.

NU_UNAVAILABLE – 세마포의 값은 0입니다.

NU_INVALID_SEMAPHORE – 세마포어 포인터가 유효하지 않습니다.

NU_INVALID_SUSPEND – 비 작업에서 일시 중단을 시도했습니다.

NU_SEMAPHORE_WAS_RESET – 작업이 일시 중단된 동안 세마포가 재설정되었습니다.

세마포어 획득을 위한 Nucleus SE API 호출

이 API 호출은 Nucleus RTOS API의 주요 기능을 지원합니다.

서비스 요청 프로토타입:

STATUS NUSE_Semaphore_Obtain(NUSE_SEMAPHORE 세마포어,
U8 정지)

매개변수:

세마포어 – 사용할 세마포어의 인덱스(ID)

일시중지 – 작업 일시 중단에 대한 사양 NUSE_NO_SUSPEND일 수 있습니다. 또는 NUSE_SUSPEND

반품:

NUSE_SUCCESS – 통화가 성공적으로 완료되었습니다.

NUSE_UNAVAILABLE – 세마포의 값은 0입니다.

NUSE_INVALID_SEMAPHORE – 세마포어 인덱스가 유효하지 않습니다.

NUSE_INVALID_SUSPEND – 작업이 아닌 스레드에서 또는 차단 API 호출이 활성화되지 않은 경우 일시 중단이 시도되었습니다.

NUSE_SEMAPHORE_WAS_RESET – 작업이 일시 중단된 동안 세마포가 재설정되었습니다.

세마포 획득의 Nucleus SE 구현

NUSE_Semaphore_Obtain() 코드의 대부분 매개변수 확인 후 API 기능은 API 호출 차단(작업 일시 중단) 지원이 활성화되었는지 여부에 따라 조건부 컴파일에 의해 선택됩니다. 여기에서 두 가지 변형을 개별적으로 살펴보겠습니다.

차단이 활성화되지 않은 경우 이 API 호출에 대한 논리는 매우 간단합니다.

if (NUSE_Semaphore_Counter[semaphore] !=0) /* 세마포 사용 가능 */{ NUSE_Semaphore_Counter[semaphore]--; return_value =NUSE_SUCCESS;}else /* 세마포를 사용할 수 없음 */{ return_value =NUSE_UNAVAILABLE;}

세마포어 값이 테스트되고 0이 아니면 감소합니다.

차단이 활성화되면 논리가 더 복잡해집니다.

do{ if (NUSE_Semaphore_Counter[semaphore] !=0) /* 세마포 사용 가능 */ { NUSE_Semaphore_Counter[semaphore]--; 반환 값 =NUSE_SUCCESS; 일시 중단 =NUSE_NO_SUSPEND; } else /* 세마포를 사용할 수 없음 */ { if (suspend ==NUSE_NO_SUSPEND) { return_value =NUSE_UNAVAILABLE; } else { /* 작업 차단 */ NUSE_Semaphore_Blocking_Count[세마포어]++; NUSE_Suspend_Task(NUSE_Task_Active, 세마포 <<4) | NUSE_SEMAPHORE_SUSPEND); return_value =NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value !=NUSE_SUCCESS) { 일시 중단 =NUSE_NO_SUSPEND; } } }} 동안 (일시 중단 ==NUSE_SUSPEND);

코드에 대한 설명이 유용할 수 있습니다.

코드는 do...while로 묶여 있습니다. 매개변수가 suspend인 동안 계속되는 루프 값이 NUSE_SUSPEND입니다. .

세마포어가 0이 아니면 감소합니다. 일시중지 변수가 NUSE_NO_SUSPEND로 설정됨 API 호출은 NUSE_SUCCESS로 종료됩니다. .

세마포가 0이고 중단인 경우 NUSE_NO_SUSPEND로 설정됨 , API 호출은 NUSE_UNAVAILBLE로 종료됩니다. . 정지가 NUSE_SUSPEND로 설정된 경우 , 작업이 일시 중단됩니다. 반환 시(즉, 작업이 깨어났을 때) 반환 값이 NUSE_SUCCESS인 경우 , 세마포어가 해제되었기 때문에 작업이 깨어났음을 나타냅니다(세마포어 재설정과 반대). 코드가 맨 위로 루프백됩니다.

세마포어 해제

세마포어 해제를 위한 Nucleus RTOS API 호출은 매우 간단합니다. 세마포어가 증가하고 성공이 보고됩니다. Nucleus SE는 오버플로 검사를 수행하는 것을 제외하고 동일한 서비스를 제공합니다.

세마포 해제를 위한 Nucleus RTOS API 호출

서비스 요청 프로토타입:

STATUS NU_Release_Semaphore(NU_SEMAPHORE *semaphore);

매개변수:

세마포어 – 사용자 제공 세마포어 제어 블록에 대한 포인터

반품:

NU_SUCCESS – 통화가 성공적으로 완료되었습니다.

NU_INVALID_SEMAPHORE – 세마포어 포인터가 유효하지 않습니다.

세마포어 해제를 위한 Nucleus SE API 호출

이 API 호출은 Nucleus RTOS API의 주요 기능을 지원합니다.

서비스 요청 프로토타입:

STATUS NUSE_Semaphore_Release(NUSE_SEMAPHORE 세마포);

매개변수:

세마포어 - 해제될 세마포어의 인덱스(ID)

반품:

NUSE_SUCCESS – 통화가 성공적으로 완료되었습니다.

NUSE_INVALID_SEMAPHORE – 세마포어 인덱스가 유효하지 않습니다.

NUSE_UNAVAILABLE – 세마포의 값은 255이며 증가할 수 없습니다.

릴리스 세마포어의 Nucleus SE 구현

NUSE_Semaphore_Release()의 초기 코드 API 기능 - 매개변수 확인 후 - 작업 차단 활성화 여부에 관계없이 일반적입니다. 세마포어의 값을 확인하고 255보다 작으면 감소합니다.

차단(작업 일시 중단) API 호출에 대한 지원이 활성화된 경우 조건부 컴파일에 의해 추가 코드가 선택됩니다.

NUSE_CS_Enter();if (NUSE_Semaphore_Counter[세마포어] <255){ NUSE_Semaphore_Counter[세마포어]++; 반환 값 =NUSE_SUCCESS; #if NUSE_BLOCKING_ENABLE if (NUSE_Semaphore_Blocking_Count[semaphore] !=0) { U8 인덱스; /* 작업이 차단되었는지 확인 */ /* 이 세마포에서 */ NUSE_Semaphore_Blocking_Count[semaphore]--; for (index=0; index 

이 세마포에서 작업이 일시 중단되면 첫 번째 작업이 깨어납니다.

다음 기사에서는 관련 데이터 구조와 함께 이벤트 플래그 그룹과 관련된 몇 가지 추가 API 호출을 다룰 것입니다.


Colin Walls는 주로 임베디드 소프트웨어를 전문으로 하는 전자 산업 분야에서 30년 이상의 경험을 가지고 있습니다. 컨퍼런스와 세미나에서 자주 발표하고 임베디드 소프트웨어에 대한 수많은 기술 기사와 두 권의 책을 저술한 Colin은 Mentor Embedded[Mentor Graphics Embedded Software Division]의 임베디드 소프트웨어 기술자이며 영국에 거주하고 있습니다. 그의 일반 블로그는 http://blogs.mentor.com/colinwalls에 있습니다. 이메일 [email protected]으로 연락할 수 있습니다.


임베디드

  1. 캠 잠금 장치 소개 및 작동 방식
  2. 아이 나사 및 작동 원리 소개
  3. 스테인리스 스틸 소개 및 제조 방법
  4. C# 기본 입력 및 출력
  5. 자동차 서비스 작가란 무엇이며 어떤 일을 합니까?
  6. 사서함:소개 및 기본 서비스
  7. 세마포어:유틸리티 서비스 및 데이터 구조
  8. 이벤트 플래그 그룹:유틸리티 서비스 및 데이터 구조
  9. 행사 플래그 그룹:소개 및 기본 서비스
  10. 대기열:소개 및 기본 서비스