как приостановить работу на 200 тиков при задержке 400 тиков в 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.


person lim zhu    schedule 29.01.2013    source источник
comment
Какой результат вы хотите?   -  person Chris Desjardins    schedule 30.01.2013
comment
Я хочу, чтобы задачу можно было приостановить на время задержки, спасибо   -  person lim zhu    schedule 31.01.2013
comment
Все еще не ясно, можете ли вы опубликовать свой полный исходный код?   -  person Chris Desjardins    schedule 31.01.2013


Ответы (1)


Я все еще не на 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 — плохая идея, потому что вы понятия не имеете, что делает задача, когда вы ее приостанавливаете. Так, например, если приостановленная задача выполняет файловый ввод-вывод, когда вы ее приостанавливаете, и у нее есть мьютекс файловой системы, вы не можете выполнять файловый ввод-вывод, пока не возобновите эту задачу...

В общем, гораздо лучше заблокировать очередь задач, семафоров, мьютексов и сообщений, чем использовать taskSuspend. Я понимаю, что это просто тест, и поэтому это может быть нормально, но если этот тест станет производственным кодом, тогда вы напрашиваетесь на проблемы.

person Chris Desjardins    schedule 31.01.2013
comment
это выглядит идеально, я попробую и сообщу вам результат, вы правы, я добавлю taskResume в конце, чтобы задержка могла продолжаться. Просто начните изучать Vxworks, я еще не прикасался к sem. Я не должен помещать taskSuspend в цикл. Это моя БОЛЬШАЯ ошибка! - person lim zhu; 01.02.2013
comment
Цель состоит в том, чтобы убедиться, что taskSuspend не повлияет на время taskDelay, независимо от того, как долго вы приостанавливаете задачу, время taskDelay будет истекать после истечения тактов. - person lim zhu; 01.02.2013
comment
Сегодня попробовал, все та же проблема. Я хочу, чтобы отсрочка до задержки + приостановка до задержки. но код дал мне приостановить задержку. Кажется, что сначала выполняется приостановка, а затем задержка. Любая помощь - person lim zhu; 04.02.2013
comment
После того, как я изменил приоритет tMytask на 99 и набрал в оболочке sp DelaySuspend вместо DelaySuspend, все заработало. Я также должен сделать DelaySuspend как задачу, прежде чем он сможет приостановить tMytask. Также он должен быть выше, чем приоритет tMytask, чтобы tMytask мог задержаться первым. - person lim zhu; 11.02.2013