[En-Nut-Discussion] Cortex ix_xxx_interuptY code duplication
Uwe Bonnes
bon at elektron.ikp.physik.tu-darmstadt.de
Mon Jul 16 18:12:57 CEST 2012
Hello (Ole),
at present nearly each nut/arch/cm3/dev/xxx/ih_xxx_*.c file implements it's
own xxxIrqCtl(int cmd, void *param) function. The core of that function is
always the same, apart from a different xxxIrqEntry and xxx_IRQn
settings. Not a very maintainable situation.
E.g. for STM32 twi1, Ulrich relayed both TWI interupts to a common IrqCtl
function:
#ifdef NUT_PERFMON
static int TwoWireIrqCtl(IRQn_Type IRQn, void(*ifunc)(void*), IRQ_HANDLER *ih, int cmd, void *param);
#else
static int TwoWireIrqCtl(IRQn_Type IRQn, void(*ifunc)(void*), int cmd, void *param);
#endif
static int TwoWireIrqCtl_Ev(int cmd, void *param);
IRQ_HANDLER sig_TWI1_EV = {
#ifdef NUT_PERFMON
0, /* Interrupt counter, ir_count. */
#endif
NULL, /* Passed argument, ir_arg. */
NULL, /* Handler subroutine, ir_handler. */
TwoWireIrqCtl_Ev /* Interrupt control, ir_ctl. */
};
/*!
* \brief Two Wire Interface Event Interrupt Entry.
*/
static void TwoWireIrqEntry_Ev(void *arg)
{
#ifdef NUT_PERFMON
sig_TWI1_EV.ir_count++;
#endif
if (sig_TWI1_EV.ir_handler) {
(sig_TWI1_EV.ir_handler) (sig_TWI1_EV.ir_arg);
}
}
static int TwoWireIrqCtl_Ev(int cmd, void *param)
{
return TwoWireIrqCtl(I2C1_EV_IRQn, TwoWireIrqEntry_Ev, cmd, param);
}
#ifdef NUT_PERFMON
static int TwoWireIrqCtl(IRQn_Type IRQn, void(*ifunc)(void*), IRQ_HANDLER *ih, int cmd, void *param)
#else
static int TwoWireIrqCtl(IRQn_Type IRQn, void(*ifunc)(void*), int cmd, void *param)
#endif
{
...
Shouldn't we extend above TwoWireIrqCtl() to a IrqCtl() function in
e.g. arch/cm3/os, replacing all xxxIrqCtl() functtions.
I think the additional redirection in the case of the common IrqCtl()
doesn't matter. That way, much code duplication could be avoided. And
perhaps all ih_xxx_uartY.c file be concatenated into one ih_xxx_uart.c file,
with each uartx entry safegaurded by #if defined (UARTx_BASE)". Perhas even
one file for all IRQ_HANDLERs.
NUT_IRQCTL_GETMODE/NUT_IRQCTL_SETMODE might need a special consideration, as
Ulrich marked some interrupt handlers as NUT_IRQMODE_LEVEL versus the
default NUT_IRQMODE_EDGE everywhere in nxp and mostly in stm32. Perhaps we
need to extend IRQ_HANDLER structure for a entry of the Handler
mode, and relay the mode via IrqCtl() . However I have not seen any consumer of the
NUT_IRQCTL_GETMODE/NUT_IRQCTL_SETMODE function in our codebase yet. GPIO is a
consumer for sure, but for NXP Ole just implemented GPIO_SIGNAL redirection,
handling that case and I will probably reuse for STM.
Bye
--
Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
More information about the En-Nut-Discussion
mailing list