Mercurial > flash_v2
diff packages/kernel/current/tests/kclock0.c @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/kernel/current/tests/kclock0.c @@ -0,0 +1,263 @@ +/*================================================================= +// +// kclock0.c +// +// Kernel C API Clock test 0 +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Cygnus eCos Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://sourceware.cygnus.com/ecos +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Cygnus Operating System, released +// September 30, 1998. +// +// The Initial Developer of the Original Code is Cygnus. Portions created +// by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): dsm +// Contributors: dsm +// Date: 1998-03-20 +// Description: Tests some basic clock functions. +//####DESCRIPTIONEND#### +*/ + +#include <cyg/kernel/kapi.h> + +#include <cyg/infra/testcase.h> + +#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK + +#ifdef CYGFUN_KERNEL_API_C + +#include "testaux.h" + +cyg_alarm_t call_me; + +cyg_counter counter0o, counter1o; +cyg_handle_t counter0, counter1; + +cyg_alarm alarmo[3]; +cyg_handle_t alarm0, alarm1, alarm2; + +cyg_resolution_t res, res0, res1; + +cyg_clock clock0o; +cyg_handle_t clock0; + +const cyg_uint32 big_number = 3333222111u; + +cyg_bool_t flash( void ) +{ + cyg_counter_create( &counter0, &counter0o ); + cyg_counter_create( &counter1, &counter1o ); + + cyg_alarm_create( counter0, + call_me, + (cyg_addrword_t)12, + &alarm0, + &alarmo[0]); + + res.dividend = 1; + res.divisor = 2; + + cyg_clock_create( res, &clock0, &clock0o ); + cyg_clock_delete( clock0 ); + + cyg_alarm_delete( alarm0 ); + + cyg_counter_delete( counter0 ); + cyg_counter_delete( counter1 ); + + return true; +} + +/* Testing alarms +// +// call_me is a function that will be called when an alarm is +// triggered. It updates a global variable called which is CHECKed +// explicitly to see if the approriate alarms have been called. +*/ + +cyg_uint16 called = 0x0; + +void call_me(cyg_handle_t alarm, cyg_addrword_t data) +{ + called ^= (int)data; +} + +void call_me2(cyg_handle_t alarm, cyg_addrword_t data) +{ + call_me(alarm, (cyg_addrword_t)((int)data^0x10)); +} + + +void kclock0_main(void) +{ + CYG_TEST_INIT(); + + CHECK(flash()); + CHECK(flash()); + + cyg_counter_create( &counter0, &counter0o); + + CHECK( 0 == cyg_counter_current_value( counter0 ) ); + + cyg_counter_tick(counter0); + + CHECK( 1 == cyg_counter_current_value(counter0) ); + + cyg_counter_tick(counter0); + + CHECK( 2 == cyg_counter_current_value(counter0) ); + + cyg_counter_set_value( counter0, 0xffffffff ); + + CHECK( 0xffffffff == cyg_counter_current_value(counter0) ); + + cyg_counter_tick(counter0); // Overflows 32 bits + + CHECK( 0x100000000ULL == cyg_counter_current_value(counter0) ); + + cyg_counter_set_value(counter0, 11); + CHECK( 11 == cyg_counter_current_value(counter0) ); + + /* the call_me functions cause the "called" bits to toggle + // checking the value of called checks the parity of # of calls + // made by each alarm. + */ + + cyg_alarm_create(counter0, + call_me, (cyg_addrword_t)0x1, &alarm0, &alarmo[0]); + cyg_alarm_create(counter0, + call_me, (cyg_addrword_t)0x2, &alarm1, &alarmo[1]); + cyg_alarm_create(counter0, + call_me2, (cyg_addrword_t)0x4, &alarm2, &alarmo[2]); + + CHECK( 0x00 == called ); + cyg_alarm_initialize(alarm0, 12,3); + cyg_alarm_initialize(alarm2, 21,2); + CHECK( 0x00 == called ); + + cyg_counter_tick(counter0); /* 12 a0 */ + CHECK( 0x01 == called ); + + cyg_alarm_initialize(alarm1, 13,0); + cyg_counter_tick(counter0); /* 13 a1 */ + CHECK( 0x03 == called ); + + cyg_alarm_initialize(alarm1, 17,0); + cyg_counter_tick(counter0); /* 14 */ + CHECK( 0x03 == called ); + + cyg_counter_tick(counter0); /* 15 a0 */ + CHECK( 0x02 == called ); + + cyg_counter_tick(counter0); /* 16 */ + cyg_counter_tick(counter0); /* 17 a1 */ + CHECK( 0x00 == called ); + + cyg_counter_tick(counter0); /* 18 a0 */ + CHECK( 0x01 == called ); + + cyg_counter_tick(counter0); /* 19 */ + cyg_counter_tick(counter0); /* 20 */ + cyg_counter_tick(counter0); /* 21 a0 a2 */ + CHECK( 0x14 == called ); + + cyg_counter_tick(counter0); /* 22 */ + cyg_counter_tick(counter0); /* 23 a2 */ + CHECK( 0x00 == called ); + + cyg_alarm_disable(alarm2); + + cyg_counter_tick(counter0); /* 24 a0 */ + cyg_counter_tick(counter0); /* 25 */ + CHECK( 0x01 == called ); + + cyg_alarm_enable(alarm2); /* a2 (enabled at 25) */ + CHECK( 0x15 == called ); + + cyg_counter_tick(counter0); /* 26 */ + CHECK( 0x15 == called ); + + cyg_counter_tick(counter0); /* 27 a0 a2 */ + cyg_counter_tick(counter0); /* 28 */ + CHECK( 0x00 == called ); + + cyg_counter_tick(counter0); /* 29 a2 */ + cyg_counter_tick(counter0); /* 30 a0 */ + cyg_counter_tick(counter0); /* 31 a2 */ + CHECK( 0x01 == called ); + + res0.dividend = 100; + res0.divisor = 3; + + cyg_clock_create( res0, &clock0, &clock0o ); + + res1 = cyg_clock_get_resolution(clock0); + CHECK( res0.dividend == res1.dividend ); + CHECK( res0.divisor == res1.divisor ); + + res1.dividend = 12; + res1.divisor = 25; + + cyg_clock_set_resolution(clock0, res1); + res0 = cyg_clock_get_resolution(clock0); + CHECK( res0.dividend == res1.dividend ); + CHECK( res0.divisor == res1.divisor ); + + cyg_clock_to_counter(clock0, &counter1); + + CHECK( 0 == cyg_counter_current_value( counter1 ) ); + CHECK( 0 == cyg_current_time() ); + + cyg_counter_tick(counter1); + + CHECK( 1 == cyg_counter_current_value(counter1) ); + + res0 = cyg_clock_get_resolution(cyg_real_time_clock()); + + /* Current time should be 0 as interrupts will still be disabled */ + CHECK( 0 == cyg_current_time() ); + + CYG_TEST_PASS_FINISH("Kernel C API Clock 0 OK"); +} + +externC void +cyg_start( void ) +{ + kclock0_main(); +} + +#else // def CYGFUN_KERNEL_API_C +#define N_A_MSG "Kernel C API layer disabled" +#endif // def CYGFUN_KERNEL_API_C +#else // def CYGVAR_KERNEL_COUNTERS_CLOCK +#define N_A_MSG "Kernel real-time clock disabled" +#endif // def CYGVAR_KERNEL_COUNTERS_CLOCK + +#ifdef N_A_MSG +externC void +cyg_start( void ) +{ + CYG_TEST_INIT(); + CYG_TEST_PASS_FINISH("N/A: " N_A_MSG); +} +#endif // N_A_MSG + +// EOF kclock0.c
