www.pudn.com > vxWorks_Lab.rar > periodicDog.c


/* periodicDog.c - use watchdog for periodic exec.*/ 
/* 
DESCRIPTION 
This code uses watchdogs to bark at the console. 
 
No method is currently provided to kill all the 
watchdogs! 
*/ 
 
#include "vxWorks.h" 
#include "wdLib.h" 
#include "taskLib.h" 
#include "stdio.h" 
#include "logLib.h" 
#include "semLib.h" 
#include "sysLib.h" 
#include "fioLib.h" 
 
#define PERIOD1 (2*sysClkRateGet( )) 
#define PERIOD2 (3*sysClkRateGet( )) 
 
LOCAL int taskId;							/* task doing periodic work */ 
LOCAL SEM_ID semId;							/* synch. sem awaited by task*/ 
 
LOCAL WDOG_ID myWdId; 
 
LOCAL void myWdRoutine1  
	( 
	WDOG_ID myWdId 
	) 
	{ 
	wdStart (myWdId, PERIOD1,  
				(FUNCPTR) myWdRoutine1, (int) myWdId); 
	logMsg ("Bark bark bark\n", 0,0,0,0,0,0); 
	} 
 
LOCAL void myWdRoutine2 
	( 
	WDOG_ID myWdId 
	) 
	{ 
	wdStart (myWdId, PERIOD2, 
				(FUNCPTR) myWdRoutine2, (int) myWdId); 
	semGive (semId); 
	} 
 
LOCAL void workDoggie (void) 
	{ 
	FOREVER 
		{ 
		if (semTake (semId, WAIT_FOREVER) == ERROR) 
			{ 
			perror ("semTake"); 
			exit (ERROR); 
			} 
		logMsg ("Woof Woof Woof\n", 0,0,0,0,0,0); 
		} 
	} 
 
STATUS doggieStart  
	( 
	int type 
	) 
	{ 
	myWdId = wdCreate ( ); 
	if (myWdId == NULL) 
		{ 
		perror ("wdCreate"); 
		return (ERROR); 
		} 
 
	switch (type) 
		{ 
		case 1: 
			wdStart (myWdId, PERIOD1, 
				(FUNCPTR) myWdRoutine1, (int) myWdId); 
			break; 
		case 2: 
			if (taskId == 0) 
				{ 
				taskId = taskSpawn ("tDoggie", 60, 0, 
								10000,(FUNCPTR) workDoggie, 
								0,0,0,0,0,0,0,0,0,0); 
				if (taskId == NULL) 
					{ 
					perror ("taskSpawn"); 
					wdDelete (myWdId); 
					return ERROR; 
					} 
 
				semId = semCCreate (SEM_Q_FIFO, 0); 
				if (semId == NULL) 
					{ 
					perror ("semCCreate"); 
					wdDelete (myWdId); 
					taskDelete (taskId); 
					return ERROR; 
					} 
				} 
			wdStart (myWdId, PERIOD2, 
				(FUNCPTR)myWdRoutine2, (int) myWdId); 
			break; 
		default: 
			wdDelete (myWdId); 
			printErr ("Invalid doggie type.\n"); 
			return ERROR; 
		} 
	return (OK); 
	}