如何在vxworks中延迟400滴答时暂停200个刻度

时间:2013-01-29 03:00:52

标签: vxworks

我正在尝试在vxworks中编写程序。当任务总延迟为400个滴答时,它会在第100个滴答处暂停20个滴答,然后恢复延迟。

我的主要代码如下:

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);
    }
}

我想要的是验证总延迟时间(或刻度)不会改变,即使我暂停任务一段时间。我知道答案但只是尝试编程以显示vxWorks是如何做到的。

1 个答案:

答案 0 :(得分:0)

我仍然不是100%清楚你要做什么,但是在这样的循环中调用taskSuspend不会再暂停任务了。我猜你想要这样的东西:

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();
    }
}

我只是把taskSuspend拉出循环,也许你还想在循环之后有什么taskResume?我不确定你想要完成什么。

无论如何,可能有更好的方法来做任何你想做的事情,一般来说使用taskSuspend是一个坏主意,因为你不知道当你暂停它时任务正在做什么。因此,例如,如果挂起的任务在挂起时执行文件I / O,并且它具有文件系统互斥,那么在恢复该任务之前,您无法执行任何文件I / O ...

通常,阻止taskDelay / semaphore / mutex / message队列比使用taskSuspend要好得多。我知道这只是一个测试,因此这样做可能没问题,但如果这个测试成为生产代码,那么你就是在寻找问题。