CLOCK_MONOTONIC_RAW resolution differs from CLOCK_MONOTONIC and seems way too high

Viewed 197

So I have just tested the available clocks on an embedded system with a 2.6.31 kernel.

Some simple test code:

#include <stdio.h>
#include <time.h>

int main(int argc, const char* argv[]) {
    struct timespec clock_resolution;

    printf("This system uses a timespec with %ldB in tv_sec and %ldB in tv_nsec.\n", (long)sizeof(clock_resolution.tv_sec), (long)sizeof(clock_resolution.tv_nsec));
    printf("An int is %ldB on this system, a long int is %ldB.\n", (long)sizeof(int), (long)sizeof(long));
    
    if (clock_getres(CLOCK_MONOTONIC, &clock_resolution))
        perror("Can't get CLOCK_MONOTONIC resolution time");
    printf("CLOCK_MONOTONIC has precision of %lds and %ldns on this system.\n", (long)clock_resolution.tv_sec, (long)clock_resolution.tv_nsec);
    
    if (clock_getres(CLOCK_MONOTONIC_RAW, &clock_resolution))
        perror("Can't get CLOCK_MONOTONIC_RAW resolution time");
    printf("CLOCK_MONOTONIC_RAW has precision of %lds and %ldns on this system.\n", (long)clock_resolution.tv_sec, (long)clock_resolution.tv_nsec);
    printf("Casted to unsigned this is %lus and %luns.\n", (unsigned long)clock_resolution.tv_sec, (unsigned long)clock_resolution.tv_nsec);

    return 0;
}

On an Ubuntu 20.04 (5.4.0-52) VM on an x86 host it results in:

This system uses a timespec with 8B in tv_sec and 8B in tv_nsec.
An int is 4B on this system, a long int is 8B.
CLOCK_MONOTONIC has precision of 0s and 1ns on this system.
CLOCK_MONOTONIC_RAW has precision of 0s and 1ns on this system.
Casted to unsigned this is 0s and 1ns.

On the ARM based NXP i.MX257 controller it results in:

This system uses a timespec with 4B in tv_sec and 4B in tv_nsec.
An int is 4B on this system, a long int is 4B.
CLOCK_MONOTONIC has precision of 0s and 1ns on this system.
CLOCK_MONOTONIC_RAW has precision of 0s and -1070597342ns on this system.
Casted to unsigned this is 0s and 3224369954ns.

This seems somewhat off to me!? As an unsigned value that ns-resolution is 3224369954ns, so over 3s.

Edit to clarify some things:

  • Error checks on the clock_getres() calls don't trigger.
  • Controller is a NXP i.MX257.
  • For the ARM target: gcc 6.5, Kernel 2.6.31, uClibc-ng 1.0.30 (based on a buildroot environment)
0 Answers
Related