This is the mail archive of the ecos-discuss@sourceware.org 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]

Re: Serial channel sharing the same ISR


Sergei Gavrikov a écrit :
On Wed, 30 Jun 2010, Nicolas FLAVEN wrote:

Hello,

I would like to know how i can setup x serial channel that share the
same interrupt vector.

My probleme is that my serial channel have to share the same interrupt
vector and I want that the ISR find which channel is interrupting but
if I use SERIAL_CHANNEL_USING_INTERRUPTS with the corresponding
DEVTAB_ENTRY this will overwrite the adresse of the ISR attache to the
vector and the data.

Should I care about it ? Is the " chain all interrupts together"
options the solution to allows for multiple ISR/DSR pairs to be
registered for the same interrupt vector.

Hi Nicolas,


Look at a comment in hal_arbiter.h (hal/common/*/include/hal_arbiter.h).
I hope you will get the idea.

Sergei


Hi


I understand that CYGIMP_KERNEL_INTERRUPTS_CHAIN and CYGIMP_HAL_INTERRUPTS_CHAIN will produce ALL my ISR to be chain ON vector. Is that right ? Does it depend of the target ( there it's an lpc2294 ) ?

I don't really understand the arbiter process comment (looking at mpc8xx example don't help me too): for me different source call different isr.
In my case CYGNUM_HAL_INTERRUPT_EINT3 is the shared vector, SERIAL_CHANNEL_USING_INTERRUPTS is used to attach 8 pc_serial_ISR through pc_serial_funs.
How can i make the difference between the 8 channel to process the right data in hal_call_isr ?


Nicolas

//=============================================================================
// Function used to call ISRs from ISR arbiters
// An arbiter is hooked on the shared interrupt vector and looks like this:
//
// cyg_uint32 _arbitration_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)
// {
// cyg_uint32 isr_ret;
// // decode interrupt source and for each active source call the ISR
// if (source_A_active) {
// isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_SOURCE_A);
// #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
// if (isr_ret & CYG_ISR_HANDLED)
// #endif
// return isr_ret;
// }
// if (source_B_active) {
// isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_SOURCE_B);
// #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
// if (isr_ret & CYG_ISR_HANDLED)
// #endif
// return isr_ret;
// }
// ...
// return 0;
// }
//
// Remember to attach and enable the arbiter source:
// HAL_INTERRUPT_ATTACH(CYGNUM_HAL_INTERRUPT_ARBITER, &_arbitration_isr, 0, 0);
// HAL_INTERRUPT_SET_LEVEL(CYGNUM_HAL_INTERRUPT_ARBITER, 1);
// HAL_INTERRUPT_UNMASK(CYGNUM_HAL_INTERRUPT_ARBITER);


--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


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