Hi Mr. Dörfler,

Thanks for your reply.

When the first task is reactivated, it leaves the contextswitch function.
> Therefore all the code around the context switch function handles the same
> task it was called for.

When I am debugging sp16.exe,after TA1 calls task_wake_after, it calls the
_Context_Switch() function, and I think (correct me if I am wrong) TA5
follows the execution after TA1 calls _Context_Switch.

I have attached the gdb trace with this mail. Let me know what you think.

Thanks,
Richi.


On Sun, Nov 1, 2020 at 12:35 AM Thomas Dörfler <
thomas.doerf...@embedded-brains.de> wrote:

> Richi,
>
> inside the contextswitch function, the current context ist suspended (so
> it is stuck/frozen die nside the context switch code) and execution
> switches to a different task. When the first task is reactivated, it leaves
> the contextswitch function. Therefore all the code around the context
> switch function handles the same task it was called for.
>
> --------------------------------------------
> embedded brains GmbH
> Thomas Doerfler
> Dornierstr. 4
> D-82178 Puchheim
> Germany
> email: thomas.doerf...@embedded-brains.de
> Phone: +49-89-18 94 741-12
> Fax:   +49-89-18 94 741-09
> PGP: Public key available on request.
>
> Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
>
>
>
> Am 31.10.2020 16:49 schrieb Richi Dubey <richidu...@gmail.com>:
>
> Hi,
>
> I want to learn more about how context switching works in RTEMS. I saw the
> following lines in theaddispatch.c:
>
>     _Thread_Save_fp( executing );
>     _Context_Switch( &executing->Registers, &heir->Registers );
>     _Thread_Restore_fp( executing );
>
> I do not understand how it works. Here, the executing process saves its
> context by calling _Thread_Save_fp( executing ), then if a different
> process resumes execution after the context switch, why does it get the
> context of previous process (executing)?
>
> Can someone help me learn more about this?
>
> Thanks,
> Richi.
>
>
>
Right now we are in Task_1:

197       puts( "TA1 - rtems_task_wake_after - yield processor" );
(gdb) 
0x00102590      197       puts( "TA1 - rtems_task_wake_after - yield processor" 
);
(gdb) 
0x00102594      197       puts( "TA1 - rtems_task_wake_after - yield processor" 
);
(gdb) 
198       status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
(gdb) si
0x0010259a      198       status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR 
);
(gdb) 
rtems_task_wake_after (ticks=46) at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/rtems/src/taskwakeafter.c:28
28      {
(gdb) ni
0x0010b27a      28      {
(gdb) 
0x0010b27c      28      {
(gdb) 
0x0010b27e      28      {
(gdb) 
36        cpu_self = _Thread_Dispatch_disable();
(gdb) 
0x0010b284      36        cpu_self = _Thread_Dispatch_disable();
(gdb) 
37          executing = _Per_CPU_Get_executing( cpu_self );
(gdb) 
0x0010b288      37          executing = _Per_CPU_Get_executing( cpu_self );
(gdb) 
0x0010b28c      37          executing = _Per_CPU_Get_executing( cpu_self );
(gdb) 
39          if ( ticks == 0 ) {
(gdb) 
0x0010b290      39          if ( ticks == 0 ) {
(gdb) 
0x0010b292      39          if ( ticks == 0 ) {
(gdb) 
40            _Thread_Yield( executing );
(gdb) ni
0x0010b296      40            _Thread_Yield( executing );
(gdb) 
0x0010b29a      40            _Thread_Yield( executing );
(gdb) 
46        _Thread_Dispatch_direct( cpu_self );
(gdb) si
0x0010b2ba      46        _Thread_Dispatch_direct( cpu_self );
(gdb) 
_Thread_Dispatch_direct (cpu_self=0x202180 <_RTEMS_tasks_Objects+1280>) at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/threaddispatch.c:351
351     {
(gdb) ni
0x00110662      351     {
(gdb) 
0x00110664      351     {
(gdb) 
0x00110666      351     {
(gdb) 
354       if ( cpu_self->thread_dispatch_disable_level != 1 ) {
(gdb) 
0x0011066a      354       if ( cpu_self->thread_dispatch_disable_level != 1 ) {
(gdb) 
354       if ( cpu_self->thread_dispatch_disable_level != 1 ) {
(gdb) 
0x0011066e      354       if ( cpu_self->thread_dispatch_disable_level != 1 ) {
(gdb) 
358       _ISR_Local_disable( level );
(gdb) 
0x0011067a      358       _ISR_Local_disable( level );
(gdb) 
359       _Thread_Do_dispatch( cpu_self, level );
(gdb) 
0x0011067e      359       _Thread_Do_dispatch( cpu_self, level );
(gdb) si
0x00110680      359       _Thread_Do_dispatch( cpu_self, level );
(gdb) 
_Thread_Do_dispatch (cpu_self=0x1, level=48) at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/threaddispatch.c:260
260     {
(gdb) ni
0x0011059a      260     {
(gdb) 
0x0011059c      260     {
(gdb) 
0x0011059e      260     {
(gdb) 
0x001105a0      260     {
(gdb) 
267         !_ISR_Is_enabled( level )
(gdb) 
0x001105a4      267         !_ISR_Is_enabled( level )
(gdb) 
0x001105a8      267         !_ISR_Is_enabled( level )
(gdb) ni
267         !_ISR_Is_enabled( level )
(gdb) 
0x001105ae      267         !_ISR_Is_enabled( level )
(gdb) 
266       if (
(gdb) 
0x001105b2      266       if (
(gdb) 
276       executing = cpu_self->executing;
(gdb) 
0x001105bc      276       executing = cpu_self->executing;
(gdb) p executing
$1 = (Thread_Control *) 0x600f01d3
(gdb) ni
0x001105be      276       executing = cpu_self->executing;
(gdb) 
281         level = _Thread_Preemption_intervention( executing, cpu_self, level 
);
(gdb) p executing
$2 = (Thread_Control *) 0x202180 <_RTEMS_tasks_Objects+1280>
(gdb) ni
0x001105c2      281         level = _Thread_Preemption_intervention( executing, 
cpu_self, level );
(gdb) 
0x001105c4      281         level = _Thread_Preemption_intervention( executing, 
cpu_self, level );
(gdb) 
0x001105c6      281         level = _Thread_Preemption_intervention( executing, 
cpu_self, level );
(gdb) 
0x001105ca      281         level = _Thread_Preemption_intervention( executing, 
cpu_self, level );
(gdb) 
282         heir = _Thread_Get_heir_and_make_it_executing( cpu_self );
(gdb) 
0x001105ce      282         heir = _Thread_Get_heir_and_make_it_executing( 
cpu_self );
(gdb) 
0x001105d2      282         heir = _Thread_Get_heir_and_make_it_executing( 
cpu_self );
(gdb) 
289         if ( heir == executing )
(gdb) 
0x001105d6      289         if ( heir == executing )
(gdb) 
0x001105d8      289         if ( heir == executing )
(gdb) 
0x001105da      289         if ( heir == executing )
(gdb) 
296         if ( heir->budget_algorithm == 
THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
(gdb) 
0x001105de      296         if ( heir->budget_algorithm == 
THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
(gdb) 
296         if ( heir->budget_algorithm == 
THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
(gdb) 
0x001105e4      296         if ( heir->budget_algorithm == 
THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
(gdb) 
299         _ISR_Local_enable( level );
(gdb) 
0x001105f8      299         _ISR_Local_enable( level );
(gdb) 
304         _Thread_Save_fp( executing );
(gdb) 
0x001105fe      304         _Thread_Save_fp( executing );
(gdb) 
305         _Context_Switch( &executing->Registers, &heir->Registers );
(gdb) si
0x00110604      305         _Context_Switch( &executing->Registers, 
&heir->Registers );
(gdb) 
0x00110608      305         _Context_Switch( &executing->Registers, 
&heir->Registers );
(gdb) 
0x0011060a      305         _Context_Switch( &executing->Registers, 
&heir->Registers );
(gdb) 
0x0011060e      305         _Context_Switch( &executing->Registers, 
&heir->Registers );
(gdb) 
0x00110610      305         _Context_Switch( &executing->Registers, 
&heir->Registers );
(gdb) 
0x00110612      305         _Context_Switch( &executing->Registers, 
&heir->Registers );
(gdb) 
_CPU_Context_switch () at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/cpu/arm/cpu_asm.S:56
56      DEFINE_FUNCTION_ARM(_CPU_Context_switch)
(gdb) ni
_CPU_Context_switch_arm () at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/cpu/arm/cpu_asm.S:58
58              GET_SELF_CPU_CONTROL    r2
(gdb) 
59              ldr     r3, [r2, #PER_CPU_ISR_DISPATCH_DISABLE]
(gdb) 
60              stm     r0, {r4, r5, r6, r7, r8, r9, r10, r11, r13, r14}
(gdb) 
63              add     r5, r0, #ARM_CONTEXT_CONTROL_D8_OFFSET
(gdb) 
64              vstm    r5, {d8-d15}
(gdb) 
67              str     r3, [r0, #ARM_CONTEXT_CONTROL_ISR_DISPATCH_DISABLE]
(gdb) 
75              dmb
(gdb) 
76              add     sp, r2, #(PER_CPU_INTERRUPT_FRAME_AREA + 
CPU_INTERRUPT_FRAME_SIZE)
(gdb) 
_CPU_Context_switch_arm () at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/cpu/arm/cpu_asm.S:77
77              mov     r3, #0
(gdb) 
78              strb    r3, [r0, #ARM_CONTEXT_CONTROL_IS_EXECUTING_OFFSET]
(gdb) 
83              add     r3, r1, #ARM_CONTEXT_CONTROL_IS_EXECUTING_OFFSET
(gdb) 
84              ldrexb  r4, [r3]
(gdb) 
85              cmp     r4, #0
(gdb) 
86              bne     .L_get_potential_new_heir
(gdb) 
89              mov     r4, #1
(gdb) 
90              strexb  r5, r4, [r3]
(gdb) 
91              cmp     r5, #0
(gdb) 
92              bne     .L_get_potential_new_heir
(gdb) 
93              dmb
(gdb) 
103             ldr     r3, [r1, #ARM_CONTEXT_CONTROL_THREAD_ID_OFFSET]
(gdb) 
106             ldr     r4, [r1, #ARM_CONTEXT_CONTROL_ISR_DISPATCH_DISABLE]
(gdb) 
109             add     r5, r1, #ARM_CONTEXT_CONTROL_D8_OFFSET
(gdb) 
110             vldm    r5, {d8-d15}
(gdb) 
114             mcr     p15, 0, r3, c13, c0, 3
(gdb) 
117             str     r4, [r2, #PER_CPU_ISR_DISPATCH_DISABLE]
(gdb) 
121             ldm     r1, {r4, r5, r6, r7, r8, r9, r10, r11, r13, pc}
(gdb) 
_Thread_Do_dispatch (cpu_self=0x200580 <_Per_CPU_Information>, 
level=1610678611) at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/threaddispatch.c:306
306         _Thread_Restore_fp( executing );
(gdb) 
0x00110618      306         _Thread_Restore_fp( executing );
(gdb) 
308         _User_extensions_Thread_switch( NULL, executing );
(gdb) 
0x0011061e      308         _User_extensions_Thread_switch( NULL, executing );
(gdb) 
0x00110620      308         _User_extensions_Thread_switch( NULL, executing );
(gdb) 
316         cpu_self = _Per_CPU_Get();
(gdb) 
0x00110628      316         cpu_self = _Per_CPU_Get();
(gdb) 
318         _ISR_Local_disable( level );
(gdb) 
0x0011062e      318         _ISR_Local_disable( level );
(gdb) 
319       } while ( cpu_self->dispatch_necessary );
(gdb) 
0x00110632      319       } while ( cpu_self->dispatch_necessary );
(gdb) 
0x00110634      319       } while ( cpu_self->dispatch_necessary );
(gdb) 
319       } while ( cpu_self->dispatch_necessary );
(gdb) 
0x00110638      319       } while ( cpu_self->dispatch_necessary );
(gdb) 
321     post_switch:
(gdb) 
323       cpu_self->thread_dispatch_disable_level = 0;
(gdb) p cpu_self->executing;
Invalid character ';' in expression.
(gdb) p cpu_self->executing
$3 = (struct _Thread_Control *) 0x202680 <_RTEMS_tasks_Objects+2560>
(gdb) ni
0x00110640      323       cpu_self->thread_dispatch_disable_level = 0;
(gdb) 
0x00110642      323       cpu_self->thread_dispatch_disable_level = 0;
(gdb) 
324       _Profiling_Thread_dispatch_enable( cpu_self, 0 );
(gdb) 
0x00110646      324       _Profiling_Thread_dispatch_enable( cpu_self, 0 );
(gdb) 
0x00110648      324       _Profiling_Thread_dispatch_enable( cpu_self, 0 );
(gdb) 
326       _ISR_Local_enable( level );
(gdb) 
0x0011064e      326       _ISR_Local_enable( level );
(gdb) 
328       _Thread_Run_post_switch_actions( executing );
(gdb) ni
0x00110654      328       _Thread_Run_post_switch_actions( executing );
(gdb) 
329     }
(gdb) 
0x0011065a      329     }
(gdb) 
0x0011065c      329     }
(gdb) 
0x0011065e      329     }
(gdb) 
_Thread_Dispatch_direct (cpu_self=0x200580 <_Per_CPU_Information>) at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/threaddispatch.c:360
360     }
(gdb) 
0x00110686      360     }
(gdb) 
0x00110688      360     }
(gdb) 
0x0011068a      360     }
(gdb) 
_Thread_queue_Enqueue (queue=0x200888 <_Region_Objects+16>, operations=0x123204 
<_Thread_queue_Operations_FIFO>, the_thread=0x202680 
<_RTEMS_tasks_Objects+2560>, queue_context=0x20fc38) at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/threadqenqueue.c:453
453     }
(gdb) 
0x001145ec      453     }
(gdb) 
0x001145ee      453     }
(gdb) 
rtems_region_get_segment (id=838926337, size=3072, option_set=0, timeout=0, 
segment=0x20fd14) at 
/home/richi/quick-start/src/rtems/c/src/../../cpukit/rtems/src/regiongetsegment.c:113
113           return _Status_Get_after_wait( executing );
(gdb) 
0x0010a13c      113           return _Status_Get_after_wait( executing );
(gdb) 
0x0010a140      113           return _Status_Get_after_wait( executing );
(gdb) 
0x0010a142      113           return _Status_Get_after_wait( executing );
(gdb) 
119     }
(gdb) 
0x0010a152      119     }
(gdb) 
0x0010a154      119     }
(gdb) 
0x0010a156      119     }
(gdb) 
0x00103c82 in Task5 (argument=0) at 
/home/richi/quick-start/src/rtems/c/src/../../testsuites/sptests/sp16/task5.c:53
53        status = rtems_region_get_segment(
(gdb) 
60        puts_nocr( "TA5 - got segment from region 1 - " );

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to