Thumb2 명령어 / 레지스터 / 핸들러 모드, 쓰레드 모드

2025. 6. 27. 11:50·ARM arch/Cortex-M

기존의 명령어 셋

  • Thumb 명령어셋
  • ARM 명령어셋

Thumb 명령어

  • 16비트 고정 길이 명령어
  • 코드 크기 줄이고, 메모리 절약

ARM 명령어

  • 32비트 고정 길이 명령어
  • 고성능, 풍부한 연산기능 제공

Thumb과 ARM 명령어셋 비교

Thumb, ARM instruction comparison

 

  • 메모리 대역폭이 32bit일때
    • 한번에 32비트 가져올 수 있음 → ARM에유리
    • Thumb명령어는 16비트지만, decode는 결국 fetch당 한번만 수행 → 이득없음
  • 메모리 대역폭이 16bit일때
    • ARM명령어는 2번 fetch필요 → 비효율
    • Thumb명령어는 1번fetch로 충분 → 효율적

그래서 Thumb2 명령어 사용

Thumb와 ARM 명령어를 번갈아서 사용하면, overhead가 생긴다.

→ 성능 저하 발생

 

따라서, Thumb와 ARM을 혼합한 Thumb2를 사용하는데,

모드 전환이 필요없기 때문에 성능 저하가 발생하지 않는다.

속도는 25%, 코드사이즈는 26% 더 좋다.

thumb2 비교


Register

cortex-m register structure

범용 레지스터 : 일반적인 연산의 결과

  • R0 ~ R7 : Thumb1에서 사용
  • R0 ~ R12 : Thumb2에서 사용

스택 메모리에 저장되는 것

  1. 전달 인자
  2. 지역 변수
  3. 컨텍스트
  4. 리턴 주소
  5. 프레임 포인터(r7 or r11)

프레임 포인터란?

스택 Push/Pop 동작

Push 동작

push sp, {r7, lr}
  • sp가 먼저 8 바이트 감소한 후, 그 위치에 r7, lr 값이 저장됩니다.
  • 즉, Full Descending Stack은:
    • Full: sp가 이미 사용 중인 위치를 가리킨다
    • Descending: 스택이 아래 방향으로 확장된다 → 주소가 작아지는 방향으로 push를 진행한다.       

Pop 동작

pop sp, {r7, lr}
  • 현재 sp가 가리키는 주소에 있는 값을 r7, lr에 저장하고, 이후 sp는 8 바이트 증가합니다.

리틀 엔디안

  • ARM은 기본적으로 리틀 엔디안으로 동작하므로, 메모리에 저장할 때 하위 바이트가 먼저 저장됩니다.
  • 예: 0x12345678을 저장하면 메모리에는 아래처럼 저장됨
  • 주소 값 0x00 0x78 0x01 0x56 0x02 0x34 0x03 0x12

Handler mode, Thread mode

  • Thread mode
    • 기본 실행모드 , main()함수 등 일반코드
  • handler mode
    • 인터럽트 / exception 발생 시
    • IRQ handler

[흐름]

thread mode → 인터럽트 발생 → handler mode → 인터럽트 종료 → thread mode 복귀

특권 / 비특권

  • Thread mode : privileged 혹은 unprivileged 가능
  • Handler mode : 항상 privileged 만 가능 (익셉션은 반드시 시스템 권한이 있어야함)

Banked Register 구조

스택 포인터 레지스터(sp)말고도, msp(시스템/커널/인터럽트용), psp(사용자 task용)가 있음.

특권/비특권에 따라서 혹은 mode에 따라서 msp, psp둘중에 어떤 걸 alias할지 고른다.

현재 모드 권한 수준 sp가 가리키는 스택

Handler Mode 항상 Privileged MSP (고정)
Thread Mode Privileged MSP 또는 PSP 설정 가능
Thread Mode Unprivileged PSP만 사용 가능

 

'ARM arch > Cortex-M' 카테고리의 다른 글

cortex-m3 AMBA와 메모리 맵  (0) 2025.07.14
2025.07.09 - ARM assembly 프로그래밍2  (0) 2025.07.09
2025.07.07 - ARM assembly 프로그래밍1  (0) 2025.07.08
빅 엔디언, 리틀 엔디언  (0) 2025.07.02
AAPCS  (0) 2025.06.30
'ARM arch/Cortex-M' 카테고리의 다른 글
  • 2025.07.09 - ARM assembly 프로그래밍2
  • 2025.07.07 - ARM assembly 프로그래밍1
  • 빅 엔디언, 리틀 엔디언
  • AAPCS
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    앤드류모튼
    파일 입출력
    커널 기여
    Git
    c언어
    스택
    파이썬
    C++
    commit
    리눅스
    버퍼
    드라이버 분석
    yolo
    피보나치
    자료구조
    동적메모리
    arm
    Qualcomm
    순환
    소수
    rubikpi3
    INIT
    포인터
    시스템콜
    백준
    커널
    이진 트리
    토발즈
    Branch
    rubik pi
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
Thumb2 명령어 / 레지스터 / 핸들러 모드, 쓰레드 모드
상단으로

티스토리툴바