![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: A 64 Bit clock (100nSec)can be assessed using the sys$gettime function call. However it seems to only update at a 1msec rate even thoght we have a 1GHz CPU. Is there any way to changed the update rate so it updates closer to the 100sSec rate? We are tr ying to make some high resolution timing measurement. The Answer is : The Alpha rscc and rpcc mechanisms will likely be of interest. Related topics include (2734), (3265), (3477), (4004) and others. If you wish to pursue this question, some background information on the general problem you are trying to solve -- in addition to what approach(es) you are trying to use to solve it -- would be quite helpful in providing an answer and/or potential alternatives. You cannot improve on the interrupts provided by the system hardware tick rate without some combination of device drivers and/or external interrupt source. The OpenVMS system generally "acquires" some specified number of hardware ticks before a software tick is generated -- the software clock ticks over every 10ms, while the hardware tick occurs at an architectural minimum rate of 1000 times per second. Various Alpha systems have a hardware tick rate of 1024 interrupts per second. As mentioned, the OpenVMS Alpha software clock rate is 10ms, meaning that a (large) number of hardware ticks transpire for each software tick. [Given that the OpenVMS Alpha software tick rate operates at 10ms intervals, you will have some difficulty with a 5ms AST interval.] The Accuracy Bonus is periodically added to the system time to "correct" a tick rate such as 1024 ticks per second for the rounding errors that are inherent when producing an integer representation of the number of 10ms intervals (ticks) that have transpired -- based on a hardware interrupt that occurs every 1/1024 seconds, the accuracy bonus accounts for an expected rounding error in this calculation of the current time in 10ms units, in other words. You will want to consider what level of accuracy is required for your particular application, and what sort of time-related processing is required. Triggering ASTs at periodic intervals may or may not be an appropriate approach, depending particularly on the frequency of interrupts required and on the time that is required to activate and service each AST. (Further, available techniques and options can and do vary between user-mode application code and kernel-mode driver code. Kernel-mode code can use recurring TQE entries, or various other approaches.) Two common approaches to timekeeping involve the Alpha RPCC and RSCC counters. An example of working with RSCC (beware SMP effects, as the system cycle counter is CPU-local) follows: $ cc/prefix=all show_rscc+sys$library:sys$lib_c/library $ link/sysexe show_rscc /* // This program demonstrates the usage of the System Cycle Counter */ #include <stdio.h> #include <signal.h> #include <hwrpbdef.h> #include <evx_opcodes.h> #include <c_asm.h> #define QUOTE(s) #s #define QUOTEVAL(s) QUOTE (s) #define RSCC() (asm ("call_pal " QUOTEVAL (EVX$PAL_RSCC))) extern HWRPB* exe$gpq_hwrpb; /* Hardware Restart Parameter Block */ int main( int argc, char** argv ) { __int64 scc1, scc2, micro; scc1 = RSCC(); sleep (3); scc2 = RSCC(); /* // The number of ticks per second is located in the Hardware // Restart Parameter Block (HWRPB). Convert it to microseconds. */ micro = (1000000 * (scc2 - scc1)) / exe$gpq_hwrpb->hwrpb$iq_cycle_count_freq; printf ("%Ld microseconds\n", micro); }
|