Search code examples
vxworks

how to suspend for 200 ticks while delay 400 ticks in vxworks


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.


Solution

  • 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.