관리 메뉴

Leo's Garage

MCAL IRQ과 AUTOSAR OS ISR 연결 본문

Embedded/AURIX

MCAL IRQ과 AUTOSAR OS ISR 연결

LeoBehindK 2023. 7. 18. 00:51
728x90
반응형

MCAL에는  IRQ(Interrupt Request)라는 모듈이 존재한다. 

Infineon AUTOSAR stack Concept - IRQ는 MCAL Complex driver에 포함되어 있는데 생략되었다.

해당 모듈은 각 MCU에서 Interrupt를 관장하는 HW와 user간에 통일된 API 혹은 함수로 호출할 수 있도록 사전에 정의해 놓은 코드들이다. 

 

AUTOSAR를 적용하면, Interrupt에 대해서 Category라는 것을 적용하게 된다. 

그에 대한 정의를 보면 아래와 같다. 

Category 1. Cat1 interrupts are not supported by the OS and are only allowed to make a very small selection of OS calls to enable and disable all interrupts.

Category 2. Cat2 ISRs are supported by the OS and can make OS calls.

즉, CAT1은 OS에 영향 받지 않고 호출되는 Interrupt이고, CAT2는 OS에 의해서 호출되는 Interrupt이다. 

시스템 상 아주 Time Critical한 로직의 경우에는 CAT1로 하는 것이 맞고, 그렇지 않은 경우에는 주로 CAT2로 설정한다. 

아무튼 오늘하고 싶은 이야기는 이러한 Interrupt를 AUTOSAR 설정에 맞게 CAT1, CAT2로 설정해서 작업하다가 생긴 실수에 대한 이야기 이다. 

 

특정 HW 조건에 맞게 Interrupt를 발생시키기 위한 작업을 하던 중에 해당 HW모듈에 적절한 작업을 하고 동작까지 확인하였다. 실제로 원하는 대로 동작을 하고 해당 동작을 재현도 가능했다.

문제는 해당 동작 이후에 설정한 Interrupt가 발생하지 않는 것이었는데, 아무리 동작을 해봐도 Interrupt는 발생하지 않았다. 따라서  각종 설정을 확인하고 AUTOSAR OS 쪽 configuration도 꼼꼼히 살펴보았다. 실제로 특정 Servive rountine으로 들어가는 register 주소값이 정확히 들어갔는지, Priority는 제대로 들어갔는지 말이다. 

실제로 동작을 시켜보면서 디버거로 하나하나 확인하기 시작했다. 실제로 HW 모듈을 정상적으로 동작했고, Interrupt도 뜬 걸 확인했는데 왠걸 내가 의도한 Interrupt service rountine이 아닌 다른 ISR을 자꾸 호출하는 것이었다. 

그래서 하나하나 다시 확인해보니 MCAL IRQ 내에 priority와 AUTOSAR OS Interrupt 설정 내 Priority가 다르게 설정되어있던 것이었다. 보통 MCAL의 IRQ 설정을 우선적으로 따르므로 HW 입장에서는 본인 동작을 마치고 IRQ 설정대로 ISR을 따라갔는데 해당 함수가 없던 상황인 것이다. 즉 OS Interrupt 설정된 함수와 만나야하는데 이 부분이 어긋나 동작하지 못했던 것!

확인 또 확인해야 한다. 

쉬운 작업인데 이걸로 시간을 너무 허비하였다. 

728x90
반응형
Comments