1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 <2022> 2023 2024 2025 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 <2022> 2023 2024 2025 |
<== Date ==> | <== Thread ==> |
---|
Subject: | Re: Interrupt problem. |
From: | Francisco Ramos via Tech-talk <tech-talk at aps.anl.gov> |
To: | "Johnson, Andrew N." <anj at anl.gov> |
Cc: | EPICS tech-talk <tech-talk at aps.anl.gov> |
Date: | Tue, 25 Jan 2022 16:43:03 -0300 |
Hi Francisco,
On Jan 24, 2022, at 2:53 PM, Francisco Ramos via Tech-talk <tech-talk at aps.anl.gov> wrote:
I am writing to see if you can help or guide me to find a solution for the error I am having with the "Bancomm 365" driver. We are migrating the module to EPCIS version 7.0.6.1. with rtems5. The driver works correctly for version 3.14.12.8 and RTEMS 4.10.
When I boot the driver I get the "spurious interrupt: 32" error. This implies that the function (isr_bc635) associated with the interrupt is never called. In this case, the Bancomm card should issue an interrupt for each tick periodically.
The error “spurious interrupt: 32” would imply to me that the CPU was seeing an interrupt on vector 32 but that it doesn’t have an interrupt service routine associated with that vector number. Does your macro BC635VEC expand out to 32? Has your bc635IntEnable() routine actually been run at the point when you are seeing the error message?
I assume you have already applied the patch to the epicsEvent API found in the GitHub PR #206 which is essential to be able to call epicsEventSignal() from an ISR on RTEMS-5.1. I just merged that PR into the 7.0 branch earlier today.
HTH,
- Andrew
Thank you very much in advance.
int bc635IntEnable (const epicsUInt16 signal, const char *parm ){……
/* Connect bc635 interrupts */if( (status = devConnectInterruptVME(BC635VEC, isr_bc635, NULL) ) != OK ){errMessage(status, "BC635 error - unable to connect\n");return status;}pbc635->vector = BC635VEC; /* Interrupt vector */pbc635->level = BC635LVL; /* Interrupt level */
/* Enable interrupts on this level */status = devEnableInterruptLevel( intVME, BC635LVL );if( status )printf("Enabling Bancomm interrupts failed\n");init = TRUE;}……}
void isr_bc635 (void *p){/* First check for periodic interrupt */if ( ((pbc635->intstat & 0x02) & pbc635->mask) != 0){……}
/* let a high priority task deal with the other interrupts */epicsEventSignal(intSvc);}
Regards,
--Complexity comes for free, simplicity you have to work for.