Check FPU function using Cos & Sin calculation

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?

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