This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
RE: help needed: interrupt + semaphore
- From: "Robert Cragie" <rcc at jennic dot com>
- To: "Edelmann Thomas" <thomas dot edelmann at siemens dot com>, <ecos-discuss at sources dot redhat dot com>
- Cc: <thomas dot edelmann at gmx dot de>
- Date: Tue, 20 Aug 2002 11:06:30 +0100
- Subject: 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