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

사서함:소개 및 기본 서비스


RTOS 공개 시리즈 보기

사서함은 이전 기사에서 소개되었습니다. 신호 다음으로 Nucleus SE가 지원하는 태스크 간 통신의 두 번째로 간단한 방법일 것입니다. 작업 간에 간단한 메시지를 전달할 수 있는 저비용이지만 유연한 수단을 제공합니다.

사서함 사용

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

사서함은 단순히 ADDR 유형의 단일 변수를 저장할 수 있을 만큼 충분히 큰 저장 위치입니다. , 여러 작업에서 안전하게 사용할 수 있도록 액세스가 제어됩니다. 하나의 작업은 사서함에 쓸 수 있습니다. 그러면 가득 차서 작업이 사서함에서 읽기를 수행하거나 사서함이 재설정될 때까지 작업을 보낼 수 없습니다. API 호출 및 Nucleus SE 구성에서 선택한 옵션에 따라 전체 사서함으로 보내거나 빈 사서함에서 읽으려고 하면 오류가 발생하거나 작업이 일시 중단될 수 있습니다.

사서함 및 대기열

일부 OS 구현에서는 사서함이 구현되지 않으며 단일 항목 대기열의 사용이 대안으로 권장됩니다. 이러한 대기열은 사서함과 동일한 기능을 제공하므로 합리적으로 들립니다. 그러나 큐는 메일박스보다 다소 복잡한 데이터 구조이며 데이터(헤드 및 테일 포인터 등), 코드 및 실행 시간에서 훨씬 더 많은 오버헤드를 전달합니다.

Nucleus RTOS와 마찬가지로 Nucleus SE를 사용하면 두 개체 유형을 모두 선택할 수 있으며 스스로 결정할 수 있습니다.

응용 프로그램에 여러 대기열이 포함되어 있지만 사서함은 하나일 수 있는 경우 다른 접근 방식을 고려해 볼 가치가 있습니다. 해당 사서함을 대기열로 교체하면 약간의 데이터 오버헤드가 발생하지만 모든 사서함 관련 API 코드가 제거됩니다. 애플리케이션을 양방향으로 구성하고 메모리 공간과 성능을 비교하는 것은 매우 쉬울 것입니다.

대기열은 향후 기사에서 논의될 것입니다.

사서함 구성

사서함 수

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

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

API 사용

Nucleus SE의 모든 API 기능(서비스 호출)에는 활성화된 #define이 있습니다. nuse_config.h의 기호 . 사서함의 경우:

NUSE_MAILBOX_SEND
NUSE_MAILBOX_RECEIVE
NUSE_MAILBOX_RESET
NUSE_MAILBOX_INFORMATION
NUSE_MAILBOX_COUNT

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

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

/* 의 사서함 수 시스템 - 0-16 */ #define NUSE_MAILBOX_NUMBER 0  /* 서비스 호출 인에이블러:*/ #define NUSE_MAILBOX_SEND FALSE  #define NUSE_MAILBOX_RECEIVE FALSE  #define NUSE_MAILBOX_RESET FALSE  #define NUSE_MAILBOX_INFORMATION FALSE  #define NUSE_MAILBOX_COUNT FALSE  

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

사서함 서비스 호출

Nucleus RTOS는 다음 기능을 제공하는 사서함과 관련된 9개의 서비스 호출을 지원합니다.

  • 사서함으로 메시지를 보냅니다. NUSE_Mailbox_Send()에 의해 구현됨 Nucleus SE에서.

  • 사서함에서 메시지를 받습니다. NUSE_Mailbox_Receive()에 의해 구현됨 Nucleus SE에서.

  • 일시 중단(재설정)하지 않고 사서함을 사용하지 않은 상태로 복원합니다. NUSE_Mailbox_Reset()에 의해 구현됨 Nucleus SE에서.

  • 지정된 사서함에 대한 정보를 제공합니다. NUSE_Mailbox_Information()에 의해 구현됨 Nucleus SE에서.

  • 응용 프로그램에 대해 (현재) 구성된 사서함 수를 반환합니다. NUSE_Mailbox_Count()에 의해 구현됨 Nucleus SE에서.

  • 애플리케이션에 새 편지함을 추가합니다(만들기). Nucleus SE에서는 구현되지 않습니다.

  • 응용 프로그램에서 사서함을 제거합니다(삭제). Nucleus SE에서는 구현되지 않습니다.

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

  • 메일함(브로드캐스트)에서 일시 중단된 모든 작업에 메시지를 보냅니다. Nucleus SE에서는 구현되지 않습니다.

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

사서함 쓰기 및 읽기 서비스

사서함에서 수행할 수 있는 기본 작업은 사서함에 데이터를 쓰는 것입니다. 이를 보내기라고도 합니다. 또는 게시 – 데이터 읽기 – 수신이라고도 함 . Nucleus RTOS와 Nucleus SE는 각각 이러한 작업에 대해 두 가지 기본 API 호출을 제공하며 여기에서 설명합니다.

사서함에 쓰기

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

Nucleus RTOS는 사서함으로 브로드캐스트하는 기능도 제공하지만 Nucleus SE에서는 지원하지 않습니다. 구현되지 않은 API 아래에 설명되어 있습니다. 다음 기사에서.

사서함으로 보내기 위한 Nucleus RTOS API 호출

서비스 요청 프로토타입:

<블록 인용>

STATUS NU_Send_To_Mailbox(NU_MAILBOX *사서함, VOID *메시지, 서명되지 않은 정지),

매개변수:

<블록 인용>

사서함 – 사용할 사서함에 대한 포인터

메시지 – 4개의 서명되지 않은 메시지에 대한 포인터 요소

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

반품:

<블록 인용>

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

NU_INVALID_MAILBOX – 사서함 포인터가 잘못되었습니다.

NU_INVALID_POINTER – 메시지 포인터가 NULL입니다.

NU_INVALID_SUSPEND – 작업이 아닌 스레드에서 일시 중단을 시도했습니다.

NU_MAILBOX_FULL – 사서함이 가득 차서 일시 중단이 지정되지 않았습니다.

NU_TIMEOUT – 지정된 기간 동안 일시 중단된 후에도 메일함이 가득 찼습니다.

NU_MAILBOX_DELETED – 작업이 일시 중단된 동안 사서함이 삭제되었습니다.

NU_MAILBOX_WAS_RESET – 작업이 일시 중단된 동안 사서함이 재설정되었습니다.

사서함으로 보내기 위한 Nucleus SE API 호출

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

서비스 요청 프로토타입:

<블록 인용>

STATUS NUSE_Mailbox_Send(NUSE_MAILBOX 편지함, ADDR *메시지, U8 정지);

매개변수:

<블록 인용>

사서함 – 활용할 사서함의 인덱스(ID)

메시지ADDR 유형의 단일 변수인 보낼 메시지에 대한 포인터

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

반품:

<블록 인용>

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

NUSE_INVALID_MAILBOX – 사서함 인덱스가 잘못되었습니다.

NUSE_INVALID_POINTER – 메시지 포인터가 NULL입니다.

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

NUSE_MAILBOX_FULL – 사서함이 가득 차서 일시 중단이 지정되지 않았습니다.

NUSE_MAILBOX_WAS_RESET – 작업이 일시 중단된 동안 사서함이 재설정되었습니다.

Nucleus SE의 Mailbox Send 구현

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

차단이 활성화되지 않은 경우 이 API 호출에 대한 논리는 매우 간단하고 코드에는 설명이 거의 필요하지 않습니다.

if (NUSE_Mailbox_Status[mailbox]) /* 편지함 가득 참 */{ return_value =NUSE_MAILBOX_FULL;}else /* 편지함 비어 있음 */{ NUSE_Mailbox_Data[mailbox] =*message; NUSE_Mailbox_Status[사서함] =TRUE; return_value =NUSE_SUCCESS;}

메시지는 NUSE_Mailbox_Data[]의 적절한 요소에 저장됩니다. 사용 중인 것으로 표시된 사서함.

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

do{ if (!NUSE_Mailbox_Status[mailbox]) /* 편지함 비어 있음 */ { NUSE_Mailbox_Data[mailbox] =*message; NUSE_Mailbox_Status[사서함] =TRUE; if (NUSE_Mailbox_Blocking_Count[mailbox] !=0) { U8 인덱스; /* 작업이 차단되었는지 확인 */ /* 이 편지함에서 */ NUSE_Mailbox_Blocking_Count[mailbox]--; for (index=0; index 

다음과 같은 설명이 유용할 수 있습니다.

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

편지함이 비어 있으면 제공된 메시지가 저장되고 편지함이 가득 찼음을 나타내도록 편지함 상태가 변경됩니다. 사서함에서 일시 중단된(수신 대기 중) 작업이 있는지 확인합니다. 대기 중인 작업이 있으면 첫 번째 작업이 깨어납니다. 일시중지 변수가 NUSE_NO_SUSPEND로 설정됨 API 호출은 NUSE_SUCCESS로 종료됩니다. .

편지함이 가득 차서 일시중지한 경우 NUSE_NO_SUSPEND로 설정됨 , API 호출은 NUSE_MAILBOX_FULL로 종료됩니다. . 일시중지하는 경우 NUSE_SUSPEND(으)로 설정되었습니다. , 작업이 일시 중단됩니다. 반환 시(즉, 작업이 깨어났을 때) 반환 값이 NUSE_SUCCESS인 경우 , 메시지를 읽었기 때문에 작업이 깨어났음을 나타냅니다(사서함 재설정과 반대). 코드가 맨 위로 루프백됩니다.


임베디드

  1. 캠 잠금 장치 소개 및 작동 방식
  2. 아이 나사 및 작동 원리 소개
  3. 그로밋 및 작동 원리 소개
  4. 스테인리스 스틸 소개 및 제조 방법
  5. COVID 19 및 클라우드; COVID 19 및 비즈니스에 미치는 영향
  6. C# 기본 입력 및 출력
  7. 세마포어:유틸리티 서비스 및 데이터 구조
  8. 세마포어:소개 및 기본 서비스
  9. 이벤트 플래그 그룹:유틸리티 서비스 및 데이터 구조
  10. 행사 플래그 그룹:소개 및 기본 서비스