본문 바로가기
Embedded SW/[Infineon] Embedded SW Project

[Infineon] 05. Aurix (TC23x) 인터럽트 Interrupt 이해하기 (1)

by 방구석 임베디드 2021. 5. 19.
반응형

MCU를 개발하는 과정에서 가장 중요한 개념!

바로 인터럽트를 이해하는 부분입니다.

 

인터럽트에 관련된 내용은 구글에 치면 잘 설명이 되어 있으니까!

한번 보고 오셔도 될것 같습니다.

 

예를 들어서 아래와 같은 코드가 돌고 있습니다.

시스템을 초기한 이후 무한루프를 돌고 있는 함수입니다.

그리고 그 함수는 LED를 켰다 껏다를 반복합니다.

우리가 전자 시계를 보면 LED가 깜박깜박합니다.

이러한 흐름의 코드가 들어있기 때문에 가능한 것입니다.

 

int main(void)
{
	/*시스템 초기화*/
	sysinit();
    
    /*무한 루프*/
    while(1)
    {
    	function();
    }
    return 0;
}

static void function(void)
{
	int i;
    
    /*LED ON Function*/
    LED_ON();
    /*Wait*/
    for(i=0;i<100000;i++){}
    
    /*LED OFF Function*/
    LED_OFF();
    /*Wait*/
    for(i=0;i<100000;i++){}    
}


 

다시 말해서 저 코드는 지금 계속 While 구문에 갇혀서 돌고 있습니다.

저것을 polling으로 돌고 있다라고 이야기 합니다.

 

그때 MCU안에 주기적인 시간이 되면 전기신호를 보내주는 System Timer 모듈이라는 놈이 있는데

그놈이 인터럽트 라우터에게 전기 신호를 보냅니다.

야! 1ms가 되었어

 

그러면 인터럽트 라우터는 CPU에게 약속된 전기신호를 보냅니다.

잠시 너가 하는 일을 멈추고, System Timer Module ISR(Interrupt Service Routine)을 실행히켜줘

 

ISR 함수는 아래와 같이 만들어 보았습니다.

void ISR_Timer(void)
{
	static unsigned long Cnt = 0u;
	Cnt ++;   
}

 

결국 위의 Main의 무한루프 함수가 멈추고, 위의 ISR 함수가 실행이 되고 다시 Main 함수로 돌아오게 됩니다.

이때 ISR함수로 점프하기 전에

현재 자신의 레지스터 정보, 그리고 다시 돌아올 주소들을 Stack에 저장합니다.

인피니언은 따로 RAM 메모리를 설정하여 ISR 정보를 관리합니다.

 

커다른 인터럽트 흐름에 대해서 말씀드렸습니다.

그러면 다음 글에서, 이제 System Timer Module을 이용하여 1ms 마다 ISR이 발생하도록 설계를 해보고 확인을 해보도록 하겠습니다.

반응형

댓글