Mercurial > ecos
annotate packages/kernel/current/tests/fptest.c @ 1596:df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
doubles into two ints.
| author | jlarmour |
|---|---|
| date | Fri, 16 Apr 2004 03:33:59 +0000 |
| parents | 92cf4ff674de |
| children | 0e1e2bf4be93 |
| rev | line source |
|---|---|
| 552 | 1 //========================================================================== |
| 2 // | |
| 3 // fptest.cxx | |
| 4 // | |
| 5 // Basic FPU test | |
| 6 // | |
| 7 //========================================================================== | |
| 8 //####ECOSGPLCOPYRIGHTBEGIN#### | |
| 9 // ------------------------------------------- | |
| 10 // This file is part of eCos, the Embedded Configurable Operating System. | |
| 11 // Copyright (C) 2003 Nick Garnett | |
| 12 // | |
| 13 // eCos is free software; you can redistribute it and/or modify it under | |
| 14 // the terms of the GNU General Public License as published by the Free | |
| 15 // Software Foundation; either version 2 or (at your option) any later version. | |
| 16 // | |
| 17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY | |
| 18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 20 // for more details. | |
| 21 // | |
| 22 // You should have received a copy of the GNU General Public License along | |
| 23 // with eCos; if not, write to the Free Software Foundation, Inc., | |
| 24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | |
| 25 // | |
| 26 // As a special exception, if other files instantiate templates or use macros | |
| 27 // or inline functions from this file, or you compile this file and link it | |
| 28 // with other works to produce a work based on this file, this file does not | |
| 29 // by itself cause the resulting work to be covered by the GNU General Public | |
| 30 // License. However the source code for this file must still be made available | |
| 31 // in accordance with section (3) of the GNU General Public License. | |
| 32 // | |
| 33 // This exception does not invalidate any other reasons why a work based on | |
| 34 // this file might be covered by the GNU General Public License. | |
| 35 // | |
| 36 // ------------------------------------------- | |
| 37 //####ECOSGPLCOPYRIGHTEND#### | |
| 38 //========================================================================== | |
| 39 //#####DESCRIPTIONBEGIN#### | |
| 40 // | |
| 41 // Author(s): nickg@calivar.com | |
| 42 // Contributors: nickg@calivar.com | |
| 43 // Date: 2003-01-27 | |
| 44 // Description: Simple FPU test. This is not very sophisticated as far | |
| 45 // as checking FPU performance or accuracy. It is more | |
| 46 // concerned with checking that several threads doing FP | |
| 47 // operations do not interfere with eachother's use of the | |
| 48 // FPU. | |
| 49 // | |
| 50 //####DESCRIPTIONEND#### | |
| 51 //========================================================================== | |
| 52 | |
| 53 #include <pkgconf/kernel.h> | |
| 54 #include <pkgconf/hal.h> | |
| 55 | |
| 56 #include <cyg/hal/hal_arch.h> | |
| 57 | |
| 58 #include <cyg/kernel/kapi.h> | |
| 59 | |
| 60 #include <cyg/infra/testcase.h> | |
| 61 #include <cyg/infra/diag.h> | |
| 62 | |
| 63 //#include <cyg/kernel/test/stackmon.h> | |
| 64 //#include CYGHWR_MEMORY_LAYOUT_H | |
| 65 | |
| 66 //========================================================================== | |
| 67 | |
| 68 #if defined(CYGFUN_KERNEL_API_C) && \ | |
| 69 defined(CYGSEM_KERNEL_SCHED_MLQUEUE) && \ | |
| 70 (CYGNUM_KERNEL_SCHED_PRIORITIES > 12) | |
| 71 | |
| 72 //========================================================================== | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
73 // Base priority for all threads. |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
74 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
75 #define BASE_PRI 5 |
| 552 | 76 |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
77 //========================================================================== |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
78 // Runtime |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
79 // |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
80 // This is the number of ticks that the program will run for. 3000 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
81 // ticks is equal to 30 seconds in the default configuration. For |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
82 // simulators we reduce the run time to 3 simulated seconds. |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
83 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
84 #define RUN_TICKS 3000 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
85 #define RUN_TICKS_SIM 300 |
| 552 | 86 |
| 87 //========================================================================== | |
| 88 // Thread parameters | |
| 89 | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
90 #define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_MINIMUM) |
| 552 | 91 |
|
782
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
92 static cyg_uint8 stacks[3][STACK_SIZE]; |
|
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
93 static cyg_handle_t thread[3]; |
|
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
94 static cyg_thread thread_struct[3]; |
| 552 | 95 |
| 96 //========================================================================== | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
97 // Alarm parameters. |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
98 |
|
782
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
99 static cyg_alarm alarm_struct; |
|
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
100 static cyg_handle_t alarm; |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
101 |
|
782
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
102 static cyg_count8 cur_thread = 0; |
|
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
103 static cyg_count32 alarm_ticks = 0; |
|
a9ff9f7e3010
* tests/fptest.c: Make all variables static to avoid any risk
jlarmour
parents:
760
diff
changeset
|
104 static cyg_count32 run_ticks = RUN_TICKS; |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
105 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
106 //========================================================================== |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
107 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
108 static int errors = 0; |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
109 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
110 //========================================================================== |
| 552 | 111 // Random number generator. Ripped out of the C library. |
| 112 | |
| 113 static int rand( unsigned int *seed ) | |
| 114 { | |
| 115 // This is the code supplied in Knuth Vol 2 section 3.6 p.185 bottom | |
| 116 | |
| 117 #define RAND_MAX 0x7fffffff | |
| 118 #define MM 2147483647 // a Mersenne prime | |
| 119 #define AA 48271 // this does well in the spectral test | |
| 120 #define QQ 44488 // (long)(MM/AA) | |
| 121 #define RR 3399 // MM % AA; it is important that RR<QQ | |
| 122 | |
| 123 *seed = AA*(*seed % QQ) - RR*(unsigned int)(*seed/QQ); | |
| 124 if (*seed < 0) | |
| 125 *seed += MM; | |
| 126 | |
| 127 return (int)( *seed & RAND_MAX ); | |
| 128 } | |
| 129 | |
| 130 //========================================================================== | |
| 131 // Test calculation. | |
| 132 // | |
| 133 // Generates an array of random FP values and then repeatedly applies | |
| 134 // a calculation to them and checks that the same result is reached | |
| 135 // each time. The calculation, in the macro CALC, is intended to make | |
| 136 // maximum use of the FPU registers. However, the i386 compiler | |
| 137 // doesn't let this expression get very complex before it starts | |
| 138 // spilling values out to memory. | |
| 139 | |
| 140 static void do_test( double *values, | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
141 int count, |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
142 int loops, |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
143 int test, |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
144 const char *name) |
| 552 | 145 { |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
146 unsigned int i, j; |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
147 // volatiles necessary to force |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
148 // values to 64 bits for comparison |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
149 volatile double sum = 1.0; |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
150 volatile double last_sum; |
| 552 | 151 unsigned int seed; |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
152 |
| 552 | 153 #define V(__i) (values[(__i)%count]) |
| 154 #define CALC ((V(i-1)*V(i+1))*(V(i-2)*V(i+2))*(V(i-3)*sum)) | |
| 155 | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
156 seed = ((unsigned int)&i)*count; |
| 552 | 157 |
| 158 // Set up an array of values... | |
| 159 for( i = 0; i < count; i++ ) | |
| 160 values[i] = (double)rand( &seed )/(double)0x7fffffff; | |
| 161 | |
| 162 // Now calculate something from them... | |
| 163 for( i = 0; i < count; i++ ) | |
| 164 sum += CALC; | |
| 165 last_sum = sum; | |
| 166 | |
| 167 // Now recalculate the sum in a loop and look for errors | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
168 for( j = 0; j < loops ; j++ ) |
| 552 | 169 { |
| 170 sum = 1.0; | |
| 171 for( i = 0; i < count; i++ ) | |
| 172 sum += CALC; | |
| 173 | |
| 174 if( sum != last_sum ) | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
175 { |
|
1596
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
176 union double_int_union { |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
177 double d; |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
178 cyg_uint32 i[2]; |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
179 } diu_sum, diu_lastsum; |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
180 |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
181 diu_sum.d = sum; |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
182 diu_lastsum.d = last_sum; |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
183 |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
184 errors++; |
|
1596
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
185 if (sizeof(double) != 2*sizeof(cyg_uint32)) { |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
186 diag_printf("Warning: sizeof(double) != 2*sizeof(cyg_uint32), therefore next line may\n" |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
187 "have invalid sum/last_sum values\n"); |
|
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
188 } |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
189 diag_printf("%s: Sum mismatch! %d sum=[%08x:%08x] last_sum=[%08x:%08x]\n", |
|
1596
df01feb2f050
* tests/fptest.c (do_test): Silence aliasing warning when breaking
jlarmour
parents:
1507
diff
changeset
|
190 name,j, diu_sum.i[0], diu_sum.i[1], diu_lastsum.i[0], diu_lastsum.i[1] ); |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
191 } |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
192 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
193 #if 0 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
194 if( ((j*count)%1000000) == 0 ) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
195 diag_printf("INFO:<%s: %2d calculations done>\n",name,j*count); |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
196 #endif |
| 552 | 197 } |
| 198 | |
| 199 } | |
| 200 | |
| 201 //========================================================================== | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
202 // Alarm handler |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
203 // |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
204 // This is called every tick. It lowers the priority of the currently |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
205 // running thread and raises the priority of the next. Thus we |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
206 // implement a form of timelslicing between the threads at one tick |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
207 // granularity. |
| 552 | 208 |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
209 static void alarm_fn(cyg_handle_t alarm, cyg_addrword_t data) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
210 { |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
211 alarm_ticks++; |
| 552 | 212 |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
213 if( alarm_ticks >= run_ticks ) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
214 { |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
215 if( errors ) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
216 CYG_TEST_FAIL("Errors detected"); |
|
760
74589c7c236e
* tests/fptest.c (alarm_fn): Added CYG_TEST_PASS() call to keep
nickg
parents:
648
diff
changeset
|
217 else |
|
74589c7c236e
* tests/fptest.c (alarm_fn): Added CYG_TEST_PASS() call to keep
nickg
parents:
648
diff
changeset
|
218 CYG_TEST_PASS("OK"); |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
219 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
220 CYG_TEST_FINISH("FP Test done"); |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
221 } |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
222 else |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
223 { |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
224 cyg_thread_set_priority( thread[cur_thread], BASE_PRI ); |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
225 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
226 cur_thread = (cur_thread+1)%3; |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
227 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
228 cyg_thread_set_priority( thread[cur_thread], BASE_PRI-1 ); |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
229 } |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
230 } |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
231 |
| 552 | 232 |
| 233 //========================================================================== | |
| 234 | |
| 235 #define FP1_COUNT 1000 | |
| 236 | |
| 237 static double fpt1_values[FP1_COUNT]; | |
| 238 | |
| 239 void fptest1( CYG_ADDRWORD id ) | |
| 240 { | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
241 while(1) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
242 do_test( fpt1_values, FP1_COUNT, 2000000000, id, "fptest1" ); |
| 552 | 243 } |
| 244 | |
| 245 //========================================================================== | |
| 246 | |
| 247 #define FP2_COUNT 10000 | |
| 248 | |
| 249 static double fpt2_values[FP2_COUNT]; | |
| 250 | |
| 251 void fptest2( CYG_ADDRWORD id ) | |
| 252 { | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
253 while(1) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
254 do_test( fpt2_values, FP2_COUNT, 2000000000, id, "fptest2" ); |
| 552 | 255 } |
| 256 | |
| 257 //========================================================================== | |
| 258 | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
259 #define FP3_COUNT 100 |
| 552 | 260 |
| 261 static double fpt3_values[FP3_COUNT]; | |
| 262 | |
| 263 void fptest3( CYG_ADDRWORD id ) | |
| 264 { | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
265 while(1) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
266 do_test( fpt3_values, FP3_COUNT, 2000000000, id, "fptest3" ); |
| 552 | 267 } |
| 268 | |
| 269 //========================================================================== | |
| 270 | |
| 271 void fptest_main( void ) | |
| 272 { | |
| 273 | |
| 274 CYG_TEST_INIT(); | |
| 275 | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
276 if( cyg_test_is_simulator ) |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
277 { |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
278 run_ticks = RUN_TICKS_SIM; |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
279 } |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
280 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
281 CYG_TEST_INFO("Run fptest in cyg_start"); |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
282 do_test( fpt3_values, FP3_COUNT, 1000, 0, "start" ); |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
283 CYG_TEST_INFO( "cyg_start run done"); |
| 552 | 284 |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
285 cyg_thread_create( BASE_PRI-1, |
| 552 | 286 fptest1, |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
287 0, |
| 552 | 288 "fptest1", |
| 289 &stacks[0][0], | |
| 290 STACK_SIZE, | |
| 291 &thread[0], | |
| 292 &thread_struct[0]); | |
| 293 | |
| 294 cyg_thread_resume( thread[0] ); | |
| 295 | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
296 cyg_thread_create( BASE_PRI, |
| 552 | 297 fptest2, |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
298 1, |
| 552 | 299 "fptest2", |
| 300 &stacks[1][0], | |
| 301 STACK_SIZE, | |
| 302 &thread[1], | |
| 303 &thread_struct[1]); | |
| 304 | |
| 305 cyg_thread_resume( thread[1] ); | |
| 306 | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
307 cyg_thread_create( BASE_PRI, |
| 552 | 308 fptest3, |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
309 2, |
| 552 | 310 "fptest3", |
| 311 &stacks[2][0], | |
| 312 STACK_SIZE, | |
| 313 &thread[2], | |
| 314 &thread_struct[2]); | |
| 315 | |
| 316 cyg_thread_resume( thread[2] ); | |
|
648
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
317 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
318 cyg_alarm_create( cyg_real_time_clock(), |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
319 alarm_fn, |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
320 0, |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
321 &alarm, |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
322 &alarm_struct ); |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
323 |
|
0c5540a10fcc
* tests/fptest.c: Changed to run for a constant time rather than a
nickg
parents:
552
diff
changeset
|
324 cyg_alarm_initialize( alarm, cyg_current_time()+1, 1 ); |
| 552 | 325 |
| 326 cyg_scheduler_start(); | |
| 327 | |
| 328 } | |
| 329 | |
| 330 //========================================================================== | |
| 331 | |
| 332 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG | |
| 333 externC void | |
| 334 cyg_hal_invoke_constructors(); | |
| 335 #endif | |
| 336 | |
| 337 externC void | |
| 338 cyg_start( void ) | |
| 339 { | |
| 340 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG | |
| 341 cyg_hal_invoke_constructors(); | |
| 342 #endif | |
| 343 fptest_main(); | |
| 344 } | |
| 345 | |
| 346 //========================================================================== | |
| 347 | |
| 348 #else // CYGFUN_KERNEL_API_C... | |
| 349 | |
| 350 externC void | |
| 351 cyg_start( void ) | |
| 352 { | |
| 353 CYG_TEST_INIT(); | |
| 1507 | 354 CYG_TEST_INFO("FP test requires:\n" |
| 552 | 355 "CYGFUN_KERNEL_API_C && \n" |
| 356 "CYGSEM_KERNEL_SCHED_MLQUEUE && \n" | |
| 357 "(CYGNUM_KERNEL_SCHED_PRIORITIES > 12)\n"); | |
| 1507 | 358 CYG_TEST_NA("FP test requirements"); |
| 552 | 359 } |
| 360 | |
| 361 #endif // CYGFUN_KERNEL_API_C, etc. | |
| 362 | |
| 363 //========================================================================== | |
| 364 // EOF fptest.cxx |
