periodicdog.c

来自「Vxworks的培训教程,大家分享下啊,」· C语言 代码 · 共 110 行

C
110
字号
/* periodicDog.c - use watchdog for periodic exec.*//*DESCRIPTIONThis code uses watchdogs to bark at the console.No method is currently provided to kill all thewatchdogs!*/#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);	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?