STM32F 4 의 FPU 성능 의 충분 한 발휘 - 설정 요점

5563 단어
전환 하 다
        부동 소수점 연산 은 지정 CPU 의 어 려 운 문제 이다. 예 를 들 어 간단 한 1.1 + 1.1 이다. 지정 CPU 는 반드시 IEEE - 754 표준 알고리즘 에 따라 연산 을 완성 해 야 한다. 8 개의 싱글 칩 마이크로컴퓨터 에 있어 악몽 이 고 32 개의 싱글 칩 마이크로컴퓨터 에 있어 서도 크게 개선 되 지 않 을 것 이다.부동 소수점 을 Q 화 처리 하면 32 비트 싱글 칩 마이크로컴퓨터 의 연산 성능 을 충분히 발휘 할 수 있 지만 정밀도 가 제한 되 어 높 지 않다.FPU (부동 소수점 연산 장치) 가 있 는 싱글 칩 이나 CPU 에 있어 부동 소수점 덧셈 은 몇 가지 명령 일 뿐이다.       
현재 FPU 나 하드웨어 부동 소수점 연산 능력 이 있 는 것 은 주로 고급 DSP (예 를 들 어 TI F28335 / C6000 / DM6XX / OMAP 등), 유 니 버 설 CPU (X87 수학 협회 프로세서) 와 고급 ARM + DSP 프로세서 등 이 있다.
       
STM32 - F4 는 Cortex - M4F 구조 에 속 하 는데 이것 은 M0, M3 와 가장 큰 차이 점 은
F - float, 즉 부동 소수점 명령 집합 을 지원 하기 때문에 수학 연산 을 처리 할 때 M0 / M3 보다 수 십 배, 심지어 백 배 이상 높 은 성능 을 가 집 니 다.
그러나 FPU 의 수학 적 성능 을 충분히 발휘 하려 면 작은 설정 이 필요 하 다.
        1. 컴 파일 제어 옵션: STM32F4XX 펌웨어 라 이브 러 리 의 루틴 system stm32f4XXX. c 파일 에 해당 하 는 코드 를 추 가 했 지만 사용자 평가 에 사용 되 는 STM32F4 - Discovery 루틴 에는 없 기 때문에 MDK 4.23 부동 소수점 연산 프로그램 을 작성 할 때 컴 파일 러 가 V 명령 을 정확하게 만들어 부동 소수점 연산 을 했 지만 system stm32f4XXX. c 파일 에 FPU 가 사용 되 지 않 았 기 때문에 CPU실행 시 불법 명령 어 를 만 났 다 고 생각 하고 HardFault Handler () 로 이동 하여 제자리 걸음 을 중단 합 니 다. 따라서 이 오류 가 발생 하지 않도록 하려 면 system init () 함수 에 다음 코드 를 추가 해 야 합 니 다.
/* FPU settings ------  FPU------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
        이 옵션 은 조건 부 컴 파일 제어 가 있 기 때문에 프로젝트 옵션 (Project - > Options for target "XXXX") 에 있어 야 합 니 다.
C / C + + 옵션 카드 의 Define 에는 다음 과 같은 문구 가 추가 되 어 있 습 니 다. FPU PRESENT = 1, FPU USED = 1. 이렇게 컴 파일 할 때 FPU 를 시작 하 는 코드 를 추가 하면 CPU 도 FPU 를 정확하게 사용 하여 간단 한 가감 곱 하기 제 거 를 할 수 있 습 니 다.
        그러나 이것 은 턱 없 이 부족 합 니 다. 복잡 한 연산, 예 를 들 어 삼각함수, 처방 등 연산 에 대해 서 는 프로 그래 밍 할 때 math. h 헤더 파일 을 사용 하면 효율 을 높 일 수 없습니다. math. h 헤더 파일 은 모든 ARM 프로 세 서 를 대상 으로 하 는 것 이기 때문에 연산 함 수 는 지정 CPU 와 표준 알고리즘 (IEEE - 754) 을 기반 으로 합 니 다.FPU 를 사용 하 는 경 우 는 예견 되 지 않 았 습 니 다. 많은 명령 과 복잡 한 과정 이 있어 야 연산 이 완료 되 고 연산 시간 이 늘 어 납 니 다. 따라서 M4F 의 부동 소수점 기능 을 충분히 발휘 하려 면 펌웨어 라 이브 러 리 자체 의 arm math. h 를 사용 해 야 합 니 다. 이 파일 은 컴 파일 제어 항목 ( FPU USED = = 1) 에 따라그 함수 방법 을 사용 하기 로 결 정 했 습 니 다. FPU 를 사용 하지 않 았 다 면 keil 의 표준 math. h 헤더 파일 에서 정 의 된 함 수 를 호출 하 십시오. FPU 를 사용 했다 면 펌웨어 라 이브 러 리 자체 의 최적화 함수 로 문 제 를 해결 하 는 것 입 니 다.        arm math 의 시작 부분 에 이러한 컴 파일 제어 정보 가 있 습 니 다.
        #ifndef _ARM_MATH_H
            #define _ARM_MATH_H
            #define __CMSIS_GENERIC              /* disable NVIC and Systick functions */

            #if defined (ARM_MATH_CM4)
                #include "core_cm4.h"
            #elif defined (ARM_MATH_CM3)
                #include "core_cm3.h"
            #elif defined (ARM_MATH_CM0)
                #include "core_cm0.h"
            #else
                #include "ARMCM4.h"
                #warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
            #endif

            #undef  __CMSIS_GENERIC              /* enable NVIC and Systick functions */
            #include "string.h"
            #include "math.h"
        CMSIS 를 사용 하지 않 으 면 keil 이 가지 고 있 는 표준 라 이브 러 리 함 수 를 호출 합 니 다. 그렇지 않 으 면 CMSIS 로 정의 합 니 다. 여 기 는 STM32F 4 를 사용 하기 때문에 ARM MATH CM4 제어, 즉 core cm4. h 를 추가 해 야 합 니 다. 그렇지 않 으 면 ARMM4. h 를 사용 합 니 다. 그러나 컴 파일 할 때 keil 은 이 파일 을 찾 을 수 없습니다. 따라서 프로젝트 옵션 의 C / C + 옵션 카드 define 에 계속 추가 해 야 합 니 다.ARM MATH CM4.
       
위 컴 파일 제어 항목 을 추가 하면 고급 수학 함수 의 사용 은 기본적으로 문제 가 없습니다. 예 를 들 어 정 코사인 삼각함수 의 계산 입 니 다. 그러나 sin (), cos (), sqrt () 같은 함 수 를 직접 사용 하면 결 과 는 keil 의 math. h 를 호출 하 는 셈 입 니 다. debug 에서 해당 하 는 코드 를 볼 수 있 습 니 다. 어 셈 블 리 명령 은 BL. W hardfp xxx 입 니 다. 따라서
이때 삼각함수 의 계산 을 완성 하려 면 arm sin f32 () 또는 arm cos f32 () 를 사용 해 야 합 니 다. 용법 이 변 하지 않 습 니 다. 이 두 함수 의 원형 은 각각 arm sin f32. c 와 arm cos f32. c 에 있 습 니 다. 256 점 삼각함수 표 에 대한 조회 와 플러그 인 알고리즘 을 통 해 임의의 각도 의 정확 한 함수 값 을 얻 으 면 '원본' 의 sin (), cos () 보다 훨씬 빠 릅 니 다.
        물론 일부 예외 적 인 것 은 개발 함수 sqrt () 입 니 다. arm math. h 에서 이렇게 정 의 됩 니 다.
        static __INLINE arm_status  arm_sqrt_f32(float32_t in, float32_t *pOut)
        {
            if(in > 0)
            {
                //    #if __FPU_USED
                #if (__FPU_USED == 1) && defined ( __CC_ARM   )
                    *pOut = __sqrtf(in);
                #else      
                    *pOut = sqrtf(in);
                #endif
                    return (ARM_MATH_SUCCESS);
            }
            else
            {
                *pOut = 0.0f;
                return (ARM_MATH_ARGUMENT_ERROR);
            }
        }    
        즉, 개방 자가 사용 하 는 함 수 는 arm sqrt f32 () 입 니 다. 그 중에서 먼저 개 발 된 수량 이 0 보다 많 는 지 판단 하고 0 이상 만 연산 할 수 있 습 니 다. 그렇지 않 으 면 출력 결 과 는 0 이 고 '오류' 로 고 를 되 돌려 줍 니 다. 0 이상 이 고 FPU 와 CC ARM 제어 항목 을 사용 하면 sqrtf () 를 호출 하여 컴 파일 을 완성 합 니 다. 그렇지 않 으 면 sqrtf () - 이 sqrtf () 를 호출 합 니 다.keil 의 math. h 에서 찾 을 수 있 습 니 다. 즉, 하위 함 수 를 호출 하여 연산 을 완성 할 수 있 습 니 다. sqrtf () 는 새로 나 왔 습 니 다. 어떤 물건 인지 모두 가 알 아 맞 힐 수 있 을 것 이 라 고 믿 습 니 다.
네, 바로 VSQRT 명령 입 니 다. 따라서 이 성능 도 발휘 하려 면 프로젝트 옵션 의 C / C + 옵션 카드 의 define 에 구문 CC ARM 을 계속 추가 해 야 합 니 다. CC ARM 컴 파일 에 가입 하면 어 셈 블 리 코드 의 차이 가 매우 큽 니 다.
        물론 arm sqrt f32 () 함수 에 대해 서 는 좀 번 거 롭 습 니 다. 피 개방 자의 수가 0 보다 많은 것 을 확인 하면 sqrtf () 함수 로 연산 을 완성 합 니 다. 즉, 간단 한 VSQRT 명령 입 니 다.
        STM32F 4 펌웨어 라 이브 러 리 는 또 다른 유용 한 수학 함 수 를 제공 합 니 다. 모두 DSP Lib 폴 더 에 있 습 니 다. 천천히 탐색 하 세 요. Discovery!

좋은 웹페이지 즐겨찾기