📄 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -