Измерение времени переключения контекста

Знакомлюсь с ядром MicroC/OS-II и многозадачностью. Я запрограммировал следующие две задачи, использующие семафоры:

#define TASK1_PRIORITY      6  // highest priority
#define TASK2_PRIORITY      7

void task1(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task1, 0, &err);    
    int i;

    if (sharedAddress >= 0)
    {
        printText(text1);
        printDigit(++sharedAddress);
    }
    else
    {
        printText(text2);
        printDigit(sharedAddress);                      
    }  
    OSTimeDlyHMSM(0, 0, 0, 11);  
    OSSemPost(aSemaphore_task2);  
  }
}

void task2(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task2, 0, &err);    
    sharedAddress *= -1; 
    OSTimeDlyHMSM(0, 0, 0, 4);                                 
    OSSemPost(aSemaphore_task1);
  }
}

Теперь я хочу измерить время переключения контекста, то есть время, необходимое процессору для переключения между этими двумя задачами.

Это делается с помощью функции timer(), например:

void task1(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task1, 0, &err);    
    int i;

    if (sharedAddress >= 0)
    {
        printText(text1);
        printDigit(++sharedAddress);
    }
    else
    {
        printText(text2);
        printDigit(sharedAddress);                      
    }    
     OSTimeDlyHMSM(0, 0, 0, 11);
     OSSemPost(aSemaphore_task2);
     timer(start);
  }
}

void task2(void* pdata)
{
  while (1)
  { 
    timer(stop):
    INT8U err;
    OSSemPend(aSemaphore_task2, 0, &err);    
    sharedAddress *= -1;  
    OSTimeDlyHMSM(0, 0, 0, 4);                                
    OSSemPost(aSemaphore_task1);
  }
}

или я совсем не так понял?


person Smajjk    schedule 06.10.2012    source источник
comment
Во-первых, можете ли вы гарантировать, что эти две задачи будут постоянно выполняться на одном и том же ядре ЦП? Затем давайте подумаем об измерении продолжительности переключения контекста.   -  person lashgar    schedule 06.10.2012
comment
Да, он работает на одном и том же ядре все время.   -  person Smajjk    schedule 06.10.2012
comment
Существует функция clock(), возвращающая текущие такты часов, прошедшие с момента запуска приложения. Вы можете использовать его вместо времени. Обратитесь к этой ссылке для использования: cplusplus.com/reference/clibrary/ctime/clock< /а>   -  person lashgar    schedule 06.10.2012
comment
Есть ли в ядре инструменты для этого? Вполне может. Одной из действительно удобных вещей VxWorks, когда я в последний раз пользовался ею, был инструмент WindView — он позволял вам фиксировать события ядра, а затем отображать их на графике, чтобы вы могли точно видеть, когда происходило переключение контекста и сколько времени оно занимало. Можно с уверенностью сказать, что за прошедшие годы другие RTOS получили эту функциональность.   -  person marko    schedule 07.10.2012
comment
можно ли найти функцию переключения контекста? Возможно, вы сможете посмотреть на количество инструкций, необходимых для переключения, и вывести из этого время.   -  person Josh Petitt    schedule 04.02.2013


Ответы (3)


Боюсь, вы не сможете измерить время переключения контекста ни с одним из примитивов µC/OS. Время переключения контекста слишком мало, чтобы его можно было измерить с помощью программных таймеров микроСи/ОС, которые, скорее всего, основаны на кратном системном такте (следовательно, на несколько мс), даже если оно зависит от конкретного порта микроСи/ОС на ваш ЦП. архитектура.

Вам нужно будет получить прямой доступ к аппаратному таймеру вашего процессора - вы, вероятно, захотите настроить его частоту на максимальную, которую он может выдержать. Установите его в качестве автономного таймера (вам не нужны никакие прерывания) и используйте его значение счетчика в качестве временной базы для измерения времени переключения.

Или вы можете прочитать ASM OS_TASK_SW() для вашей архитектуры и вычислить необходимое количество циклов;)

person Pepito    schedule 05.03.2013

Для измерения производительности стандартный подход заключается в том, чтобы сначала откалибровать ваши инструменты. В данном случае это ваш таймер или предлагаемые часы (если вы используете C++).

Чтобы откалибровать его, вам нужно вызвать его много раз (например, 1000) и посмотреть, сколько времени в среднем занимает каждый из них. Теперь вы знаете цену измерения времени. В этом случае он, скорее всего, будет находиться в диапазоне (в лучшем случае) похожем на функцию, которую вы пытаетесь измерить, — переключение контекста.

Так что калибровка важна.

Дайте нам знать, как вы идете.

person andy256    schedule 06.10.2012

Вы можете использовать OSTimeGet API для получения времени выполнения. uCOS не использует функцию timer() для получения времени выполнения.

person Himanshu Singh    schedule 04.02.2013