Trace interrupts with the capture engine
Daniel Cederman
cederman at gaisler.com
Wed Jan 7 14:49:22 UTC 2015
Hello,
I am looking into adding support to the capture engine to trace
interrupts. One possible way, which seems generic and would not require
any changes to the BSPs, is to replace the ISR for a specific interrupt
with a wrapper that adds a record to the capture log before and after it
calls the original ISR. I have attached some code below to show how it
could be done. The wrapper could be installed/uninstalled using
rtems_interrupt_catch(). Would this be an acceptable solution or can you
see any immediate problems with this approach?
rtems_isr_entry original_vector_table[CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER];
static void record_interrupt(rtems_vector_number vector)
{
void* rec;
Thread_Control* tcb = _Thread_Get_executing();
if (!rtems_capture_task_recorded (tcb))
rtems_capture_record_task (tcb);
rtems_capture_begin_add_record(tcb, RTEMS_CAPTURE_INTERRUPT_ENTER,
sizeof(rtems_capture_interrupt_record_t), &rec);
rtems_capture_append_to_record(rec, &vector,
sizeof(rtems_vector_number));
rtems_capture_end_add_record(rec);
original_vector_table[vector](vector);
rtems_capture_begin_add_record(tcb, RTEMS_CAPTURE_INTERRUPT_EXIT,
sizeof(rtems_capture_interrupt_record_t), &rec);
rtems_capture_append_to_record(rec, &vector,
sizeof(rtems_vector_number));
rtems_capture_end_add_record(rec);
}
void capture_interrupt(rtems_vector_number vector)
{
rtems_interrupt_catch(record_interrupt, vector,
&original_vector_table[vector]);
}
--
Daniel Cederman
Software Engineer
Aeroflex Gaisler AB
Aeroflex Microelectronic Solutions – HiRel
Kungsgatan 12
SE-411 19 Gothenburg, Sweden
cederman at gaisler.com
www.Aeroflex.com/Gaisler
More information about the devel
mailing list