0

我正在尝试在 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 是如何做到的。

4

1 回答 1

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

一般来说,阻塞任务延迟/信号量/互斥/消息队列比使用任务挂起要好得多。我知道这只是一个测试,因此这样做可能没问题,但如果这个测试成为生产代码,那么你就是在问问题。

于 2013-01-31T17:29:19.390 回答