rtems instrrupt


bsp_interrupt_server_trigger

rtems_status_code rtems_interrupt_server_handler_install(
  uint32_t server_index,
  rtems_vector_number vector,
  const char *info,
  rtems_option options,
  rtems_interrupt_handler handler,
  void *arg
)
{
  rtems_status_code sc;
  rtems_interrupt_server_control *s;

  s = bsp_interrupt_server_get_context(server_index, &sc);
  if (s == NULL) {
    return sc;
  }

  return bsp_interrupt_server_call_helper(
    s,
    vector,
    options,
    handler,
    arg,
    bsp_interrupt_server_install_helper
  );
static rtems_status_code bsp_interrupt_server_call_helper(
  rtems_interrupt_server_control *s,
  rtems_vector_number vector,
  rtems_option options,
  rtems_interrupt_handler handler,
  void *arg,
  void (*helper)(void *)
)
{
  bsp_interrupt_server_helper_data hd = {
    .server = s,
    .vector = vector,
    .options = options,
    .handler = handler,
    .arg = arg,
    .task = rtems_task_self()
  };
  rtems_interrupt_server_action a = {
    .handler = helper,
    .arg = &hd
  };
  rtems_interrupt_server_entry e = {
    .server = s,
    .vector = BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR,
    .actions = &a
  };

  bsp_interrupt_server_trigger(&e);
  rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); //发送消息

  return hd.sc;
}

                           
static void bsp_interrupt_server_trigger(void *arg)
{
  rtems_interrupt_lock_context lock_context;
  rtems_interrupt_server_entry *e = arg;
  rtems_interrupt_server_control *s = e->server;

  if (bsp_interrupt_is_valid_vector(e->vector)) {
    bsp_interrupt_vector_disable(e->vector);
  }

  rtems_interrupt_lock_acquire(&s->lock, &lock_context);

  if (rtems_chain_is_node_off_chain(&e->node)) {
    rtems_chain_append_unprotected(&s->entries, &e->node);
  } else {
    ++s->errors;
  }

  rtems_interrupt_lock_release(&s->lock, &lock_context);

  rtems_event_system_send(s->server, RTEMS_EVENT_SYSTEM_SERVER);
}

bsp_interrupt_server_install_helper

(gdb) c
Continuing.

Breakpoint 1, bsp_interrupt_server_install_helper (arg=0x4834c4)
    at ../../../bsps/shared/irq/irq-server.c:154
154     ../../../bsps/shared/irq/irq-server.c: No such file or directory.
(gdb) bt
#0  bsp_interrupt_server_install_helper (arg=0x4834c4)
    at ../../../bsps/shared/irq/irq-server.c:154
#1  0x001e9ff8 in bsp_interrupt_server_task (arg=4676060)
    at ../../../bsps/shared/irq/irq-server.c:363
#2  0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#3  0x001f945e in _Thread_Do_dispatch (cpu_self=out>, level=out>)
    at ../../../cpukit/score/src/threaddispatch.c:309
#4  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 
(gdb) bt
#0  _Event_Surrender (the_thread=0x445680 <_RTEMS_tasks_Objects>, 
    event_in=event_in@entry=2147483648, event=0x445874 <_RTEMS_tasks_Objects+500>, 
    wait_class=wait_class@entry=512, lock_context=lock_context@entry=0x4bbb5c)
    at ../../../cpukit/rtems/src/eventsurrender.c:80
#1  0x001f5472 in rtems_event_system_send (id=out>, 
    event_in=event_in@entry=2147483648) at ../../../cpukit/rtems/src/systemeventsend.c:54
#2  0x001e9eee in rtems_event_transient_send (id=out>)
    at ../../../cpukit/include/rtems/rtems/event.h:644
#3  bsp_interrupt_server_install_helper (arg=0x4834c4)
    at ../../../bsps/shared/irq/irq-server.c:229
#4  0x001e9ff8 in bsp_interrupt_server_task (arg=4676060)
    at ../../../bsps/shared/irq/irq-server.c:363
#5  0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#6  0x001f945e in _Thread_Do_dispatch (cpu_self=out>, level=out>)
    at ../../../cpukit/score/src/threaddispatch.c:309
#7  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 
Breakpoint 2, _Event_Surrender (the_thread=0x446a80 <_RTEMS_tasks_Objects+5120>, 
    event_in=1073741824, event=0x446c74 <_RTEMS_tasks_Objects+5620>, 
    wait_class=wait_class@entry=512, lock_context=lock_context@entry=0x4834b4)
    at ../../../cpukit/rtems/src/eventsurrender.c:80
80      ../../../cpukit/rtems/src/eventsurrender.c: No such file or directory.
(gdb) bt
#0  _Event_Surrender (the_thread=0x446a80 <_RTEMS_tasks_Objects+5120>, event_in=1073741824, 
    event=0x446c74 <_RTEMS_tasks_Objects+5620>, wait_class=wait_class@entry=512, 
    lock_context=lock_context@entry=0x4834b4) at ../../../cpukit/rtems/src/eventsurrender.c:80
#1  0x001f5472 in rtems_event_system_send (id=out>, event_in=out>)
    at ../../../cpukit/rtems/src/systemeventsend.c:54
#2  0x001e9f98 in bsp_interrupt_server_call_helper (
    s=0x4759dc , vector=vector@entry=79, 
    options=options@entry=0, handler=out>, arg=0x513568, 
    helper=0x1e9e6d )
    at ../../../bsps/shared/irq/irq-server.c:313
#3  0x001ea066 in rtems_interrupt_server_handler_install (server_index=server_index@entry=0, 
    vector=vector@entry=79, info=out>, options=options@entry=0, 
    handler=out>, handler@entry=0x17d22d , arg=out>, 
    arg@entry=0x513568) at ../../../bsps/shared/irq/irq-server.c:390
#4  0x0017bf60 in nexus_setup_intr (dev=out>, child=out>, res=0x513c48, 
    flags=out>, filt=0x0, intr=0x17d22d , arg=0x513568, 
    cookiep=0x513574) at ../../rtemsbsd/rtems/rtems-kernel-nexus.c:335
#5  0x00110102 in BUS_SETUP_INTR (_cookiep=0x513574, _arg=0x513568, 
    _intr=0x17d22d , _filter=0x0, _flags=514, _irq=0x513c48, 
    _child=0x50daa8, _dev=0x50d898) at ../../rtemsbsd/include/rtems/bsd/local/bus_if.h:553
#6  _bsd_bus_setup_intr (dev=dev@entry=0x50daa8, r=0x513c48, flags=flags@entry=514, 
    filter=filter@entry=0x0, handler=handler@entry=0x17d22d , 
--Type  for more, q to quit, c to continue without paging--
    arg=arg@entry=0x513568, cookiep=cookiep@entry=0x513574)
    at ../../freebsd/sys/kern/subr_bus.c:4799
#7  0x0017d2d0 in arasan_sdhci_attach (dev=0x50daa8)
    at ../../rtemsbsd/sys/dev/sdhci/arasan_sdhci.c:258
#8  0x00110358 in DEVICE_ATTACH (dev=0x50daa8)
    at ../../rtemsbsd/include/rtems/bsd/local/device_if.h:195
#9  _bsd_device_attach (dev=dev@entry=0x50daa8) at ../../freebsd/sys/kern/subr_bus.c:2998
#10 0x00110c88 in _bsd_device_probe_and_attach (dev=0x50daa8)
    at ../../freebsd/sys/kern/subr_bus.c:2953
#11 _bsd_bus_generic_new_pass (dev=0x50d898) at ../../freebsd/sys/kern/subr_bus.c:4187
#12 0x00110c6e in BUS_NEW_PASS (_dev=0x50d898)
    at ../../rtemsbsd/include/rtems/bsd/local/bus_if.h:1046
#13 _bsd_bus_generic_new_pass (dev=0x50b368) at ../../freebsd/sys/kern/subr_bus.c:4185
#14 0x0010f95c in BUS_NEW_PASS (_dev=0x50b368)
    at ../../rtemsbsd/include/rtems/bsd/local/bus_if.h:1046
#15 _bsd_bus_set_pass (pass=2147483647) at ../../freebsd/sys/kern/subr_bus.c:994
#16 0x00195ae4 in _bsd_mi_startup () at ../../freebsd/sys/kern/init_main.c:331
#17 0x0017b396 in rtems_bsd_initialize () at ../../rtemsbsd/rtems/rtems-kernel-init.c:235
#18 0x001047ca in Init (arg=out>)
    at ../../testsuite/include/rtems/bsd/test/default-network-init.h:239
#19 0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#20 0x001fa96a in _Thread_Start_multitasking ()
--Type  for more, q to quit, c to continue without paging--
    at ../../../cpukit/score/src/threadstartmultitasking.c:68
#21 0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 

install bsp_interrupt_server_trigger

static void bsp_interrupt_server_trigger(void *arg)
{
  rtems_interrupt_lock_context lock_context;
  rtems_interrupt_server_entry *e = arg;
  rtems_interrupt_server_control *s = e->server;

  if (bsp_interrupt_is_valid_vector(e->vector)) {
    bsp_interrupt_vector_disable(e->vector);
  }

  rtems_interrupt_lock_acquire(&s->lock, &lock_context);

  if (rtems_chain_is_node_off_chain(&e->node)) {
    rtems_chain_append_unprotected(&s->entries, &e->node);
  } else {
    ++s->errors;
  }

  rtems_interrupt_lock_release(&s->lock, &lock_context);

  rtems_event_system_send(s->server, RTEMS_EVENT_SYSTEM_SERVER);
}
(gdb) c
Continuing.

Breakpoint 1, bsp_interrupt_entry_install (entry=0x511328, options=0, vector=54)
    at ../../../bsps/shared/irq/irq-generic.c:218
218     ../../../bsps/shared/irq/irq-generic.c: No such file or directory.
(gdb) bt
#0  bsp_interrupt_entry_install (entry=0x511328, options=0, vector=54)
    at ../../../bsps/shared/irq/irq-generic.c:218
#1  rtems_interrupt_entry_install (vector=vector@entry=54, options=options@entry=0, 
    entry=entry@entry=0x511328) at ../../../bsps/shared/irq/irq-generic.c:280
#2  0x001e9d96 in rtems_interrupt_handler_install (vector=54, 
    info=info@entry=0x2410a8 "IRQS", options=0, 
    routine=routine@entry=0x1e9e25 , arg=arg@entry=0x511308)
    at ../../../bsps/shared/irq/irq-handler-install.c:107
#3  0x001e9f32 in bsp_interrupt_server_install_helper (arg=0x4834c4)
    at ../../../bsps/shared/irq/irq-server.c:180
#4  0x001e9ff8 in bsp_interrupt_server_task (arg=4676060)
    at ../../../bsps/shared/irq/irq-server.c:363
#5  0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#6  0x001f945e in _Thread_Do_dispatch (cpu_self=out>, level=out>)
    at ../../../cpukit/score/src/threaddispatch.c:309
#7  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) p *entry
$3 = {handler = 0x1e9e25 , arg = 0x511308, next = 0x0, 
  info = 0x2410a8 "IRQS"}
(gdb) c
Continuing.

Breakpoint 1, bsp_interrupt_entry_install (entry=0x513d38, options=0, vector=79)
    at ../../../bsps/shared/irq/irq-generic.c:218
218     in ../../../bsps/shared/irq/irq-generic.c
(gdb) p *entry
$4 = {handler = 0x1e9e25 , arg = 0x513d18, next = 0x0, 
  info = 0x2410a8 "IRQS"}
(gdb) bt
#0  bsp_interrupt_entry_install (entry=0x513d38, options=0, vector=79)
    at ../../../bsps/shared/irq/irq-generic.c:218
#1  rtems_interrupt_entry_install (vector=vector@entry=79, options=options@entry=0, 
    entry=entry@entry=0x513d38) at ../../../bsps/shared/irq/irq-generic.c:280
#2  0x001e9d96 in rtems_interrupt_handler_install (vector=79, 
    info=info@entry=0x2410a8 "IRQS", options=0, 
    routine=routine@entry=0x1e9e25 , arg=arg@entry=0x513d18)
    at ../../../bsps/shared/irq/irq-handler-install.c:107
#3  0x001e9f32 in bsp_interrupt_server_install_helper (arg=0x4834e4)
    at ../../../bsps/shared/irq/irq-server.c:180
#4  0x001e9ff8 in bsp_interrupt_server_task (arg=4676060)
    at ../../../bsps/shared/irq/irq-server.c:363
#5  0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#6  0x001f945e in _Thread_Do_dispatch (cpu_self=out>, level=out>)
    at ../../../cpukit/score/src/threaddispatch.c:309
#7  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 
(gdb) p *entry
$5 = {handler = 0x1e9e25 , arg = 0x513d18, next = 0x0, 
  info = 0x2410a8 "IRQS"}
(gdb) 

 触发一

(gdb) bt
#0  bsp_interrupt_server_trigger (arg=0x4834d0) at ../../../bsps/shared/irq/irq-server.c:82
#1  0x001e9f98 in bsp_interrupt_server_call_helper (
    s=0x4759dc , vector=vector@entry=56, 
    options=options@entry=0, handler=out>, arg=0x513df8, 
    helper=0x1e9e6d )
    at ../../../bsps/shared/irq/irq-server.c:313
#2  0x001ea066 in rtems_interrupt_server_handler_install (server_index=server_index@entry=0, 
    vector=vector@entry=56, info=out>, options=options@entry=0, 
    handler=out>, handler@entry=0x17d22d , arg=out>, 
    arg@entry=0x513df8) at ../../../bsps/shared/irq/irq-server.c:390
#3  0x0017bf60 in nexus_setup_intr (dev=out>, child=out>, res=0x5143c8, 
    flags=out>, filt=0x0, intr=0x17d22d , arg=0x513df8, 
    cookiep=0x513e04) at ../../rtemsbsd/rtems/rtems-kernel-nexus.c:335
#4  0x00110102 in BUS_SETUP_INTR (_cookiep=0x513e04, _arg=0x513df8, 
    _intr=0x17d22d , _filter=0x0, _flags=514, _irq=0x5143c8, 
    _child=0x50db48, _dev=0x50d898) at ../../rtemsbsd/include/rtems/bsd/local/bus_if.h:553
#5  _bsd_bus_setup_intr (dev=dev@entry=0x50db48, r=0x5143c8, flags=flags@entry=514, 
    filter=filter@entry=0x0, handler=handler@entry=0x17d22d , 
    arg=arg@entry=0x513df8, cookiep=cookiep@entry=0x513e04)
    at ../../freebsd/sys/kern/subr_bus.c:4799
#6  0x0017d2d0 in arasan_sdhci_attach (dev=0x50db48)
    at ../../rtemsbsd/sys/dev/sdhci/arasan_sdhci.c:258
--Type  for more, q to quit, c to continue without paging--
#7  0x00110358 in DEVICE_ATTACH (dev=0x50db48)
    at ../../rtemsbsd/include/rtems/bsd/local/device_if.h:195
#8  _bsd_device_attach (dev=dev@entry=0x50db48) at ../../freebsd/sys/kern/subr_bus.c:2998
#9  0x00110c88 in _bsd_device_probe_and_attach (dev=0x50db48)
    at ../../freebsd/sys/kern/subr_bus.c:2953
#10 _bsd_bus_generic_new_pass (dev=0x50d898) at ../../freebsd/sys/kern/subr_bus.c:4187
#11 0x00110c6e in BUS_NEW_PASS (_dev=0x50d898)
    at ../../rtemsbsd/include/rtems/bsd/local/bus_if.h:1046
#12 _bsd_bus_generic_new_pass (dev=0x50b368) at ../../freebsd/sys/kern/subr_bus.c:4185
#13 0x0010f95c in BUS_NEW_PASS (_dev=0x50b368)
    at ../../rtemsbsd/include/rtems/bsd/local/bus_if.h:1046
#14 _bsd_bus_set_pass (pass=2147483647) at ../../freebsd/sys/kern/subr_bus.c:994
#15 0x00195ae4 in _bsd_mi_startup () at ../../freebsd/sys/kern/init_main.c:331
#16 0x0017b396 in rtems_bsd_initialize () at ../../rtemsbsd/rtems/rtems-kernel-init.c:235
#17 0x001047ca in Init (arg=out>)
    at ../../testsuite/include/rtems/bsd/test/default-network-init.h:239
#18 0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#19 0x001fa96a in _Thread_Start_multitasking ()
    at ../../../cpukit/score/src/threadstartmultitasking.c:68
#20 0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 

触发二

(gdb) bt
#0  bsp_interrupt_server_trigger (arg=0x4140a8 <_Linker_set__Per_CPU_Data_epoch+40>)
    at ../../../bsps/shared/irq/irq-server.c:83
#1  rtems_interrupt_server_entry_submit (entry=0x4140a8 <_Linker_set__Per_CPU_Data_epoch+40>)
    at ../../../bsps/shared/irq/irq-server.c:797
#2  0x001fad8e in _Watchdog_Do_tickle (
    header=header@entry=0x475ef0 <_Per_CPU_Information+48>, 
    first=0x414088 <_Linker_set__Per_CPU_Data_epoch+8>, now=out>, 
    lock_context=lock_context@entry=0x47afa4 <_ISR_Stack_area_begin+2980>)
    at ../../../cpukit/score/src/watchdogtick.c:53
#3  0x001fadfa in _Watchdog_Tick (cpu=0x475ec0 <_Per_CPU_Information>)
    at ../../../cpukit/score/src/watchdogtick.c:88
#4  0x001f7ec6 in _Timecounter_Tick () at ../../../cpukit/score/src/kern_tc.c:2268
#5  0x001e9a1a in rtems_timecounter_tick () at ../../../cpukit/include/rtems/timecounter.h:88
#6  Clock_driver_timecounter_tick ()
    at ../../../bsps/arm/include/../../shared/dev/clock/clockimpl.h:99
#7  Clock_isr (arg=out>)
    at ../../../bsps/arm/include/../../shared/dev/clock/clockimpl.h:146
#8  0x001ea40a in bsp_interrupt_dispatch_entries (entry=0x47b4d8)
    at ../../../bsps/include/bsp/irq-generic.h:455
#9  bsp_interrupt_handler_dispatch_unchecked (vector=0)
    at ../../../bsps/include/bsp/irq-generic.h:482
#10 bsp_interrupt_handler_dispatch (vector=0) at ../../../bsps/include/bsp/irq-generic.h:509
--Type  for more, q to quit, c to continue without paging--
#11 arm_interrupt_handler_dispatch (vector=0)
    at ../../../bsps/arm/include/dev/irq/arm-gic-arch.h:50
#12 bsp_interrupt_dispatch () at ../../../bsps/shared/dev/irq/arm-gicv2.c:61
#13 0x001faf82 in _ARMV4_Exception_interrupt ()
    at ../../../cpukit/score/cpu/arm/arm_exc_interrupt.S:130
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

 

rtems_chain_append_unprotected

/**
 * @brief Append a node on the end of a chain (unprotected).
 *
 * This routine appends @a the_node onto the end of @a the_chain.
 *
 * NOTE: It does NOT disable interrupts to ensure the atomicity of the
 * append operation.
 */
RTEMS_INLINE_ROUTINE void rtems_chain_append_unprotected(
  rtems_chain_control *the_chain,
  rtems_chain_node    *the_node
)
{
  _Chain_Append_unprotected( the_chain, the_node );
}

 

void rtems_interrupt_server_entry_submit(
  rtems_interrupt_server_entry *entry
)
{
  bsp_interrupt_server_trigger(entry);
}
void _Watchdog_Do_tickle(
  Watchdog_Header  *header,
  Watchdog_Control *first,
  uint64_t          now,
#ifdef RTEMS_SMP
  ISR_lock_Control *lock,
#endif
  ISR_lock_Context *lock_context
)
{
  do {
    if ( first->expire <= now ) {
      Watchdog_Service_routine_entry routine;

      _Watchdog_Next_first( header, first );
      _RBTree_Extract( &header->Watchdogs, &first->Node.RBTree );
      _Watchdog_Set_state( first, WATCHDOG_INACTIVE );
      routine = first->routine;

      _ISR_lock_Release_and_ISR_enable( lock, lock_context );
      ( *routine )( first );
      _ISR_lock_ISR_disable_and_acquire( lock, lock_context );
    } else {
      break;
    }

 网卡

err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE |
                             INTR_EXCL, NULL, cgem_intr, sc, &sc->intrhand);

 

 bsp_interrupt_server_task

Breakpoint 1, cgem_recv (sc=0x50e500) at ../../freebsd/sys/dev/cadence/if_cgem.c:702
702             if_t ifp = sc->ifp;
(gdb) bt
#0  cgem_recv (sc=0x50e500) at ../../freebsd/sys/dev/cadence/if_cgem.c:702
#1  cgem_intr (arg=0x50e500) at ../../freebsd/sys/dev/cadence/if_cgem.c:1185
#2  0x001e9ff8 in bsp_interrupt_server_task (arg=4676060) at ../../../bsps/shared/irq/irq-server.c:363
#3  0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#4  0x001f945e in _Thread_Do_dispatch (cpu_self=out>, level=out>) at ../../../cpukit/score/src/threaddispatch.c:309
#5  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)

bsp_interrupt_server_create bsp_interrupt_server_task

(gdb) bt
#0  0x001ea096 in bsp_interrupt_server_create (s=out>, cpu_index=out>, 
    attributes=out>, modes=out>, stack_size=out>, 
    priority=out>) at ../../../bsps/shared/irq/irq-server.c:528
#1  rtems_interrupt_server_initialize (priority=priority@entry=96, stack_size=32768, 
    modes=modes@entry=0, attributes=attributes@entry=0, server_count=server_count@entry=0x0)
    at ../../../bsps/shared/irq/irq-server.c:603
#2  0x001aadfc in irqs_sysinit () at ../../rtemsbsd/rtems/rtems-kernel-irqs.c:54
#3  0x00195ae4 in _bsd_mi_startup () at ../../freebsd/sys/kern/init_main.c:331
#4  0x0017b396 in rtems_bsd_initialize () at ../../rtemsbsd/rtems/rtems-kernel-init.c:235
#5  0x001047ca in Init (arg=out>)
    at ../../testsuite/include/rtems/bsd/test/default-network-init.h:239
#6  0x001f95b4 in _Thread_Handler () at ../../../cpukit/score/src/threadhandler.c:145
#7  0x001fa96a in _Thread_Start_multitasking ()
    at ../../../cpukit/score/src/threadstartmultitasking.c:68
#8  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 

static void bsp_interrupt_server_task(rtems_task_argument arg)
{
  rtems_interrupt_server_control *s = (rtems_interrupt_server_control *) arg;

  while (true) {
    rtems_event_set events;
    rtems_interrupt_server_entry *e;

    rtems_event_system_receive(
      RTEMS_EVENT_SYSTEM_SERVER,
      RTEMS_EVENT_ALL | RTEMS_WAIT,
      RTEMS_NO_TIMEOUT,
      &events
    );

    while ((e = bsp_interrupt_server_get_entry(s)) != NULL) {
      rtems_interrupt_server_action *action = e->actions;
      rtems_vector_number vector = e->vector;
      do {
        rtems_interrupt_server_action *current = action;
        action = action->next;
        (*current->handler)(current->arg);
      } while (action != NULL);

      if (bsp_interrupt_is_valid_vector(vector)) {
        bsp_interrupt_vector_enable(vector);
      }
    }
  }
}
static rtems_interrupt_server_entry *bsp_interrupt_server_get_entry(
  rtems_interrupt_server_control *s
)
{
  rtems_interrupt_lock_context lock_context;
  rtems_interrupt_server_entry *e;

  rtems_interrupt_lock_acquire(&s->lock, &lock_context);

  if (!rtems_chain_is_empty(&s->entries)) {
    e = (rtems_interrupt_server_entry *)
      rtems_chain_get_first_unprotected(&s->entries);
    rtems_chain_set_off_chain(&e->node);
  } else {
    e = NULL;
  }

  rtems_interrupt_lock_release(&s->lock, &lock_context);

  return e;
}

总结

1、rtems_interrupt_server_entry  rtems_interrupt_server_action

static rtems_status_code bsp_interrupt_server_call_helper(
  rtems_interrupt_handler handler,
  void (*helper)(void *)
)
{
  bsp_interrupt_server_helper_data hd = {
    .server = s,
    .vector = vector,
    .options = options,
    .handler = handler, // interrutp handler
    .arg = arg,
    .task = rtems_task_self()
  };
  rtems_interrupt_server_action a = {
    .handler = helper, // bsp_interrupt_server_install_helper
    .arg = &hd
  };
  rtems_interrupt_server_entry e = {
    .server = s,
    .vector = BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR,
    .actions = &a
  };
   // e->actions->handler 等于bsp_interrupt_server_install_helper
bsp_interrupt_server_trigger(&e); return hd.sc; }

2、中断install

bsp_interrupt_server_install_helper

bsp_interrupt_server_helper_data *hd = arg;
rtems_status_code sc;
rtems_interrupt_server_entry *e;
rtems_interrupt_server_action *a;
rtems_option trigger_options;

static void bsp_interrupt_server_install_helper(void *arg)
{
  a->handler = hd->handler; // 中断处理函数
  a->arg = hd->arg;

  bsp_interrupt_lock();

  e = bsp_interrupt_server_query_entry(hd->vector, &trigger_options);
  if (e == NULL) {
    e = calloc(1, sizeof(*e));
    if (e != NULL) {
      e->server = hd->server;
      e->vector = hd->vector;
      e->actions = a;
     // 此时 e->actions->handler 等于interrrupt
      sc = rtems_interrupt_handler_install(
        hd->vector,
        "IRQS",
        hd->options & RTEMS_INTERRUPT_UNIQUE,
        bsp_interrupt_server_trigger,
        e //含有interrupt
      );
     
  rtems_event_transient_send(hd->task);
}

 2、中断路由

3、通过event通知中断线程