임베디드를 좋아하는 조금 특이한 개발자?

[AArch64] FPU 및 SIMD 활성화 (실수 연산시 멈춤 현상 해결) 본문

Embedded/ARM

[AArch64] FPU 및 SIMD 활성화 (실수 연산시 멈춤 현상 해결)

Gordon_ 2025. 7. 28. 12:32

1. 서론

  최근 Bare metal 환경에서 프로그래밍을 하면서 많은 점을 느끼는 것이 어떤 기능을 사용하려고 하더라도 일일이 신경을 써야 한다는 것입니다. 심지어 실수 연산에 대해서 조차 미리 설정하지 않은 이상 실수 연산시 프로그램이 멈춰 버립니다. 그래서 포스트를 통해 AArch64 아키텍쳐에서 Bare metal환경으로 개발을 진행하는 경우 FPU를 활성화 시켜야 실수 관련 어셈블리 명령어를 수행할 수 있게 됩니다. 하지만 일반적으로 OS(리눅스 및 윈도우)에서 개발하는 경우 이미 부팅하는 과정에서 FPU를 활성화 하기에 굳이 활성화 할 필요는 없습니다.

 

2. FPU 활성화 관련 레지스터 확인

출처) ARMv8, for ARMv8-A architecture profile manual

 

  CPACR_EL1의 레지스터 중 FPEN을 11로 설정함으로써 EL0모드 또는 EL0 모드에서 SVE, Advance SIMD, FPU(Floating Point Unit)를 활성화할 수 있습니다.

 

3. FPU 활성화 어셈블리 코드

  실수 연산을 하기전 아래의 어셈블리 코드를 미리 실행하여, FPU를 활성화합니다. 저의 경우는 main 함수에 진입하기전에 FPU를 활성화하였습니다.

    MRS     x0, cpacr_el1
    ORR     x0, x0, #(0b11 << 20)
    MSR     cpacr_el1, x0
    ISB