Я создаю программу VxWorks, используя Wind River Workbench 3.3.
Программа требует, чтобы я использовал сторожевые таймеры, однако у меня возникли проблемы с запуском таймеров.
Ниже приведен фрагмент моего кода. Как видите, в основной функции я создаю свой сторожевой таймер (wdCreate()), и таймер запускается в функции smallObject (wdStart()). Я убедился, что мой код действительно достигает функции smallObject, как предполагалось.
Я установил функцию обратного вызова таймера на функцию с именем closeOpenGates(), однако таймер никогда не вызывает эту функцию по прошествии какого-либо времени.
Я включил необходимый заголовочный файл '#include "wdLib.h".
#include "vxWorks.h"
#include "sysLib.h"
#include "taskLib.h"
#include "stdio.h"
#include "stdlib.h"
#include "cinterface.h"
#include "semLib.h"
#include "wdLib.h"
#include “msgQLib.h”
SEM_ID smallObjectSem;
SEM_ID largeObjectSem;
WDOG_ID gateTimer; /* Gate timer */
int gateTimerI
void main (void)
{
char sizeSensorState;
int res;
startMotor(); /* Begins the motor to turn the conveyors */
/* Create the task for handling detected small objects */
int smallObjectTask;
smallObjectTask = taskSpawn("Small Object Task", 100, 0, 20000, (FUNCPTR)smallObject, 0,0,0,0,0,0,0,0,0,0);
gateTimer = wdCreate(); /* Create a timer for when to close the gate */
if (gateTimer == NULL)
{
printf("\n\nCannot create the gate timer! Terminating task...\n");
exit(0);
}
void smallObject(void)
{
while (1)
{
smallObjectDetect0++; /* Increase the detected small object count by 1 */
/* Start a timer for 3.5s - how long it takes the object to reach the gates */
gateTimerInt = wdStart(gateTimer, 3.5 * sysClkRateGet(), (FUNCPTR)closeOpenGate, 0);
if (gateTimerInt == ERROR)
{
printf("Cannot start the gate timer! Terminating task...");
exit(0);
}
else printf("\nTimer started successfully");
}
}
void closeOpenGate (void)
{
printf("\n Small Timer Successful");
setGates(1); /* Close the gate on Conveyor 0 */
taskDelay(1.5 * sysClkRateGet()); /* Wait for 1.5s to allow the small object to fall off */
setGates(0); /* Reopen the gate */
}
Будем очень признательны за любые идеи о том, что может быть причиной того, что мой сторожевой таймер не запускается или не вызывает обратный вызов функции.
Большое спасибо.