RTOS - 기본적으로 알아야 할 ASM 코드

지난 포스팅에서 Interrupt 발생시 Core 에서 어떻게 Stacking하는지에 대해 알아보았습니다. 이번 포스팅에서는 Task Context 스위칭시 R4 ~ R11 까지 Core Register들을 Stack에 쌓기 위해 기본적으로 알아야 할 ASM(assembler) 코드에 대해서 알아보겠습다.

 

Task Context 스위칭시 사용되는 ASM 코드는 크게 아래와 같습니다.

  • MRS : 레지스터의 값을 읽는다.
    • mrs r0, msp : msp의 내용을 읽어 r0에 로드
  • STMDB : 여러개의 레지스터 값을 읽어 메모리의 위치에 저장한다.
    • stmdb r0!, {r4-r11} : r0의 포인터에 r4 ~ r10의 내용을 내림차순으로 저장
  • MSR : 레지스터에 값을 저장한다.
    • msr msp, r0 : r0의 내용을 msp에 저장
  • BX : 분기명령어
    • bx lr : lr에 저장된 address로 분기
  • LDMFD : 여러개의 메모리 값을 읽어 레지스터들에 저장한다.
    • ldmfd r0!, {r4-r11} : r4 ~ r11의 내용을 r0의 포인터에 올림차순으로 저장

 

위의 msp는 Main Stack pointer의 약자로 default stack pointer입니다. OS kernel 과 exception handler, privileged mode에서 사용되며 일반적인 RTOS로 생각해보면 kernel mode에서 사용되는 stack pointer를 의미합니다.

 

RTOS에서는 Context 스위칭을 위해서 현재 Task의 Context를 stack에 넣고 다음 실행될 Task를 stack에서 빼내어와 Context를 채워넣고 Task를 실행하게 됩니다. 아래는 기본적인 Context 스위칭 ASM코드입니다.

static void __attribute__((naked)) store_context(void)
{
	asm volatile("mrs r0, msp");
	asm volatile("stmdb r0!, {r4-r11}");
	asm volatile("msr msp, r0");
	asm volatile("bx lr");
}
 
 

아래 코드는 stack pointer에서 Context(이전에 stack 저장한 Core register r4 ~ r11)를 빼내어 Core register에 복구시키는 코드 입니다.

static void __attribute__((naked)) restore_context(void)
{
	asm volatile("mrs r0, msp");
	asm volatile("ldmfd r0!, {r4-r11}");
	asm volatile("msr msp, r0");
	asm volatile("bx lr");
}
 

이해를 돕기위해 실제로 위 store_context 실행 할 때 Core register의 변화를 디버깅 해보도록 하겠습니다.

 

1. 아래는 store_context 진입한 후 코드입니다.

초기 Core register

2. "mrs r0, msp" : r0에 msp의 주소를 복사합니다.

mrs r0, msp 후 Core register

 

3. "stmdb r0!, {r4-r11}" : r0의 주소에 r4 ~ r11의 내용을 저장합니다. r4 ~ r11 까지 총 8개의 Core register들을 r0의 포인터값 0x20007ff8에 저장했기 때문에 r0 값이 갯수 만큼 감소하였습니다.

stmdb r0!, {r4-r11} 후 Core register

 

4. "msr msp, r0" : 감소한 r0의 포인터 값을 msp에 다시 저장해 줍니다.

msr msp, r0 후 Core register

5. "bx lr" 이제 다시 lr로 PC를 복구 시킵니다.

bx lr 후 Core register

실제로 값이 올바르게 저장되어 있는지는 memory를 읽어서 확인할 수가 있습니다.

 

출처: https://velog.io/@coral2cola/Overview-of-ARM-Architecture-Cortex-M-Processors

출처: http://www.jkelec.co.kr/img/lecture/arm_arch/arm_arch_4.html