지난 포스트부터 Exception에 대한 정리를 시작했고 Exception Type에 대해 알아봤습니다.

이번 포스트에서는 Exception 우선순위(Priority)를 어떻게 결정하는지에 대해서 살펴봅시다.

지난번에 살펴봤듯이  Reset(-3), NMI(-2), HardFault(-1)은 고정 우선순위를 가지지만
이외에 Exception들은 사용자가 우선순위를 부여할 수있는 Configurable Priority를 가집니다.

 

Configurable Priority를 가지는 Exception들에 우선순위를 부여할 때 관련된 Register를 이용하게 되는데 
이런 우선순위를 결정하는 Register에 대해서 살펴봅시다.


· System Handler Priority Register(SHPR)

Exception Number Table

SHPR은 위에 표시한 내부 Exception들의 Priority를 결정하는 Register입니다.

Reset, NMI, HardFault가 빠져있는 이유는.. 고정 우선순위를 가지기 때문입니다. 

그럼 Exception Number 4~15번 Exception들, 총 12개의 Exception들에 대한 Priority를 결정할 수 있겠네요.

 

SHPR(왼쪽부터 SHPR1, SHPR2, SHPR3)

위의 사진이 바로 Exception Number 4~15번 Exception들의 우선순위를 정의하기 위한 SHPR입니다.

보시다시피 SHPR1, SHPR2, SHPR3 총 3개의 32-bit Register가 존재하고

각 SHPR에는 8-bit 씩 Field가 나누어져 있습니다.

 

또 Field이름을 보면 PRI_4, PRI_5 ... PRI_15로 되어있죠.

즉, 각 8-bit Field는 해당 Exception Number의 Priority를 결정하는 공간인 것입니다.

예를 들어, 11번 SVCall의 우선순위를 100으로 하고 싶다면 PRI_11 Field에 100(16진수로는 0x64)을 넣으면 되겠습니다.

 

근데 Field에 PRI_0~PRI_3은 왜 없을까요?

Exception Number Table을 보시면 1번은 Reset, 2번은 NMI, 3번은 HardFault입니다.

Exception Number 0은 존재하지도 않고 1,2,3번은 고정 우선순위를 가지니
쓰지도 않을 SHPR0이라는 Register를 따로 두고 PRI_0~PRI_3 Field를 만들어 놓을 필요가 없겠네요.

 

· Interrupt Priority Register(IPR)

Exception Number 4~15번 Exception들에 대한 우선순위 결정을 알아봤으니 

Exception Number 16~255번 Exception들(외부 Exception)에 대한 우선순위 결정 Register, IPR을 살펴봅시다.

Exception Number Table

IPR로의 우선순위 결정은 SHPR과 Register 개수만 다를 뿐 방식은 다르지 않습니다. 

IPR

외부 Exception은 Exception Number 16~255번, 총 240개까지 있을 수 있으므로 총 240개의 Field가 있어야하죠.

하나의 32-bit IPR에는 8-bit Field가 4개 존재하기 때문에 PRI_0부터 PRI_59까지 총 60개의 Register가 존재하는 것을 볼 수 있습니다.

 

그러면 각 Field는 어떤 Exception의 Priority를 결정할지 예상이 되시죠?

PRI_0은 External Interrupt 0(Exception Number 16)의 우선순위를 결정하고
PRI_239는 External Interrupt 239(Exception Number 255)의 우선순위를 결정하겠습니다.

 


SHPR, IPR Register를 통해 각 Exception들에 대해 Priority가 어떻게 결정되는지에 대해서 살펴봤습니다.

그런데.. 이렇게 단순히 Priority를 결정하는 것 외에
Group Prioiry와 Sub Priority라는 것을 이용해서 Priority를 설정할 수가 있습니다.

 

Group Priority는 말 그대로 Exception들을 몇가지의 그룹(묶음)으로 만들어서 그룹 간 우선순위를 부여하는 것이고
Sub Priority는 동일한 그룹 안에 있는 Exception들 간의 우선순위를 정해주는 것입니다.

그러면 Group Priority과 Sub Priority는 어떻게 결정할까요?

앞서 SHPR, IPR Register를 이용해서 각 Exception마다 8-bit짜리 우선순위를 부여했었습니다.

이때 Group Priority과 Sub Priority를 부여하고 싶다면 AIRCR이라는 Register를 이용해서
8-bit에서 앞의 몇개의 bit를 Group Priority로 사용할지(나머지 bit는 Sub Priority로 사용) 정하게됩니다.

잘 이해가 안될 수 있으니 AIRCR을 살펴보면서 관련된 내용을 살펴봅시다.

 

· Application Interrupt and Reset Control Register (AIRCR)

Application Interrupt and Reset Control Register (AIRCR)

[31:16] bits에 있는 VECTKEY, VECTKEYSTAT은 열쇠라고 생각하면 됩니다.
AIRCR을 읽으려면(Read) 해당 Field에 0xFA05를 입력해야 하고 쓰려면(Write) 해당 Field에 0x05FA를 입력해야만 해요.

[15] bit, ENDIANNESS는 Memory System의 Endianness를 나타내는 부분으로 
0이면 Little-Endian, 1이면 Big-Endian이라는 것을 나타냅니다.

[10:8] bits, PRIGROUP이 바로 위에서 설명한 8-bit Priority값에서 Group Prioiry, Sub Priority의 경계선을 지정하는 부분이라고 할 수 있어요. 

아래와 같이 PRIGROUP값을 어떻게 선택하느냐에 따라서 앞의 몇 bit가 Group Priority를 나타낼지를 결정합니다.

PRIGROUP Group / Sub Group Priority 개수 Sub Priority 개수
0 GGGGGGG/S 128 2
1 GGGGGG/SS 64 4
2 GGGGG/SSS 32 8
3 GGGG/SSSS 16 16
4 GGG/SSSSS 8 32
5 GG/SSSSSS 4 64
6 G/SSSSSSS 2 128
7 /SSSSSSSS 1 256

[2] bit, SYSRESETREQ는 System Reset Request bit이고 
[1] bit, VECTCLRACTIVE나 [0] bit, VECTRESET은 Debugging 관련된 bit이라는 정도로만 이해했습니다.

 


이렇게 저번 Exception Type에 이어 Priority를 어떻게 설정하는지에 대해서 알아봤습니다. 

다음 포스트에서는 저희가 궁금했던 Exception이 어떻게 처리되는지에 대한 Routine을 알아보도록 할게요.

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