AUTOSAR CAN 통신 Stack 구조 정리
AUTOSAR CAN 통신 스택
하드웨어 독립적 소프트웨어 플랫폼을 구축하기 위해 계층형 구조를 도입
하위에는 하드웨어 종속적인 모듈 배치, 상위로 갈수록 하드웨어와 독립적인 구조가 될 수 있도록 계층과 모듈 구성
(하드웨어에 독립적인 어플리케이션 작성이 필요하지만, 더 정확한 구현과 디버깅을 위해 내부 계층 이해 필요)
통신 DB import
통신 모듈을 설정하기 위해 ARXML 형태로 구성된 통신 데이터가 필요
모듈 설정에 앞서 ECU에서 사용할 통신 데이터 import
(대부분의 AUTOSAR 솔루션은 통신 DB를 간편하게 AUTOSAR 데이터 포맷으로 변환하는 기능 제공)
→ 현대 mobilge을 사용하여 CAN(DBC) → AUTOSAR 변수 (Com, ComM, PduR, CAN, CANNM 등)
CAN 통신스택
모듈을 계층 구조로 표현한 것으로, 계층의 특성에 맞춰 통신 관련 모듈이 분포되어 있음
- 빨간색 : MCU 추상화 계층
- 초록색 : ECU 추상화 계층
- 파란색 : 서비스 계층
CAN 통신 스택은 기능/역할 별로 다음의 세 가지 영역으로 구분 가능
1. PDU 송/수신 관련 기능 : CAN 메시지 송수신 과정에서 PDU 전달과 관련 기능 수행하는 모듈
2. 통신 상태 제어 기능 : 통신 상태 변경하거나 이상이 발생했을 때 이를 처리하는 모듈
3. 네트워크 관리 기능 : 통신 네트워크 관리하기 위한 모듈
COM 모듈
통신 스택은 일반적으로 CAN 통신의 송/수신 기능에 관여하는 모듈 : Com, PduR, CanIf, CAN으로 구성
COM 모듈을 기점으로 상위 layer는 signal을 사용하고, 하위로는 PDU를 사용
여기서 signal이란 전달할 메시지, PDU는 계층 간 메시지 전송을 위한 프로토콜 추상화
어플리케이션에서 전달 받은 signal은, COM의 I-PDU 버퍼에 저장되고 PduR-ComTransmit 함수에 의해 I-PDU 형태로 PduR로 전달
반대로 PDU 수신받을 때 PduR에서 Com-RxIndication 함수를 통해 수신된 PDU가 있음을 알리고, COM에서 I-PDU 속 signal 분석하여 해당 signal과 연결된 callback 함수를 호출하여 수신된 signal이 RTE를 통해 어플리케이션으로 전달
(Signal / PDU 사이 변경을 위해 COM 모듈에는 각 signal과 PDU가 정의되어 있음)
PDU (Protocol Data Unit)
통신 메시지는 네트워크 계층 간 정보 전달의 편의를 위해 PDU(데이터인 SDU + 프로토콜인 PCI)로 바뀌는데 SDU(Service Data Unit)와 PCI(Protocol Control Information)로 구성. SDU란 다른 계층 또는 모듈로 전달되는 데이터고, PCI는 발신/수신/순서 등 정보들로 계층 혹은 모듈 간 PDU 전달을 위해 덧붙이는 정보
(COM에서 전달 받은 PDU는 PduR에서는 SDU가 되고, 라우팅 정보가 포함된 PCI가 더해져 새로운 PDU를 구성)
이렇게 하위 계층(to 하드웨어 레벨)으로 이동하면서 PDU는 상위 게층에서 만들어진 SDU와 PCI를 헤더에 붙여가는 방식으로 PDU가 지나온 경로 기억, 계층별로 주고받는 정보가 다르기에 계층에 따라 PDU에 붙는 정보도 다름
*PDU는 AUTOSAR CAN Stack 내에서만 사용되는 것이기에 CAN Driver 통해서 실제 전송 시 PDU 형태로 전송되지 않음.
*필요한 메시지만 PDU에서 추출하여 네트워크로 전송
PduR 모듈
COM에서 만들어진 PDU는 PduR(PDU Router)로 전달되어 Routing table 참고하여 해당 PDU를 전달할 목적지를 설정하는 방식으로 PDU를 목적지로 전송. PduR 모듈은 routing table과 engine으로 구성되는데, routing table은 각 PDU 들의 경로 정보를 가지고 있어, 여기에 기록되지 않은 PDU는 정상적으로 전달되지 않음. Engine은 routing table을 사용하여 PDU가 올바른 경로로 전달될 수 있도록 유도. PDU가 위로 가는지, 아래로 가는지에 따라 PDU ID와 API를 연결하여 호출해 주는 기능
*PduR을 기준으로 상위는 BUS나 Controller에 의존성이 없지만, 하위부터는 특정 BUS나 Controller에 의존성을 갖는다.
CanIF 모듈
PDU ID를 확인하여 내부의 Channel 선택
각 Channel에 연결된 HOH (Hardware object handle)에 PDU를 전달하면, CAN Controller의 HW Object에 해당 PDU를 write하고, Object flag 값을 1로 설정하면 transceiver에 의해 CAN Frame 전달.
COM | - PDU Data를 signal 단위로 읽고 쓸 수 있는 I/F 제공 - 주기적으로 PDU 송신 - Signal에 대한 time out, data received, data send 등의 이벤트를 ASW에 통지 |
PduR | - Routing table에 설정된 PDU reference 참조하여 source 및 destination 모듈 간 PDU 전달 |
CanIF | - CAN driver로부터 수신한 PDU를 상위 layer로 전달 - 상위 layer가 송신한 PDU를 CAN Driver로 전달 - CAN controller 및 transceiver를 제어하는 interface 제공 - Bus off 발생을 CAN으로부터 받아 CanSM에 전달 |
CAN | - Can Controller 활성화 및 비활성화 제어 - Can interrupt handler 제공 |
다음 그림은 CAN 메시지 송신 시 모듈 간 호출되는 API 및 Callback 함수를 정리한 것
1. RTE API를 통해 송신하고 싶은 signal이 COM에 도착하면 COM은 signal을 PDU로 변환
2. 변환된 PDU(SDU + PCI)를 PduR로 전달
3. PduR은 적절한 전송 모듈을 선택하여 해당 모듈로 PDU를 보내 전송 요청
4. CanIF는 PDU ID를 확인하여 연결할 channel을 설정하고, 해당 channel을 통해 CAN Driver로 전송
5. CAN driver에서는 CAN Controller에서 전달할 메시지 write
6. Transceiver에 의해 해당 메시지 전달되면, Callback function이 호출되며 전달 결과가 상위 layer로 전달