C - Сторожевой таймер не запускается или не вызывает функцию обратного вызова

Я создаю программу 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 */  
}

Будем очень признательны за любые идеи о том, что может быть причиной того, что мой сторожевой таймер не запускается или не вызывает обратный вызов функции.

Большое спасибо.


person LukeO    schedule 23.03.2018    source источник
comment
'пока (1)'......   -  person Martin James    schedule 23.03.2018


Ответы (2)


Основная проблема здесь в том, что вы постоянно перезапускаете таймер внутри своей задачи. smallObject выполняет бесконечный цикл и каждый раз вызывает wdStart. Единственный раз, когда он этого не сделает, — это если вызов wdStart завершится неудачно, и в этом случае задача завершится.

Вызов wdStart для уже запущенного таймера приводит к перезапуску таймера. Таким образом, он постоянно перезапускается и, таким образом, никогда не истекает время ожидания.

person mjs    schedule 27.03.2018

Вы поместили wdStart() в свой цикл while, из-за чего он всегда вызывал его, и у таймера WatchDog нет шансов истечь время ожидания.

person Jianhui Wang    schedule 04.04.2018