Domanda

I'm trying to code a program in vxworks. When a task total delay is 400 ticks, it was suspended at the 100th tick for 20 ticks, then resume to delay.

My main code is like the following:

void  DelaySuspend (int level)
    {

    int tid, suspend_start,suspend_end,i;

    suspend_start = vxTicks + 100;
    suspend_end = vxTicks + 120;
    i = vxTicks;

    /* myfunction has taskDelay(400)*/
    tid = taskSpawn("tMytask",200,0,2000,(FUNCPTR)myfunction,0,0,0,0,0,0,0,0,0,0);

    /* tick between vxTicks+100 and vxTicks+120,suspend tMytask*/

    while (i<suspend_start)
    {
        i=tickGet();
    }

    while (i <= suspend_end &&i >= suspend_start) 
    {   
         i = tickGet();
         taskSuspend(tid);
    }
}

What I want is to verify total delay time(or tick) doesn't change even I suspend the task for some time. I know the answer but just try to program it to show how vxWorks does it.

È stato utile?

Soluzione

I am still not 100% clear on what you are trying to do, but calling taskSuspend in a loop like that isn't going to suspend the task any more. I am guessing you want something like this:

void  DelaySuspend (int level)
{

    int tid, suspend_start,suspend_end,i;

    suspend_start = vxTicks + 100;
    suspend_end = vxTicks + 120;
    i = vxTicks;

    /* myfunction has taskDelay(400)*/
    tid = taskSpawn("tMytask",200,0,2000,(FUNCPTR)myfunction,0,0,0,0,0,0,0,0,0,0);

    /* tick between vxTicks+100 and vxTicks+120,suspend tMytask*/

    while (i<suspend_start)
    {
        i=tickGet();
    }

    taskSuspend(tid);
    while (i <= suspend_end &&i >= suspend_start) 
    {   
         i = tickGet();
    }
}

I just pulled the taskSuspend out of the loop, maybe you also want a taskResume in there after the loop or something? I am not sure what you are attempting to accomplish.

Whatever the case, there are probably better ways to do whatever you want, in general using taskSuspend is a bad idea because you have no idea what the task is doing when you suspend it. So for example if the suspended task is doing File I/O when you suspend it, and it has the file system mutex, then you cannot do any file I/O until you resume that task...

In general it is much better to block on a taskDelay/semaphore/mutex/message queue than use taskSuspend. I understand that this is just a test, and as such doing this may be ok, but if this test becomes production code, then you are asking for problems.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top