Valid contexts – Comtrol eCos User Manual

Page 62

Advertising
background image

Clocks

The main reason for this is that it accurately reflects the hardware: calling something like

nanosleep

with a delay

of ten nanoseconds will not work as intended on any real hardware because timer interrupts simply will not happen
that frequently; instead calling

cyg_thread_delay

with the equivalent delay of 0 ticks gives a much clearer

indication that the application is attempting something inappropriate for the target hardware. Similarly, passing a
delay of five ticks to

cyg_thread_delay

makes it fairly obvious that the current thread will be suspended for

somewhere between four and five clock periods, as opposed to passing 50000000 to

nanosleep

which suggests a

granularity that is not actually provided.

A secondary reason is that conversion between clock ticks and units such as milliseconds can be somewhat expen-
sive, and whenever possible should be done at compile-time or by the application developer rather than at run-time.
This saves code size and cpu cycles.

The information needed to perform these conversions is the clock resolution. This is a structure with two fields,
a dividend and a divisor, and specifies the number of nanoseconds between clock ticks. For example a clock
that runs at 100Hz will have 10 milliseconds between clock ticks, or 10000000 nanoseconds. The ratio between the
resolution’s dividend and divisor will therefore be 10000000 to 1, and typical values for these might be 1000000000
and 100. If the clock runs at a different frequency, say 60Hz, the numbers could be 1000000000 and 60 respectively.
Given a delay in nanoseconds, this can be converted to clock ticks by multiplying with the the divisor and then
dividing by the dividend. For example a delay of 50 milliseconds corresponds to 50000000 nanoseconds, and with
a clock frequency of 100Hz this can be converted to ((50000000 * 100) / 1000000000) = 5 clock ticks. Given the
large numbers involved this arithmetic normally has to be done using 64-bit precision and the long long data type,
but allows code to run on hardware with unusual clock frequencies.

The default frequency for the real-time clock on any platform is usually about 100Hz, but platform-specific docu-
mentation should be consulted for this information. Usually it is possible to override this default by configuration
options, but again this depends on the capabilities of the underlying hardware. The resolution for any clock can
be obtained using

cyg_clock_get_resolution

. For clocks created by application code, there is also a function

cyg_clock_set_resolution

. This does not affect the underlying hardware timer in any way, it merely updates

the information that will be returned in subsequent calls to

cyg_clock_get_resolution

: changing the actual

underlying clock frequency will require appropriate manipulation of the timer hardware.

Valid contexts

cyg_clock_create

is usually only called during system initialization (if at all), but may also be called from

thread context. The same applies to

cyg_clock_delete

. The remaining functions may be called during initial-

ization, from thread context, or from DSR context, although it should be noted that there is no locking between

cyg_clock_get_resolution

and

cyg_clock_set_resolution

so theoretically it is possible that the former

returns an inconsistent data structure.

62

Advertising