Планирование задач

Моя система состоит из семи задач. Я создал демо-версию RTP, чтобы проверить мою систему следующим образом:

    int main()
    {
        taskSpawn("/task1" , 107 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task1, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task2" , 106 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task2, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task3" , 105 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task3, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task4" , 104 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task4, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task5" , 105 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task5, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task6" , 106 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task6, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task7" , 101 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task7, 0,0,0,0,0,0,0,0,0,0);

        taskExit(OK);
    }

void task1() { taskDelay(7); }
void task2() { taskDelay(13); }
void task3() { taskDelay(313); }
void task4() { taskDelay(19); }
void task5() { taskDelay(188); }
void task6() { taskDelay(10); }
void task7() { taskDelay(10); }

Я запустил RTP и подключил профилировщик производительности. Профилировщик производительности дал мне использование ЦП каждой задачи. Я хочу проверить, что каждая задача выполняется вовремя, например, я хочу убедиться, что task1 выполняет каждые 7 * 16 = 112 миллисенса (моя системная тактовая частота составляет 60HZ, что означает, что планировщик вызывается каждые 16 миллисекунд)

Вопросов: 1.Есть ли какой-либо способ в профилировщике сделать shure, это происходит. 2.Если не может это проверить?

Благодарю.

0
nl ja de

1 ответы

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

1) Создайте задачу с приоритетом = 255 (или ниже, чем любая ваша задача в реальном времени), которая потребляет 100% CPU следующим образом:


void lowPriTask()
{
    volatile int forever = 1;
    while (forever) {}
}

2) Установите крючок переключателя задачи с taskSwitchHookAdd (), и ваш обратный вызов на крючок коммутатора должен отслеживать (в памяти) старый taskId и новый taskId и tickGet (), в основном просто компилировать список этой информации в памяти.

3) Затем, когда вы запускаете свои задачи на некоторое время, выгружаете память в файл и выясняете какой-нибудь классный способ проверить/визуализировать ее, возможно, с помощью excel или так.

Причина этой задачи lowPri заключается в том, что в vxworks taskSwitchHook вызывается только при переключении задачи (очевидно), тонкая деталь заключается в том, что если система неактивна, тогда переключатель задачи не возникает. Поэтому, если вы отслеживаете время, когда задача включается и выключается, а система неактивна, тогда у вас появятся некоторые задачи, которые, как представляется, забивают кучу времени процессора, когда на самом деле система простаивает. Вот так:

  • taskSwitch_In
  • taskRuns
  • задача выполнена, но никакие другие задачи не готовы, поэтому система переходит в режим ожидания.
  • некоторые тики позже задача будет готова ...
  • taskSwitch_Out

Поэтому, если у вас есть задача с низким приоритетом, которая потребляет 100% времени простоя, то это всегда приводит к переключению задачи сразу после выполнения любой задачи (более высокий приоритет). Поэтому вы всегда видите такой шаблон:

  • taskSwitch_In
  • taskRuns
  • taskSwitch_Out (to lowPriTask в случае, если другая задача не готова)

В дополнение к этому он дает вам точную оценку того, сколько свободного времени существует в зависимости от времени, которое запускается этой задачей с низким приоритетом.

Это грубо, но это работает.

1
добавлено
Обновленный ответ ...
добавлено автор Chris Desjardins, источник
Привет, 1. Отличный инструмент для работы на ветре, называемый System viewer, который отлично подходит для отслеживания различных событий (например, контекстного переключателя). 2. Можете ли вы объяснить, почему вы порождаете lowPriTask? заранее спасибо
добавлено автор Alex, источник