What time is it?
There are several functions that you can use to determine the current time, for use in timestamps or for calculating execution times:
- This is the fastest generic time function we have. It's fast because it just reads from the qtime entries from the system page (see SYSPAGE_ENTRY() ). You can find the code for time() on our Foundry27 website, http://community.qnx.com/ , and you can use this code directly in your program to save a function call.
- The kernel call for time functions. Using CLOCK_MONOTONIC is typically better than using CLOCK_REALTIME because the monotonic clock is always increasing, so you don't have to worry that someone might be changing the clock. Changing the realtime clock just modifies SYSPAGE_ENTRY(qtime)->nsec_tod_adjust to be the difference between the monotonic and realtime clocks.
- A POSIX cover function for ClockTime(). You can also find its source code on Foundry27.
All the above methods have an accuracy based on the system timer tick. If you need more accuracy, you can use ClockCycles() . This function is implemented differently for each processor, so there are tradeoffs. The implementation tries to be as quick as possible, so it tries to use a CPU register if possible. Because of this, to get accurate times on SMP machines, you need to use thread affinity to lock the thread to a processor, because each processor can have a ClockCycles() base value that may not be synchronized with the values on other processors.
Some caveats for each processor:
- Reads from a 64-bit register, except for 486s, where it causes a fault and the fault handler reads from an external clock chip.
- Always faults, and the fault handler reads from an external clock chip to make a 64-bit value.
To convert the cycle number to real time, use SYSPAGE_ENTRY(qtime)->cycles_per_sec.
If you need a very short delay (e.g. for accessing hardware), you should look at the nanospin*() functions:
They basically do a while loop to a calibrated number of iterations to delay the proper amount of time. This wastes CPU, so you should use these functions only if necessary.