<div dir="ltr">Okay, I'm gonna do that. Thanks for the help.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 8, 2020 at 9:47 PM Gedare Bloom <<a href="mailto:gedare@rtems.org">gedare@rtems.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Thu, Oct 8, 2020 at 9:38 AM Richi Dubey <<a href="mailto:richidubey@gmail.com" target="_blank">richidubey@gmail.com</a>> wrote:<br>
><br>
> Hi,<br>
><br>
> I have been trying to debug sp16 for the last few days. I am using the new Strong APA scheduler we worked on during this GSoC. The scheduler fails only for the following tests:<br>
><br>
>  sp02.exe<br>
>  sp16.exe<br>
>  sp30.exe<br>
>  sp31.exe<br>
>  sp37.exe<br>
>  sp42.exe<br>
>  spfatal29.exe<br>
>  tm24.exe<br>
><br>
> On executing sp16.exe, I get the following output:<br>
><br>
> *** BEGIN OF TEST SP 16 ***<br>
> *** TEST VERSION: 5.0.0.61ccb9c05dcd695114541960aa6bfc1315f30514-modified<br>
> *** TEST STATE: EXPECTED_PASS<br>
> *** TEST BUILD: RTEMS_NETWORKING RTEMS_POSIX_API RTEMS_SMP<br>
> *** TEST TOOLS: 7.5.0 20191114 (RTEMS 5, RSB 5 (0b7e87143b76), Newlib fbaa096)<br>
> TA1 - rtems_region_ident - rnid => 32010001<br>
> TA1 - rtems_region_get_segment - wait on 1000 byte segment from region 2<br>
> TA1 - got segment from region 2 - 0x00000040<br>
> TA1 - rtems_region_get_segment - wait on 3K segment from region 3<br>
> TA1 - got segment from region 3 - 0x00000080<br>
> TA1 - rtems_region_get_segment - get 3080 byte segment from region 1 - NO_WAIT<br>
> TA1 - got segment from region 1 - 0x00000040<br>
> TA1 - rtems_task_wake_after - yield processor<br>
> TA2 - rtems_region_get_segment - wait on 2K segment from region 1<br>
> TA1 - rtems_region_return_segment - return segment to region 1 - 0x00000040<br>
> TA1 - rtems_region_get_segment - wait 10 seconds for 3K segment from region 1<br>
> TA2 - got segment from region 1 - 0x00000040<br>
> TA2 - rtems_region_return_segment - return segment to region 1 - 0x00000040<br>
> TA2 - rtems_task_set_priority - make self highest priority task<br>
> TA2 - rtems_region_get_segment - wait on 3750 byte segment<br>
> TA1 - got segment from region 1 - 0x00000040<br>
> TA1 - rtems_region_return_segment - return segment to region 2 - 0x00000040<br>
> TA2 - got segment from region 2 - 0x00000040<br>
> TA2 - rtems_region_return_segment - return segment to region 2 - 0x00000040<br>
> TA2 - rtems_task_exit<br>
> TA1 - rtems_task_wake_after - yield processor<br>
> TA3 - rtems_region_get_segment - wait on 3750 byte segment from region 2<br>
> TA3 - got segment from region 2 - 0x00000040<br>
> TA3 - rtems_region_get_segment - wait on 2K segment from region 3<br>
> TA1 - rtems_task_delete - delete TA3<br>
> TA1 - rtems_task_wake_after - yield processor<br>
> TA4 - rtems_region_get_segment - wait on 1.5K segment from region 1<br>
> TA5 - rtems_region_get_segment - wait on 1.5K segment from region 1<br>
> TA1 - rtems_region_return_segment - return segment to region 1 - 0x00000040<br>
> TA1 - rtems_task_wake_after - yield processor<br>
> TA4 - got and returned 0x00000040<br>
> TA5 - got and returned 0x000006c0<br>
> TA1 - rtems_region_get_segment - wait 10 seconds for 3K segment from region 1<br>
> TA1 - got segment from region 1 - 0x00000040<br>
> TA1 - rtems_task_wake_after - yield processor<br>
> TA4 - rtems_region_get_segment - wait on 3K segment from region 1<br>
> TA5 - rtems_region_get_segment - wait on 3K segment from region 1<br>
> TA1 - rtems_task_delete - delete TA4<br>
> TA1 - rtems_region_return_segment - return segment to region 1 - 0x00000040<br>
> TA1 - rtems_task_wake_after - yield processor<br>
> TA5 - got segment from region 1 - 0x00000040<br>
> TA5 - rtems_region_return_segment - return segment to region 1 - 0x00000040<br>
> TA5 - rtems_task_exit<br>
><br>
> and it doesn't progress further from here. It gets stuck in some kind of loop. While debugging with gdb, I realized the loop is:<br>
><br>
> Clock_isr (arg=0x0) at /home/richi/quick-start/src/rtems/bsps/arm/include/../../shared/dev/clock/clockimpl.h:155<br>
> 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x001042fa 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x001042fc 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x001042fe 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
><br>
> 0x00104302 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104304 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104306 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x0010430a 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 154        while (<br>
> (gdb)<br>
> 0x0010430e 154        while (<br>
> (gdb)<br>
> 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104314 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104316 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104318 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x0010431c 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x0010431e 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104322 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104324 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042d2 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042d4 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042d8 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042dc 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 162            (*tc->tc_get_timecount)(tc),<br>
> (gdb)<br>
> 0x001042e2 162            (*tc->tc_get_timecount)(tc),<br>
> (gdb)<br>
> 160          _Timecounter_Tick_simple(<br>
> (gdb)<br>
> 0x001042e6 160          _Timecounter_Tick_simple(<br>
> (gdb)<br>
> 0x001042e8 160          _Timecounter_Tick_simple(<br>
> (gdb)<br>
> 0x001042ea 160          _Timecounter_Tick_simple(<br>
> (gdb)<br>
> 0x001042ee 160          _Timecounter_Tick_simple(<br>
> (gdb)<br>
> 0x001042f0 160          _Timecounter_Tick_simple(<br>
> (gdb)<br>
> 0x001042f2 160          _Timecounter_Tick_simple(<br>
> (gdb)<br>
><br>
> 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
><br>
> 0x001042fa 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x001042fc 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x001042fe 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
><br>
> 0x00104302 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104304 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104306 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x0010430a 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 154        while (<br>
> (gdb)<br>
> 0x0010430e 154        while (<br>
> (gdb)<br>
> 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104314 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104316 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104318 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x0010431c 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x0010431e 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104322 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 0x00104324 155          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle<br>
> (gdb)<br>
> 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042d2 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042d4 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042d8 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
> 0x001042dc 159          _Timecounter_Acquire(&lock_context);<br>
> (gdb)<br>
><br>
> 162            (*tc->tc_get_timecount)(tc),<br>
> (gdb)<br>
> 0x001042e2 162            (*tc->tc_get_timecount)(tc),<br>
><br>
><br>
> and so on...<br>
><br>
> I cannot figure out what is wrong. Like Dr. Sherill suggested in a different .exe debug earlier, I set breakpoints and checked values of variables passed to the function and it all looks okay. I am quite sure this is because of the scheduler.<br>
><br>
> How do I progress further? Please let me know.<br>
><br>
<br>
The loop is spinning with an idle thread only, advancing the time<br>
counters still. The last message from TA1 is a yield. You need to dig<br>
into where TA1 got lost or why it doesn't get back the processor when<br>
TA5 exits.<br>
<br>
> Thanks,<br>
> Richi.<br>
><br>
><br>
> _______________________________________________<br>
> devel mailing list<br>
> <a href="mailto:devel@rtems.org" target="_blank">devel@rtems.org</a><br>
> <a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/mailman/listinfo/devel</a><br>
</blockquote></div>