0

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.

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を実行できません...

一般に、taskSuspendを使用するよりも、taskDelay / semaphore / mutex/messageキューでブロックする方がはるかに優れています。これは単なるテストであり、それ自体は問題ないかもしれませんが、このテストが製品コードになる場合は、問題が発生していることを理解しています。

于 2013-01-31T17:29:19.390 に答える