C - 看门狗定时器未启动或调用回叫功能

时间:2018-03-23 08:14:55

标签: c timer vxworks watchdog

我正在使用Wind River Workbench 3.3创建一个VxWorks程序。

该程序要求我使用看门狗定时器,但是我在定时器启动时遇到了问题。

下面是我的一些代码的片段。正如您在main函数中看到的,我创建了Watchdog Timer(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 */  
}

任何关于可能导致我的看门狗定时器无法启动或回调函数的想法都将非常感激。

非常感谢。

2 个答案:

答案 0 :(得分:0)

这里的主要问题是你在任务中不断重启计时器。 smallObject执行无限循环,并且每次调用wdStart。 唯一不会这样做的是,如果对wdStart的调用失败,那么任务将退出。

在已经运行的计时器上调用wdStart,具有重新启动计时器的效果。因此,它不断重新启动,因此永远不会超时。

答案 1 :(得分:-1)

你把wdStart()放在你的while循环中导致它总是调用它,并且WatchDog定时器没有机会超时。