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