임베디드 용어 사전
부팅·빌드

VTOR

벡터 테이블의 시작 주소를 담는 레지스터. 부트로더가 애플리케이션으로 넘어갈 때 반드시 옮겨 준다.

Vector Table Offset Register. 인터럽트가 어디를 보고 점프할지를 정한다.

왜 옮기나

0x0800_0000   부트로더  (벡터 테이블 ①)
0x0800_8000   애플리케이션 (벡터 테이블 ②)

부트로더가 애플리케이션으로 점프한 뒤에도 VTOR 이 ①을 가리키면, 인터럽트가 부트로더의 핸들러로 간다. 증상은 "점프 직후 이상하게 죽는다" 이고 원인 찾기가 어렵다.

SCB->VTOR = APP_BASE;      // 애플리케이션 벡터 테이블로 전환
__set_MSP(*(uint32_t *)APP_BASE);          // 스택 포인터도 새로 잡는다
((void (*)(void))(*(uint32_t *)(APP_BASE + 4)))();   // 리셋 벡터로 점프

함께 챙길 것

  • 점프 전에 켜 둔 인터럽트를 모두 끈다 — 옛 핸들러가 불릴 수 있다
  • 주변장치를 리셋 상태로 되돌린다
  • VTOR 은 정렬 제약이 있다(테이블 크기에 따라 128바이트 이상 경계)

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 부팅 — 전원을 넣고 main 까지