본문 바로가기
AUTOSAR, ASPICE

[AUTOSAR] MCAR Layer란? #MCAR

by jjongday 2024. 4. 20.
반응형

MCAR Layer에 대해서...

한 마디로 말하면 Device Driver라고 할 수 있다.

MCAL로 제공된 Device Driver는 OS가 제공되지 않는 Embedded 환경에서도 동작이 가능하다는 것이다.


즉, Firmware Level에서는 Device Driver를 제어(Control)할 수 있도록 제공되는 것이 Driver인데 AUTOSAR용 MCAL은 AUTOSR에서 규정한 API 이름을 사용해 Device Driver를 제어할 수 있도록 제공한다. 차량용 반도체 회사에서는 AUTOSAR에서 규정한 API만으로는 각 MCU의 고유한 특징을 제어하기에 부족할 경우에는 독자적인 Parameter를 제공을 하고 있다. AUTOSAR용 MCAL의 가장 큰 특징은 XML 형식을 이용한 소스코드 자동 생성이므로, MCU Vendor에 의존한 독자 Parameter를 제공할 경우 XML 형식으로 독자 Parameter를 설정할 수 있어야 하며 자동으로 독자 Parameter의 확장 API 소스코드를 생성할 수 있도록 제공해야만 한다. MCAL은 AUTOSAR Software Architec ture상 다음 그림처럼 Microcontroller 위에 위치해 Microcontroller를 직접적으로 컨트롤할 수 있다.

 

MCAL은 아래와 같이 크게 4가지로 분류된다.
1. Microcontroller Drivers
2. Memory Drivers
3. Communication Drivers
4. I/O Drivers

 

 

1. Microcontroller Drivers

Microcontroller Drivers는 MCU, WDT(Watchdog Timer), GPT(General Purpose Timer)로 구성되어 있다.

이 중에 중요한 부분이 MCU이다. 이 MCU는 Microcontroller가 동작하기 위한 clock과 PLL를 설정하고, 메모리 영역의 초기화를 담당한다. 또한 MCU는 전원 모드에 대한 것을 담당한다. 절전모드에 들어가게 하면 Reset을 할 수 있도록 해주며 현재 MCU의 모드를 알려준다. 이 MCU 모듈은 Mcu_Init이라는 함수에 의해서 동작되며 이것은 EcuM_Init이라는 함수 안에 존재할 것이다. GPT(General Purpose Timer)는 타이머의 기능을 한다.

 

GPT는 구현하는 것에 따라서 GTM(Generic Timer Module)을 이용해서 구현하는 경우도 있고 또는 Microcontroller 안에 있는 Timer 기능을 통해서 구현하는 경우로 나뉘어진다. MCU Driver의 clock을 이용하며 HW Timer(OS 사용)로 사용되면 time에 관련한 interrupt, wakeup에 사용할 수 있다. GPT_StartTimer, GPT_StopTimer라는 함수를 통해서 타이머를 구동시키면 시간이 Expire가 되면 연결되어진 Timer Notification 함수를 호출한다. WDT는 Microcontroller 안에서 보면은 여러 가지가 있다.

 

예를 들어서 safety watchdog, external watchdog, internal watchdog 등 다양하다. 이 와중에 Internal watchdog을 말하며 Multicore인 경우 core마다 하나씩 watchdog이 있다. Internal watchdog은 소프트웨어 Logic에 에러가 발생한 경우로 정상적인 동작을 하지 못했을 경우 Software, System을 Reset 시켜주는 일을 한다. 종류는 원하던 상태로 Active되었는지를 Monitoring하는 WdgMAliveSupervision, 원하던 시간 안에 Logic이 처리되었는지를 Monitoring하는 WdgMDeadline Supervision, 설계한 Logic대로 동작하는지를 Monitoring하는 WdgMExternalLogicalSupervision 등이 있다.

 

 

2. Memory Drivers

Memory Drivers는 Microcontroller에 들어가는 Flash, EEPROM 두 가지를 지원해준다. 그 상위 층에는 이것들을 가상화 시켜준 Ea(EEPROM Abstraction), Fee(Flash EEPROM Emulation)에 있고, 맨 위에 MemIf(Memory Interface) 그 위에는  NvM(NV RAM Manager)등이 있다.

 

 

3. Communication Drivers

Communication Drivers는 CAN, LIN, SPI Handler, FlexRay, Ethernet 등이 있지만, 주로 CAN을 얘기한다. CAN은 맨 하단에 CanDrv가 있고 그 상위에 CanIf가 있다. 그리고 모드 제어를 위해서 COM과 PduR(PDU Router)이 있다. 

 

위의 그림을 크게 보면 세 층으로 나누어진다. 세 층을 이루고 있는 모듈 중에서 Communication에 관련된 모듈을 모아서 Communication Stack이라고 부른다. Com-Stack을 이루는 모듈들 사이의 관계를 살펴보면 아래 그림과 같다. Application Layer를 기준으로 전송하는 메시지는 Tx 메시지라 하고, 받는 메시지를 Rx 메시지라 한다. CAN 메시지는 여러 개의 모듈에 걸쳐 전달된다. 메시지가 전달될 때 이는 Signal, PDU, Frame의 형태로 각각의 모듈에 전달된다. Tx 메시지의 경우 RTE는 Application Layer에서 SystemSignal을 받아 Com에 ISignal을 전달한다. 반대로 RX 메시지의 경우 Com에서 ISignal을 받아 ASW로 SystemSignal을 전달한다.

 

CAN통신에 관련된 내용은 공부양이 많아 다음에 설명을 이어서 할 예정이다.

 

 

4. I/O Drivers

I/O Driver에는 ICU, PWM, ADC, DIO, PORT가 있다. 입출력에 대한 부분이 해당되며 구현되는 것에 따라서 GTM(Generic Timer Module)으로 구현되기도 하고 Microcontroller 안에 주변장치로 구현되기도 한다.

 

  • ICU(Input Capture Unit)

ICU(Input Capture Unit)는 신호의 Rising edge Falling edge의 Signal을 설정하고 Notification을 받아내고 이를 분석해 사용하도록 하는 Device Driver이다. Sequence는 Icu_Init(ConfigPtr) → Icu_EnableWakeup(Ch1) → Icu_SetActivation Condition(Ch1) → Icu_SetActiation Condition(Ch1, ICU_FALLING_EDGE) → Icu_EnableNotificaion(Ch1) 로 설정하고 나면 Falling edge가 발생하면 Icu_SignalNofifiaion _Ch1이 호출된다. 호출된 함수에 Logic을 추가해서 기능을 구현하면 된다.

 

  • PWM(Pulse width modulation)

PWM(Pulse width modulation)은 일정한 주기 내에서 Duty비를 변화시켜서 평균전압을 제어해 DC모터의 속도제어나 LED 등 헤드램프의 광량을 조절하는데 많이 사용된다. Duty Cycle은 1초 동안 반복되는 주기이며, 그 한 주기에 “HIGH Value를 유지한 %가 얼마인지가 Duty rate이다. Duty ratio가 30%일 때는 시간당 가해지는 신호의 평균값은 DC 신호의 30%가 된다. 즉, 30%의 DC신호가 가해지는 것과 거의 유사한 효과를 내는 것이다.

Duty cycle설정에 사용되는 API는  Pwm_SetDutyCycle(ChannelNumber, DutyCycle)이며, 주기와 Duty설정 API는 Pwm_SetPeriodAndDuty(Pwm_ChannelType, Pwm_PeriodType, uint16)를 사용한다.

 

  • ADC(Analogue Digital Converter)

ADC(Analogue Digital Converter)는 Analogue 신호를 Digital 신호로 바꾸어서 읽어 들이도록 하는 Device Driver이다. ADC Channel과 ADC Channel Group으로 나눠서 값을 읽어낼 수 있는데, ADC Channel은 ADC port 1개에 대해서만 읽어낼 때 사용되고, ADC Channel Group은 여러 개의 ADC Port가 하나의 기능을 위해 묶음으로 돼 있는 것을 읽어낼 때 사용된다.

 

  • DIO(Digital Input output)

DIO(Digital Input output)는 DIO channel, DIO port, DIO channel group으로 나눠 pin에 대한 input/output을 설정하도록 하는 Device Driver이다.

 

  • PORT

PORT는 MCU의 기본설정 이후에 Board상의 Pin을 어떤 목적으로 사용할지를 결정하고, Pin direction(Input /output), Pin의 Level 초기값을 설정하고 실행 중에 Pin direction 변경을 위한 API를 생성할 것인지 또는 실행 중에 Port Mode의 변경을 위한 API를 생성할 것인지를 설정하는 Device Driver이다.

 

 

이렇게 MCAL을 구성하게 되면은 EcuM 이라는 곳에 붙여 넣게 된다. 이렇게 EcuM에 붙이는 이유는 MCAL에 있는 모듈들을 초기화 하기 위해서다. EcuM에 붙이는 설정까지가 Ecu Configuration 과정에 해당되며 Configuration이 끝나면 Configuration이 잘못 설정되었는지를 확인하는 Verification 과정을 거치고 최종적으로 code generation을 한다. 이렇게 generation 한 코드는 xxx_Cfg.h 파일과 xxx_PBCfg.c 파일로 구성되며 MCAL module 소스에 합쳐서 함께 빌드해야 한다.

 

 

반응형