The System Clock Manager is responsible for all timing services in
SYS/BIOS.
It generates the periodic system tick. The tick period is configurable.
The timeout and period for all Clock Instances and timeout values in
other SYS/BIOS modules are specified in terms of Clock ticks.
The Clock Manager supports two tick "modes": a periodic mode with an
interrupt on each tick (TickMode_PERIODIC), and a tick suppression
mode (TickMode_DYNAMIC), which reduces the number of timer interrupts to
the minimum required to support the scheduled timeouts. For devices that
support it (e.g., MSP430 devices), TickMode_DYNAMIC will be the default
mode if one is not specified in the application configuration; otherwise,
the default mode will be TickMode_PERIODIC. The following example shows
how the tick mode can be specified in the application configuration:
Clock Instances are functions that can be scheduled to run after a
certain number of Clock ticks.
Clock instances are either one-shot or periodic. Instances are started
when created or they are started later using the Clock_start()function.
Instances can be stopped using the Clock_stop() function. All Clock
Instances are executed when they expire in the context of a software
interrupt.
Clock objects are placed in the Clock object service list when
created/constructed and remain there until deleted/destructed.
To minimize processing overhead, unused or expired Clock objects
should be deleted or destructed.
The getTicks() function returns number of clock ticks since startup.
enum Clock_TickMode |
 |
Clock Tick Mode
typedef enum Clock_TickMode {
Clock_TickMode_PERIODIC,
// Timer will interrupt every period
Clock_TickMode_DYNAMIC
// Unnecessary timer ticks can be suppressed
} Clock_TickMode;
enum Clock_TickSource |
 |
Clock tick source
typedef enum Clock_TickSource {
Clock_TickSource_TIMER,
// Use Timer to automatically call Clock_tick()
Clock_TickSource_USER,
// Application explicitly calls Clock_tick()
Clock_TickSource_NULL
// Clock_tick() is never called
} Clock_TickSource;
VALUES
TickSource_USER
Clock_tick() must be explicitly
called by the user's application.
TickSource_NULL
Clock_tick() is never called.
In this case, it is an error for the application to ever call
Clock_tick().
SEE
typedef Clock_FuncPtr |
 |
Instance function prototype
typedef Void (*Clock_FuncPtr)(UArg);
config Clock_A_badThreadType // module-wide |
 |
Asserted in Clock_create and Clock_delete
extern const Assert_Id Clock_A_badThreadType;
config Clock_A_clockDisabled // module-wide |
 |
Asserted in Clock_create()
extern const Assert_Id Clock_A_clockDisabled;
config Clock_LM_begin // module-wide |
 |
Logged just prior to calling each Clock function
config Clock_LM_tick // module-wide |
 |
Logged in every Clock tick interrupt
config Clock_LW_delayed // module-wide |
 |
Logged if Clock Swi delayed by >= 1 tick
config Clock_tickMode // module-wide |
 |
Timer tick mode
DETAILS
This parameter specifies the tick mode to be used by the underlying
Timer. With TickMode_PERIODIC the timer will interrupt the CPU at
a fixed rate, defined by the tickPeriod. With TickMode_DYNAMIC the
timer can be dynamically reprogrammed by Clock, to interrupt the CPU
when the next tick is actually needed for a scheduled timeout.
config Clock_tickPeriod // module-wide |
 |
Tick period specified in microseconds
extern const UInt32 Clock_tickPeriod;
DETAILS
Default value is family dependent. For example, Linux systems often
only support a minimum period of 10000 us and multiples of 10000 us.
TI platforms have a default of 1000 us.
config Clock_tickSource // module-wide |
 |
Source of clock ticks
DETAILS
If this parameter is not set to TickSource_TIMER,
Clock_tickStart(),
Clock_tickStop(), and
Clock_tickReconfig(), have no effect.
The default is TickSource_TIMER.
config Clock_timerId // module-wide |
 |
Timer Id used to create a Timer instance
extern const UInt Clock_timerId;
DETAILS
If
Clock.tickSource is set to TickSource_TIMER,
the Clock module automatically creates a
instance that automatically calls
Clock_doTick() on a periodic basis (as specified by
tickPeriod and
periodType.)
This configuration parameter allows you to control which timer is
used to drive the Clock module.
The default value is
Timer.ANY (~0)
and the maximum timerId possible is family and device specific.
SEE
Clock_getTicks() // module-wide |
 |
Time in Clock ticks
RETURNS
time in clock ticks
DETAILS
The value returned will wrap back to zero after it reaches the max
value that can be stored in 32 bits.
Clock_getTimerHandle() // module-wide |
 |
Get timer Handle
RETURNS
Timer Handle
DETAILS
Used when is it necessary to change family
specific options for the timer and its Hwi Object.
Clock_tick() // module-wide |
 |
Advance Clock time by one tick
DETAILS
After incrementing a global tick counter, this function posts a Swi
that processes the clock instances.
This function is automatically called by a timer ISR when
tickSource is set to
TickSource_TIMER.
When
tickSource is set to
TickSource_USER, Clock_tick() must be called by the
application. Usually, this is done within a user defined
Hwi,
Swi, or
Task.
Note that this function is not re-entrant. The application is
responsible for ensuring that invocations of this function are
serialized: either only one thread in the system ever calls this
function or all calls are "wrapped" by an appropriate mutex.
SEE
Clock_tickReconfig() // module-wide |
 |
Reconfigure clock for new cpu frequency
Bool Clock_tickReconfig();
RETURNS
true if successful
DETAILS
This function uses the new cpu frequency to reconfigure the timer used
for generation of clock ticks such that tick period is
accurate. This function is used along with Clock_tickStop() and
Clock_tickStart() to allow reconfiguration of timer at runtime.
When calling Clock_tickReconfig outside of main(), you must also call
Clock_tickStop and Clock_tickStart to stop and restart the timer.
Use the following call sequence:
// disable interrupts if an interrupt could lead to
// another call to Clock_tickReconfig or if interrupt
// processing relies on having a running timer
Hwi_disable() or Swi_disable();
BIOS_setCpuFrequency(Types.FreqHz *freq);
Clock_tickStop();
Clock_tickReconfig();
Clock_tickStart();
Hwi_restore() or Swi_enable()
When calling Clock_tickReconfig from main(), the timer has not yet
been started because the timer is started as part of BIOS_start().
As a result, you can use the following simplified call sequence
in main():
BIOS_setCpuFrequency(Types.FreqHz *freq);
Clock_tickReconfig(Void);
The return value is false if the timer cannot support the new
frequency
CONSTRAINTS
This function is non-reentrant and appropriate locks must be used to
protect against re-entrancy.
Clock_tickStart() // module-wide |
 |
Start clock after reconfiguration
DETAILS
This function starts the timer used for generation of clock ticks
It is used along with Clock_tickStop() and Clock_tickReconfig() to
allow reconfiguration of timer at runtime. The new timer configuration
reflects changes caused by a call to reconfig().
CONSTRAINTS
This function is non-reentrant and appropriate locks must be used to
protect against re-entrancy.
Clock_tickStop() // module-wide |
 |
Stop clock for reconfiguration
DETAILS
This function is used to stop the timer used for generation of
clock ticks. It is used along with Clock_tickStart() and
Clock_tickReconfig() to allow reconfiguration of timer at runtime.
CONSTRAINTS
This function is non-reentrant and appropriate locks must be used to
protect against re-entrancy.
Module-Wide Built-Ins |
 |
// Get this module's unique id
Bool Clock_Module_startupDone();
// Test if this module has completed startup
// The heap from which this module allocates memory
Bool Clock_Module_hasMask();
// Test whether this module has a diagnostics mask
Bits16 Clock_Module_getMask();
// Returns the diagnostics mask for this module
Void Clock_Module_setMask(Bits16 mask);
// Set the diagnostics mask for this module
Instance Object Types |
 |
typedef struct Clock_Object Clock_Object;
// Opaque internal representation of an instance object
// Client reference to an instance object
typedef struct Clock_Struct Clock_Struct;
// Opaque client structure large enough to hold an instance object
// Convert this instance structure pointer into an instance handle
// Convert this instance handle into an instance structure pointer
Instance Config Parameters |
 |
typedef struct Clock_Params {
// Instance config-params structure
// Common per-instance configs
UArg arg;
// Uninterpreted argument passed to instance function
UInt period;
// Period of this instance (in clock ticks)
Bool startFlag;
// Start immediately after instance is created
} Clock_Params;
// Initialize this config-params structure with supplier-specified defaults before instance creation
config Clock_arg // instance |
 |
Uninterpreted argument passed to instance function
DETAILS
The default is null.
config Clock_period // instance |
 |
Period of this instance (in clock ticks)
DETAILS
The default value of this parameter is 0, which indicates this is
a one-shot Clock object.
A non zero value for this parameter specifies that the Clock
object is to be called periodically, and also specifies the
rate (in Clock ticks) that the Clock function will be called
AFTER the initial 'timeout' argument period.
For one-shot Clock instances, this parameter must be set to zero.
config Clock_startFlag // instance |
 |
Start immediately after instance is created
DETAILS
When this flag is set to false, the user will have to call
Clock_start() to start the instance.
When set to true, both statically created Clock objects and Clock
objects created in main() are started at the end of main() when the
user calls BIOS_start(). Dynamically created Clock objects created
after main() (ie within a task) will be started immediately.
The default setting for this parameter is false.
The configured Clock function will be called initially after an
interval equal to the 'timeout' argument for both one-shot and
periodic Clock objects.
Periodic Clock objects will subsequently be called at the rate
specified by the
period parameter.
Instance Creation |
 |
// Allocate and initialize a new instance object and return its handle
// Initialize a new instance object inside the provided structure
ARGUMENTS
clockFxn
Function that runs upon timeout
timeout
One-shot timeout or initial start delay (in clock
ticks)
params
per-instance config params, or NULL to select default values (target-domain only)
eb
active error-handling block, or NULL to select default policy (target-domain only)
DETAILS
The first argument is the function that gets called when the timeout
expires.
The 'timeout' argument is used to specify the initial timeout
for both one-shot and periodic Clock instances (in Clock ticks).
The
period parameter is used to set the subsequent timeout
interval (in Clock ticks) for periodic instances.
For one-shot instances, the period parameter must be set to zero.
When instances are created they are placed upon a linked list managed
by the Clock module. For this reason, instances cannot be created
from either Hwi or Swi context.
Instance Deletion |
 |
// Finalize and free this previously allocated instance object, setting the referenced handle to NULL
// Finalize the instance object inside the provided structure
Clock_getPeriod() // instance |
 |
Get period of instance
ARGUMENTS
handle
handle of a previously-created Clock instance object
RETURNS
returns periodic interval in Clock ticks
DETAILS
Returns the period of an instance.
Clock_getTimeout() // instance |
 |
Get timeout of instance
ARGUMENTS
handle
handle of a previously-created Clock instance object
RETURNS
returns timeout in clock ticks
DETAILS
Returns the remaining time if instance has been started.
Clock_setFunc() // instance |
 |
Overwrite Clock function and arg
ARGUMENTS
handle
handle of a previously-created Clock instance object
clockFxn
function of type FuncPtr
arg
argument to clockFxn
DETAILS
Replaces a Clock object's clockFxn function originally
provided in
create.
CONSTRAINTS
Cannot change function and arg of Clock object that has been started.
Clock_setPeriod() // instance |
 |
Set periodic interval
ARGUMENTS
handle
handle of a previously-created Clock instance object
period
periodic interval in Clock ticks
CONSTRAINTS
Cannot change period of instance that has been started.
Clock_setTimeout() // instance |
 |
Set the initial timeout
ARGUMENTS
handle
handle of a previously-created Clock instance object
timeout
initial timeout in Clock ticks
CONSTRAINTS
Cannot change the initial timeout of instance that has been started.
Clock_start() // instance |
 |
Start instance
ARGUMENTS
handle
handle of a previously-created Clock instance object
DETAILS
The
timeout and
period values set during create()
or by calling Clock_setTimeout() and Clock_setPeriod() are used and
the expiry is recomputed.
Note that for periodic instances, the first expiry is
computed using the timeout specified. All subsequent expiries use the
period value.
CONSTRAINTS
Timeout of instance cannot be zero
Clock_stop() // instance |
 |
Stop instance
ARGUMENTS
handle
handle of a previously-created Clock instance object
Instance Built-Ins |
 |
Int Clock_Object_count();
// The number of statically-created instance objects
// The handle of the i-th statically-created instance object (array == NULL)
// The handle of the first dynamically-created instance object, or NULL
// The handle of the next dynamically-created instance object, or NULL
// The heap used to allocate dynamically-created instance objects
// The label associated with this instance object
// The name of this instance object
enum Clock.TickMode |
 |
Clock Tick Mode
XDCscript usage |
meta-domain |
values of type Clock.TickMode
const Clock.TickMode_PERIODIC;
// Timer will interrupt every period
const Clock.TickMode_DYNAMIC;
// Unnecessary timer ticks can be suppressed
C SYNOPSIS
enum Clock.TickSource |
 |
Clock tick source
XDCscript usage |
meta-domain |
values of type Clock.TickSource
const Clock.TickSource_TIMER;
// Use Timer to automatically call Clock_tick()
const Clock.TickSource_USER;
// Application explicitly calls Clock_tick()
const Clock.TickSource_NULL;
// Clock_tick() is never called
VALUES
TickSource_USER
Clock_tick() must be explicitly
called by the user's application.
TickSource_NULL
Clock_tick() is never called.
In this case, it is an error for the application to ever call
Clock_tick().
SEE
C SYNOPSIS
config Clock.A_badThreadType // module-wide |
 |
Asserted in Clock_create and Clock_delete
XDCscript usage |
meta-domain |
msg: "A_badThreadType: Cannot create/delete a Clock from Hwi or Swi thread."
};
C SYNOPSIS
config Clock.A_clockDisabled // module-wide |
 |
Asserted in Clock_create()
XDCscript usage |
meta-domain |
msg: "A_clockDisabled: Cannot create a clock instance when BIOS.clockEnabled is false."
};
C SYNOPSIS
config Clock.LM_begin // module-wide |
 |
Logged just prior to calling each Clock function
XDCscript usage |
meta-domain |
msg: "LM_begin: clk: 0x%x, func: 0x%x"
};
C SYNOPSIS
config Clock.LM_tick // module-wide |
 |
Logged in every Clock tick interrupt
XDCscript usage |
meta-domain |
msg: "LM_tick: tick: %d"
};
C SYNOPSIS
config Clock.LW_delayed // module-wide |
 |
Logged if Clock Swi delayed by >= 1 tick
XDCscript usage |
meta-domain |
msg: "LW_delayed: delay: %d"
};
C SYNOPSIS
config Clock.tickMode // module-wide |
 |
Timer tick mode
XDCscript usage |
meta-domain |
DETAILS
This parameter specifies the tick mode to be used by the underlying
Timer. With TickMode_PERIODIC the timer will interrupt the CPU at
a fixed rate, defined by the tickPeriod. With TickMode_DYNAMIC the
timer can be dynamically reprogrammed by Clock, to interrupt the CPU
when the next tick is actually needed for a scheduled timeout.
C SYNOPSIS
config Clock.tickPeriod // module-wide |
 |
Tick period specified in microseconds
XDCscript usage |
meta-domain |
Clock.tickPeriod = UInt32 undefined;
DETAILS
Default value is family dependent. For example, Linux systems often
only support a minimum period of 10000 us and multiples of 10000 us.
TI platforms have a default of 1000 us.
C SYNOPSIS
config Clock.tickSource // module-wide |
 |
Source of clock ticks
XDCscript usage |
meta-domain |
DETAILS
If this parameter is not set to TickSource_TIMER,
Clock_tickStart(),
Clock_tickStop(), and
Clock_tickReconfig(), have no effect.
The default is TickSource_TIMER.
C SYNOPSIS
config Clock.timerId // module-wide |
 |
Timer Id used to create a Timer instance
XDCscript usage |
meta-domain |
DETAILS
If
Clock.tickSource is set to TickSource_TIMER,
the Clock module automatically creates a
instance that automatically calls
Clock_doTick() on a periodic basis (as specified by
tickPeriod and
periodType.)
This configuration parameter allows you to control which timer is
used to drive the Clock module.
The default value is
Timer.ANY (~0)
and the maximum timerId possible is family and device specific.
SEE
C SYNOPSIS
metaonly config Clock.common$ // module-wide |
 |
Common module configuration parameters
XDCscript usage |
meta-domain |
DETAILS
All modules have this configuration parameter. Its name
contains the '$' character to ensure it does not conflict with
configuration parameters declared by the module. This allows
new configuration parameters to be added in the future without
any chance of breaking existing modules.
metaonly config Clock.rovViewInfo // module-wide |
 |
XDCscript usage |
meta-domain |
metaonly config Clock.swiPriority // module-wide |
 |
The priority of Swi used by Clock to process its instances
XDCscript usage |
meta-domain |
Clock.swiPriority = UInt undefined;
DETAILS
All Clock instances are executed in the context of a single
Swi. This parameter allows you to control the priority of
that Swi.
The default value of this parameter is Swi.numPriorities - 1; i.e.,
the maximum Swi priority.
SEE
Instance Config Parameters |
 |
XDCscript usage |
meta-domain |
var params = new Clock.Params;
// Instance config-params object
params.arg = UArg null;
// Uninterpreted argument passed to instance function
params.period = UInt 0;
// Period of this instance (in clock ticks)
params.startFlag = Bool false;
// Start immediately after instance is created
config Clock.arg // instance |
 |
Uninterpreted argument passed to instance function
XDCscript usage |
meta-domain |
var params = new Clock.Params;
...
params.arg = UArg null;
DETAILS
The default is null.
C SYNOPSIS
config Clock.period // instance |
 |
Period of this instance (in clock ticks)
XDCscript usage |
meta-domain |
var params = new Clock.Params;
...
params.period = UInt 0;
DETAILS
The default value of this parameter is 0, which indicates this is
a one-shot Clock object.
A non zero value for this parameter specifies that the Clock
object is to be called periodically, and also specifies the
rate (in Clock ticks) that the Clock function will be called
AFTER the initial 'timeout' argument period.
For one-shot Clock instances, this parameter must be set to zero.
C SYNOPSIS
config Clock.startFlag // instance |
 |
Start immediately after instance is created
XDCscript usage |
meta-domain |
var params = new Clock.Params;
...
params.startFlag = Bool false;
DETAILS
When this flag is set to false, the user will have to call
Clock_start() to start the instance.
When set to true, both statically created Clock objects and Clock
objects created in main() are started at the end of main() when the
user calls BIOS_start(). Dynamically created Clock objects created
after main() (ie within a task) will be started immediately.
The default setting for this parameter is false.
The configured Clock function will be called initially after an
interval equal to the 'timeout' argument for both one-shot and
periodic Clock objects.
Periodic Clock objects will subsequently be called at the rate
specified by the
period parameter.
C SYNOPSIS
Instance Creation |
 |
XDCscript usage |
meta-domain |
var params =
new Clock.
Params;
// Allocate instance config-params
params.config = ...
// Assign individual configs
var inst = Clock.create(Void(*)(UArg) clockFxn, UInt timeout, params);
// Create an instance-object
ARGUMENTS
clockFxn
Function that runs upon timeout
timeout
One-shot timeout or initial start delay (in clock
ticks)
params
per-instance config params, or NULL to select default values (target-domain only)
eb
active error-handling block, or NULL to select default policy (target-domain only)
DETAILS
The first argument is the function that gets called when the timeout
expires.
The 'timeout' argument is used to specify the initial timeout
for both one-shot and periodic Clock instances (in Clock ticks).
The
period parameter is used to set the subsequent timeout
interval (in Clock ticks) for periodic instances.
For one-shot instances, the period parameter must be set to zero.
When instances are created they are placed upon a linked list managed
by the Clock module. For this reason, instances cannot be created
from either Hwi or Swi context.