On 22/11/17 05:41, gro...@chichak.ca wrote:
Here is the situation, I have my ADCs set up to deliver results using
DMA 200 times per second using two interrupt routines. One routine is
called when the ADC buffer is half full, the other when the ADC buffer
is full. The interrupt routines execute a rtems_event_send call that
is picked up in the task code using rtems_event_receive.
If I don’t call rtems_event_receive (wth a timeout of 100 ticks) the
code runs for hours. With the rtems_event_send call, it fails after
125 seconds.
The failure is not something that I have seen before:
#0 _Terminate (the_source=the_source@entry=INTERNAL_ERROR_CORE,
the_error=the_error@entry=31) at
/Users/andreichichak/development/rtems/kernel/rtems/c/src/../../cpukit/score/src/interr.c:37
#1 0x0800bf6e in _Internal_error
(core_error=core_error@entry=INTERNAL_ERROR_BAD_THREAD_DISPATCH_ENVIRONMENT)
at
/Users/andreichichak/development/rtems/kernel/rtems/c/src/../../cpukit/score/src/interr.c:52
#2 0x0800dd38 in _Thread_Do_dispatch (cpu_self=<optimized out>,
level=<optimized out>) at
/Users/andreichichak/development/rtems/kernel/rtems/c/src/../../cpukit/score/src/threaddispatch.c:186
#3 0x0800f924 in _ARMV7M_Thread_dispatch () at
/Users/andreichichak/development/rtems/kernel/rtems/c/src/../../cpukit/score/cpu/arm/armv7m-isr-dispatch.c:32
In _Thread_Do_dispatch, it looks like an maybe an ISR is firing when
it is disabled (?) and then _Internal_error is being called.
*void* *_Thread_Do_dispatch*( Per_CPU_Control *cpu_self, ISR_Level level )
{
Thread_Control *executing;
_Assert( cpu_self->thread_dispatch_disable_level == 1 );
*#if* defined(RTEMS_SCORE_ROBUST_THREAD_DISPATCH)
*if* (
!_ISR_Is_enabled( level )
*#if* defined(RTEMS_SMP)
&& rtems_configuration_is_smp_enabled()
*#endif*
) {
_Internal_error( INTERNAL_ERROR_BAD_THREAD_DISPATCH_ENVIRONMENT );
}
*#endif*
*
*
*
*
*Does anybody have any idea where I should look to figure this out?*
We fixed one serious issue in the ARMv7-M interrupt support this year:
http://devel.rtems.org/ticket/3060
This was quite hard to debug. We used a μTrace from Lauterbach
(http://www.lauterbach.com/flyer_microtrace_web.pdf).
I have absolutely no idea how you can end up in
_ARMV7M_Thread_dispatch() with an unexpected interrupt level. This
function is called as a result of an interrupt return:
void _ARMV7M_Pendable_service_call( void )
{
Per_CPU_Control *cpu_self = _Per_CPU_Get();
/*
* We must check here if a thread dispatch is allowed. Right after a
* "msr basepri_max, %[basepri]" instruction an interrupt service may
still
* take place. However, pendable service calls that are activated during
* this interrupt service may be delayed until interrupts are enable
again.
*/
if (
( cpu_self->isr_nest_level |
cpu_self->thread_dispatch_disable_level ) == 0
) {
ARMV7M_Exception_frame *ef;
cpu_self->isr_nest_level = 1;
_ARMV7M_SCB->icsr = ARMV7M_SCB_ICSR_PENDSVCLR;
_ARMV7M_Trigger_lazy_floating_point_context_save();
ef = (ARMV7M_Exception_frame *) _ARMV7M_Get_PSP();
--ef;
_ARMV7M_Set_PSP( (uint32_t) ef );
/*
* According to "ARMv7-M Architecture Reference Manual" section B1.5.6
* "Exception entry behavior" the return address is half-word aligned.
*/
ef->register_pc = (void *)
((uintptr_t) _ARMV7M_Thread_dispatch & ~((uintptr_t) 1));
ef->register_xpsr = 0x01000000U;
}
}
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.hu...@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
users mailing list
users@rtems.org
http://lists.rtems.org/mailman/listinfo/users