<!-- Copyright (C) 2003 Red Hat, Inc. -->
|
<!-- Copyright (C) 2003 Red Hat, Inc. -->
|
<!-- This material may be distributed only subject to the terms -->
|
<!-- This material may be distributed only subject to the terms -->
|
<!-- and conditions set forth in the Open Publication License, v1.0 -->
|
<!-- and conditions set forth in the Open Publication License, v1.0 -->
|
<!-- or later (the latest version is presently available at -->
|
<!-- or later (the latest version is presently available at -->
|
<!-- http://www.opencontent.org/openpub/). -->
|
<!-- http://www.opencontent.org/openpub/). -->
|
<!-- Distribution of the work or derivative of the work in any -->
|
<!-- Distribution of the work or derivative of the work in any -->
|
<!-- standard (paper) book form is prohibited unless prior -->
|
<!-- standard (paper) book form is prohibited unless prior -->
|
<!-- permission is obtained from the copyright holder. -->
|
<!-- permission is obtained from the copyright holder. -->
|
<HTML
|
<HTML
|
><HEAD
|
><HEAD
|
><TITLE
|
><TITLE
|
>Clocks</TITLE
|
>Clocks</TITLE
|
><meta name="MSSmartTagsPreventParsing" content="TRUE">
|
><meta name="MSSmartTagsPreventParsing" content="TRUE">
|
<META
|
<META
|
NAME="GENERATOR"
|
NAME="GENERATOR"
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
|
"><LINK
|
"><LINK
|
REL="HOME"
|
REL="HOME"
|
TITLE="eCos Reference Manual"
|
TITLE="eCos Reference Manual"
|
HREF="ecos-ref.html"><LINK
|
HREF="ecos-ref.html"><LINK
|
REL="UP"
|
REL="UP"
|
TITLE="The eCos Kernel"
|
TITLE="The eCos Kernel"
|
HREF="kernel.html"><LINK
|
HREF="kernel.html"><LINK
|
REL="PREVIOUS"
|
REL="PREVIOUS"
|
TITLE="Counters"
|
TITLE="Counters"
|
HREF="kernel-counters.html"><LINK
|
HREF="kernel-counters.html"><LINK
|
REL="NEXT"
|
REL="NEXT"
|
TITLE="Alarms"
|
TITLE="Alarms"
|
HREF="kernel-alarms.html"></HEAD
|
HREF="kernel-alarms.html"></HEAD
|
><BODY
|
><BODY
|
CLASS="REFENTRY"
|
CLASS="REFENTRY"
|
BGCOLOR="#FFFFFF"
|
BGCOLOR="#FFFFFF"
|
TEXT="#000000"
|
TEXT="#000000"
|
LINK="#0000FF"
|
LINK="#0000FF"
|
VLINK="#840084"
|
VLINK="#840084"
|
ALINK="#0000FF"
|
ALINK="#0000FF"
|
><DIV
|
><DIV
|
CLASS="NAVHEADER"
|
CLASS="NAVHEADER"
|
><TABLE
|
><TABLE
|
SUMMARY="Header navigation table"
|
SUMMARY="Header navigation table"
|
WIDTH="100%"
|
WIDTH="100%"
|
BORDER="0"
|
BORDER="0"
|
CELLPADDING="0"
|
CELLPADDING="0"
|
CELLSPACING="0"
|
CELLSPACING="0"
|
><TR
|
><TR
|
><TH
|
><TH
|
COLSPAN="3"
|
COLSPAN="3"
|
ALIGN="center"
|
ALIGN="center"
|
>eCos Reference Manual</TH
|
>eCos Reference Manual</TH
|
></TR
|
></TR
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="10%"
|
WIDTH="10%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
><A
|
><A
|
HREF="kernel-counters.html"
|
HREF="kernel-counters.html"
|
ACCESSKEY="P"
|
ACCESSKEY="P"
|
>Prev</A
|
>Prev</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="80%"
|
WIDTH="80%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="10%"
|
WIDTH="10%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
><A
|
><A
|
HREF="kernel-alarms.html"
|
HREF="kernel-alarms.html"
|
ACCESSKEY="N"
|
ACCESSKEY="N"
|
>Next</A
|
>Next</A
|
></TD
|
></TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
><HR
|
><HR
|
ALIGN="LEFT"
|
ALIGN="LEFT"
|
WIDTH="100%"></DIV
|
WIDTH="100%"></DIV
|
><H1
|
><H1
|
><A
|
><A
|
NAME="KERNEL-CLOCKS">Clocks</H1
|
NAME="KERNEL-CLOCKS">Clocks</H1
|
><DIV
|
><DIV
|
CLASS="REFNAMEDIV"
|
CLASS="REFNAMEDIV"
|
><A
|
><A
|
NAME="AEN922"
|
NAME="AEN922"
|
></A
|
></A
|
><H2
|
><H2
|
>Name</H2
|
>Name</H2
|
>cyg_clock_create, cyg_clock_delete, cyg_clock_to_counter, cyg_clock_set_resolution, cyg_clock_get_resolution, cyg_real_time_clock, cyg_current_time -- Provide system clocks</DIV
|
>cyg_clock_create, cyg_clock_delete, cyg_clock_to_counter, cyg_clock_set_resolution, cyg_clock_get_resolution, cyg_real_time_clock, cyg_current_time -- Provide system clocks</DIV
|
><DIV
|
><DIV
|
CLASS="REFSYNOPSISDIV"
|
CLASS="REFSYNOPSISDIV"
|
><A
|
><A
|
NAME="AEN931"><H2
|
NAME="AEN931"><H2
|
>Synopsis</H2
|
>Synopsis</H2
|
><DIV
|
><DIV
|
CLASS="FUNCSYNOPSIS"
|
CLASS="FUNCSYNOPSIS"
|
><A
|
><A
|
NAME="AEN932"><P
|
NAME="AEN932"><P
|
></P
|
></P
|
><TABLE
|
><TABLE
|
BORDER="5"
|
BORDER="5"
|
BGCOLOR="#E0E0F0"
|
BGCOLOR="#E0E0F0"
|
WIDTH="70%"
|
WIDTH="70%"
|
><TR
|
><TR
|
><TD
|
><TD
|
><PRE
|
><PRE
|
CLASS="FUNCSYNOPSISINFO"
|
CLASS="FUNCSYNOPSISINFO"
|
>#include <cyg/kernel/kapi.h>
|
>#include <cyg/kernel/kapi.h>
|
</PRE
|
</PRE
|
></TD
|
></TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
><P
|
><P
|
><CODE
|
><CODE
|
><CODE
|
><CODE
|
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
>void cyg_clock_create</CODE
|
>void cyg_clock_create</CODE
|
>(cyg_resolution_t resolution, cyg_handle_t* handle, cyg_clock* clock);</CODE
|
>(cyg_resolution_t resolution, cyg_handle_t* handle, cyg_clock* clock);</CODE
|
></P
|
></P
|
><P
|
><P
|
><CODE
|
><CODE
|
><CODE
|
><CODE
|
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
>void cyg_clock_delete</CODE
|
>void cyg_clock_delete</CODE
|
>(cyg_handle_t clock);</CODE
|
>(cyg_handle_t clock);</CODE
|
></P
|
></P
|
><P
|
><P
|
><CODE
|
><CODE
|
><CODE
|
><CODE
|
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
>void cyg_clock_to_counter</CODE
|
>void cyg_clock_to_counter</CODE
|
>(cyg_handle_t clock, cyg_handle_t* counter);</CODE
|
>(cyg_handle_t clock, cyg_handle_t* counter);</CODE
|
></P
|
></P
|
><P
|
><P
|
><CODE
|
><CODE
|
><CODE
|
><CODE
|
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
>void cyg_clock_set_resolution</CODE
|
>void cyg_clock_set_resolution</CODE
|
>(cyg_handle_t clock, cyg_resolution_t resolution);</CODE
|
>(cyg_handle_t clock, cyg_resolution_t resolution);</CODE
|
></P
|
></P
|
><P
|
><P
|
><CODE
|
><CODE
|
><CODE
|
><CODE
|
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
>cyg_resolution_t cyg_clock_get_resolution</CODE
|
>cyg_resolution_t cyg_clock_get_resolution</CODE
|
>(cyg_handle_t clock);</CODE
|
>(cyg_handle_t clock);</CODE
|
></P
|
></P
|
><P
|
><P
|
><CODE
|
><CODE
|
><CODE
|
><CODE
|
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
>cyg_handle_t cyg_real_time_clock</CODE
|
>cyg_handle_t cyg_real_time_clock</CODE
|
>(void);</CODE
|
>(void);</CODE
|
></P
|
></P
|
><P
|
><P
|
><CODE
|
><CODE
|
><CODE
|
><CODE
|
CLASS="FUNCDEF"
|
CLASS="FUNCDEF"
|
>cyg_tick_count_t cyg_current_time</CODE
|
>cyg_tick_count_t cyg_current_time</CODE
|
>(void);</CODE
|
>(void);</CODE
|
></P
|
></P
|
><P
|
><P
|
></P
|
></P
|
></DIV
|
></DIV
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="REFSECT1"
|
CLASS="REFSECT1"
|
><A
|
><A
|
NAME="KERNEL-CLOCKS-DESCRIPTION"
|
NAME="KERNEL-CLOCKS-DESCRIPTION"
|
></A
|
></A
|
><H2
|
><H2
|
>Description</H2
|
>Description</H2
|
><P
|
><P
|
>In the eCos kernel clock objects are a special form of <A
|
>In the eCos kernel clock objects are a special form of <A
|
HREF="kernel-counters.html"
|
HREF="kernel-counters.html"
|
>counter</A
|
>counter</A
|
> objects. They are attached to
|
> objects. They are attached to
|
a specific type of hardware, clocks that generate ticks at very
|
a specific type of hardware, clocks that generate ticks at very
|
specific time intervals, whereas counters can be used with any event
|
specific time intervals, whereas counters can be used with any event
|
source.
|
source.
|
</P
|
</P
|
><P
|
><P
|
>In a default configuration the kernel provides a single clock
|
>In a default configuration the kernel provides a single clock
|
instance, the real-time clock. This gets used for timeslicing and for
|
instance, the real-time clock. This gets used for timeslicing and for
|
operations that involve a timeout, for example
|
operations that involve a timeout, for example
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_semaphore_timed_wait</TT
|
>cyg_semaphore_timed_wait</TT
|
>. If this functionality
|
>. If this functionality
|
is not required it can be removed from the system using the
|
is not required it can be removed from the system using the
|
configuration option <TT
|
configuration option <TT
|
CLASS="VARNAME"
|
CLASS="VARNAME"
|
>CYGVAR_KERNEL_COUNTERS_CLOCK</TT
|
>CYGVAR_KERNEL_COUNTERS_CLOCK</TT
|
>.
|
>.
|
Otherwise the real-time clock can be accessed by a call to
|
Otherwise the real-time clock can be accessed by a call to
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_real_time_clock</TT
|
>cyg_real_time_clock</TT
|
>, allowing applications to
|
>, allowing applications to
|
attach alarms, and the current counter value can be obtained using
|
attach alarms, and the current counter value can be obtained using
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_current_time</TT
|
>cyg_current_time</TT
|
>.
|
>.
|
</P
|
</P
|
><P
|
><P
|
>Applications can create and destroy additional clocks if desired,
|
>Applications can create and destroy additional clocks if desired,
|
using <TT
|
using <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_create</TT
|
>cyg_clock_create</TT
|
> and
|
> and
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_delete</TT
|
>cyg_clock_delete</TT
|
>. The first argument to
|
>. The first argument to
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_create</TT
|
>cyg_clock_create</TT
|
> specifies the
|
> specifies the
|
<A
|
<A
|
HREF="kernel-clocks.html#KERNEL-CLOCKS-RESOLUTION"
|
HREF="kernel-clocks.html#KERNEL-CLOCKS-RESOLUTION"
|
>resolution</A
|
>resolution</A
|
> this clock
|
> this clock
|
will run at. The second argument is used to return a handle for this
|
will run at. The second argument is used to return a handle for this
|
clock object, and the third argument provides the kernel with the
|
clock object, and the third argument provides the kernel with the
|
memory needed to hold this object. This clock will not actually tick
|
memory needed to hold this object. This clock will not actually tick
|
by itself. Instead it is the responsibility of application code to
|
by itself. Instead it is the responsibility of application code to
|
initialize a suitable hardware timer to generate interrupts at the
|
initialize a suitable hardware timer to generate interrupts at the
|
appropriate frequency, install an interrupt handler for this, and
|
appropriate frequency, install an interrupt handler for this, and
|
call <TT
|
call <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_counter_tick</TT
|
>cyg_counter_tick</TT
|
> from inside the DSR.
|
> from inside the DSR.
|
Associated with each clock is a kernel counter, a handle for which can
|
Associated with each clock is a kernel counter, a handle for which can
|
be obtained using <TT
|
be obtained using <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_to_counter</TT
|
>cyg_clock_to_counter</TT
|
>.
|
>.
|
</P
|
</P
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="REFSECT1"
|
CLASS="REFSECT1"
|
><A
|
><A
|
NAME="KERNEL-CLOCKS-RESOLUTION"
|
NAME="KERNEL-CLOCKS-RESOLUTION"
|
></A
|
></A
|
><H2
|
><H2
|
>Clock Resolutions and Ticks</H2
|
>Clock Resolutions and Ticks</H2
|
><P
|
><P
|
>At the kernel level all clock-related operations including delays,
|
>At the kernel level all clock-related operations including delays,
|
timeouts and alarms work in units of clock ticks, rather than in units
|
timeouts and alarms work in units of clock ticks, rather than in units
|
of seconds or milliseconds. If the calling code, whether the
|
of seconds or milliseconds. If the calling code, whether the
|
application or some other package, needs to operate using units such
|
application or some other package, needs to operate using units such
|
as milliseconds then it has to convert from these units to clock
|
as milliseconds then it has to convert from these units to clock
|
ticks.
|
ticks.
|
</P
|
</P
|
><P
|
><P
|
>The main reason for this is that it accurately reflects the
|
>The main reason for this is that it accurately reflects the
|
hardware: calling something like <TT
|
hardware: calling something like <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>nanosleep</TT
|
>nanosleep</TT
|
> with a
|
> with a
|
delay of ten nanoseconds will not work as intended on any real
|
delay of ten nanoseconds will not work as intended on any real
|
hardware because timer interrupts simply will not happen that
|
hardware because timer interrupts simply will not happen that
|
frequently; instead calling <TT
|
frequently; instead calling <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_thread_delay</TT
|
>cyg_thread_delay</TT
|
> with
|
> with
|
the equivalent delay of 0 ticks gives a much clearer indication that
|
the equivalent delay of 0 ticks gives a much clearer indication that
|
the application is attempting something inappropriate for the target
|
the application is attempting something inappropriate for the target
|
hardware. Similarly, passing a delay of five ticks to
|
hardware. Similarly, passing a delay of five ticks to
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_thread_delay</TT
|
>cyg_thread_delay</TT
|
> makes it fairly obvious that
|
> makes it fairly obvious that
|
the current thread will be suspended for somewhere between four and
|
the current thread will be suspended for somewhere between four and
|
five clock periods, as opposed to passing 50000000 to
|
five clock periods, as opposed to passing 50000000 to
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>nanosleep</TT
|
>nanosleep</TT
|
> which suggests a granularity that is
|
> which suggests a granularity that is
|
not actually provided.
|
not actually provided.
|
</P
|
</P
|
><P
|
><P
|
>A secondary reason is that conversion between clock ticks and units
|
>A secondary reason is that conversion between clock ticks and units
|
such as milliseconds can be somewhat expensive, and whenever possible
|
such as milliseconds can be somewhat expensive, and whenever possible
|
should be done at compile-time or by the application developer rather
|
should be done at compile-time or by the application developer rather
|
than at run-time. This saves code size and cpu cycles.
|
than at run-time. This saves code size and cpu cycles.
|
</P
|
</P
|
><P
|
><P
|
>The information needed to perform these conversions is the clock
|
>The information needed to perform these conversions is the clock
|
resolution. This is a structure with two fields, a dividend and a
|
resolution. This is a structure with two fields, a dividend and a
|
divisor, and specifies the number of nanoseconds between clock ticks.
|
divisor, and specifies the number of nanoseconds between clock ticks.
|
For example a clock that runs at 100Hz will have 10 milliseconds
|
For example a clock that runs at 100Hz will have 10 milliseconds
|
between clock ticks, or 10000000 nanoseconds. The ratio between the
|
between clock ticks, or 10000000 nanoseconds. The ratio between the
|
resolution's dividend and divisor will therefore be 10000000 to 1, and
|
resolution's dividend and divisor will therefore be 10000000 to 1, and
|
typical values for these might be 1000000000 and 100. If the clock
|
typical values for these might be 1000000000 and 100. If the clock
|
runs at a different frequency, say 60Hz, the numbers could be
|
runs at a different frequency, say 60Hz, the numbers could be
|
1000000000 and 60 respectively. Given a delay in nanoseconds, this can
|
1000000000 and 60 respectively. Given a delay in nanoseconds, this can
|
be converted to clock ticks by multiplying with the the divisor and
|
be converted to clock ticks by multiplying with the the divisor and
|
then dividing by the dividend. For example a delay of 50 milliseconds
|
then dividing by the dividend. For example a delay of 50 milliseconds
|
corresponds to 50000000 nanoseconds, and with a clock frequency of
|
corresponds to 50000000 nanoseconds, and with a clock frequency of
|
100Hz this can be converted to
|
100Hz this can be converted to
|
((50000000 * 100) / 1000000000) = 5
|
((50000000 * 100) / 1000000000) = 5
|
clock ticks. Given the large numbers involved this arithmetic normally
|
clock ticks. Given the large numbers involved this arithmetic normally
|
has to be done using 64-bit precision and the
|
has to be done using 64-bit precision and the
|
<SPAN
|
<SPAN
|
CLASS="TYPE"
|
CLASS="TYPE"
|
>long long</SPAN
|
>long long</SPAN
|
> data type, but allows code to run on
|
> data type, but allows code to run on
|
hardware with unusual clock frequencies.
|
hardware with unusual clock frequencies.
|
</P
|
</P
|
><P
|
><P
|
>The default frequency for the real-time clock on any platform is
|
>The default frequency for the real-time clock on any platform is
|
usually about 100Hz, but platform-specific documentation should be
|
usually about 100Hz, but platform-specific documentation should be
|
consulted for this information. Usually it is possible to override
|
consulted for this information. Usually it is possible to override
|
this default by configuration options, but again this depends on the
|
this default by configuration options, but again this depends on the
|
capabilities of the underlying hardware. The resolution for any clock
|
capabilities of the underlying hardware. The resolution for any clock
|
can be obtained using <TT
|
can be obtained using <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_get_resolution</TT
|
>cyg_clock_get_resolution</TT
|
>.
|
>.
|
For clocks created by application code, there is also a function
|
For clocks created by application code, there is also a function
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_set_resolution</TT
|
>cyg_clock_set_resolution</TT
|
>. This does not affect
|
>. This does not affect
|
the underlying hardware timer in any way, it merely updates the
|
the underlying hardware timer in any way, it merely updates the
|
information that will be returned in subsequent calls to
|
information that will be returned in subsequent calls to
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_get_resolution</TT
|
>cyg_clock_get_resolution</TT
|
>: changing the actual
|
>: changing the actual
|
underlying clock frequency will require appropriate manipulation of
|
underlying clock frequency will require appropriate manipulation of
|
the timer hardware.
|
the timer hardware.
|
</P
|
</P
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="REFSECT1"
|
CLASS="REFSECT1"
|
><A
|
><A
|
NAME="KERNEL-CLOCKS-CONTEXT"
|
NAME="KERNEL-CLOCKS-CONTEXT"
|
></A
|
></A
|
><H2
|
><H2
|
>Valid contexts</H2
|
>Valid contexts</H2
|
><P
|
><P
|
><TT
|
><TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_create</TT
|
>cyg_clock_create</TT
|
> is usually only called during
|
> is usually only called during
|
system initialization (if at all), but may also be called from thread
|
system initialization (if at all), but may also be called from thread
|
context. The same applies to <TT
|
context. The same applies to <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_delete</TT
|
>cyg_clock_delete</TT
|
>.
|
>.
|
The remaining functions may be called during initialization, from
|
The remaining functions may be called during initialization, from
|
thread context, or from DSR context, although it should be noted that
|
thread context, or from DSR context, although it should be noted that
|
there is no locking between
|
there is no locking between
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_get_resolution</TT
|
>cyg_clock_get_resolution</TT
|
> and
|
> and
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_clock_set_resolution</TT
|
>cyg_clock_set_resolution</TT
|
> so theoretically it is
|
> so theoretically it is
|
possible that the former returns an inconsistent data structure.
|
possible that the former returns an inconsistent data structure.
|
</P
|
</P
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="NAVFOOTER"
|
CLASS="NAVFOOTER"
|
><HR
|
><HR
|
ALIGN="LEFT"
|
ALIGN="LEFT"
|
WIDTH="100%"><TABLE
|
WIDTH="100%"><TABLE
|
SUMMARY="Footer navigation table"
|
SUMMARY="Footer navigation table"
|
WIDTH="100%"
|
WIDTH="100%"
|
BORDER="0"
|
BORDER="0"
|
CELLPADDING="0"
|
CELLPADDING="0"
|
CELLSPACING="0"
|
CELLSPACING="0"
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="kernel-counters.html"
|
HREF="kernel-counters.html"
|
ACCESSKEY="P"
|
ACCESSKEY="P"
|
>Prev</A
|
>Prev</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="34%"
|
WIDTH="34%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="ecos-ref.html"
|
HREF="ecos-ref.html"
|
ACCESSKEY="H"
|
ACCESSKEY="H"
|
>Home</A
|
>Home</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="kernel-alarms.html"
|
HREF="kernel-alarms.html"
|
ACCESSKEY="N"
|
ACCESSKEY="N"
|
>Next</A
|
>Next</A
|
></TD
|
></TD
|
></TR
|
></TR
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="top"
|
VALIGN="top"
|
>Counters</TD
|
>Counters</TD
|
><TD
|
><TD
|
WIDTH="34%"
|
WIDTH="34%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="kernel.html"
|
HREF="kernel.html"
|
ACCESSKEY="U"
|
ACCESSKEY="U"
|
>Up</A
|
>Up</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="top"
|
VALIGN="top"
|
>Alarms</TD
|
>Alarms</TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
></DIV
|
></DIV
|
></BODY
|
></BODY
|
></HTML
|
></HTML
|
|
|