Check FPU function using Cos & Sin calculation

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?

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 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 }