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

대기열:소개 및 기본 서비스


RTOS 공개 시리즈 보기

대기열은 이전 기사에서 소개되었습니다. 사서함보다 작업 간에 간단한 메시지를 보다 유연하게 전달할 수 있습니다.

대기열 사용

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

대기열은 단순히 ADDR 유형의 단일 데이터 항목을 저장할 수 있을 만큼 충분히 큰 저장 위치 집합입니다. , 여러 작업에서 안전하게 사용할 수 있도록 액세스가 제어됩니다. 작업은 모든 위치가 가득 찰 때까지 반복적으로 대기열에 쓸 수 있습니다. 작업은 대기열에서 읽을 수 있으며 데이터는 일반적으로 FIFO(선입 선출) 방식으로 수신됩니다. 전체 대기열로 보내거나 빈 대기열에서 읽으려고 하면 API 호출 및 Nucleus SE 구성에서 선택한 옵션에 따라 오류 또는 작업 일시 중단이 발생할 수 있습니다.

대기열 및 파이프

Nucleus SE는 파이프도 지원합니다. 이는 이전 기사에서도 소개되었으며 향후 기사에서 자세히 다룹니다. 큐와 파이프의 주요 차이점은 메시지 크기입니다. 대기열은 단일 ADDR로 구성된 메시지를 전달합니다. – 일반적으로 포인터가 됩니다. 파이프는 길이가 임의의 바이트 수인 메시지를 전달합니다. 크기는 응용 프로그램의 각 파이프에 대해 고정되어 있으며 구성 시 설정됩니다.

대기열 구성

대기열 수

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

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

API 사용

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

NUSE_QUEUE_SEND
NUSE_QUEUE_RECEIVE
NUSE_QUEUE_JAM
NUSE_QUEUE_RESET
NUSE_QUEUE_INFORMATION
NUSE_QUEUE_COUNT

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

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

#define NUSE_QUEUE_NUMBER 0 /* 대기열의 수
시스템 - 0-16 * /
/ * 서비스 호출 블러 * /
#DEFINE의 NUSE_QUEUE_SEND의 FALSE
#DEFINE NUSE_QUEUE_RECEIVE FALSE
#DEFINE NUSE_QUEUE_JAM FALSE
#DEFINE NUSE_QUEUE_RESET FALSE
#define NUSE_QUEUE_INFORMATION FALSE
#define NUSE_QUEUE_COUNT FALSE

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

대기열 서비스 호출

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

  • 대기열에 메시지를 보냅니다. NUSE_Queue_Send()에 의해 구현됨 Nucleus SE에서.

  • 대기열에서 메시지를 받습니다. NUSE_Queue_Receive()에 의해 구현됨 Nucleus SE에서.

  • 대기열의 맨 앞으로 메시지를 보냅니다. NUSE_Queue_Jam()에 의해 구현됨 Nucleus SE에서.

  • 대기 중인 작업(재설정) 없이 대기열을 사용하지 않은 상태로 복원합니다. NUSE_Queue_Reset()에 의해 구현됨 Nucleus SE에서.

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

  • 애플리케이션에 대해 (현재) 구성된 대기열 수를 반환합니다. NUSE_Queue_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_Queue(NU_QUEUE *queue, VOID *message,
서명되지 않은 크기, 서명되지 않은 일시 중지);

매개변수:

대기열 – 사용자 제공 대기열 제어 블록에 대한 포인터

메시지 – 보낼 메시지에 대한 포인터

크기 UNSIGNED의 수 메시지의 데이터 요소. 큐가 가변 길이 메시지를 지원하는 경우 이 매개변수는 큐에서 지원하는 메시지 크기보다 작거나 같아야 합니다. 큐가 고정 크기 메시지를 지원하는 경우 이 매개변수는 큐에서 지원하는 메시지 크기와 정확히 동일해야 합니다.

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

반품:

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

NU_INVALID_QUEUE – 큐 포인터가 유효하지 않습니다.

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

NU_INVALID_SIZE – 메시지 크기가 대기열에서 지원하는 메시지 크기와 호환되지 않음

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

NU_QUEUE_FULL – 대기열이 가득 차서 일시 중단이 지정되지 않았습니다.

NU_TIMEOUT – 지정된 시간 초과 값 동안 일시 중단한 후에도 대기열이 여전히 가득 찼습니다.

NU_QUEUE_DELETED – 작업이 일시 중단되는 동안 대기열이 삭제되었습니다.

NU_QUEUE_RESET – 작업이 일시 중단된 동안 대기열이 재설정되었습니다.

대기열로 보내기 위한 Nucleus SE API 호출

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

서비스 요청 프로토타입:

STATUS NUSE_Queue_Send(NUSE_QUEUE 대기열, ADDR *메시지,
U8 정지);

매개변수:

대기열 – 활용될 큐의 인덱스(ID)

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

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

반품:

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

NUSE_INVALID_QUEUE – 대기열 인덱스가 유효하지 않습니다.

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

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

NUSE_QUEUE_FULL – 대기열이 가득 차서 일시 중단이 지정되지 않았습니다.

NUSE_QUEUE_WAS_RESET – 작업이 일시 중단된 동안 대기열이 재설정되었습니다.

Queue ASend의 Nucleus SE 구현

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

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

if (NUSE_Queue_Items[queue] ==NUSE_Queue_Size[queue]) /* 대기열이 가득 참 */{ return_value =NUSE_QUEUE_FULL;}else /* 사용 가능한 대기열 요소 */{ NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] =*메세지; if (NUSE_Queue_Head[대기열] ==NUSE_Queue_Size[대기열]) { NUSE_Queue_Head[대기열] =0; } NUSE_Queue_Items[대기열]++; return_value =NUSE_SUCCESS;}

이 함수는 단순히 대기열에 공간이 있는지 확인하고 NUSE_Queue_Head[]를 사용합니다. 큐의 데이터 영역에 메시지를 저장하기 위한 인덱스입니다.

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

do{ if (NUSE_Queue_Items[queue] ==NUSE_Queue_Size[queue]) /* 대기열 가득 참 */ { if (suspend ==NUSE_NO_SUSPEND) { return_value =NUSE_QUEUE_FULL; } else { /* 작업 차단 */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (대기열 <<4) | NUSE_QUEUE_SUSPEND); return_value =NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value !=NUSE_SUCCESS) { 일시 중단 =NUSE_NO_SUSPEND; } } } else { /* 사용 가능한 큐 요소 */ NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] =*message; if (NUSE_Queue_Head[대기열] ==NUSE_Queue_Size[대기열]) { NUSE_Queue_Head[대기열] =0; } NUSE_Queue_Items[대기열]++; if (NUSE_Queue_Blocking_Count[queue] !=0) { U8 인덱스; /* 이 큐에서 작업이 차단되었는지 확인 */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index 

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

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

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

대기열이 가득 차지 않은 경우 제공된 메시지는 NUSE_Queue_Head[]를 사용하여 저장됩니다. 큐의 데이터 영역에 메시지를 저장하기 위한 인덱스. 대기열에서 작업이 일시 중단(수신 대기 중)되었는지 여부를 확인합니다. 대기 중인 작업이 있으면 첫 번째 작업이 깨어납니다. 일시중지 변수가 NUSE_NO_SUSPEND로 설정됨 API 호출은 NUSE_SUCCESS로 종료됩니다. .


임베디드

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