218 lines
6.0 KiB
C++
218 lines
6.0 KiB
C++
// VXWWd/vxwWdLib.h - watchdog timer class
|
|
|
|
// Copyright 1995-1999 Wind River Systems, Inc.
|
|
|
|
// modification history
|
|
// --------------------
|
|
// 01c,08mar99,jdi doc: fixed cross-reference.
|
|
// 01b,23feb99,fle doc : made it refgen compliant
|
|
// 01c,21feb99,jdi added library section, checked in documentation.
|
|
// 01b,29sep95,rhp adjusted comments for new mangen-C++ conventions
|
|
// 01a,15jun95,srh written.
|
|
|
|
// DESCRIPTION
|
|
// This library provides a general watchdog timer facility. Any task may
|
|
// create a watchdog timer and use it to run a specified routine in
|
|
// the context of the system-clock ISR, after a specified delay.
|
|
//
|
|
// Once a timer has been created, it can be started with
|
|
// VXWWd::start(). The VXWWd::start() routine specifies what routine to run, a
|
|
// parameter for that routine, and the amount of time (in ticks) before
|
|
// the routine is to be called. (The timeout value is in ticks as
|
|
// determined by the system clock; see sysClkRateSet() for more
|
|
// information.) After the specified delay ticks have elapsed (unless
|
|
// VXWWd::cancel() is called first to cancel the timer) the timeout routine is
|
|
// invoked with the parameter specified in the VXWWd::start() call. The
|
|
// timeout routine is invoked whether the task which started the watchdog
|
|
// is running, suspended, or deleted.
|
|
//
|
|
// The timeout routine executes only once per VXWWd::start() invocation; there
|
|
// is no need to cancel a timer with VXWWd::cancel() after it has expired, or
|
|
// in the expiration callback itself.
|
|
//
|
|
// Note that the timeout routine is invoked at interrupt level, rather than
|
|
// in the context of the task. Thus, there are restrictions on what the
|
|
// routine may do. Watchdog routines are constrained to the same rules
|
|
// as interrupt service routines. For example, they may not take semaphores,
|
|
// issue other calls that may block, or use I/O system routines like printf().
|
|
//
|
|
// EXAMPLE
|
|
// In the fragment below, if maybeSlowRoutine() takes more than 60
|
|
// ticks, logMsg() will be called with the string as a parameter,
|
|
// causing the message to be printed on the console. Normally, of
|
|
// course, more significant corrective action would be taken.
|
|
// .CS
|
|
// VXWWd *pWd = new VXWWd;
|
|
// pWd->start (60, logMsg, "Help, I've timed out!");
|
|
// maybeSlowRoutine (); /@ user-supplied routine @/
|
|
// delete pWd;
|
|
// .CE
|
|
//
|
|
// INCLUDE FILES: vxwWdLib.h
|
|
//
|
|
// SEE ALSO: wdLib, logLib,
|
|
// .pG "Basic OS",
|
|
// .pG "C++ Development"
|
|
//
|
|
// SECTION: 1C
|
|
//
|
|
|
|
#ifndef vxwWdLib_h
|
|
#define vxwWdLib_h
|
|
|
|
#include "vxWorks.h"
|
|
#include "wdLib.h"
|
|
#include "vxwObject.h"
|
|
#include "vxwErr.h"
|
|
|
|
|
|
class VXWWd : virtual public VXWIdObject
|
|
{
|
|
public:
|
|
|
|
//_ VXWWd Public Constructors
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VXWWd::VXWWd - construct a watchdog timer
|
|
//
|
|
// This routine creates a watchdog timer.
|
|
//
|
|
// RETURNS: N/A
|
|
//
|
|
// SEE ALSO: VXWWd::~VXWWd()
|
|
|
|
VXWWd ()
|
|
: wd_ (wdCreate ())
|
|
{
|
|
if (wd_ == 0)
|
|
vxwThrowErrno ();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VXWWd::VXWWd - construct a watchdog timer
|
|
//
|
|
// This routine creates a watchdog timer from an existing WDOG_ID.
|
|
//
|
|
// RETURNS: N/A
|
|
//
|
|
// SEE ALSO: VXWWd::~VXWWd()
|
|
|
|
VXWWd (WDOG_ID aWdId)
|
|
: wd_ (aWdId)
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VXWWd::~VXWWd - destroy a watchdog timer
|
|
//
|
|
// This routine destroys a watchdog timer. The watchdog will be removed
|
|
// from the timer queue if it has been started.
|
|
//
|
|
// RETURNS: N/A
|
|
//
|
|
// SEE ALSO: VXWWd::VXWWd()
|
|
|
|
~VXWWd ()
|
|
{
|
|
if (wdDelete (wd_) != OK)
|
|
vxwThrowErrno ();
|
|
}
|
|
|
|
//_ VXWWd Public Member Functions
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VXWWd::cancel - cancel a currently counting watchdog
|
|
//
|
|
// This routine cancels a currently running watchdog timer by
|
|
// zeroing its delay count. Watchdog timers may be canceled from interrupt
|
|
// level.
|
|
//
|
|
// RETURNS: OK, or ERROR if the watchdog timer cannot be canceled.
|
|
//
|
|
// SEE ALSO: VXWWd::start()
|
|
//
|
|
|
|
STATUS cancel ()
|
|
{
|
|
return wdCancel (wd_);
|
|
}
|
|
|
|
STATUS show () const
|
|
{
|
|
return wdShow (wd_);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VXWWd::start - start a watchdog timer
|
|
//
|
|
// This routine adds a watchdog timer to the system tick queue. The
|
|
// specified watchdog routine will be called from interrupt level after
|
|
// the specified number of ticks has elapsed. Watchdog timers may be
|
|
// started from interrupt level.
|
|
//
|
|
// To replace either the timeout <delay> or the routine to be executed,
|
|
// call VXWWd::start() again; only the most recent
|
|
// VXWWd::start() on a given watchdog ID has any effect. (If your
|
|
// application requires multiple watchdog routines, use VXWWd::VXWWd() to
|
|
// generate separate a watchdog for each.) To cancel a watchdog
|
|
// timer before the specified tick count is reached, call VXWWd::cancel().
|
|
//
|
|
// Watchdog timers execute only once, but some applications require
|
|
// periodically executing timers. To achieve this effect, the timer
|
|
// routine itself must call VXWWd::start() to restart the timer on each
|
|
// invocation.
|
|
//
|
|
// WARNING: The watchdog routine runs in the context of the
|
|
// system-clock ISR; thus, it is subject to all ISR restrictions.
|
|
//
|
|
// RETURNS: OK, or ERROR if the watchdog timer cannot be started.
|
|
//
|
|
// SEE ALSO: VXWWd::cancel()
|
|
//
|
|
|
|
STATUS start (int delay, FUNCPTR pRoutine, int parameter)
|
|
{
|
|
return wdStart (wd_, delay, pRoutine, parameter);
|
|
}
|
|
|
|
protected:
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VXWWd::VXWWd (const VXWWd &) - copy constructor
|
|
//
|
|
// RETURNS: N/A
|
|
//
|
|
// NOMANUAL
|
|
//
|
|
|
|
VXWWd (const VXWWd & aWd)
|
|
: wd_ (aWd.wd_)
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VXWWd::operator=(const VXWWd &) - assignment operator
|
|
//
|
|
// RETURNS: reference to <this>
|
|
//
|
|
// NOMANUAL
|
|
//
|
|
|
|
VXWWd & operator = (const VXWWd & aWd)
|
|
{
|
|
wd_ = aWd.wd_;
|
|
return *this;
|
|
}
|
|
virtual void * myValue ();
|
|
WDOG_ID wd_;
|
|
};
|
|
|
|
#endif /* ifndef vxwWdLib_h */
|