2015-06-22 7 views
1

Я хочу измерить накладные расходы на время переключения контекста.FreeRTOS: Как измерить время переключения контекста?

Вот моя идея, чтобы сделать это:

Есть две задачи:

  1. Таска
  2. простаивает

создать задачу, как показано ниже:

void calculate_ct(void *pvParameters) 
{ 
    int i = 0; 
    for(; i < 100; i++) 
    { 
     vTaskDelay(100/portTICK_RATE_MS); // delay 100 ms 
    }  
    // get_time(); 
    vTaskDelete(NULL); 
} 

Когда задача ca lt vTaskDelay(), он превратится в состояние блока. Это означает, что вы делаете context switch бездействующей задаче.

Могу ли я использовать get_time() в конце и минус время задержки (10 * 100 мс), чтобы получить общие накладные расходы на время переключения контекста и сделать разбиение на служебные данные на 10, чтобы получить среднее значение издержки времени переключения контекста ?

время получить(), как показано ниже:

unsigned int get_reload() 
{ 
    return *(uint32_t *) 0xE000E014; 
} 

unsigned int get_current() 
{ 
    return *(uint32_t *) 0xE000E018; 
} 

unsigned int get_time() 
{ 
    static unsigned int const *reload = (void *) 0xE000E014; 
    static unsigned int const *current = (void *) 0xE000E018; 
    static const unsigned int scale = 1000000/configTICK_RATE_HZ; 
            /* microsecond */ 
    return xTaskGetTickCount() * scale + (*reload - *current) * (1.0)/(*reload/scale); 
} 

ответ

0

я бы, вероятно, пойти с двумя нитями, которые постоянно своп блок вокруг двух семафоров до некоторого количества не будет достигнуто. С достаточно высоким счетчиком вы можете время с секундомером, а затем делить на счет, чтобы получить интервал, который почти все время переключения контекста.

+0

Я пробую так, тоже. И я хочу попробовать, будет ли одна задача и незанятая задача переключаться на контекст, чтобы я мог их измерять или нет. –

1

Во-первых, информация, которая не является специфической для FreeRTOS:

Большинство попыток измерить время переключения контекста измерения времени для выполнения функции, что происходит иметь переключение контекста в нем. Поэтому время, которое вы измеряете, будет зависеть от выбранной вами функции и не связано с временем переключения контекста. Это верно при измерении времени для одной RTOS, это сложнее при попытке сравнить RTOS, поскольку выбранные функции будут включать в себя очень разные функциональные возможности в разных RTOS-системах, что делает сравнение в значительной степени бесполезным, хотя люди этого не понимают, и принимают это «абсолютный». В конце концов, способ получить самое быстрое время переключения - удалить всю функциональность или сломать политику планирования, чтобы меньше было нужно выполнить логику.

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

Тогда FreeRTOS конкретные детали:

Информация о количестве циклов, принимаемых в контексте переключателя показано здесь: http://www.freertos.org/FAQMem.html#ContextSwitchTime. Вам необходимо настроить систему следующим образом:

Установите configUSE_PORT_OPTIMISED_TASK_SELECTION в 1 - который будет использовать одну или несколько инструкций asm для выбора следующей задачи для запуска, вместо использования общей реализации C.

Установить configCHECK_FOR_STACK_OVERFLOW в 0 - это позволит удалить проверку переполнения стека, которая представляет собой самую длинную вещь, которая выполняется в контекстном коммутаторе.

Убедитесь, что оптимизация компилятора настроена на оптимизацию скорости.

Убедитесь, что макросы трассировки не определены. Макросы трассировки добавляют код в ядро.

Убедитесь, что configGENERATE_RUN_TIME_STATS установлен в 0 - это позволит удалить код, который собирает статистику.

FreeRTOS включает макросы трассировки, которые позволяют вставлять код в контекстный переключатель. Вы можете использовать эти макросы для установки выходов, которые затем могут быть измерены в области. Это позволит вам измерять контекстный переключатель, а не прерывать время входа, но вы также будете измерять время, затраченное на установку или очистку выходного файла, который будет варьироваться от архитектуры до архитектуры.

Вы хотите измерить время переключения контекста или время выполнения функции, в которой есть контекстный переключатель?

+0

Я не понимаю, как его измерить. Что это такое: «Если вы хотите измерить время переключения контекста, то просто измерить это» означает? –

+0

Простая задача может рассматриваться как другая задача, не так ли? Поэтому я думаю, что две задачи (block -> idle -> resume -> block -> idle) имеют контекстный переключатель. Это правда? могу ли я измерить таким образом? –