Context switching 디버깅1

Nitroblue 1·2025년 10월 9일

일단 내가 이 어셈블리어를 직접 뜯어고치려면 알아야 하는 필수 정보들을 정리했다.

주제설명
Cortex-M 스택 프레임 구조예외 진입/복귀 시 CPU가 자동으로 push/pop하는 레지스터 구조
PSP vs MSPThread mode에서는 PSP 사용, Handler mode에서는 MSP 사용
EXC_RETURN 값lr에 저장되는 예외 복귀 정보로, 실행 모드와 스택 선택에 영향을 줌
PendSV 핸들러 역할태스크 스위칭을 위한 컨텍스트 저장/복원 책임
8바이트 스택 정렬psp는 항상 8바이트 정렬되어 있어야 함 (stack alignment fault 방지)
Thumb 비트PC (프로그램 카운터)의 하위 비트가 반드시 1이어야 함 (Thumb 모드에서 실행을 위해)
Terminal                                                                       
[mini-os] Booting
20:34:03.900: [MAIN] About to initialize kernel and tasks
20:34:03.900: [INIT] Setting up kernel stack...
20:34:03.900: [INIT] Kernel stack: 0x20001090 - 0x20001890 (size=2048 bytes)
20:34:03.900: [INIT] Initializing 3 tasks...
20:34:03.900: [INIT] Initializing Task 0...
20:34:03.900: [STACK] Building stack for entry=0x08000503
20:34:03.900: [STACK] Stack layout: SW(8) + HW(8) + GUARD(8) = 24 words
20:34:03.900: [STACK] Stack length: 256 words, base offset: 232
20:34:03.900: [STACK] SW context (R4-R11) cleared at offset 232-239
20:34:03.900: [STACK] HW context starts at offset 240
20:34:03.900: [STACK] LR (task_return_trap) = 0x08000AB5
20:34:03.900: [STACK] PC (task_entry) = 0x08000503
20:34:03.900: [STACK] HW frame initialized:
20:34:03.900: [STACK]   R0=11111111 R1=22222222 R2=33333333 R3=44444444
20:34:03.900: [STACK]   R12=55555555 LR=08000AB5 PC=08000503 xPSR=01000000
20:34:03.900: [STACK] Memory layout:
20:34:03.900: [STACK]   PSP (SW start) = 0x20000830
20:34:03.900: [STACK]   HW start      = 0x20000850 (PSP + 32)
20:34:03.900: [STACK]   Expected: PSP + 32 = 0x20000850
20:34:03.900: [STACK] Stack bounds: 0x20000490 - 0x20000890 (size=1024)
20:34:03.900: [STACK] Stack initialization complete, returning PSP=0x20000830
20:34:03.900: [INIT] Task 0 initialized with SP=0x20000830

0개의 댓글