AW: [ECOS] help needed: interrupt + semaphore

Gary Thomas gthomas@ecoscentric.com
Tue Aug 20 05:07:00 GMT 2002


On Tue, 2002-08-20 at 04:56, Edelmann Thomas wrote:
> Hi,
> 
> thanks for your help! 
> 
> But this doesn't solve the problem. The ISR is always called, but then
> nothing happens, no DSR, no INTThread.
> 
> Knows someone something else?
> 

You need to start the scheduler, otherwise nothing else will
happen - the threads won't run and the DSR will never be called.

There are more comments below, in your code.

> bye, Thomas
> 
> > -----Ursprüngliche Nachricht-----
> > Von: Robert Cragie [ mailto:rcc@jennic.com ]
> > Gesendet: Dienstag, 20. August 2002 12:07
> > An: Edelmann Thomas; ecos-discuss@sources.redhat.com
> > Cc: thomas.edelmann@gmx.de
> > Betreff: RE: [ECOS] help needed: interrupt + semaphore
> > 
> > 
> > I do it like this and it works for me:
> > 
> > static cyg_uint32 intE1ISR(cyg_vector_t vector, cyg_addrword_t data)
> > {
> > 	cyg_interrupt_mask(vector);
> > 
> > 	cyg_interrupt_acknowledge(vector);
> > 
> > 	return CYG_ISR_CALL_DSR;
> > }
> > 
> > static void intDSR(cyg_vector_t vector, cyg_ucount32 count, 
> > cyg_addrword_t
> > data)
> > {
> >     cyg_semaphore_post(&semEINT1);
> > 
> >     cyg_interrupt_unmask(vector);
> > }
> > 
> > I also commented that cyg_interrupt_acknowledge() must be 
> > called in the
> > ISR - the docs. seem to say this must be done.
> > 
> > HTH
> > 
> > Robert Cragie, Design Engineer
> > ________________________________________________________
> > Jennic Ltd, Furnival Street, Sheffield, S1 4QT,  UK
> > www.jennic.com Tel: +44 (0) 114 281 2655
> > 
> > > -----Original Message-----
> > > From: ecos-discuss-owner@sources.redhat.com
> > > [ mailto:ecos-discuss-owner@sources.redhat.com]On Behalf Of Edelmann
> > > Thomas
> > > Sent: 20 August 2002 08:44
> > > To: 'ecos-discuss@sources.redhat.com'
> > > Cc: 'thomas.edelmann@gmx.de'
> > > Subject: [ECOS] help needed: interrupt + semaphore
> > >
> > >
> > > Hi,
> > >
> > > I need your help! I've attached a simplified copy of my System.
> > > Only running
> > > an Interrupthandler with a Semaphore.
> > >
> > > But it is not running. The Problem: If I receive an 
> > external Interupt
> > > (created by a FPGA) the ISR Routine is called, but nothing 
> > else. WHY???
> > >
> > > What am I doing wrong???
> > >
> > > Thanks for your Help!
> > >
> > > bye,
> > > Thomas
> > >
> > >
> > > --- System.c ---
> > >
> > > #include <stdio.h>                      /* printf */
> > > #include <stdlib.h>
> > > #include <pkgconf/system.h>
> > > #include <pkgconf/net.h>
> > > #include <pkgconf/posix.h>
> > > #include <pkgconf/kernel.h>
> > > #include <fcntl.h>
> > > #include <mqueue.h>
> > > #include <cyg/kernel/kapi.h>            /* All the kernel
> > > specific stuff */
> > > #include <cyg/io/io.h>                  /* I/O functions */
> > > #include <cyg/hal/hal_arch.h>           /*
> > > CYGNUM_HAL_STACK_SIZE_TYPICAL */
> > > #include <cyg/hal/hal_intr.h>
> > > #include <cyg/hal/hal_edb7xxx.h>
> > > #include <network.h>
> > >
> > > /* ============ */
> > > /* === ecos === */
> > >
> > > /* DEFINES */
> > >
> > > #define NTHREADS 2
> > > #define STACKSIZE ( CYGNUM_HAL_STACK_SIZE_TYPICAL)
> > >
> > > /* STATICS */
> > >
> > > static cyg_handle_t		thread[NTHREADS];
> > > static cyg_thread			thread_obj[NTHREADS];
> > > static char				stack[NTHREADS][STACKSIZE];
> > >
> > > static cyg_handle_t		hEInt1;
> > > static cyg_interrupt		iEInt1;
> > > static cyg_sem_t			semEINT1;
> > >
> > > static void intDSR(cyg_vector_t vector, cyg_ucount32 count, 
> > cyg_addrword_t
> > > data)
> > > {
> > > 	cyg_semaphore_post(&semEINT1);
> > > }
> > >
> > > static cyg_uint32 intE1ISR(cyg_vector_t vector, cyg_addrword_t data)
> > > {
> > > 	cyg_interrupt_mask(CYGNUM_HAL_INTERRUPT_EINT1);
> > >
> > > 	return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR);  // Run the DSR
> > > }
> > >
> > > void INTThread (CYG_ADDRESS data)
> > > {
> > > 	while (1)
> > > 	{
> > > 		cyg_semaphore_wait(&semEINT1);
> > >
> > > 		diag_printf("INTThread: IRT IRQ1: %.8lX NRT IRQ1:
> > > %.8lX\n\n", IO_SP_IRQ1_IRT, IO_SP_IRQ1_NRT);
> > >
> > > 		cyg_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_EINT1);
> > > 		cyg_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EINT1);
> > > 	}
> > > }
> > >
> > > externC void
> > > cyg_user_start( void )
> > > {
> > > 	cyg_semaphore_init(&semEINT1, 0);
> > >
> > > 	cyg_interrupt_create(CYGNUM_HAL_INTERRUPT_EINT1,
> > > 		6,                     // Priority - unused
> > > 		1,   //  Data item passed to interrupt handler
> > > 		intE1ISR,
> > > 		intDSR,
> > > 		&hEInt1,
> > > 		&iEInt1);
> > >
> > > 	cyg_interrupt_attach(hEInt1);
> > > 	cyg_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_EINT1);
> > >
> > > 	// Interrupt Freigabe
> > > 	cyg_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EINT1);
> > >
> > > 	// Interrupts aktivieren
> > > 	// external 1
> > > 	*(volatile unsigned char *)INTMR1 |= 0x20;
> > >
> > > 	cyg_interrupt_enable();
        ^^^^^^^^^^^^^^^^^^^^^^^

Don't do this!  It's done by cyg_scheduler_start(), only when it's safe
to do so.

> > >
> > > 	cyg_thread_create (5, INTThread, (cyg_addrword_t) 0, 
> > "INTThread",
> > > 		(void *)stack[5], STACKSIZE, &thread[5], 
> > &thread_obj[5]);
> > > 	cyg_thread_resume (thread[5]);
> > >
> > > //	cyg_scheduler_start();
                ^^^^^^^^^^^^^^^^^^^^^^

This must be called for this program to function.

> > > }
> > >
> > > --- \System.c ---
> > >
> > > Mit freundlichen Grüßen
> > > Thomas Edelmann
> > >
> > >
> > >
> > > --
> > > Before posting, please read the FAQ: 
> http://sources.redhat.com/fom/ecos
> > and search the list archive: http://sources.redhat.com/ml/ecos-discuss
> >
> >
> 
> -- 
> Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
> and search the list archive: http://sources.redhat.com/ml/ecos-discuss

-- 
------------------------------------------------------------
Gary Thomas                  |
eCosCentric, Ltd.            |  
+1 (970) 229-1963            |  eCos & RedBoot experts
gthomas@ecoscentric.com      |
http://www.ecoscentric.com/  |
------------------------------------------------------------


--
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss



More information about the Ecos-discuss mailing list