본문으로 바로가기

1) Set up the priority grouping of the ARM cortex mx processor

All the APIs which deal with Processor specific details are put under “stm32f4xx_hal_cortex.c”

  • HAL_NVIC_SetPriorityGrouping : NVIC_PRIORITYGROUP
    • preemption priority
      • 여러 개 intuerrupt 발생 → lower preemption priority 가진 interrupt 먼저 실행
    • subpriority
      • 동일한 수준의 preemption priority → subpriority 비교

priority group 구성하지 않으면 → group 4 (default)

⇒ This MCU uses 4bits to indicate the preemption priority

⇒ 0 (highest) ≤ preemption priority ≤ 15 (lowest)

 

2) Enable the required system exceptions of the arm cortex mx processor

Enable the required system exceptions of the ARM Cortex-Mx processor

(e.g. hard fault system exception, bus fault, usage fault, SVC, PendSV etc.)

 

Cortex-Mx Processors Generic User Guide

Cortex-Mx Processors Generic User Guide

Exception 정보 : Exception model → Exception types

Register 정보 : System control block → System Handler Control and State Register


추가 의문점 정리

의문점 1 ) SHCSR에서 USGFAULTENA와 SVCALLPENDED랑 SVCALLACT 를 비교해보면 끝에 ENA와 PENDED와 ACT의 차이가 뭐야?

  • PENDING : 요청 대기 상태(pending)
  • ACT : 핸들러 실행 중(active)
  • ENA : 핸들러 활성화(enable) 여부

 

의문점 2) 근데 왜 SVCALLENA는 없어?

  1. 핸들러의 특성
    • SVC는 운영체제나 시스템 레벨에서 중요한 역할(특히 커널 모드로의 전환 등)을 수행하기 위해 설계
    • 이를 비활성화한다면 시스템의 주요 기능, 특히 OS 커널 호출과 같은 기본 작업이 중단될 수 있습니다. 따라서 SVC 핸들러는 항상 활성화된 상태로 유지
  2. Usage Fault, Bus Fault 등과의 차이
    • Usage Fault나 Bus Fault 등은 필요에 따라 활성화/비활성화할 수 있는 설정이 제공. 이런 설정은 애플리케이션 요구 사항에 따라 특정 예외를 무시하거나 커스터마이징하는 유연성을 주기 위함
    • 반면, SVC는 시스템 호출과 밀접하게 연관되어 있으며, 이런 호출이 중단되면 시스템 안정성을 보장하기 어려움. 따라서 SVCALLENA와 같은 활성화 비트가 제공되지 않음
  3. SVC의 기본 설계 의도
    • SVC는 소프트웨어에서 의도적으로 호출하는 예외입니다(SVC 명령어 사용). 하드웨어 예외처럼 불확실하게 발생하는 것이 아니므로, 항상 시스템이 이를 처리할 준비가 되어 있어야 함
  • SVC 핸들러는 비활성화할 수 없다

 

의문점 3) 그럼 SYSTICKENA는 왜 없어? 비활성화 가능한 인터럽트인데?

SysTick은 NVIC에서 관리되는 인터럽트이기 때문

    - SysTick은 시스템 핸들러이긴 하지만, ARM Cortex-M 아키텍처에서 일반 인터럽트처럼 NVIC를 통해 관리

    - SysTick 타이머의 활성화와 비활성화는 STCSR의 ENABLE 비트로 제어
    - 또한, SysTick 인터럽트의 활성화 여부는 STCSR의 TICKINT 비트를 통해 제어

    이와 달리, SHCSR는 시스템 핸들러(예: Usage Fault, Bus Fault 등) 중에서도 NVIC에서 직접 제어할 수 없는 특수한 핸들러들의 활성화 상태를 관리

 

SHCSR 시스템 안정성 관련 핸들러(Usage Fault, Bus Fault 등)의 활성화 및 상태 관리
STCSR SysTick 타이머의 동작 및 인터럽트 활성화 제어
ICSR SysTick 및 기타 인터럽트의 펜딩 상태 관리

 

  • SCB->SHCSR |= 0x7 << 16;
    • bitwise OR 0x7, 7 means 1 1 1 in binary
    • Left shifted by 16
    • ⇒ place 1 1 1 into the bit position 16, 17, and 18
    • ⇒ enable usage fault, memory fault, and bus fault system exceptions

3) Configure the priority for the system exceptions

  • HAL_NVIC_SetPriority : IRQn_Type
    • stm32f446xx.h 에 정의
  • HAL_NVIC_SetPriority : PreemptPriority
    • 0 (최고우선순위) ~ 15 (최저우선순위)

 

반응형