You are here

Статистика времени выполнения

Перевод может содержать ошибки. Читайте первоисточник: Run Time Statistics

Назад: [Более подробно...] Вверх: [Более подробно...] Вперёд: [Более подробно...]

 

Кликните для увеличения

Определение

FreeRTOS может дополнительно собирать информацию о количестве времени работы, которое было использовано каждой задачей. Затем можно использовать функция API vTaskGetRunTimeStats() для представления этой информации в табличном виде, как показано на рисунке справа.

Для каждой задачи выводится два значения:

  1. Abs Time (Абсолютное время)

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

  2. % Time (Процентное время)

    Это показывает, по-сути, ту же информацию, но в процентах от общего времени работы, а не абсолютные значения времени работы.

 

Конфигурация и использование

Для сбора статистики необходимы три макроса. Они могут быть определены в файле FreeRTOSConfig.h.

  1. configGENERATE_RUN_TIME_STATS

    Сбор статистики времени выполнения включается установкой значения константы configGENERATE_RUN_TIME_STATS в 1. После того, как это сделано, необходимо определить два других макроса для успешной компиляции проекта.

  2. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()

    ВременнАя база статистики должна иметь большее разрешение, чем прерывание тиков ОС, иначе статистика может иметь слишком большую погрешность, чтобы приносить пользу. Рекомендуется делать временнУю базу в 10-100 раз быстрее, чем прерывания тиков ОС. Чем быстрее временнАя база, тем точнее статистика, но тем быстрее переполнится таймер.

    Если configGENERATE_RUN_TIME_STATS установлен в 1, то ядро ОС будет автоматически вызывать макрос portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() при его запуске. Он вызывается из функции API vTaskStartScheduler(). Предполагается, что разработчик приложения использует макрос для настройки временнОй базы. Некоторые примеры приведены ниже.

  3. portGET_RUN_TIME_COUNTER_VALUE()

    Этот макрос должен просто возвращать текущее "время", как настроено в portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(). Некоторые примеры также приведены ниже.

Извлечение собранной статистики осуществляется функцией API vTaskGetRunTimeStats().

 

Примеры

[Среди многих других] Демонстрационные приложения вебсервера LPC17xx LPCXpresso и LM3Sxxxx Eclipse настроены для сбор и отображение статистики времени выполнения.

Пример для LM3Sxxxx

Демонстрационное приложение для LM3Sxxxx под Eclipse показывает тестирование таймера с частотой 20 кГц. Обработчик прерывания реализован так, чтобы увеличивать переменную ulHighFrequencyTimerTicks при каждом выполнении. Поэтому portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() просто устанавливает переменной значение 0, а portGET_RUN_TIME_COUNTER_VALUE() возвращает это значение. Для реализации этого в файле FreeRTOSConfig.h добавлено несколько новых строк:

/*----------------------------------------------------------------------------*/
extern volatile unsigned long ulHighFrequencyTimerTicks;
/* ulHighFrequencyTimerTicks увеличивается на 1 с частотой 20кГц. Просто
сбрасываем её обратно в 0. */
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL )
/* Возвращаем текущее значение переменной ulHighFrequencyTimerTicks. */
#define portGET_RUN_TIME_COUNTER_VALUE()	 ulHighFrequencyTimerTicks

 
Пример для LPC17xx

Демонстрационное приложения для LPC17xx не включает в себя тестирование высокоскоростного таймера, поэтому portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() используется для настройки периферийного таймера 0 для выработки временнОй базы. portGET_RUN_TIME_COUNTER_VALUE() просто возвращает значение периферифного таймера 0. Эта реализация использует функции и макросы.

/*----------------------------------------------------------------------------*/
/* Определяем функцию vConfigureTimerForRunTimeStats() в файле main.c. */
void vConfigureTimerForRunTimeStats( void )
{
const unsigned long TCR_COUNT_RESET = 2,
                    CTCR_CTM_TIMER = 0x00,
                    TCR_COUNT_ENABLE = 0x01;

    /* Power up and feed the timer with a clock. */
    PCONP |= 0x02UL;
    PCLKSEL0 = (PCLKSEL0 & (~(0x3<<2))) | (0x01 << 2);

    /* Reset Timer 0 */
    T0TCR = TCR_COUNT_RESET;

    /* Just count up. */
    T0CTCR = CTCR_CTM_TIMER;

    /* Prescale to a frequency that is good enough to get a decent resolution,
    but not too fast so as to overflow all the time. */
    T0PR =  ( configCPU_CLOCK_HZ / 10000UL ) - 1UL;

    /* Start the counter. */
    T0TCR = TCR_COUNT_ENABLE;
}

/*----------------------------------------------------------------------------*/
/* Определяем макросы в файле FreeRTOSConfig.h. */
extern void vConfigureTimerForRunTimeStats( void );
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE() T0TC

 
Hobby's category: