Context 스위칭을 하기 위해서는 우선 Cortex-M Core의 Stacking에 대해서 먼저 이해해야 합니다. Stacking은 Core가 interrupt 에 진입했을 때 정해진 Stackpointer에 Core registers의 내용을 저장하는 것을 말합니다.
아래 그림은 Core registers 인데 우리는 이 레지스터를 통해 CPU의 현재 상태를 알 수 있습니다.
아래 예시는 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
'▶ RTOS > RTOS 만들기' 카테고리의 다른 글
Cortex-M4(F) Lazy Stacking and Context Switching (2) (0) | 2023.11.17 |
---|---|
Cortex-M4(F) Lazy Stacking and Context Switching (1) (0) | 2023.11.17 |
RTOS - 기본적으로 알아야 할 ASM 코드 (0) | 2023.11.17 |
RTOS Task (0) | 2023.11.17 |
RTOS 구현 with 임베디드 시스템 아키텍쳐 (0) | 2023.11.17 |