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); }