SW(software)

차량용SW기본개념(AUTOSAR/ASW/BSW/RTE/MCAL/샘플코드)

동프로 2026. 1. 24. 21:49
반응형

Application(ASW)   : 실제 로직을 짜는 구간(일반적으로 알고있는것들 if등으로 )

 |

RTE                          : 코드보단 구성을 해주는 것 ASW의 호출을 BSW기능으로 연결

BSW API(autosar)  : 전압값을 온도로 변환하는 레이어(ADC, 수식(스케일) 등 적용) 

MCAL                      : 반도체 제조사의 기능 0,1 제어(레지스터 직접제어) 

 |

Hardware(MCU)

 

BSW(Basic software) Layer : OS, 메모리, I/O, 통신, 진단

MCAL : 하드웨어 레지스터를 직접 제어하는 가장 하단 층

ECU Abstraction Layer : 센서, ACT등 외부 장치를 수행

Services layer : 진단, 통신, 메모리 관리, 전원 관리등 수행

 

일반적으로 AUTOSAR플랫폼이라고 하는건 : RTE + BSW(OS, 통신, 스택, 메모리 스택 등)

 - ASW(응용소프트웨어)가 구동될수 있도록 바닥에서 깔아주는 기반 소프트웨어(윈도우)

 

이해하기 쉽게 각 레이어들을 샘플을 통해 설명해드리겠습니다.

1)ASW : 하드웨어가 LED인지 전구인지, 센서가 어디있는지 고민하지 않고 오직 밝기값과 전등상태에만 집중합니다.

          - 제어로직(100ms마다 실행), 특정값에서 조도값을 읽어옴, 몇 이상에서 작동, 출력 송부

/* ASW: Headlight Control Component */
/* 주기적으로 실행되는 함수 (예: 100ms 마다 실행) */
void HeadlightControl_Runnable(void) {
    uint16 ambientLight = 0;
    boolean lightCommand = FALSE;

    /* RTE를 통해 현재 조도(Lux) 값을 읽어옴 */
    /* 실제 하드웨어가 ADC인지 CAN 통신인지 몰라도 됨 */
    Rte_Read_rpLightSensor_Lux(&ambientLight);

    /* 제어 로직 (Hysteresis 적용: 잦은 깜빡임 방지) */
    if (ambientLight < 500) {  /* 500 Lux 미만일 때 */
        lightCommand = TRUE;
    } else if (ambientLight > 700) {
        lightCommand = FALSE;
    }

    /* RTE를 통해 전조등 상태 출력 명령 보냄 */
    Rte_Write_ppHeadlight_Status(lightCommand);
}

2)RTE : ASW가 호출한 실제 데이터가 있는 곳으로 연결

/* RTE 자동 생성 코드 (개념적 코드) */
Std_ReturnType Rte_Read_rpLightSensor_Lux(uint16* data) {
    /* BSW의 IoHwAb 계층 함수를 호출하여 실제 물리적 수치를 가져옴 */
    return IoHwAb_Get_AmbientLight(data);
}

3)BSW : 하드웨어에서 올라온 데이터를 사람들이 쓰는 값으로 변경

            - ADC값 -> lux

/* BSW: 조도 센서 추상화 구현 */
Std_ReturnType IoHwAb_Get_AmbientLight(uint16* lux) {
    uint16 adcValue;
    /* MCAL의 ADC 드라이버를 통해 전압 레벨(0~4095)을 읽음 */
    Adc_ReadGroup(AdcConf_AdcGroup_LightSensor, &adcValue);

    /* 이론적 근거: 조도와 전압의 상관관계 식 적용 */
    /* Lux = (V_ref * AdcValue / 4096) * Calibration_Factor */
    *lux = (uint16)((float32)adcValue * 0.5f); 
    
    return E_OK;
}

4)MCAL : 레지스터 활성화

/* MCAL: 하드웨어 직접 제어 */
void Dio_WriteChannel(Dio_ChannelType ChannelId, Dio_LevelType Level) {
    /* 특정 주소의 레지스터 비트를 0 또는 1로 바꿈 */
    if(Level == STD_HIGH) {
        *(volatile uint32*)0x4000C004 |= (1 << ChannelId); // Pin High
    } else {
        *(volatile uint32*)0x4000C004 &= ~(1 << ChannelId); // Pin Low
    }
}

반응형