/* * COPYRIGHT (c) 1989-2003. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id$ */ #include #include #include #include /* _Timespec_Substract */ struct timespec start; #if defined(INCLUDE_TO_ISR) struct timespec to_isr; #endif struct timespec stop_in_task; rtems_id semaphore; rtems_id task_id; void irqforce(int); void ISR( uint32_t arg ) { rtems_status_code status; #if defined(INCLUDE_TO_ISR) _TOD_Get( &to_isr ); #endif status = rtems_semaphore_release( semaphore ); } rtems_task ISR_Task( rtems_task_argument argument ) { rtems_status_code status; struct timespec diff1, diff2; #define print_timespec( _t ) \ printf ( "%ld:%ld ", (long) _t.tv_sec, (long) _t.tv_nsec ); /* * Print base overhead */ _TOD_Get( &start ); _TOD_Get( &stop_in_task ); _Timespec_Subtract( &start, &stop_in_task, &diff1 ); printf( "Timer Overhead: " ); print_timespec( start ); print_timespec( stop_in_task ); printf( "--> " ); print_timespec( diff1 ); printf( "\n" ); while (1) { status = rtems_semaphore_obtain( semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); _TOD_Get( &stop_in_task ); _Timespec_Subtract( &start, &stop_in_task, &diff2 ); print_timespec( start ); #if defined(INCLUDE_TO_ISR) _Timespec_Subtract( &start, &to_isr, &diff1 ); print_timespec( to_isr ); #endif print_timespec( stop_in_task ); printf( "--> " ); #if defined(INCLUDE_TO_ISR) print_timespec( diff1 ); #endif print_timespec( diff2 ); printf( "\n" ); } } rtems_task Init( rtems_task_argument argument ) { rtems_status_code status; rtems_time_of_day time; int i; puts( "\n\n*** IRQ FORCE TEST ***" ); time.year = 2007; time.month = 10; time.day = 17; time.hour = 13; time.minute = 45; time.second = 0; time.ticks = 0; status = rtems_clock_set( &time ); /* * Create the simple semaphore used to wake us up */ status = rtems_semaphore_create( rtems_build_name( 'A', 'I', 'S', 'R' ), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, 0, &semaphore ); status = rtems_task_create( rtems_build_name( 'A', 'I', 'S', 'R' ), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); status = rtems_task_start( task_id, ISR_Task, 1 ); /* * Now generate the interrupt and time it */ set_vector( ISR, 17, 1 ); for ( i=0 ; i<= 10 ; i++ ) { sleep(1); _TOD_Get( &start ); irqforce(1); } sleep(1); exit( 0 ); } /**************** START OF CONFIGURATION INFORMATION ****************/ #define CONFIGURE_INIT #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER #define CONFIGURE_MAXIMUM_TASKS 4 #define CONFIGURE_MAXIMUM_SEMAPHORES 1 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT_TASK_PRIORITY 5 #define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_PREEMPT #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE) #include /**************** END OF CONFIGURATION INFORMATION ****************/