diff options
Diffstat (limited to 'c/src/libchip/shmdr/poll.c')
-rw-r--r-- | c/src/libchip/shmdr/poll.c | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/c/src/libchip/shmdr/poll.c b/c/src/libchip/shmdr/poll.c index 411f740fb0..1190a53854 100644 --- a/c/src/libchip/shmdr/poll.c +++ b/c/src/libchip/shmdr/poll.c @@ -1,14 +1,8 @@ -/* void Shm_Poll() - * +/* * This routine polls to see if a packet has arrived. If one - * has it informs the executive. It is typically called from - * the clock tick interrupt service routine. - * - * Input parameters: NONE - * - * Output parameters: NONE + * has it informs the executive. It uses a Classic API Timer * - * COPYRIGHT (c) 1989-1999. + * COPYRIGHT (c) 1989-2008. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -22,31 +16,41 @@ #include <rtems/score/sysstate.h> #include <rtems/libio.h> +#include <assert.h> + #include "shm_driver.h" -void Shm_Poll() +rtems_timer_service_routine Shm_Poll_TSR( + rtems_id id, + void *ignored_address +) { - uint32_t tmpfront; - rtems_libio_ioctl_args_t args; - - /* invoke clock isr */ - args.iop = 0; - args.command = rtems_build_name('I', 'S', 'R', ' '); - (void) rtems_io_control(rtems_clock_major, rtems_clock_minor, &args); + uint32_t tmpfront; /* - * Check for msgs only if we are "up" - * This avoids a race condition where we may get a clock - * interrupt before MPCI has completed its init + * This should NEVER happen but just in case. */ + if (!_System_state_Is_up(_System_state_Get())) + return; - if (_System_state_Is_up(_System_state_Get())) - { - tmpfront = Shm_Local_receive_queue->front; - if ( Shm_Convert(tmpfront) != Shm_Locked_queue_End_of_list ) - { - rtems_multiprocessing_announce(); - Shm_Interrupt_count++; - } + tmpfront = Shm_Local_receive_queue->front; + if ( Shm_Convert(tmpfront) != Shm_Locked_queue_End_of_list ) { + rtems_multiprocessing_announce(); + Shm_Interrupt_count++; } + + (void) rtems_timer_reset( id ); } + +void Shm_install_timer(void) +{ + rtems_id id; + rtems_status_code status; + + status = rtems_timer_create( rtems_build_name( 'S', 'H', 'P', 'L' ), &id ); + assert( !status ); + + status = rtems_timer_fire_after( id, 1, Shm_Poll_TSR, NULL ); + assert( !status ); +} + |