From: singo on 4 Dec 2009 06:09 Dear Ada community, I have recently become very interested of Ada 2005, and it's real-time annex. However, as a new user of Ada I face some problems with the software. I cannot get the package Ada.Execution_Time to work with gnat, although the gnat documentation says that the real-time annex is fully supported... I use the gnat version 4.4 on a Ubuntu 9.10 distribution. The typical error message I get is gcc -c executiontime.adb Execution_Time is not supported in this configuration compilation abandoned How can I configure gnat to support the Ada.Execution_Time package? Hopefully somebody can help me! Thanks in advance! Ingo Below follows an example program that generates the error messge. with Ada.Text_IO; use Ada.Text_IO; with Ada.Real_Time; use Ada.Real_Time; with Ada.Execution_Time; procedure ExecutionTime is task T; task body T is Start : CPU_Time; Interval : Time_Span := Milliseconds(100); begin Start := Ada.Execution_Time.Clock; loop Put_Line(Duration'Image(Ada.Execution_Time.Clock - Start)); delay To_Duration(Interval); end loop; end T; begin null; end ExecutionTime;
From: Dmitry A. Kazakov on 4 Dec 2009 06:26 On Fri, 4 Dec 2009 03:09:35 -0800 (PST), singo wrote: > I have recently become very interested of Ada 2005, and it's real-time > annex. However, as a new user of Ada I face some problems with the > software. > > I cannot get the package Ada.Execution_Time to work with gnat, > although the gnat documentation says that the real-time annex is fully > supported... I use the gnat version 4.4 on a Ubuntu 9.10 distribution. > > The typical error message I get is > > gcc -c executiontime.adb > Execution_Time is not supported in this configuration > compilation abandoned > > How can I configure gnat to support the Ada.Execution_Time package? > > Hopefully somebody can help me! > > Thanks in advance! > > Ingo > > Below follows an example program that generates the error messge. > > with Ada.Text_IO; use Ada.Text_IO; > with Ada.Real_Time; use Ada.Real_Time; > with Ada.Execution_Time; > > procedure ExecutionTime is > task T; > > task body T is > Start : CPU_Time; > Interval : Time_Span := Milliseconds(100); > begin > Start := Ada.Execution_Time.Clock; > loop > Put_Line(Duration'Image(Ada.Execution_Time.Clock - Start)); > delay To_Duration(Interval); > end loop; > end T; > begin > null; > end ExecutionTime; I cannot tell anything about Ubuntu, but the program you provided contains language errors. It also has the problem that "delay" is non busy in Ada, i.e. the program will count 0 CPU time for a very long time, at least under Windows, where the system services, which I presume, Ada.Execution_Time relies on, are broken. Anyway, here is the code which works to me: with Ada.Text_IO; use Ada.Text_IO; with Ada.Real_Time; use Ada.Real_Time; with Ada.Execution_Time; use Ada.Execution_Time; procedure ExecutionTime is task T; task body T is Start : CPU_Time := Clock; begin loop Put_Line (Duration'Image (To_Duration (Clock - Start))); for I in 1..40 loop Put ("."); -- This does something! end loop; end loop; end T; begin null; end ExecutionTime; Under Windows this shows rather poor performance, which again is not surprising, because as I said there is no way to implement Ada.Execution_Time under Windows. Maybe Linux counts CPU time better, I never investigated this issue. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de
From: Georg Bauhaus on 4 Dec 2009 07:10 singo schrieb: > I cannot get the package Ada.Execution_Time to work with gnat, > although the gnat documentation says that the real-time annex is fully > supported... I use the gnat version 4.4 on a Ubuntu 9.10 distribution. The reason are explained in the GNAT source files. The ones I have show a note, after the � box: ------------------------------------------------------------------------------ -- -- -- GNAT RUN-TIME COMPONENTS -- -- -- -- A D A . E X E C U T I O N _ T I M E -- -- -- -- S p e c -- -- -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. In accordance with the copyright of that document, you can freely -- -- copy and modify this specification, provided that if you redistribute a -- -- modified version, any changes that you have made are clearly indicated. -- -- -- ------------------------------------------------------------------------------ -- This unit is not implemented in typical GNAT implementations that lie on -- top of operating systems, because it is infeasible to implement in such -- environments. -- If a target environment provides appropriate support for this package -- then the Unimplemented_Unit pragma should be removed from this spec and -- an appropriate body provided. with Ada.Task_Identification; with Ada.Real_Time; package Ada.Execution_Time is pragma Preelaborate; pragma Unimplemented_Unit;
From: John B. Matthews on 4 Dec 2009 13:28 In article <5e5d6fb5-e719-4195-925c-d1286699393d(a)f16g2000yqm.googlegroups.com>, singo <sander.ingo(a)gmail.com> wrote: > I have recently become very interested of Ada 2005, and it's > real-time annex. However, as a new user of Ada I face some problems > with the software. > > I cannot get the package Ada.Execution_Time to work with gnat, > although the gnat documentation says that the real-time annex is > fully supported... I use the gnat version 4.4 on a Ubuntu 9.10 > distribution. > > The typical error message I get is > > gcc -c executiontime.adb > Execution_Time is not supported in this configuration > compilation abandoned Georg Bauhaus has helpfully referred you to comments in Ada.Execution_Time. > How can I configure gnat to support the Ada.Execution_Time package? I defer to Dmitry A. Kazakov about Windows, but this variation produces similar results on MacOS 10.5 & Ubuntu 9.10 using GNAT 4.3.4: <code> with Ada.Text_IO; use Ada.Text_IO; with Ada.Real_Time; use Ada.Real_Time; procedure ExecutionTime is task T; task body T is Start : Time := Clock; Interval : Time_Span := Milliseconds(100); begin loop Put_Line(Duration'Image(To_Duration(Clock - Start))); delay To_Duration(Interval); end loop; end T; begin null; end ExecutionTime; </code> <console> $ ./executiontime 0.000008000 0.100168000 0.200289000 0.300409000 0.400527000 0.500575000 .... </console> -- John B. Matthews trashgod at gmail dot com <http://sites.google.com/site/drjohnbmatthews>
From: Dmitry A. Kazakov on 4 Dec 2009 14:01 On Fri, 04 Dec 2009 13:28:24 -0500, John B. Matthews wrote: > In article > <5e5d6fb5-e719-4195-925c-d1286699393d(a)f16g2000yqm.googlegroups.com>, > singo <sander.ingo(a)gmail.com> wrote: > >> I have recently become very interested of Ada 2005, and it's >> real-time annex. However, as a new user of Ada I face some problems >> with the software. >> >> I cannot get the package Ada.Execution_Time to work with gnat, >> although the gnat documentation says that the real-time annex is >> fully supported... I use the gnat version 4.4 on a Ubuntu 9.10 >> distribution. >> >> The typical error message I get is >> >> gcc -c executiontime.adb >> Execution_Time is not supported in this configuration >> compilation abandoned > > Georg Bauhaus has helpfully referred you to comments in > Ada.Execution_Time. > >> How can I configure gnat to support the Ada.Execution_Time package? > > I defer to Dmitry A. Kazakov about Windows, but this variation produces > similar results on MacOS 10.5 & Ubuntu 9.10 using GNAT 4.3.4: > > <code> > with Ada.Text_IO; use Ada.Text_IO; > with Ada.Real_Time; use Ada.Real_Time; > > procedure ExecutionTime is > task T; > > task body T is > Start : Time := Clock; > Interval : Time_Span := Milliseconds(100); > begin > loop > Put_Line(Duration'Image(To_Duration(Clock - Start))); > delay To_Duration(Interval); > end loop; > end T; > begin > null; > end ExecutionTime; > </code> > > <console> > $ ./executiontime > 0.000008000 > 0.100168000 > 0.200289000 > 0.300409000 > 0.400527000 > 0.500575000 > ... > </console> Your code counts the wall clock time. On the contrary Ada.Execution_Time should do the task time, i.e. the time the task actually owned the processor or, maybe, the time the system did something on the task's behalf. This package heavily depends on the OS services at least when the tasks are mapped onto the OS scheduling items (like threads). As far as I know it is impossible to implement it reasonably under Windows, because the corresponding service (used by the Task Manager too) counts time quants instead of the time. This causes a massive systematic error if tasks are switched before they consume their quants. I.e. *always* when you do I/O or communicate to other tasks. The bottom line, under Windows Ada.Execution_Time can be used only for tasks that do lengthy computations interrupted by only by the scheduler, so that all counted quants were consumed and no time were spent in uncounted quants. I don't know, if or how, this works under Linux or Max OS. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de
|
Next
|
Last
Pages: 1 2 Prev: Mike Yoder Next: GNAT.Sockets, Create_Selector and error 10055 on Windows |