Перевод может содержать ошибки. Читайте первоисточник: Run Time Statistics
Назад: [Более подробно...] | Вверх: [Более подробно...] | Вперёд: [Более подробно...] |
FreeRTOS может дополнительно собирать информацию о количестве времени работы, которое было использовано каждой задачей. Затем можно использовать функция API vTaskGetRunTimeStats() для представления этой информации в табличном виде, как показано на рисунке справа.
Для каждой задачи выводится два значения:
Это полное время, в течение которого задача фактически выполнялась, т.е. общее время нахождения в состоянии "запущена". Пользователь может выбрать подходящую временнУю базу для своего приложения.
Это показывает, по-сути, ту же информацию, но в процентах от общего времени работы, а не абсолютные значения времени работы.
Для сбора статистики необходимы три макроса. Они могут быть определены в файле FreeRTOSConfig.h.
Сбор статистики времени выполнения включается установкой значения константы configGENERATE_RUN_TIME_STATS в 1. После того, как это сделано, необходимо определить два других макроса для успешной компиляции проекта.
ВременнАя база статистики должна иметь большее разрешение, чем прерывание тиков ОС, иначе статистика может иметь слишком большую погрешность, чтобы приносить пользу. Рекомендуется делать временнУю базу в 10-100 раз быстрее, чем прерывания тиков ОС. Чем быстрее временнАя база, тем точнее статистика, но тем быстрее переполнится таймер.
Если configGENERATE_RUN_TIME_STATS установлен в 1, то ядро ОС будет автоматически вызывать макрос portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() при его запуске. Он вызывается из функции API vTaskStartScheduler(). Предполагается, что разработчик приложения использует макрос для настройки временнОй базы. Некоторые примеры приведены ниже.
Этот макрос должен просто возвращать текущее "время", как настроено в 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