IoHwAb를 처음 설정하면 대부분 같은 지점에서 막힌다.
IoHwAb에 채널은 만들었는데 어디서 Port를 추가해야 하는지 모르겠고,
SWC랑 어떻게 연결되는지 모르겠고 Generate 이후 코드가 어떻게 동작하는지도 감이 안 온다
이 글에서는 Analog Input 하나를 실제로 읽어서 SWC에서 사용하는 과정을 기준으로
mobilgene 툴에서 어디를 설정하는지부터 코드가 어떻게 동작하는지까지 전부 연결해서 설명한다.
먼저 구조를 이해해야 한다.
AUTOSAR에서 데이터는 아래처럼 흐른다.
SWC → RTE → IoHwAb → Adc Driver → ADC
여기서 중요한 점은 IoHwAb와 SWC는 직접 연결되지 않는다.
반드시 RTE를 통해서만 연결된다.
이걸 이해 못하면 이후 설정이 전부 의미 없이 느껴진다.
IoHwAb에서 설정 방법
우선 회로도를 확인해야 한다.
회로도 기준으로 Analog Input은 아무 채널이나 선택하는 것이 아니라
실제 ECU 하드웨어에 연결된 핀 기준으로 결정된다.
즉, 설정은 툴에서 시작하는 것이 아니라 "회로도 → MCU 핀 → ADC 채널 매핑" 확인부터 시작해야 한다.
예를 들어 배터리 전압을 읽는다고 가정하면, 회로도에서 Battery Voltage 신호가 연결된 핀을 찾는다.
해당 핀이 MCU의 어떤 Port/Pin (예: P6.2 등)에 연결되어 있는지 확인한다.
그리고 그 핀이 어떤 ADC Channel로 매핑되어 있는지 확인한다.
1. 회로도 확인
아래처럼 회로도를 확인하고, P6.2 Port 에 B+_ADC_IN 이 있음을 확인 후 mobilgene 에서 설정하도록 하겠다.

2. MCAL 영역의 Adc.arxml 에서 설정 확인
어떤 Channel이 P6.2에 매핑되어 있는지 확인해야 한다.

3. Adc Group 확인
다음으로 봐야 할 건 Group이다.


AdcGroup_U0_C02 그룹에 ADC Channel 2 와 연결되어 있음을 확인해야 한다.
즉, IoHwAbAdcGroupRef는 임의로 선택하는 값이 아니라,
MCAL Adc 설정에서 정의된 Channel과 Group을 기준으로 결정된다.
따라서 반드시 회로도 → MCU Pin → Adc Channel → Adc Group 순서로 확인한 후 설정해야 한다.
4. IoHwAb.arxml 작업
IoHwAb > IoHwAbConfig > IoHwAbAnalogInputDirect > Logical 영역에서 Container를 추가한다.
Logical 영역은 실제 하드웨어 채널을 Application에서 사용할 수 있는 “논리 신호”로 정의하는 영역이다.

- Short Name은 회로도 신호명과 MCU 핀 정보를 기반으로 작성해야 한다.
예를 들어 P6_2_Bpluse_ADC_IN처럼 “핀 번호 + 신호 의미”를 함께 표현하면
이후 디버깅 시 어떤 신호인지 바로 파악할 수 있다.
- Adc Group Ref는 Adc Group Ref는 MCAL Adc 설정을 직접 참조하는 것이 아니라,
IoHwAbGeneral > IoHwAbAdcSetting > IoHwAbAdcGroups에서 정의된 Group을 참조한다.
이 Group은 내부적으로 MCAL Adc Group과 매핑되어 있으므로, 반드시 회로도 및 Adc 설정과 일치하도록 구성해야 한다.

하지만 이 단계까지는 IoHwAb 내부에서 값을 읽을 준비만 된 상태이며,
Application(SWC)에서 이 값을 사용하려면 추가 설정이 필요하다.
5. Application(SWC)에서 Port 추가 및 Runnable 설정
Channel만 생성한 상태에서는 ADC 값이 IoHwAb 내부에서만 읽히게 된다.
즉, 값은 존재하지만 Application에서는 접근할 수 없는 상태다.
따라서 IoHwAb에서 Analog Input을 설정했다면,
이 값을 실제 Application(SWC)에서 사용할 수 있도록 Port를 구성해야 한다.
이 단계는 단순히 Port를 추가하는 작업이 아니라, IoHwAb와 SWC 간의 데이터 전달 방식을 정의하는 과정이다.
먼저 Application SWC의 Ports 항목에서 새로운 Port를 추가하고,
Client-Server Interface의 Client (Required Port) 형태로 설정한다.
이때 사용하는 인터페이스는 IoHwAb_If_AnInDir이며,
이는 IoHwAb Analog Input Direct에서 사용하는 표준 인터페이스다.

이 인터페이스에는 ReadDirect라는 Operation이 정의되어 있다.
여기서 중요한 점은 데이터 전달 방식이다.
Analog Input Direct는 일반적인 Sender-Receiver 방식과 다르게 RTE 버퍼에 값을 저장해두고 읽는 구조가 아니라
SWC가 필요할 때 IoHwAb에 직접 요청하여 값을 읽어오는 구조다.
따라서 이 구조는 Rte_Read가 아닌 Rte_Call 기반의 Client-Server 방식으로 동작한다.

Port 설정 Short Name 은 'R_P6_2_Bplus_ADC_IN'로 설정하였다.
그리고 Required Com Specs 항목에서 Enable Required Com Specs를 반드시 활성화해야 한다.
이 설정을 하지 않으면 RTE에서 해당 호출이 정상적으로 생성되지 않는다.
Port 설정이 완료되면, 이제 Runnable에서 해당 Port를 사용할 수 있도록 설정해야 한다.
Runnable 탭으로 이동한 뒤, 값을 읽고자 하는 Runnable의 Operation / Mode / Trigger Access 항목에서
Synchronous Server Call Point를 추가한다.

6. Composition에서 연결
Analog Input Direct는 Client-Server 구조를 사용하지만,
Sender-Receiver와 달리 설정 시점에 바로 연결할 수는 없다.
그 이유는 IoHwAb 측의 Server Port가 Generate 수행 이후에 자동으로 생성되기 때문이다.
따라서 실제 작업 순서는 다음과 같다.
위에서 IoHwAb 및 SWC Port 설정을 했다면, 하모나이즈를 먼저 수행하고 generate 이후
Composition에서 IoHwAb Server Port와 SWC Client Port 연결해야 한다.
즉, Client-Server 구조라고 해서 연결을 안 하는 것이 아니라 "generate 이후에 연결해야 하는 구조"다.


하모나이즈를 먼저 수행하고 Generate를 수행하면, 아직 Composition에서 Port 연결을 하지 않은 상태이기 때문에
Generate 과정에서 에러가 발생한다.
이 에러는 단순한 설정 오류가 아니라,
Client-Server 구조에서 Server Port가 아직 연결되지 않았기 때문에 발생하는 정상적인 에러다.
즉, Generate 과정에서 발생한 에러는 문제 상황이 아니라 다음 단계를 수행하기 위한 정상적인 흐름이다.
이렇게 Harmonize 및 Generate 를 수행했다면, Composition으로 이동하여
Generate로 생성된 IoHwAb Server Port와 SWC Client Port 연결하면 된다.

IoHwAb의 Server Port 와 SWC의 Client Port 를 연결한 뒤
다시 Generate를 수행하면 에러 없이 정상적으로 코드가 생성된다.

7. Generate 이후 SWC에서 사용 코드 작성
Composition 연결까지 완료하고 Generate를 정상적으로 수행했다면,
이제 SWC에서 IoHwAb Analog Input 값을 실제로 사용할 수 있는 상태가 된다.
이 단계에서는 단순히 함수를 호출하는 것이 아니라,
RTE를 통해 IoHwAb의 ADC 값을 요청하고 사용하는 로직을 작성하는 과정이다.
IoHwAbAnalogInputDirect는 Sender-Receiver 방식이 아니라 Client-Server 구조를 사용한다.
따라서 SWC에서는 Rte_Read가 아닌 Rte_Call 함수를 통해 값을 읽어야 한다.
Generate 이후, 다음과 같은 형태의 함수가 생성된다.
#ifndef Rte_Call_R_P6_2_Bplus_ADC_IN_ReadDirect
#define Rte_Call_R_P6_2_Bplus_ADC_IN_ReadDirect Rte_Call_SWC_ABS_R_P6_2_Bplus_ADC_IN_ReadDirect
#endif
FUNC(Std_ReturnType, RTE_CODE) Rte_Call_SWC_ABS_R_P6_2_Bplus_ADC_IN_ReadDirect
(
P2VAR(IoHwAb_ValueType, AUTOMATIC, RTE_APPL_DATA) Value,
VAR(IoHwAb_LengthType, AUTOMATIC) AnaInDirLength
);
Generate 이후 생성된 함수 형태를 보면, 단순히 하나의 값을 반환하는 구조가 아니라
두 개의 파라미터를 가지는 형태로 정의되어 있는 것을 확인할 수 있다.
이 구조는 IoHwAb Analog Input Direct가 단일 값이 아니라
“버퍼와 길이”를 함께 사용하는 방식으로 설계되어 있기 때문이다.
첫 번째 파라미터는 ADC 값을 저장할 변수의 주소이며,
두 번째 파라미터는 몇 개의 데이터를 읽어올 것인지를 나타내는 길이 값이다.
일반적으로 단일 Analog Input을 사용하는 경우에는 읽어올 데이터가 1개이기 때문에 길이 값은 1로 설정하면 된다.
실제 SWC에서는 Runnable 내부에서 이 함수를 호출하여 값을 사용하게 된다.
Runnable이 실행되면 SWC는 RTE를 통해 IoHwAb에 ReadDirect 요청을 보내고,
IoHwAb는 내부적으로 Adc Driver를 호출하여 해당 시점의 실제 ADC 값을 읽어온 뒤,
그 결과를 다시 SWC로 반환하게 된다.
여기서 중요한 점은 이 동작이 단순히 저장된 값을 읽는 것이 아니라
함수를 호출하는 순간 실제 하드웨어 ADC 값을 직접 읽어온다는 것이다.
즉, 이 구조는 RTE 내부 버퍼를 사용하는 방식이 아니라 항상 최신 값을 가져오는 방식으로 동작한다.
예를 들어 주기적으로 ADC 값을 읽고 싶다면, 해당 Runnable(예: 10ms Task)에 아래와 같이 코드를 작성한다.
void Runnable_10ms(void)
{
uint16 adcValue;
(void)Rte_Call_R_P6_2_Bplus_ADC_IN_ReadDirect(&adcValue, 1);
}
이 단계까지 완료하면 하드웨어 ADC 값이 IoHwAb를 거쳐 RTE를 통해 SWC에서 직접 사용 가능한 상태가 된다.
이로써 IoHwAb Analog Input Direct의 설정부터 실제 사용까지 전 과정을 모두 구성할 수 있다.
'mobilgene > 미분류' 카테고리의 다른 글
| [Det] AUTOSAR Det(Development Error Tracer)란 무엇인가? (0) | 2026.05.25 |
|---|---|
| [WdgM] Watchdog Manager란? Mobilgene에서 WdgM 설정 구조 이해하기 (0) | 2026.05.15 |
| [IoHwAb] AUTOSAR IoHwAb 완전 정리 2편 – IoHwAbConfig 구조와 실무 설정 (0) | 2026.04.30 |
| [IoHwAb] AUTOSAR IoHwAb 완전 정리 1편 – IoHwAbGeneral 구조와 실무 설정 (0) | 2026.04.30 |
| [EcuC] AUTOSAR EcuC 모듈 이해 – 구조부터 EcuPartition 실무 설정까지 (0) | 2026.04.29 |