220 lines
8.1 KiB
C
220 lines
8.1 KiB
C
/* timerLibP.h - private POSIX 1003.4 Clocks & Timers header */
|
|
|
|
/*
|
|
* Copyright (c) 1991-2007, 2009-2010, 2018, 2023
|
|
* Wind River Systems, Inc.
|
|
*
|
|
* The right to copy, distribute, modify or otherwise make use
|
|
* of this software may be licensed only pursuant to the terms
|
|
* of an applicable Wind RIver License agreement.
|
|
*/
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
04c,19oct23,kch Fixed compiler warning for TV_CONVERT_TO_TICK(), TV_ROUNDUP()
|
|
and TV_CONVERT_TO_TICK_NO_PARTIAL() macros.
|
|
04b,04jul18,rza Fix NTP clock adjustment (F10121)
|
|
04a,22dec10,cww added timerEventNode field in timer structure
|
|
03z,13jul10,pcs Update the data type of tickBase from UINT32 to _Vx_ticks64_t
|
|
03y,09jun10,jpb Fixed merge issue with TV_CONVERT_TO_TICK.
|
|
03x,03jun10,pad Adapted TV_CONVERT_TO_TICK_NO_PARTIAL to LP64.
|
|
03w,17may10,jpb Fixed TV_CONVERT_TO_TICK to fix build warnings for LP64.
|
|
03v,29apr10,pad Moved extern C statement after include statements.
|
|
03u,06apr10,jpb Added clockLibInit prototype.
|
|
03r,10nov09,gls modified TV_CONVERT_TO_TICK() to compensate for partial tick
|
|
added TV_CONVERT_TO_TICK_NO_PARTIAL() (WIND00186253)
|
|
03t,26aug09,jpb Updated for LP64 support.
|
|
03s,22jun07,lei changed WDOG_ID to a union in struct __timer
|
|
03r,07feb07,jmg Changed comment from vxTicks to vxAbsTicks
|
|
03q,31oct06,jmg Added verbose mode to timer_show as part of Defect
|
|
#WIND00039293
|
|
03p,18sep06,jmg Added { and } to some of the macros as part of Defect
|
|
#WIND00059292
|
|
03o,17feb06,jln added TV_ROUNDUP macro
|
|
03n,26oct04,fr added timerOpenInit() routine (SPR 101491)
|
|
03m,28sep04,fr removed vTimerCreate prototype (SPR 101349)
|
|
03l,23aug04,lei added timer_destroy() prototype.
|
|
03k,31mar04,dcc added vTimerCreate() prototype. Added timerClassId declaration.
|
|
03j,02dec03,ans code inspection changes
|
|
03i,22oct03,ans added extern declaration for timerLibInit.
|
|
03h,30sep03,ans User-level timer support.
|
|
03g,12nov01,gls Account for system clock rate (SPR #70255)
|
|
03f,27jun96,dbt modified TV_CONVERT_TO_TICK to round up the value to
|
|
return (SPR #5647).
|
|
Updated copyright.
|
|
03e,29nov93,dvs updated for POSIX draft 14
|
|
03d,23sep92,kdl changed name to timerLibP.h
|
|
03c,22sep92,rrr added support for c++
|
|
03b,31jul92,gae added sigevent.h, time.h and timers.h includes.
|
|
03a,22jul92,gae Draft 12 revision; removed object stuff; moved
|
|
some prototype definitions to timers.h.
|
|
02a,04jul92,jcf cleaned up.
|
|
01d,26may92,rrr the tree shuffle
|
|
01c,30apr92,rrr some preparation for posix signals.
|
|
01a,16oct91,gae written.
|
|
*/
|
|
|
|
/*
|
|
DESCRIPTION
|
|
This file provides header information for the
|
|
POSIX 1003.4 Clocks & Timers interface per Draft 12.
|
|
*/
|
|
|
|
#ifndef __INCtimerLibPh
|
|
#define __INCtimerLibPh
|
|
|
|
#include <vxWorks.h>
|
|
#include <sllLib.h>
|
|
#include <sys/types.h>
|
|
#include <time.h>
|
|
#include <signal.h>
|
|
#include <sigevent.h>
|
|
#include <private/sigLibP.h>
|
|
#include <private/objLibP.h>
|
|
#include <private/pxCpuTimeLibP.h>
|
|
#include <wdLib.h>
|
|
#include <stdarg.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct __timer
|
|
{
|
|
OBJ_CORE objCore; /* object core */
|
|
|
|
union
|
|
{
|
|
WDOG_ID wdog;
|
|
void * pxCpuTimer; /* POSIX cpu timer */
|
|
} expireId; /* expiry mechanism */
|
|
|
|
int active; /* wdog is set */
|
|
TASK_ID taskId; /* "owner" of timer */
|
|
clockid_t clock_id; /* always CLOCK_REALTIME */
|
|
SIGEVENT_ID sigevId; /* sigevent ID for async notification */
|
|
struct sigevent sevent; /* user's signal event */
|
|
struct itimerspec exp; /* time to go off plus interval */
|
|
TIMER_CONNECT_FUNC routine; /* user's routine */
|
|
_Vx_usr_arg_t arg; /* argument to user's routine */
|
|
struct timespec timeStamp; /* timestamp when timer is armed */
|
|
SL_NODE timerEventNode; /* list node for queueing sigevents */
|
|
int queuedCnt; /* number of times timer is queued */
|
|
} TIMER;
|
|
|
|
typedef struct clock
|
|
{
|
|
_Vx_ticks64_t tickBase; /* vxAbsTicks when time set */
|
|
struct timespec timeBase; /* time set */
|
|
_Vx_ticks64_t lastAdjTick; /* vxAbsTicks at last clock_adjtime() call */
|
|
long adjustment; /* current adjustment rate in nanosec / second */
|
|
} CLOCK;
|
|
|
|
extern struct clock _clockRealtime;
|
|
extern CLASS_ID timerClassId; /* timer class id */
|
|
|
|
/* macros for "time value" manipulation */
|
|
|
|
#define BILLION 1000000000 /* 1000 million nanoseconds / second */
|
|
|
|
#define TV_EQ(a,b) \
|
|
((a).tv_sec == (b).tv_sec && (a).tv_nsec == (b).tv_nsec)
|
|
#define TV_GT(a,b) \
|
|
((a).tv_sec > (b).tv_sec || \
|
|
((a).tv_sec == (b).tv_sec && (a).tv_nsec > (b).tv_nsec))
|
|
#define TV_LT(a,b) \
|
|
((a).tv_sec < (b).tv_sec || \
|
|
((a).tv_sec == (b).tv_sec && (a).tv_nsec < (b).tv_nsec))
|
|
#define TV_ISZERO(a) \
|
|
((a).tv_sec == 0 && (a).tv_nsec == 0)
|
|
#define TV_SET(a,b) \
|
|
{(a).tv_sec = (b).tv_sec; (a).tv_nsec = (b).tv_nsec;}
|
|
#define TV_ADD(a,b) \
|
|
{(a).tv_sec += (b).tv_sec; (a).tv_nsec += (b).tv_nsec; TV_NORMALIZE(a);}
|
|
#define TV_SUB(a,b) \
|
|
{(a).tv_sec -= (b).tv_sec; (a).tv_nsec -= (b).tv_nsec; TV_NORMALIZE(a);}
|
|
#define TV_NORMALIZE(a) \
|
|
if ((a).tv_nsec >= BILLION) \
|
|
{ (a).tv_sec++; (a).tv_nsec -= BILLION; } \
|
|
else if ((a).tv_nsec < 0) \
|
|
{ (a).tv_sec--; (a).tv_nsec += BILLION; }
|
|
#define TV_VALID(a) \
|
|
((a).tv_nsec >= 0 && (a).tv_nsec < BILLION)
|
|
#define TV_ZERO(a) \
|
|
{(a).tv_sec = 0; (a).tv_nsec = 0;}
|
|
|
|
/* Round up the whole time value based on resolution */
|
|
|
|
#define TV_ROUNDUP(a) \
|
|
do { \
|
|
ULONG offset; \
|
|
UINT32 hz = (UINT32) sysClkRateGet(); \
|
|
register UINT32 res = (BILLION / hz); \
|
|
\
|
|
offset = (ULONG) (((UINT64)((a).tv_sec) * (BILLION % res) + \
|
|
(UINT64)((a).tv_nsec)) % res); \
|
|
if (offset != 0) \
|
|
{ \
|
|
(a).tv_nsec += (res - offset); \
|
|
TV_NORMALIZE (a) \
|
|
} \
|
|
} while (0)
|
|
|
|
#define TV_CONVERT_TO_SEC(a,b) \
|
|
do { \
|
|
register UINT32 hz = sysClkRateGet(); \
|
|
(a).tv_sec = (time_t)((b) / hz); \
|
|
(a).tv_nsec = (long)(((b) % hz) * (BILLION / hz)); \
|
|
} while (0)
|
|
|
|
#define TV_CONVERT_TO_TICK(a,b) \
|
|
do { \
|
|
register ULONG hz = (ULONG) sysClkRateGet(); \
|
|
register ULONG res = (BILLION / hz); \
|
|
(a) = (ULONG)((UINT64) ((b).tv_sec) * hz + \
|
|
(UINT64) ((b).tv_nsec) / res + \
|
|
(((UINT64)((b).tv_nsec) % res) ? 2 : 1)); \
|
|
} while (0)
|
|
|
|
#define TV_CONVERT_TO_TICK_NO_PARTIAL(a,b) \
|
|
do { \
|
|
register ULONG hz = sysClkRateGet(); \
|
|
register ULONG res = (BILLION / hz); \
|
|
(a) = (ULONG)((UINT64) ((b).tv_sec) * hz + \
|
|
(UINT64) ((b).tv_nsec) / res + \
|
|
(((UINT64)((b).tv_nsec) % res) ? 1 : 0)); \
|
|
} while (0)
|
|
|
|
/* function pointers */
|
|
|
|
extern PX_CPUTIMER * (*_func_pxCpuTimerCreate) (void);
|
|
extern STATUS (*_func_pxCpuTimerStart) (timer_t timerid,
|
|
int execCount);
|
|
extern STATUS (*_func_pxCpuTimerCancel) (PX_CPUTIMER * pxCpuTimerId,
|
|
TASK_ID tid);
|
|
extern STATUS (*_func_pxCpuTimerDelete) (PX_CPUTIMER * pxCpuTimerId,
|
|
TASK_ID tid);
|
|
|
|
#ifdef _WRS_CONFIG_SMP
|
|
extern void (*_func_pxCpuTimerCancelVerify) (PX_CPUTIMER * pxCpuTimerId,
|
|
TASK_ID tid);
|
|
#endif /* _WRS_CONFIG_SMP */
|
|
|
|
/* non-standard function declarations */
|
|
|
|
extern STATUS clockLibInit (void);
|
|
extern STATUS timerScLibInit (void);
|
|
extern STATUS clockScLibInit (void);
|
|
extern void timerShowInit (void);
|
|
extern STATUS timerLibInit (void);
|
|
extern void timerOpenInit (void);
|
|
extern int timer_destroy (timer_t timerid, BOOL dealloc);
|
|
extern int clock_setres (clockid_t clock_id, struct timespec * res);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCtimerLibPh */
|