This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

AW: help needed: interrupt + semaphore


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?

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();
> >
> > 	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();
> > }
> >
> > --- \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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]