How to add the Idle task to Ada runtime

Jan Sommer soja-misc at aries.uberspace.de
Sat Aug 15 16:09:15 UTC 2015


Top Post:

Ok. I finally manage to build a toolchain with only small optimization enabled and learned how to read assembler.
I think I found the problem (or at least one of them) now.

In s-taprop.ad : 967ff 
procedure Create_Task
     (T          : Task_Id;
      Wrapper    : System.Address;
      Stack_Size : System.Parameters.Size_Type;
      Priority   : System.Any_Priority;
      Succeeded  : out Boolean)

This procedure is supposed to create the pthread which the ada runtime can then use for its task.
I am still new to assembler, but that's what I get from looking at it:

Dump of assembler code for function system__task_primitives__operations__create_task:
   0x00009ec4 <+0>:     push    {r4, r5, r6, r7, r8, lr}		/* create a copy of registers to restore later */
   0x00009ec8 <+4>:     sub     sp, sp, #56     ; 0x38		        /* reserver 56 bytes on the stack (for the pthread_attr_t)
   0x00009ecc <+8>:     mov     r5, r0						/* some initial reorderering .... */	
   0x00009ed0 <+12>:    mov     r7, r1
   0x00009ed4 <+16>:    mov     r4, r2
   0x00009ed8 <+20>:    mov     r8, r3
   0x00009edc <+24>:    bl      0x35fbc <getpagesize>
   0x00009ee0 <+28>:    mov     r6, r0
   0x00009ee4 <+32>:    mov     r0, sp					/* store address of stack pointer to r0 as the argument for pthread_attr_init */
   0x00009ee8 <+36>:    bl      0x3c1f0 <pthread_attr_init>	/* Call pthread_attr_init to initialize the  pthread_attr_t */

Dump of assembler code for function pthread_attr_init:
=> 0x0003c1f0 <+0>:     cmp     r0, #0								/* NULL-pointer check; memcpy 1st parameter: dest address */
   0x0003c1f4 <+4>:     beq     0x3c214 <pthread_attr_init+36>
   0x0003c1f8 <+8>:     push    {r3, lr}												
   0x0003c1fc <+12>:    ldr     r1, [pc, #24]   ; 0x3c21c <pthread_attr_init+44>	/* memcpy 2nd parameter: source address: pointer to default pthread_attr_t */
   0x0003c200 <+16>:    mov     r2, #76 ; 0x4c								/* !!!!! memcpy 3rd parameter SIZE == 76 BYTES */
   0x0003c204 <+20>:    bl      0x49b00 <memcpy>							/* !!!!! OVERWRITE STACK of calling function */
   0x0003c208 <+24>:    mov     r0, #0
   0x0003c20c <+28>:    pop     {r3, lr}
   0x0003c210 <+32>:    bx      lr
   0x0003c214 <+36>:    mov     r0, #22
   0x0003c218 <+40>:    bx      lr
   0x0003c21c <+44>:    andseq  r8, r0, r0, lsr #27
End of assembler dump.

If I take a look at the stack of create task after the call to pthread_attr_init:
 Saved registers:
  r4 at 0x13eff8, r5 at 0x13effc, r6 at 0x13f000, r7 at 0x13f004, r8 at 0x13f008, lr at 0x13f00c
0x13eff8:	0x00000001
0x13effc:	0x00000001
0x13f000:	0x00000000
0x13f004:	0x00000000
0x13f008:	0x00000000
0x13f00c:	0x0000ecc0

In these registers were, among others, the address pointers to the main task and the hello task which are continued to be used by the function which called Create_Task. It seems quite a lucky that the lr-register is the only one not overwritten.

Now is the question why the runtime only reserves memory for56 bytes and why it is 76 bytes large in rtems?
I made a quick grep of the header files, but couldn't find the typedef of pthread_attr_t. Where can I find it?

Best regards,

   Jan

Am Sonntag, 2. August 2015, 19:25:40 schrieb Jan Sommer:
> Am Samstag, 1. August 2015, 12:48:09 schrieb Joel Sherrill:
> > On 08/01/2015 12:39 PM, Jan Sommer wrote:
> > > I managed to get most of the Ada examples running for the raspberry pi.
> > > However, there seem to be no default idle task.
> > > If you have
> > >
> > > with Text_IO; use Text_IO;
> > >
> > > procedure Hello is
> > >
> > >     task Hello_Task;
> > >
> > >     task body Hello_Task is
> > >     begin
> > > 	delay 5.0;
> > >     end Hello_Task;
> > >
> > > begin
> > > 	[1]
> > > 	null;
> > > end Hello;
> > >
> > > The runtime will be terminated after the body of the procedure [1] is executed.
> > > I think the usual behaviour for Ada would be that instead an idle task is running while the Hello_Task waits.
> > > At least it works like this if I compile the file for my desktop-PC.
> > >
> [...]
> > None of that is going to help. This is Ada run-time specific. So it is
> > some behavior that needs to be accounted for.
> > 
> > Ada tasks are pthreads on both Linux and RTEMS. One simple thing
> > to do would be to check that the pthread attributes are the same on
> > the call to pthread_create. I would expect the run-time to be rigorous
> > in setting all attributes explicitly but if they don't, then we might be
> > missing the attribute that makes a thread joinable.
> > 
> 
> The thread creation seems to be basically the same on Linux and Rtems.
> The thread is created as detached. 
> 
> > Otherwise, we need to figure out where this is in the run-time and
> > see what is going on.
> >
> 
> After reading about the threading implementation of gnat here: http://www.iuma.ulpgc.es/users/jmiranda/gnat-rts/node18.htm#task_steps
> I looked at the "Complete Master" part. I could find a difference in runtime behaviour in the file  /opt/rtems-4.11-pi/lib/gcc/arm-rtems4.11/4.9.3/adainclude/s-tassta.adb
> From line 1704 - 1746 the master is supposed to count the number of active tasks and afterwards in the loop between l. 1755 - 1777 it is supposed to go to sleep (l. 1775) until the number of active tasks is 0.
> In Linux this works properly. In Rtems it exits the loop immediately ( exit when Self_ID.Common.Wait_Count = 0; ) and never goes to sleep.
> So it appears to me that counting the active tasks fails (i.e. it counts 0 ) somehow. Unfortunately I wasn't able to go deeper.
> Most of the temporary variables are optimized out (according to gdb/ddd). I compiled the toolchain with rsb with --targetcflags and targetcxxflags set to "-O0 -g", but still can't print many variables. Is there another trick to have all these variables accessible as well (performance is not an issue)?
> 
> > Asking for advice on gcc at gcc.gnu.org might be useful at this point.
> > Please cc' me if you do that.
> > > Could someone point me in the right direction?
> > >
> > > Cheers,
> > >
> > >     Jan
> > >
> > > _______________________________________________
> > > users mailing list
> > > users at rtems.org
> > > http://lists.rtems.org/mailman/listinfo/users
> > 
> > 
> > 
> 
> _______________________________________________
> users mailing list
> users at rtems.org
> http://lists.rtems.org/mailman/listinfo/users




More information about the users mailing list