]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/kernel/v2_0/tests/clocktruth.cxx
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / kernel / v2_0 / tests / clocktruth.cxx
1 //==========================================================================
2 //
3 //        clocktruth.cxx
4 //
5 //        Clock accuracy test
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 // Copyright (C) 2003 Gary Thomas
13 //
14 // eCos is free software; you can redistribute it and/or modify it under
15 // the terms of the GNU General Public License as published by the Free
16 // Software Foundation; either version 2 or (at your option) any later version.
17 //
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21 // for more details.
22 //
23 // You should have received a copy of the GNU General Public License along
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 //
27 // As a special exception, if other files instantiate templates or use macros
28 // or inline functions from this file, or you compile this file and link it
29 // with other works to produce a work based on this file, this file does not
30 // by itself cause the resulting work to be covered by the GNU General Public
31 // License. However the source code for this file must still be made available
32 // in accordance with section (3) of the GNU General Public License.
33 //
34 // This exception does not invalidate any other reasons why a work based on
35 // this file might be covered by the GNU General Public License.
36 //
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
38 // at http://sources.redhat.com/ecos/ecos-license/
39 // -------------------------------------------
40 //####ECOSGPLCOPYRIGHTEND####
41 //==========================================================================
42 //#####DESCRIPTIONBEGIN####
43 //
44 // Author(s):     hmt
45 // Contributors:  hmt
46 // Date:          2001-06-05
47 // Description:   Tests the Kernel Real Time Clock for accuracy using a human
48 // 
49 //####DESCRIPTIONEND####
50
51
52 // This is for a human to watch to sanity check the clock rate.
53 // It's easier to see what's happening if you enable this:
54 #define nRUNFOREVER
55
56
57 #include <pkgconf/kernel.h>
58
59 #include <cyg/kernel/clock.hxx>
60 #include <cyg/kernel/sema.hxx>
61 #include <cyg/kernel/thread.hxx>
62
63 #include <cyg/infra/testcase.h>
64
65 #include <cyg/kernel/clock.inl>
66 #include <cyg/kernel/thread.inl>
67
68 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
69
70 #include <cyg/infra/diag.h>
71
72 #define NTHREADS 1
73 #include "testaux.hxx"
74
75 #ifdef RUNFOREVER
76 #define ENDPOINT 8192
77 #else
78 #define ENDPOINT 20
79 #endif
80
81 static cyg_alarm_fn alarmfunc;
82 static void alarmfunc( Cyg_Alarm *alarm, CYG_ADDRWORD data )
83 {
84     Cyg_Binary_Semaphore *sp = (Cyg_Binary_Semaphore *)data;
85     sp->post();
86 }
87
88
89 static void entry0( CYG_ADDRWORD data )
90 {
91     cyg_uint32 now, then;
92     int i;
93
94     Cyg_Clock *rtc = Cyg_Clock::real_time_clock;
95
96     Cyg_Binary_Semaphore sema;
97
98     Cyg_Alarm alarm( rtc, &alarmfunc, (CYG_ADDRWORD)&sema );
99
100     // First, print 100 lines as fast as you can, of distinct ticks.
101     for ( i = 0; i < 100; i++ ) {
102         now = rtc->current_value_lo();
103         then = now;
104         while ( then == now )
105             now = rtc->current_value_lo();
106
107         diag_printf( "INFO<time now %8d>\n", now );
108     }
109
110     diag_printf( "INFO<per-second times are: %8d>\n", rtc->current_value_lo() );
111     for ( i = 0; i < 20; i++ ) {
112         Cyg_Thread::counted_sleep( 100 );
113         diag_printf( "INFO<per-second time %2d is %8d>\n",
114                      i, rtc->current_value_lo() );
115     }
116
117     alarm.initialize( rtc->current_value() + 100, 100 );
118     alarm.enable();
119     for ( i = 0; i < ENDPOINT; i++ ) {
120         sema.wait();
121         diag_printf( "INFO<alarm time %2d is %8d>\n",
122                      i, rtc->current_value_lo() );
123     }
124
125     CYG_TEST_PASS_FINISH("Clock truth OK");
126 }
127
128 void clocktruth_main( void )
129 {
130     CYG_TEST_INIT();
131     new_thread(entry0, (CYG_ADDRWORD)&thread_obj[0]);
132     Cyg_Scheduler::start();
133 }
134
135 externC void
136 cyg_start( void )
137 {
138 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
139     cyg_hal_invoke_constructors();
140 #endif
141     clocktruth_main();
142 }
143
144 #else // def CYGVAR_KERNEL_COUNTERS_CLOCK
145
146 externC void
147 cyg_start( void )
148 {
149     CYG_TEST_INIT();
150     CYG_TEST_NA( "Kernel real-time clock disabled");
151 }
152
153 #endif // def CYGVAR_KERNEL_COUNTERS_CLOCK
154
155 // EOF clocktruth.cxx