Check FPU function using Cos & Sin calculation

Committer:
kenjiArai
Date:
Mon Jan 25 05:09:37 2021 +0000
Revision:
1:a8ba417b1717
Parent:
0:c46022441981
Child:
2:742afd5cf29f
Run on mbed-os6.6.0

Who changed what in which revision?

UserRevisionLine numberNew 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 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 1:a8ba417b1717 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 1:a8ba417b1717 46 extern void print_revision(void);
kenjiArai 0:c46022441981 47
kenjiArai 0:c46022441981 48 //------------------------------------------------------------------------------
kenjiArai 0:c46022441981 49 // Control Program
kenjiArai 0:c46022441981 50 //------------------------------------------------------------------------------
kenjiArai 0:c46022441981 51 int main()
kenjiArai 0:c46022441981 52 {
kenjiArai 1:a8ba417b1717 53 print_revision();
kenjiArai 1:a8ba417b1717 54 printf("\r\nSystem Clock = %d Hz\r\n", HAL_RCC_GetSysClockFreq());
kenjiArai 0:c46022441981 55 // Check FPU settings
kenjiArai 0:c46022441981 56 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
kenjiArai 1:a8ba417b1717 57 // Set bits 20-23 to enable CP10 and CP11 coprocessors
kenjiArai 1:a8ba417b1717 58 // SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
kenjiArai 0:c46022441981 59 // Mbed compiler set CP10 and CP11 Full Access
kenjiArai 1:a8ba417b1717 60 printf("Use FPU function (compiler enables FPU)\r\n");
kenjiArai 1:a8ba417b1717 61 printf("SCB->CPACR(0x%08x) = 0x%08x\r\n",
kenjiArai 1:a8ba417b1717 62 (uint32_t)&SCB->CPACR, SCB->CPACR);
kenjiArai 0:c46022441981 63 #else
kenjiArai 1:a8ba417b1717 64 #warning "NOT use FPU in your setting"
kenjiArai 0:c46022441981 65 #endif
kenjiArai 1:a8ba417b1717 66 printf("Buf size in RAM = %d + %d = %d bytes\r\n",
kenjiArai 1:a8ba417b1717 67 sizeof(buf0), sizeof(buf1), sizeof(buf0) + sizeof(buf1));
kenjiArai 1:a8ba417b1717 68 printf("Repeat number = %d\r\n", BUF_SIZE);
kenjiArai 1:a8ba417b1717 69 printf("\r\nHit any key then show buffer content\r\n");
kenjiArai 1:a8ba417b1717 70 printf("Following time is average calculate time Sin()+Cos()\r\n");
kenjiArai 1:a8ba417b1717 71 printf(" (float) (double)\r\n");
kenjiArai 0:c46022441981 72 while (true) {
kenjiArai 0:c46022441981 73 uint32_t t0, t1;
kenjiArai 0:c46022441981 74
kenjiArai 0:c46022441981 75 t.reset();
kenjiArai 0:c46022441981 76 t.start();
kenjiArai 0:c46022441981 77 test_FPU_0(buf0);
kenjiArai 1:a8ba417b1717 78 t0 = t.elapsed_time().count();
kenjiArai 0:c46022441981 79 t.reset();
kenjiArai 0:c46022441981 80 t.start();
kenjiArai 0:c46022441981 81 test_FPU_1(buf1);
kenjiArai 1:a8ba417b1717 82 t1 = t.elapsed_time().count();
kenjiArai 1:a8ba417b1717 83 printf("t0 =%.3f uS, t1 =%.3f uS\r\n",
kenjiArai 1:a8ba417b1717 84 (double)t0 / (double)BUF_SIZE, (double)t1 / (double)BUF_SIZE);
kenjiArai 1:a8ba417b1717 85 if (readable()) {
kenjiArai 1:a8ba417b1717 86 for (uint16_t n = 0; n < BUF_SIZE; n++) {
kenjiArai 1:a8ba417b1717 87 printf("%+8.6f,%+8.6lf,%+8.6lf\r\n",
kenjiArai 1:a8ba417b1717 88 buf0[n], buf1[n], (double)buf0[n] - buf1[n]);
kenjiArai 0:c46022441981 89 }
kenjiArai 1:a8ba417b1717 90 while (readable()) {
kenjiArai 1:a8ba417b1717 91 getc();
kenjiArai 1:a8ba417b1717 92 }
kenjiArai 0:c46022441981 93 }
kenjiArai 1:a8ba417b1717 94 ThisThread::sleep_for(1s);
kenjiArai 0:c46022441981 95 }
kenjiArai 0:c46022441981 96 }
kenjiArai 0:c46022441981 97
kenjiArai 0:c46022441981 98 void test_FPU_0(float *buf0)
kenjiArai 0:c46022441981 99 {
kenjiArai 0:c46022441981 100 int32_t i;
kenjiArai 0:c46022441981 101 volatile float d, d0, d1;
kenjiArai 0:c46022441981 102 float step;
kenjiArai 0:c46022441981 103
kenjiArai 0:c46022441981 104 step = ((2.0f * PI) + 0.1f) / (float)BUF_SIZE;
kenjiArai 0:c46022441981 105 d = 0.0f;
kenjiArai 1:a8ba417b1717 106 for(i = 0; i < BUF_SIZE; i++) {
kenjiArai 0:c46022441981 107 d0 = sin(d);
kenjiArai 0:c46022441981 108 d1 = cos(d);
kenjiArai 0:c46022441981 109 d += step;
kenjiArai 0:c46022441981 110 buf0[i] = d0;
kenjiArai 0:c46022441981 111 }
kenjiArai 0:c46022441981 112 }
kenjiArai 0:c46022441981 113
kenjiArai 0:c46022441981 114 void test_FPU_1(double *buf1)
kenjiArai 0:c46022441981 115 {
kenjiArai 0:c46022441981 116 int32_t i;
kenjiArai 0:c46022441981 117 volatile double d, d0, d1;
kenjiArai 0:c46022441981 118 double step;
kenjiArai 0:c46022441981 119
kenjiArai 1:a8ba417b1717 120 step = ((2.0 * PI) + 0.1) / (double)BUF_SIZE;
kenjiArai 1:a8ba417b1717 121 d = 0.0;
kenjiArai 1:a8ba417b1717 122 for(i = 0; i < BUF_SIZE; i++) {
kenjiArai 0:c46022441981 123 d0 = sin(d);
kenjiArai 0:c46022441981 124 d1 = cos(d);
kenjiArai 0:c46022441981 125 d += step;
kenjiArai 0:c46022441981 126 buf1[i] = d0;
kenjiArai 0:c46022441981 127 }
kenjiArai 0:c46022441981 128 }