我正在尝试在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是如何做到的。
答案 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要好得多。我知道这只是一个测试,因此这样做可能没问题,但如果这个测试成为生产代码,那么你就是在寻找问题。