지난 포스트부터 Exception에 대한 정리를 시작했고 Exception Type에 대해 알아봤습니다.
이번 포스트에서는 Exception 우선순위(Priority)를 어떻게 결정하는지에 대해서 살펴봅시다.
지난번에 살펴봤듯이 Reset(-3), NMI(-2), HardFault(-1)은 고정 우선순위를 가지지만
이외에 Exception들은 사용자가 우선순위를 부여할 수있는 Configurable Priority를 가집니다.
Configurable Priority를 가지는 Exception들에 우선순위를 부여할 때 관련된 Register를 이용하게 되는데
이런 우선순위를 결정하는 Register에 대해서 살펴봅시다.
· System Handler Priority Register(SHPR)
SHPR은 위에 표시한 내부 Exception들의 Priority를 결정하는 Register입니다.
Reset, NMI, HardFault가 빠져있는 이유는.. 고정 우선순위를 가지기 때문입니다.
그럼 Exception Number 4~15번 Exception들, 총 12개의 Exception들에 대한 Priority를 결정할 수 있겠네요.
위의 사진이 바로 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을 살펴봅시다.
IPR로의 우선순위 결정은 SHPR과 Register 개수만 다를 뿐 방식은 다르지 않습니다.
외부 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)

[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을 알아보도록 할게요.
최근댓글