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

Nucleus SE 시그널로 효율적인 태스크 간 통신 구현

RTOS Revealed 시리즈에서 우리는 시그널을 탐구합니다 – Nucleus SE에서 태스크 간 통신을 위한 가장 단순하고 저비용한 방법. 시그널은 태스크 간 가볍고 신뢰할 수 있는 메시지 전달을 가능하게 합니다.

시그널 사용하기

다른 커널 객체와 달리 시그널은 자율적이지 않으며, 태스크에 본질적으로 연결되어 해당 태스크 컨텍스트 내에서만 존재합니다. 시그널이 애플리케이션에서 활성화되면 모든 태스크가 자동으로 8개의 이진 시그널 플래그 세트를 받습니다.

어떤 태스크든 다른 태스크의 시그널 플래그를 설정할 수 있습니다. 그러나 오직 소유 태스크만 해당 플래그를 읽고 클리어할 수 있습니다 – 읽기는 파괴적이어서 읽기 중 플래그가 리셋됩니다. 다른 태스크는 태스크의 시그널 상태를 검사하거나 수정할 수 없습니다.

Nucleus RTOS는 다른 태스크가 자신의 시그널 플래그 중 하나를 설정할 때 실행될 콜백을 태스크가 지명할 수 있는 기능을 제공합니다. 이는 인터럽트 서비스 루틴과 유사합니다. 불행히도 이 기능은 Nucleus SE에 없습니다; 태스크는 반드시 명시적으로 자신의 시그널 플래그를 폴링해야 합니다.

시그널 구성

시그널은 주로 nuse_config.h의 #define 지시어로 구성됩니다. 핵심 매크로는 NUSE_SIGNAL_SUPPORT로, TRUE로 설정하면 애플리케이션 전체에 시그널 지원이 활성화됩니다. 태스크당 시그널 수는 8개로 고정되며 추가 구성 불필요.

시그널 활성화 시 필요한 데이터 구조가 생성되고 관련 API 콜이 활성화됩니다. Nucleus SE의 각 API 함수는 고유한 인에이블 매크로를 가집니다. 시그널의 경우:

NUSE_SIGNALS_SEND NUSE_SIGNALS_RECEIVE

기본적으로 둘 다 FALSE로 설정되어 해당 서비스 콜 비활성화 및 구현 코드 생략. 시그널 사용을 위해 원하는 인에이블을 TRUE로 설정. API를 활성화하지 않고 호출하면 컴파일 타임 에러; 미구현 API 호출 시 링크 타임 에러.

nuse_config.h 발췌:

#define NUSE_SIGNAL_SUPPORT FALSE /* 시그널 지원 활성화 */ #define NUSE_SIGNALS_SEND FALSE /* 서비스 콜 인에이블러 */ #define NUSE_SIGNALS_RECEIVE FALSE /* 서비스 콜 인에이블러 */

시그널 서비스 콜

Nucleus SE는 시그널 관련 4가지 주요 서비스 콜을 제공합니다. SE에서 구현된 것은 2개뿐; 나머지는 RTOS용으로 예약되어 SE에는 없습니다.

보내기 및 받기 연산

시그널 플래그는 비트로, 이진수로 시각화하는 것이 최적입니다. 표준 C에 이진 리터럴이 없으므로 Nucleus SE는 nuse_binary.h를 포함해 b01010101 같은 모든 256개 8비트 값 매크로를 정의합니다.

#define b00000000 ((U8)0x00) #define b00000001 ((U8)0x01) #define b00000010 ((U8)0x02) #define b00000011 ((U8)0x03) #define b00000100 ((U8)0x04) #define b00000101 ((U8)0x05)

시그널 보내기

어떤 태스크든 OR 연산으로 다른 태스크의 하나 이상의 시그널 플래그를 설정 – 이전에 설정된 플래그는 변경되지 않음.

Nucleus RTOS API 콜

STATUS NU_Send_Signals(NU_TASK *task, UNSIGNED signals);

매개변수:

반환:

Nucleus SE API 콜

STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);

매개변수:

반환:

NUSE_Signals_Send() 구현

STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals){ #if NUSE_API_PARAMETER_CHECKING if (task >= NUSE_TASK_NUMBER){ return NUSE_INVALID_TASK; } #endif NUSE_CS_Enter(); NUSE_Task_Signal_Flags[task] |= signals; NUSE_CS_Exit(); return NUSE_SUCCESS; }

시그널 받기

태스크는 자신의 시그널 플래그만 읽을 수 있으며, 연산은 파괴적 – 읽을 때 플래그 클리어.

Nucleus RTOS API 콜

UNSIGNED NU_Receive_Signals(VOID);

현재 시그널 플래그 값 반환.

Nucleus SE API 콜

U8 NUSE_Signals_Receive(void);

현재 시그널 플래그 값 반환.

NUSE_Signals_Receive() 구현

U8 NUSE_Signals_Receive(void){ U8 signals; NUSE_CS_Enter(); signals = NUSE_Task_Signal_Flags[NUSE_Task_Active]; NUSE_Task_Signal_Flags[NUSE_Task_Active] = 0; NUSE_CS_Exit(); return signals; }

이 간단한 함수들은 Nucleus SE가 태스크 블로킹이나 스케줄링에 영향을 주지 않고 시그널을 효율적으로 관리하는 방식을 보여줍니다.

임베디드

  1. Nucleus SE 시그널로 효율적인 태스크 간 통신 구현
  2. Rutronik, Redpine Signals RS14100 공급: 초저전력 멀티프로토콜 보안 무선 MCU
  3. Rutronik, Redpine Signals 초저전력 멀티프로토콜 SoC 공급
  4. 단일 원자 원자핵의 자기 신호 최초 측정
  5. 인공 신경망, 무선 통신 성능 향상
  6. 와이파이 신호를 전기로 변환하는 유연한 렉테나 개발
  7. 양자 회로로 가능한 가장 약한 무선 신호(단일 광자) 검출 성공
  8. 반도체 레이저로 마이크로파 발생·무선신호 송수신… 초고속 와이파이 길 열려
  9. 실시간 포르타멘토 알고리즘, 임의 두 오디오 신호 매끄럽게 연결… MIT 학생 개발
  10. RF/마이크로웨이브 PCB 설계 핵심 원칙: 신뢰성 높은 고주파 성능 구현