This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
AW: AW: help needed: interrupt + semaphore
- From: Edelmann Thomas <thomas dot edelmann at siemens dot com>
- To: "'Gary Thomas'" <gthomas at ecoscentric dot com>, Edelmann Thomas <thomas dot edelmann at siemens dot com>
- Cc: eCos Discussion <ecos-discuss at sources dot redhat dot com>
- Date: Tue, 20 Aug 2002 14:18:08 +0200
- Subject: AW: AW: [ECOS] help needed: interrupt + semaphore
Hi,
I've tried this, but, Sorry, it didn't help.
Only the ISR ...
Thanks for your Help,
Thomas
> -----Ursprüngliche Nachricht-----
> Von: Gary Thomas [mailto:gthomas@ecoscentric.com]
> Gesendet: Dienstag, 20. August 2002 14:07
> An: Edelmann Thomas
> Cc: 'Robert Cragie'; eCos Discussion; thomas.edelmann@gmx.de
> Betreff: Re: AW: [ECOS] help needed: interrupt + semaphore
>
>
> 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