Kenji Arai
/
FPU_performance_on_F446_and_F411
Check FPU function using Cos & Sin calculation
main.cpp@2:742afd5cf29f, 2021-01-25 (annotated)
- Committer:
- kenjiArai
- Date:
- Mon Jan 25 05:11:14 2021 +0000
- Revision:
- 2:742afd5cf29f
- Parent:
- 1:a8ba417b1717
delete DigitalIn
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:c46022441981 | 1 | /* |
kenjiArai | 1:a8ba417b1717 | 2 | * Check FPU function using Cos & Sin calculation |
kenjiArai | 0:c46022441981 | 3 | * |
kenjiArai | 1:a8ba417b1717 | 4 | * Copyright (c) 2017,'21 Kenji Arai / JH1PJL |
kenjiArai | 1:a8ba417b1717 | 5 | * http://www7b.biglobe.ne.jp/~kenjia/ |
kenjiArai | 1:a8ba417b1717 | 6 | * https://os.mbed.com/users/kenjiArai/ |
kenjiArai | 0:c46022441981 | 7 | * Modify: August 31st, 2017 |
kenjiArai | 1:a8ba417b1717 | 8 | * Revised: January 25th, 2021 |
kenjiArai | 0:c46022441981 | 9 | */ |
kenjiArai | 0:c46022441981 | 10 | |
kenjiArai | 0:c46022441981 | 11 | /*============================================================================== |
kenjiArai | 1:a8ba417b1717 | 12 | -------------------- My boards result ------------------------------- |
kenjiArai | 1:a8ba417b1717 | 13 | STM32F446RE STM32F411RE STM32H743ZI2 |
kenjiArai | 1:a8ba417b1717 | 14 | Sys Clock 180 MHz 100 MHz 480 MHz |
kenjiArai | 1:a8ba417b1717 | 15 | double 23844 nS 39710 nS 1149 ns |
kenjiArai | 1:a8ba417b1717 | 16 | float 1085 nS 1954 nS 375 ns |
kenjiArai | 1:a8ba417b1717 | 17 | ratio(double/float) 21.98 20.32 3.06 |
kenjiArai | 1:a8ba417b1717 | 18 | |
kenjiArai | 1:a8ba417b1717 | 19 | ratio(F446/H743 double) 20.75 |
kenjiArai | 1:a8ba417b1717 | 20 | ratio(F446/H743 float) 2.89 |
kenjiArai | 1:a8ba417b1717 | 21 | ratio(F411/F446 double) 1.67 |
kenjiArai | 1:a8ba417b1717 | 22 | ratio(F411/F446 float) 1.80 |
kenjiArai | 0:c46022441981 | 23 | ============================================================================*/ |
kenjiArai | 0:c46022441981 | 24 | |
kenjiArai | 0:c46022441981 | 25 | // Include -------------------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 26 | #include "mbed.h" |
kenjiArai | 1:a8ba417b1717 | 27 | #include "uart_as_stdio.h" |
kenjiArai | 0:c46022441981 | 28 | |
kenjiArai | 0:c46022441981 | 29 | // Definition ----------------------------------------------------------------- |
kenjiArai | 1:a8ba417b1717 | 30 | #define PI 3.14159265 |
kenjiArai | 0:c46022441981 | 31 | #define BUF_SIZE 7000 |
kenjiArai | 0:c46022441981 | 32 | |
kenjiArai | 0:c46022441981 | 33 | // Constractor ---------------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 34 | Timer t; |
kenjiArai | 0:c46022441981 | 35 | |
kenjiArai | 0:c46022441981 | 36 | // RAM ------------------------------------------------------------------------ |
kenjiArai | 0:c46022441981 | 37 | float buf0[BUF_SIZE]; |
kenjiArai | 0:c46022441981 | 38 | double buf1[BUF_SIZE]; |
kenjiArai | 0:c46022441981 | 39 | |
kenjiArai | 0:c46022441981 | 40 | // ROM / Constant data -------------------------------------------------------- |
kenjiArai | 1:a8ba417b1717 | 41 | |
kenjiArai | 0:c46022441981 | 42 | // Function prototypes -------------------------------------------------------- |
kenjiArai | 0:c46022441981 | 43 | void test_FPU_0(float *buf0); |
kenjiArai | 0:c46022441981 | 44 | void test_FPU_1(double *buf1); |
kenjiArai | 1:a8ba417b1717 | 45 | extern void print_revision(void); |
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 | 1:a8ba417b1717 | 52 | print_revision(); |
kenjiArai | 1:a8ba417b1717 | 53 | printf("\r\nSystem Clock = %d Hz\r\n", HAL_RCC_GetSysClockFreq()); |
kenjiArai | 0:c46022441981 | 54 | // Check FPU settings |
kenjiArai | 0:c46022441981 | 55 | #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) |
kenjiArai | 1:a8ba417b1717 | 56 | // Set bits 20-23 to enable CP10 and CP11 coprocessors |
kenjiArai | 1:a8ba417b1717 | 57 | // SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); |
kenjiArai | 0:c46022441981 | 58 | // Mbed compiler set CP10 and CP11 Full Access |
kenjiArai | 1:a8ba417b1717 | 59 | printf("Use FPU function (compiler enables FPU)\r\n"); |
kenjiArai | 1:a8ba417b1717 | 60 | printf("SCB->CPACR(0x%08x) = 0x%08x\r\n", |
kenjiArai | 1:a8ba417b1717 | 61 | (uint32_t)&SCB->CPACR, SCB->CPACR); |
kenjiArai | 0:c46022441981 | 62 | #else |
kenjiArai | 1:a8ba417b1717 | 63 | #warning "NOT use FPU in your setting" |
kenjiArai | 0:c46022441981 | 64 | #endif |
kenjiArai | 1:a8ba417b1717 | 65 | printf("Buf size in RAM = %d + %d = %d bytes\r\n", |
kenjiArai | 1:a8ba417b1717 | 66 | sizeof(buf0), sizeof(buf1), sizeof(buf0) + sizeof(buf1)); |
kenjiArai | 1:a8ba417b1717 | 67 | printf("Repeat number = %d\r\n", BUF_SIZE); |
kenjiArai | 1:a8ba417b1717 | 68 | printf("\r\nHit any key then show buffer content\r\n"); |
kenjiArai | 1:a8ba417b1717 | 69 | printf("Following time is average calculate time Sin()+Cos()\r\n"); |
kenjiArai | 1:a8ba417b1717 | 70 | printf(" (float) (double)\r\n"); |
kenjiArai | 0:c46022441981 | 71 | while (true) { |
kenjiArai | 0:c46022441981 | 72 | uint32_t t0, t1; |
kenjiArai | 0:c46022441981 | 73 | |
kenjiArai | 0:c46022441981 | 74 | t.reset(); |
kenjiArai | 0:c46022441981 | 75 | t.start(); |
kenjiArai | 0:c46022441981 | 76 | test_FPU_0(buf0); |
kenjiArai | 1:a8ba417b1717 | 77 | t0 = t.elapsed_time().count(); |
kenjiArai | 0:c46022441981 | 78 | t.reset(); |
kenjiArai | 0:c46022441981 | 79 | t.start(); |
kenjiArai | 0:c46022441981 | 80 | test_FPU_1(buf1); |
kenjiArai | 1:a8ba417b1717 | 81 | t1 = t.elapsed_time().count(); |
kenjiArai | 1:a8ba417b1717 | 82 | printf("t0 =%.3f uS, t1 =%.3f uS\r\n", |
kenjiArai | 1:a8ba417b1717 | 83 | (double)t0 / (double)BUF_SIZE, (double)t1 / (double)BUF_SIZE); |
kenjiArai | 1:a8ba417b1717 | 84 | if (readable()) { |
kenjiArai | 1:a8ba417b1717 | 85 | for (uint16_t n = 0; n < BUF_SIZE; n++) { |
kenjiArai | 1:a8ba417b1717 | 86 | printf("%+8.6f,%+8.6lf,%+8.6lf\r\n", |
kenjiArai | 1:a8ba417b1717 | 87 | buf0[n], buf1[n], (double)buf0[n] - buf1[n]); |
kenjiArai | 0:c46022441981 | 88 | } |
kenjiArai | 1:a8ba417b1717 | 89 | while (readable()) { |
kenjiArai | 1:a8ba417b1717 | 90 | getc(); |
kenjiArai | 1:a8ba417b1717 | 91 | } |
kenjiArai | 0:c46022441981 | 92 | } |
kenjiArai | 1:a8ba417b1717 | 93 | ThisThread::sleep_for(1s); |
kenjiArai | 0:c46022441981 | 94 | } |
kenjiArai | 0:c46022441981 | 95 | } |
kenjiArai | 0:c46022441981 | 96 | |
kenjiArai | 0:c46022441981 | 97 | void test_FPU_0(float *buf0) |
kenjiArai | 0:c46022441981 | 98 | { |
kenjiArai | 0:c46022441981 | 99 | int32_t i; |
kenjiArai | 0:c46022441981 | 100 | volatile float d, d0, d1; |
kenjiArai | 0:c46022441981 | 101 | float step; |
kenjiArai | 0:c46022441981 | 102 | |
kenjiArai | 0:c46022441981 | 103 | step = ((2.0f * PI) + 0.1f) / (float)BUF_SIZE; |
kenjiArai | 0:c46022441981 | 104 | d = 0.0f; |
kenjiArai | 1:a8ba417b1717 | 105 | for(i = 0; i < BUF_SIZE; i++) { |
kenjiArai | 0:c46022441981 | 106 | d0 = sin(d); |
kenjiArai | 0:c46022441981 | 107 | d1 = cos(d); |
kenjiArai | 0:c46022441981 | 108 | d += step; |
kenjiArai | 0:c46022441981 | 109 | buf0[i] = d0; |
kenjiArai | 0:c46022441981 | 110 | } |
kenjiArai | 0:c46022441981 | 111 | } |
kenjiArai | 0:c46022441981 | 112 | |
kenjiArai | 0:c46022441981 | 113 | void test_FPU_1(double *buf1) |
kenjiArai | 0:c46022441981 | 114 | { |
kenjiArai | 0:c46022441981 | 115 | int32_t i; |
kenjiArai | 0:c46022441981 | 116 | volatile double d, d0, d1; |
kenjiArai | 0:c46022441981 | 117 | double step; |
kenjiArai | 0:c46022441981 | 118 | |
kenjiArai | 1:a8ba417b1717 | 119 | step = ((2.0 * PI) + 0.1) / (double)BUF_SIZE; |
kenjiArai | 1:a8ba417b1717 | 120 | d = 0.0; |
kenjiArai | 1:a8ba417b1717 | 121 | for(i = 0; i < BUF_SIZE; i++) { |
kenjiArai | 0:c46022441981 | 122 | d0 = sin(d); |
kenjiArai | 0:c46022441981 | 123 | d1 = cos(d); |
kenjiArai | 0:c46022441981 | 124 | d += step; |
kenjiArai | 0:c46022441981 | 125 | buf1[i] = d0; |
kenjiArai | 0:c46022441981 | 126 | } |
kenjiArai | 0:c46022441981 | 127 | } |