지난번에 이어 Special Register에 대해서 좀 더 설명해보도록 할게요.

Special Register

위 Special Register 중에서 PSR만 살펴봤으니 오늘은 Exception Mask Register들과 CONTROL Register에 대해서 정리하고 Special Register 부분을 마무리하도록 하겠습니다.

 

- Exception Mask Register

Exception Mask Register라는 것은 특정한 Exception들을 Masking처리해서 Exception이 발생하더라도 무시하겠다는 의미입니다.
이에 대해 살펴보기 전에 이전에 봤었던 Exception들의 Priority 표를 다시 한번 가져와보도록 할게요.

Exception Priority

Cortex-M7에 있는 Exception들은 우선순위(Priority)를 가지고 있고
고정 우선순위를 가진 Reset(-3), NMI(-2), HardFault(-1)와 사용자의 입맛에 맞게 우선순위를 부여할 수 있는 Exception들이 존재한다고 했었습니다. 

이를 이용해 어떤 Exception을 처리할 때, 그 보다 높은 우선순위(더 낮은 Priority 값)를 가진 Exception이 발생하면
원래 하고있던 Exception 처리를 중단하고 더 높은 우선순위의 Exception을 처리하는 중첩(Nested)이 발생한다고 했었죠.

이를 기억하고 문서에서 소개된 Exception Mask Register인 PRIMASK, FAULTMASK, BASEPRI에 대해 살펴봅시다.

 

 

1. PRIMASK

PRIMASK Register

PRIMASK는 Exception Priority0으로 해서 고정우선순위를 갖는 Reset(-3), NMI(-2), HardFault(-1) 외에
Configurable priority 즉, 설정할 수 있는 우선순위를 가진 Exception이 활성화되지 않도록 하는 레지스터 입니다.

따라서 PRIMASK를 1로 하면 RESET,NMI,HardFault 이외에 다른 Exception들은 모두 Masking 처리가 되겠네요.

 

2. FAULTMASK

FAULTMASK Register

FAULTMASK같은 경우는 Exception Priority-1로 합니다.
따라서 FAULTMASK를 1로하면 이보다 우선순위가 낮은(더 높은 Priority 값) Exception을 Masking처리하기 때문에
Reset(-3), NMI(-2) 외에 HardFault(-1), Configurable priority를 가진 Exception들은 활성화 되지 않겠네요.

 

3. BASEPRI

BASEPRI Register

BASEPRI는 앞서 본 PRIMASK, FAULTMASK와 달리 8-bit Mask Register입니다.

BASEPRI같은 경우, BASEPRI 값과 같거나 더 낮은 Priority Level Exception들이 활성화 되지 않도록 Masking 합니다.

8-bit인 이유는 설정할 수 있는 Exception Priority Level이 총 256단계이기 때문에 그렇습니다.

 

추가적으로 BASEPRI같은 경우는 Nested Exception을 처리할 때 중요합니다.

예를 들어 현재 처리중인 Exception의 Priority Level이 50이라고 한다면 50보다 더 높은 우선순위(50보다 더 낮은 값)를 가지는 Exception이 들어온다면 현재 Exception 처리를 중지하고 더 높은 우선순위 Exception을 처리해야겠지만 
더 낮은 우선순위(50보다 높은 값)을 가지는 Exception은 쳐내야겠죠.

 

따라서 예시와 같이 Priority Level이 50인 Exception이 발생하면
BASEPRI를 50으로 해서 50보다 같거나 더 낮은 Priority Level을 가지는 Exception을 Masking 해버리면서 
더 높은 Priority Level을 가지는 Exception이 들어올 때만 Nested 처리가 가능하게 해줍니다.


 - CONTROL Register

다음으로는 Special Register의 마지막, CONTROL Register에 대해 살펴봅시다.

Control Register

· nPRIV, bit[0]
0 : Thread mode has privileged access.
1 : Thread mode has unprivileged access.
Cortex-M7의 Operation Mode에 대해 공부할 때,
Thread Mode는 Privileged와 Unprivileged 두가지 모두 가능하다고 했습니다.
따라서 해당 bit는 Thread Mode에서 Privileged를 사용할지 Unprivileged를 사용할지를 정의하는 bit입니다.

· SPSEL, bit[1]

0 : Use SP_main as the current stack.

1: In Thread mode, use SP_process as the current stack

Cortex-M7은 SP_main과 SP_process로 Banked Stack Pointer 구조를 가지고 있죠.

해당 bit가 0이라면 SP_main을 쓰는 것이고, bit가 1이라면 SP_process를 쓰는 것이 되겠습니다.

 

· FPCA, bit[2]

0 : FP extension not active

1 : FP extension is active

해당 bit는 FP extenstion을 사용하는지 아닌지를 나타내는 bit입니다.
참고로 FP는 Floating Point로 FP extenstion이라고 한다면 소수점을 좀 더 자세히 표현한다는 의미가 되겠네요.

 


이상으로 Cortex-M7의 Special Register까지 알아봤습니다. 

뒤로 넘어갈수록 앞서 공부했던 내용들과 연계되는 내용이 참 많은 것 같은데

문서를 읽으면서 아는 단어들이 나오면 그때서야 뭔가 공부했구나 느껴지는 것 같아서 좋습니다 :)

다들 좋은 하루 되셨길 바라며 나중에 돌아오도록 하겠습니다. 

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