[PATCH] how to fix shmdr for POLLING? [was: Re: PSIM and MP tests -- anybody got working?]
Joel Sherrill
joel.sherrill at oarcorp.com
Tue Jan 24 20:41:55 UTC 2006
Karel Gardas wrote:
> On Mon, 23 Jan 2006, Joel Sherrill wrote:
>
>> I was afraid of this. shmdr has not been used with new execption model
>> and assumes it can "wrap" the clock tick driver ISR. It was written
>> before
>> the Timer Manager exists. Instead of its clock tick ISR trick, it
>> should install
>> an RTEMS timer to run once a tick when polled.
>
>
> If I understand this well, then the code should looks like in diff
> below, but the problem is that then Shm_Poll seems to be run too often
> (just my idea), since I usually end with consumed amount of
> instructions/time... Even if I go with 1000 clicks, it's still the
> same, but test at least runs some functionality. I guess my task setup
> is wrong...
>
Each click is an instruction in the simulator so the clicks per tick
must be relatively high to
allow for positive movement in the test.
Do you have a functional gdb?
Can you dump the shm?
> Do you have any idea how to fix this?
>
Only if I could peek inside with gdb. :)
FWIW I think your idea of moving to a polling task is better than using
a Timer.
There is already an MPCI task in RTEMS waiting for requests so when this
is working it would be even better to let him poll directly. That would
eliminate overhead.
> Thanks,
> Karel
> --
> Karel Gardas kgardas at objectsecurity.com
> ObjectSecurity Ltd. http://www.objectsecurity.com
>
> Index: Makefile.am
> ===================================================================
> RCS file: /usr1/CVS/rtems/c/src/libchip/Makefile.am,v
> retrieving revision 1.36
> diff -u -r1.36 Makefile.am
> --- Makefile.am 12 Jan 2006 10:12:31 -0000 1.36
> +++ Makefile.am 23 Jan 2006 22:59:35 -0000
> @@ -96,7 +96,7 @@
> shmdr_rel_SOURCES = shmdr/addlq.c shmdr/cnvpkt.c shmdr/getlq.c
> shmdr/dump.c \
> shmdr/fatal.c shmdr/getpkt.c shmdr/init.c shmdr/initlq.c
> shmdr/intr.c \
> shmdr/mpisr.c shmdr/poll.c shmdr/receive.c shmdr/retpkt.c
> shmdr/send.c \
> - shmdr/setckvec.c
> + shmdr/poller.c
> shmdr_rel_CPPFLAGS = $(AM_CPPFLAGS)
> shmdr_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
> endif
> Index: shmdr/init.c
> ===================================================================
> RCS file: /usr1/CVS/rtems/c/src/libchip/shmdr/init.c,v
> retrieving revision 1.16
> diff -u -r1.16 init.c
> --- shmdr/init.c 20 Apr 2004 10:43:39 -0000 1.16
> +++ shmdr/init.c 23 Jan 2006 22:59:36 -0000
> @@ -20,6 +20,7 @@
> #define _SHM_INIT
>
> #include <rtems.h>
> +#include <rtems/rtems/tasks.h>
> #include <shm_driver.h>
>
> #include <string.h> /* memset() */
> @@ -126,8 +127,21 @@
> interrupt_value = Shm_Convert( Shm_Configuration->Intr.value );
> interrupt_cause = Shm_Convert( Shm_Configuration->Intr.length );
>
> - if ( Shm_Configuration->poll_intr == POLLED_MODE ) Shm_setclockvec();
> - else Shm_setvec();
> + if ( Shm_Configuration->poll_intr == POLLED_MODE ) {
> + rtems_name task_name;
> + rtems_id tid;
> + rtems_status_code status;
> +
> + task_name = rtems_build_name( 'P', 'S', 'H', 'M' );
> + status = rtems_task_create( task_name,
> + 1,
> + RTEMS_MINIMUM_STACK_SIZE,
> + RTEMS_NO_TIMESLICE | RTEMS_NO_ASR |
> RTEMS_INTERRUPT_LEVEL(0),
> + RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
> + &tid );
> + status = rtems_task_start( tid, Shm_Poller_task, 0 );
> + }
> + else Shm_setvec();
>
> if ( Shm_Is_master_node() ) {
>
> Index: shmdr/poll.c
> ===================================================================
> RCS file: /usr1/CVS/rtems/c/src/libchip/shmdr/poll.c,v
> retrieving revision 1.15
> diff -u -r1.15 poll.c
> --- shmdr/poll.c 20 Apr 2004 10:43:39 -0000 1.15
> +++ shmdr/poll.c 23 Jan 2006 22:59:36 -0000
> @@ -27,12 +27,6 @@
> void Shm_Poll()
> {
> 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);
>
> /*
> * Check for msgs only if we are "up"
> Index: shmdr/shm_driver.h
> ===================================================================
> RCS file: /usr1/CVS/rtems/c/src/libchip/shmdr/shm_driver.h,v
> retrieving revision 1.25
> diff -u -r1.25 shm_driver.h
> --- shmdr/shm_driver.h 29 Sep 2004 20:36:20 -0000 1.25
> +++ shmdr/shm_driver.h 23 Jan 2006 22:59:38 -0000
> @@ -479,8 +479,9 @@
> void Shm_Print_statistics( void );
> void MPCI_Fatal( Internal_errors_Source, boolean, uint32_t);
> rtems_task Shm_Cause_interrupt( uint32_t);
> +rtems_task Shm_Poller_task( rtems_task_argument unused );
> void Shm_Poll();
> -void Shm_setclockvec();
> +/* void Shm_setclockvec(); */
> void Shm_Convert_packet( rtems_packet_prefix * );
>
> /* CPU specific routines are inlined in shmcpu.h */
> --- /dev/null 2005-04-30 23:10:27.000000000 +0200
> +++ shmdr/poller.c 2006-01-23 23:49:08.000000000 +0100
> @@ -0,0 +1,33 @@
> +/* Shm_Poller_task
> + *
> + * This routine serves as a Shm_Poller task. It just calls Shm_Poll
> + * every tick.
> + *
> + * Input parameters: NONE
> + *
> + * Output parameters: NONE
> + *
> + * COPYRIGHT (c) 1989-1999.
> + * 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 <rtems.h>
> +#include <rtems/libio.h>
> +
> +#include "shm_driver.h"
> +
> +rtems_task Shm_Poller_task(
> + rtems_task_argument unused
> +)
> +{
> + for ( ; ; ) {
> + rtems_task_wake_after( 1 );
> + Shm_Poll();
> + }
> +}
More information about the users
mailing list