| Title: | DEC Ada |
| Notice: | Ada is no longer a trademark of the US Government |
| Moderator: | KMOOSE::CMCCUTCHEON |
| Created: | Mon Jan 27 1986 |
| Last Modified: | Fri Jun 06 1997 |
| Last Successful Update: | Fri Jun 06 1997 |
| Number of topics: | 3874 |
| Total number of notes: | 16668 |
We have a customer using ADA 3.3 on UNIX 4.0b they need
a real-time clock with a resolution of 1 microsecond.
They recompiled their kernel with MICRO_TIME and can
get this resolution using a simple C program (noted
below), but in ADA using the Calendar package they
can only get around 60 microseconds resolution. Any
ideas?
Pat CSC Atlanta
--------------------------
ADA program.
with Text_IO;
use Text_IO;
with Calendar;
use Calendar;
procedure Test is
package Dur_IO is new Fixed_IO(Standard.Duration);
count : NATURAL := 50;
count_arr : ARRAY (1..count) OF Calendar.Time;
begin
for idx in 1..count loop
count_arr(idx) := Calendar.Clock;
end loop;
for idx in 1..count loop
Put("Time: ");
Dur_IO.Put(Calendar.Seconds(count_arr(idx)),
Fore => 10,
Aft => 12);
New_Line;
end loop;
end Test;
----------------------
C program:
#include <sys/timers.h>
#define LOOPCNT 5
int dummy() {}
main ()
{
int i;
struct timespec dummyspec[LOOPCNT];
for (i=0; i < LOOPCNT; i++) {
dummyspec[i].tv_sec = dummyspec[i].tv_nsec = 0L;
}
printf("Starting ...\n");
for (i=0; i < LOOPCNT; i++) {
getclock(TIMEOFDAY, &dummyspec[i]);
}
printf("... done!\n");
for (i=0; i < LOOPCNT; i++) {
printf("%2d :-> %ld Sec %ld nS \n",
i, dummyspec[i].tv_sec, dummyspec[i].tv_nsec);
}
}
| T.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 3874.1 | the problem is fixed point types | FLOYD::YODER | It's 999,943 to 1 but it just might work | Mon Jun 02 1997 12:25 | 20 |
In fact, the Time type used in Calendar does have an accuracy of 1 microsecond if the kernel has been changed; Calendar uses the same data structures as the C routines internally, and calls the C runtimes using pragma Interface(C,...). The problem is that Duration'Small is about 64 microseconds, which means that any conversion to a Duration will destroy accuracy. This in turn is because DEC Ada only supports 32-bit fixed point types. However, you're no worse off in Ada than you are in C, which doesn't support longer fixed point types either. :-) You can yourself use pragma Interface(C, ...) to call the C runtimes. Just find CALENDAR.ADA in the sources for PAL (the Predefined Ada Library) and write something similar to the CLOCK function there. I'd suggest imitating the Ada.Real_Time package of Ada95, which was devised to meet the needs of real-time programmers; the customer could write the routines as they became needed. A crude alternative to this is to use, say, Unchecked_Conversion on items of type Calendar.Time to convert them to a datatype that exposes the internal details (the datatype can be lifted from CALENDAR.ADA). If anything is unclear about the above, I'll be happy to explain further. | |||||