Kenji Arai
/
FPU_performance_on_F446_and_F411
Check FPU function using Cos & Sin calculation
main.cpp@0:c46022441981, 2017-08-31 (annotated)
- Committer:
- kenjiArai
- Date:
- Thu Aug 31 11:40:11 2017 +0000
- Revision:
- 0:c46022441981
- Child:
- 1:a8ba417b1717
1st release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:c46022441981 | 1 | /* |
kenjiArai | 0:c46022441981 | 2 | * Check FPU function using Cos & Sin calculation |
kenjiArai | 0:c46022441981 | 3 | * |
kenjiArai | 0:c46022441981 | 4 | * Copyright (c) 2017 Kenji Arai / JH1PJL |
kenjiArai | 0:c46022441981 | 5 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:c46022441981 | 6 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:c46022441981 | 7 | * Modify: August 31st, 2017 |
kenjiArai | 0:c46022441981 | 8 | * Revised: August 31st, 2017 |
kenjiArai | 0:c46022441981 | 9 | */ |
kenjiArai | 0:c46022441981 | 10 | |
kenjiArai | 0:c46022441981 | 11 | /*============================================================================== |
kenjiArai | 0:c46022441981 | 12 | ------------------------ My boards result ------------------------------- |
kenjiArai | 0:c46022441981 | 13 | STM32F446RE STM32F411RE |
kenjiArai | 0:c46022441981 | 14 | Sys Clock 180 MHz 100 MHz |
kenjiArai | 0:c46022441981 | 15 | double 24074 nS 39751 nS |
kenjiArai | 0:c46022441981 | 16 | ratio(double/float) 20.02 21.85 |
kenjiArai | 0:c46022441981 | 17 | float 1102 nS 1986 nS |
kenjiArai | 0:c46022441981 | 18 | ratio(F411/F446 double) 1.65 |
kenjiArai | 0:c46022441981 | 19 | ratio(F411/F446 float) 1.80 |
kenjiArai | 0:c46022441981 | 20 | ============================================================================*/ |
kenjiArai | 0:c46022441981 | 21 | |
kenjiArai | 0:c46022441981 | 22 | // Include -------------------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 23 | #include "mbed.h" |
kenjiArai | 0:c46022441981 | 24 | |
kenjiArai | 0:c46022441981 | 25 | // Definition ----------------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 26 | #if defined(TARGET_STM32F446RE) || defined(TARGET_STM32F411xE) |
kenjiArai | 0:c46022441981 | 27 | #define BUF_SIZE 7000 |
kenjiArai | 0:c46022441981 | 28 | #else |
kenjiArai | 0:c46022441981 | 29 | #error "You need modify your program for your specific target CPU" |
kenjiArai | 0:c46022441981 | 30 | #endif |
kenjiArai | 0:c46022441981 | 31 | |
kenjiArai | 0:c46022441981 | 32 | // Constractor ---------------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 33 | Serial pc(USBTX, USBRX); |
kenjiArai | 0:c46022441981 | 34 | DigitalIn sw(USER_BUTTON); |
kenjiArai | 0:c46022441981 | 35 | Timer t; |
kenjiArai | 0:c46022441981 | 36 | |
kenjiArai | 0:c46022441981 | 37 | // RAM ------------------------------------------------------------------------ |
kenjiArai | 0:c46022441981 | 38 | float buf0[BUF_SIZE]; |
kenjiArai | 0:c46022441981 | 39 | double buf1[BUF_SIZE]; |
kenjiArai | 0:c46022441981 | 40 | |
kenjiArai | 0:c46022441981 | 41 | // ROM / Constant data -------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 42 | |
kenjiArai | 0:c46022441981 | 43 | // Function prototypes -------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 44 | void test_FPU_0(float *buf0); |
kenjiArai | 0:c46022441981 | 45 | void test_FPU_1(double *buf1); |
kenjiArai | 0:c46022441981 | 46 | |
kenjiArai | 0:c46022441981 | 47 | //------------------------------------------------------------------------------ |
kenjiArai | 0:c46022441981 | 48 | // Control Program |
kenjiArai | 0:c46022441981 | 49 | //------------------------------------------------------------------------------ |
kenjiArai | 0:c46022441981 | 50 | int main() |
kenjiArai | 0:c46022441981 | 51 | { |
kenjiArai | 0:c46022441981 | 52 | pc.printf("\r\nSystem Clock = %d Hz\r\n", HAL_RCC_GetSysClockFreq()); |
kenjiArai | 0:c46022441981 | 53 | // Check FPU settings |
kenjiArai | 0:c46022441981 | 54 | #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) |
kenjiArai | 0:c46022441981 | 55 | // Mbed compiler set CP10 and CP11 Full Access |
kenjiArai | 0:c46022441981 | 56 | // SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); |
kenjiArai | 0:c46022441981 | 57 | pc.printf("Use FPU function (compiler enables FPU)\r\n"); |
kenjiArai | 0:c46022441981 | 58 | pc.printf("SCB->CPACR(0x%08x) = 0x%08x\r\n", &SCB->CPACR, SCB->CPACR); |
kenjiArai | 0:c46022441981 | 59 | #else |
kenjiArai | 0:c46022441981 | 60 | #warning "NOT use FPU in your setting" |
kenjiArai | 0:c46022441981 | 61 | #endif |
kenjiArai | 0:c46022441981 | 62 | pc.printf("Buf size in RAM = %d + %d = %d bytes\r\n", |
kenjiArai | 0:c46022441981 | 63 | sizeof(buf0), sizeof(buf1), sizeof(buf0) + sizeof(buf1)); |
kenjiArai | 0:c46022441981 | 64 | pc.printf("Repeat number = %d\r\n", BUF_SIZE); |
kenjiArai | 0:c46022441981 | 65 | pc.printf("\r\nHit any key or push USER SW then show buffer content\r\n"); |
kenjiArai | 0:c46022441981 | 66 | pc.printf("Following time is average calculate time Sin()+Cos()\r\n"); |
kenjiArai | 0:c46022441981 | 67 | pc.printf(" (float) (double)\r\n"); |
kenjiArai | 0:c46022441981 | 68 | while (true) { |
kenjiArai | 0:c46022441981 | 69 | uint32_t t0, t1; |
kenjiArai | 0:c46022441981 | 70 | |
kenjiArai | 0:c46022441981 | 71 | t.reset(); |
kenjiArai | 0:c46022441981 | 72 | t.start(); |
kenjiArai | 0:c46022441981 | 73 | test_FPU_0(buf0); |
kenjiArai | 0:c46022441981 | 74 | t0 = t.read_us(); |
kenjiArai | 0:c46022441981 | 75 | t.reset(); |
kenjiArai | 0:c46022441981 | 76 | t.start(); |
kenjiArai | 0:c46022441981 | 77 | test_FPU_1(buf1); |
kenjiArai | 0:c46022441981 | 78 | t1 = t.read_us(); |
kenjiArai | 0:c46022441981 | 79 | pc.printf("t0 =%.3f uS, t1 =%.3f uS\r\n", |
kenjiArai | 0:c46022441981 | 80 | (float)t0 / (float)BUF_SIZE, (float)t1 / (float)BUF_SIZE); |
kenjiArai | 0:c46022441981 | 81 | if ((sw == 0) || (pc.readable())){ |
kenjiArai | 0:c46022441981 | 82 | for (uint16_t n = 0; n < BUF_SIZE; n++){ |
kenjiArai | 0:c46022441981 | 83 | pc.printf("%+8.6f,%+8.6lf,%+8.6lf\r\n", |
kenjiArai | 0:c46022441981 | 84 | buf0[n], buf1[n], (double)buf0[n] - buf1[n]); |
kenjiArai | 0:c46022441981 | 85 | } |
kenjiArai | 0:c46022441981 | 86 | while (pc.readable()){ pc.getc();} |
kenjiArai | 0:c46022441981 | 87 | } |
kenjiArai | 0:c46022441981 | 88 | wait(1.0f); |
kenjiArai | 0:c46022441981 | 89 | } |
kenjiArai | 0:c46022441981 | 90 | } |
kenjiArai | 0:c46022441981 | 91 | |
kenjiArai | 0:c46022441981 | 92 | void test_FPU_0(float *buf0) |
kenjiArai | 0:c46022441981 | 93 | { |
kenjiArai | 0:c46022441981 | 94 | int32_t i; |
kenjiArai | 0:c46022441981 | 95 | volatile float d, d0, d1; |
kenjiArai | 0:c46022441981 | 96 | float step; |
kenjiArai | 0:c46022441981 | 97 | |
kenjiArai | 0:c46022441981 | 98 | step = ((2.0f * PI) + 0.1f) / (float)BUF_SIZE; |
kenjiArai | 0:c46022441981 | 99 | d = 0.0f; |
kenjiArai | 0:c46022441981 | 100 | for(i = 0; i < BUF_SIZE; i++){ |
kenjiArai | 0:c46022441981 | 101 | d0 = sin(d); |
kenjiArai | 0:c46022441981 | 102 | d1 = cos(d); |
kenjiArai | 0:c46022441981 | 103 | d += step; |
kenjiArai | 0:c46022441981 | 104 | buf0[i] = d0; |
kenjiArai | 0:c46022441981 | 105 | } |
kenjiArai | 0:c46022441981 | 106 | } |
kenjiArai | 0:c46022441981 | 107 | |
kenjiArai | 0:c46022441981 | 108 | void test_FPU_1(double *buf1) |
kenjiArai | 0:c46022441981 | 109 | { |
kenjiArai | 0:c46022441981 | 110 | int32_t i; |
kenjiArai | 0:c46022441981 | 111 | volatile double d, d0, d1; |
kenjiArai | 0:c46022441981 | 112 | double step; |
kenjiArai | 0:c46022441981 | 113 | |
kenjiArai | 0:c46022441981 | 114 | step = ((2.0f * PI) + 0.1f) / (double)BUF_SIZE; |
kenjiArai | 0:c46022441981 | 115 | d = 0.0f; |
kenjiArai | 0:c46022441981 | 116 | for(i = 0; i < BUF_SIZE; i++){ |
kenjiArai | 0:c46022441981 | 117 | d0 = sin(d); |
kenjiArai | 0:c46022441981 | 118 | d1 = cos(d); |
kenjiArai | 0:c46022441981 | 119 | d += step; |
kenjiArai | 0:c46022441981 | 120 | buf1[i] = d0; |
kenjiArai | 0:c46022441981 | 121 | } |
kenjiArai | 0:c46022441981 | 122 | } |