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
}
}