Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- Visual Studio Code
- C++
- raspberrypi
- UART
- Visual Studio
- yocto
- Raspberry
- Arduino
- bare metal
- esp32
- buildroot
- Linux
- vscode
- 디버깅
- avr-gcc
- 아두이노
- Debugging
- GPIO
- BeagleBone
- AArch64
- STM32
- platformio
- nucleo
- 리눅스
- USART
- 라즈베리파이
- Debug
- QEMU
- atmel
- AVR
Archives
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[AArch64] FPU 및 SIMD 활성화 (실수 연산시 멈춤 현상 해결) 본문
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
'Embedded > ARM' 카테고리의 다른 글
[AArch64] Bare metal에서 EL2에서 EL1으로 모드 변경 방법 (2) | 2025.07.30 |
---|---|
[AArch64] Bare metal에서 BSS 섹션 초기화(전역 변수 쓰레기 값 문제) (1) | 2025.07.29 |