S/R interface 와 C/S interface 에 대해 알아보자.
SWC 간의 통신은 RTE를 통해 이루어 진다고 설명한 바 있다. SWC는 port를 가지고 있고 각 port를 연결하는 Interface로는 Sender-Receiver(S/R) Interface와 Client-Server(C/S) Interface 가 있다. S/R Interface는 Sender가 Receiver 측에 Data를 보내는 방식이고. C/S Interface는 쉽게 말해 Client가 Server의 Operation 함수를 호출하는 방식이다.
아래 그림은 S/R interface와 C/S interface 간의 차이를 도식화했다. 여기서 알 수 있듯이 두 Interface 간의 큰 차이는 PPort와 RPort의 방향이 서로 다르다는 점이다. arxml 작성 시 이 부분이 헷갈리지 않도록 유의할 필요가 있다.
Sender-Receiver Interface
Interface 구현을 위해서는 RTE API를 사용한다. 각각의 Interface는 어떤 RTE API들이 사용되는지 알아보겠다.
S/R Interface 동작은 아래 그림과 같이 Swc1.c의 runnable인 f1()에서 Rte_Write를 사용하여 data를 전송하면 Swc2.c의runnable인 f2()에서는 Rte_Read API를 사용해 data를 수신하는 방식이다. 자동 생성된 Rte.c 파일에서는 Rte_Write_p_o() 와 Rte_Read_p_o()와 같은 코드를 볼 수 있다. 여기서 <p>는 PortName이고 <o>는 DataPrototype으로 arxml 작성 시 설정한 name이 자동으로 들어가게 된다.
S/R Interface에 주로 사용되는 RTE API에는 Rte_Write/Rte_Read, Rte_IWrite/ Rte_IRead, Rte_Send/Rte_Receive 등이 있다. Rte_Write, Rte_IWrite, Rte_Send가 PPort(Sender)에 해당하고 Rte_Read, Rte_IRead, Rte_Receive가 RPort(Receiver)에 해당한다.
각각의 API에 대해 좀 더 구체적으로 비교 설명하자면 아래 [표 1]과 같다. arxml 작성 시 SWC의 Runnable에서 Port와의 연결은 DSP/DWA/DRP/DRA로 지정할 수 있고 Port에서는 Queue 사용 여부를 결정할 수 있다.
* DSP(DataSendPoint): API 호출 즉시 data를 전달 (Explicit)
* DRP(DataReceivePoint): API 호출 즉시 data를 수신 (Explicit)
* DWA(DataWriteAccess): Runnable 종료 후 data를 전달 (Implicit)
* DRA(DataReadAccess): Runnable 시작 시 data를 수신 (Implicit)
여기서 Explicit 동작과 Implicit 동작의 차이를 설명하자면, Explicit하게 동작하는 Rte_Write와 Rte_Read의 경우 Rte_Write를 호출할 때마다 Data 값을 변경해 전송하면 내부 버퍼에 계속해서 변경된 값이 저장되고 Rte_Read가 호출될 때마다 변경된 Data도 값이 읽히게 된다. Implicit하게 동작하는 Rte_IWrite와 Rte_IRead의 경우 Rte_IWrite를 호출할 때마다 값을 변경해 Data를 여러 번 전송해도 Sender측 runnable이 종료된 후에 값을 전달하기 때문에 버퍼에는 가장 최근의 Data가 저장된다. 따라서 Rte_IRead는 여러 번 호출돼도 Receiver측 runnable 실행 시 한 번만 읽기 때문에 Data는 처음 읽었던 버퍼의 값이 저장된다.
Client-Server Interface
미리 정의된 서비스를 요청하고 결과를 전달받기 위한 통신방식으로 SW 컴포넌트 간에 가장 보통의 통신 방식이다. AUTOSAR SW 컴포넌트는 Client 또는 Server로서 수행될 수 있으며 이를 동시에 수행할 수도 있다. Server는 Client에 의해 요청된 서비스를 동기 또는 비동기적으로 제공한다. 동기식 호출과 비동기식 호출은 다음과 같이 구분된다.
- 동기식(Synchronous) 호출 : Client는 Call이 진행되는 동안 차단된다.
- 비동기식(Asynchronous) 호출 : Client는 Call이 진행되는 동안 차단되지 않고 다른 명령을 수행할 수 있으며,
Server는 요청된 작업을 병렬로 실행한다.
C/S Interface의 주요 API로는 Rte_Call을 예로 들 수 있다. Rte_Call은 Server의 Runnable을 바로 호출하는 API이다.
Swc1.c의 runnable인 f1()에서 RTE API를 사용하는 것은 같으나 아래 그림에서 보는 것과 같이 S/R Interface와는 다르게 Rte.c 파일의 Rte_Call_p_o() 안에서 Swc2.c의 runnable인 f2()를 바로 호출하는 것을 알 수 있다. 여기서 <p>는 PortName, <o>는 Operation이다.
Rte_Call API를 사용 시 Runnable에서 Port와의 연결은 ServerCallPoint(SCP)로 연결해야 한다.
그리고 또 한 가지 주의할 점은 Server측에 반드시 OperationInvokedEvent가 설정되어 있어야 한다는 것이다.
해당 Event는 arxml에서 SWC Internal Behavior 안에서 설정할 수 있다.
Rte_Call과 같이 RTE API와 함께 RTE Event를 사용하는 경우가 많은데 지금부터는 RTE Event에 대해 설명하도록 하겠다. RTE Event는 RTE(Rte.c)에서 Runnable Entity를 activate하거나 wakeup하기 위해 사용한다. arxml에서 RTE Event를 설정하지 않을 수 있지만 그렇게 되면 Rte.c에서 봤을 때 API는 구현되어 있으나 해당 API가 실행되지는 않게 된다.
어떠한 RTE Event 들이 있는지 아래 그림에서 살펴 보자.
'AUTOSAR, ASPICE' 카테고리의 다른 글
[ASPICE] HSI 명세서란? #HSI (0) | 2024.04.07 |
---|---|
[ASPICE] 기능 안전 표준 ISO 26262 이란? (0) | 2024.04.04 |
[ASPICE] ASPICE란 무엇인가? #ASPICE 개요 (0) | 2024.04.03 |
[자동차 이해] AUTOSAR 플랫폼 아키텍처 구조 (0) | 2024.03.31 |
[자동차 이해] AUTOSAR란 무엇인가? #AUTOSAR (1) | 2024.03.31 |