Cortex-M7 Component Block

(4) NVIC(Nested Vectored Interrupt Controller)

다음으로는 인터럽트 컨트롤러인 NVIC이다.

M시리즈의 대표적인 특징이라고 한다면 인터럽트 컨트롤러가 Core 내부에 위치한다는 것이다.

이는 빠른 Interrupt 처리를 가능케 하고 당연 Performance를 향상시킬 수 있다.

 

컨트롤러가 Core 내부에 위치하는게 왜 빠른 Interrupt 처리를 가능케 할까?

만약 Interrupt 컨트롤러가 Core 외부에 있다면 Interrupt가 발생했을 때, 어떤 Interrupt가 발생했는지 CPU는 즉각적으로 알 수가 없고 알 수가 없으니 당연히 빠르게 처리할 수가 없다. 

즉, Interrupt란 주변에 있는 기기 등이 어떤 필요에 의해 CPU를 부르는 것인데.. 누군가 CPU를 불렀는데 CPU는 누가 불렀는지 알 수가 없는 것이다.

따라서 CPU는 누가 불렀는지 알아내기 위해 관련된 Register들에 접근을 해야만 누군지를 알 수 있고 파악이 되고 나서야 대응할 수 있는 것이다. 

 

반대로 Interrupt 컨트롤러가 Core내부에 있다면 상황은 완전히 바뀐다. 

컨트롤러가 내부에 존재함으로써 Interrupt가 발생했을 때, CPU는 즉각적으로 어떤 Interrupt인지를 알 수 있다.

당연히 어떤 Interrupt인지 판별하는 과정이 줄어들기에 빠른 처리가 가능할 것이고 NVIC의 특징인 Nested, Vectored Interrupt 처리로 더욱 빠른 처리를 가능하게 한다.

그렇다면 NVIC의 Nested, Vectored의 의미와 함께 Interrupt 처리를 간단히 살펴보자.

 

- Nested

'중첩'의 의미이다. 다음 그림을 살펴보자.

Nested의 의미


Interrupt1을 처리하는 중에 우선순위가 더 높은 Interrupt2가 발생하면 현재 수행중이던 Interrupt1을 중단하고 나중에 발생한 '더 높은 우선순위'를 가진 Interrupt2를 먼저 처리한다. 

이후 우선순위가 더 높은 Interrupt2를 처리 하고 나서 중단되었던 Interrupt1 처리로 복귀하여 마저 처리하고 Normal한 루틴으로 복귀를 할 수 있다.

 

이렇게 Interrupt를 수행하다 더 높은 우선순위를 가진 다른 Interrupt를 처리하는 것이 '중첩(Nested)'의 의미이다.

추가적으로 Interrupt에 우선순위가 있다고 기술했는데 이 또한 이번 포스트에서 간단히 설명하도록 하겠다.

 

- Vectored

Vectored는 Interrupt가 발생했을 때, 정해진 Vector Table을 참조해 ISR의 시작 주소로 바로 Branch할 수 있음을 의미한다.

Vector Table이란 무엇일까?

 

- Vector Table

Vector Table

먼저 Interrupt가 발생하면 프로세서는 하던 일을 중단하고 Interrupt를 처리하기 위해 Interrupt Service Routine(ISR)으로 들어가야 한다.

이러한 Interrupt Service Routine(ISR)을 수행하기 위해서는 해당 Interrupt에 대한 Handler를 찾아가야 하는데 이 Handler의 "주소"가 담겨있는 곳이 바로 Vector Table이다.

예를 들어, Vector Table의 0x00000004번지에는 Reset을 수행하는 코드가 있는 "주소"가 담겨있는 것이다.

 

필자는 주소가 담겨있음을 계속해서 강조하고 있다.

Vector Table에는 직접적으로 처리할 수 있는 Instruction이나 코드가 담겨있는 것이 아니라

Table을 참조해 Handler의 주소로 Branch를 하는 것임을 명심하자.

 

이 Vector Table을 이용한 Interrupt 처리 과정을 간략하게 정리해보자면
1. Interrupt가 발생하면 2. Vector Table에서 해당 Interrupt에 맞는 Handler가 있는 주소를 알 수가 있고 3. 해당 주소로 Branch하여 4. Interrupt Service Routine(ISR)에 돌입한다.

정도로 정리할 수 있겠다.

 

Interrupt에 대한 자세한 내용은 추후 포스트로 다룰 예정이니 이쯤하도록 하고

앞서 Interrupt 우선순위에 대한 내용이 나왔었는데 이는 ARM 문서 NVIC 특징에 다음과 같이 잘 나타나있다. 

 

1) External interrupts, configurable from 1 to 240. This is configured at implementation.
2) Configurable levels of interrupt priority from 8 to 256. Configured at implementation.

 

위 특징은 아래 첨부된 Exception numbers Table을 통해서
1~15는 내부(internal) interrupts, 16~255는 외부(external) interrupts(1~240가지)로 구성할 수 있음을 확인할 수 있다. 
추가적으로 고정 우선순위를 가진 Reset(-3), NMI(-2), HardFault(-1)은 우선순위를 조정할 수 없지만 이외에 Exception들은 사용자의 입맛에 맞게 우선순위를 부여할 수 있다. 

 

Exception Priority Table

(5) WIC(Wake-up Interrupt Controller)

Component Block에서 보면 NVIC옆에 WIC라는 놈이 보인다. 

특징에는 The optional WIC provides ultra-low power sleep mode support 로만 나타나 있다.

예상을 해보자면 프로세서가 저전력을 위해 Sleep Mode에 있을 때,

다른 Interrupt를 필터링 하다 특정 Interrupt를 받으면 프로세서를 Sleep Mode에서 깨어날 수 있도록 하기에 'Wake-up'이라는 이름을 갖지 않을까 예상해본다. 


이번 포스트는 여기서 마치고

Debug Unit을 제외한 Component Block 공부는 다음 포스트에서 마무리해보도록 하겠다 :)

 

출처 : ARM Cortex-M7 Processor Technical Reference Manual 문서, ARM

          ARM Microprocessor Systems Cortex-M Architecture, Programming, and Interfacing, CRC Press

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기