RTOS - Cortex-M Core Stacking 알아보기

Context 스위칭을 하기 위해서는 우선 Cortex-M Core의 Stacking에 대해서 먼저 이해해야 합니다. Stacking은 Core가 interrupt 에 진입했을 때 정해진 Stackpointer에 Core registers의 내용을 저장하는 것을 말합니다.

아래 그림은 Core registers 인데 우리는 이 레지스터를 통해 CPU의 현재 상태를 알 수 있습니다.

The Cortex-M4 processor core registers

아래 예시는 while 구문 Context 에서의 Core registers입니다. 현재 Stack pointer는 0x20007ff8 입니다.

인터럽트가 걸리면 현재의 Core register를 Stacking하게 되며 따라서 Stack pointer 값이 0x20007ff8 + (8 * 4bytes) = 0x20007fd8 로 변경될것입니다. 이제 interrupt에서 0x20007ff4 번지의 Stack 에 backup 되어 있는 내용을 확인 하도록 하겠습니다.

 

아래 그림에서 Memory를 확인해 보면 Interrupt IRQ에 들어오기 전의 Core registers 가 0x20007ff4 번지 부터 아래 번지로 차례로 저장되어 있는 것을 확인 할 수 있습니다.

  • 0x20007FF4 : xpsr
  • 0x20007FF0 : pc
  • 0x20007FEC : lr
  • 0x20007FE8 : R12
  • 0x20007FE4 : R3
  • 0x20007FE0 : R2
  • 0x20007FDC : R1
  • 0x20007FD8 : R0

 

Interrupt 진입을 위한 Stacking 즉, CPU Registers의 값을 메모리에 저장하거나 메모리에서 읽어와 복구하는 루틴은 Cortex-M CPU에서 하드웨어적으로 구현되어 있습니다. 인터럽트에 진입하면 레지스터의 복사본이 자동으로 스택에 Push됩니다.

 

스택에 있는 레지스터의 복사본을 스택 프레임이라고하며 그림과 같이 레지스터 R0~R3, R12, LR, PC, xPSR입니다.

그렇다면 RTOS의 Context 스위칭시 나머지 빠진 Registers(R4 ~ R11) 은 저장하지 않아도 될까요?

 

참조 RTOS 만들기 : https://cafe.naver.com/openiot/288

참조 Exception interrupt1 : https://cafe.naver.com/stm32study/1957

참조 Exception interrupt2 : https://cafe.naver.com/stm32study/1968