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

Визуализация статистики времени выполнения с использованием FreeRTOS и Atollic TrueSTUDIO Pro

 этой статье мы расскажем, как заставить работать статистику времени выполнения в Atollic TrueSTUDIO Pro 8.1.0.

Существует три шага для настройки системы, чтобы статистика во время выполнения отображалась в окне отладки Atollic TrueSTUDIO с поддержкой ядра.

1. Настройте аппаратный таймер

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

Таймер, используемый для сбора этой статистики, должен использовать более высокое разрешение по времени, чем прерывание по тику, которое управляет планировщиком, в противном случае статистика будет слишком неточной или даже бесполезной. FreeRTOS рекомендует, чтобы временная база была в 10-100 раз быстрее, чем прерывание по тику, как указано на веб-сайте FreeRTOS:

«Чем быстрее будет временная база, тем точнее будет статистика - но также и раньше значение таймера будет переполнено». Сайт FreeRTOS

В этом примере мы будем использовать STM32F429I-Discovery и старые API драйвера встроенного ПО Std Periph. Мы установим базовый таймер (TIMER7) для генерации прерывания обновления на каждом тике. Таймер будет работать на частоте ~ 20 кГц, что должно быть в порядке, так как он находится в диапазоне в 10-100 раз быстрее, чем прерывание по тику. Поддержка отладчика с поддержкой ядра TrueSTUDIO  показывает относительное значение времени выполнения, а не абсолютное значение в мс.

void SetupRunTimeStatsTimer(void)
{
  /* Set interrupt priority and enable TIMER7 interrupt in NVIC */

NVIC_SetPriority(TIM7_IRQn, NVIC_PriorityGroup_0);
  NVIC_EnableIRQ(TIM7_IRQn);

/* Clock the TIMER7 peripheral */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
  TIM_TimeBaseInitTypeDef TimBaseStruct;
  /* Setup a pre-scaler (PSC) and a timer period (ARR) to generate an interrupt at ~20KHz */
  TimBaseStruct.TIM_Prescaler = 0x1194;
  TimBaseStruct.TIM_Period = 0x1;
  TIM_TimeBaseInit(TIM7, &TimBaseStruct);
  TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);

  /* Start TIMER7 */

  TIM_Cmd(TIM7, ENABLE);
}

2. Включить статистику во время выполнения в FreeRTOSConfig.h

Следующие макросы должны быть определены:

#define configUSE_TRACE_FACILITY                   1
#define configGENERATE_RUN_TIME_STATS              1

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

Когда проект создается с символом configGENERATE_RUN_TIME_STATS, установленным в 1 , функция API vTaskStartScheduler () будет содержать вызов макроса portCONFIGURE_TIMER_FOR_RUN_TIME_STATS () . С помощью этого вызова пользователь может назначить функцию для вызова аппаратного таймера. Ранее мы определили функцию с именем SetupRunTimeStatsTimer (), которая будет использоваться. Поэтому добавьте следующие макросы в ваш FreeRTOSConfig.h:

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()   SetupRunTimeStatsTimer()

Также добавьте переменную, которую можно увеличить с помощью HW-таймера и использовать для определения того, сколько времени выполнения затрачивается на каждую задачу. В FreeRTOSConfig.h добавьте:

#define portGET_RUN_TIME_COUNTER_VALUE()           ulHighFrequencyTimerTicks

 

3. Увеличьте счетчик таймера

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

volatile unsigned long ulHighFrequencyTimerTicks = 0;

void TIM7_IRQHandler(void)
{
    /* Clear the pending bit in NVIC and TIMER7 */
    NVIC_ClearPendingIRQ(TIM7_IRQn);
    TIM_ClearITPendingBit(TIM7, TIM_IT_Update);

    /* Increment the counter used to mease execution time */
    ulHighFrequencyTimerTicks++;
}

Теперь начните сеанс отладки и попробуйте статистику во время выполнения!

Если вам удалось зайти так далеко, вы теперь сможете увидеть статистику времени выполнения в представлении списка задач FreeRTOS в TrueSTUDIO Pro. Это может выглядеть примерно так:

freertos_run_time_stat.png

Возможно, вам придется настроить частоту вашего таймера, чтобы найти наиболее подходящее разрешение для вашего приложения.

В столбце «Время выполнения» по-прежнему не указаны числа , только N / A, даже если вы подробно следовали этому руководству? Эта проблема может возникнуть, если вы строите свой проект с оптимизацией выше -O0 . Причина вполне вероятна в объявлении ulTutoralRunTime в tasks.c

#if ( configGENERATE_RUN_TIME_STATS == 1 )

	PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL;	/*< Holds the value of a timer/counter the last time a task was switched in. */
	PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL;		/*< Holds the total amount of execution time as defined by the run time counter clock. */

#endif

Либо объявите переменную как volatile:

PRIVILEGED_DATA volatile static uint32_t ulTotalRunTime = 0UL;		/*< Holds the total amount of execution time as defined by the run time counter clock. */

Или просто измените уровень оптимизации только для tasks.c, щелкнув его правой кнопкой мыши в Проводнике -> Свойства -> Сборка C / C ++ -> Настройки -> Настройки инструмента -> Оптимизация -> Уровень оптимизации == -O0.

 

Удачной отладки с Atollic TrueSTUDIO Pro и FreeRTOS!

Темы: freertos , stastistics во время выполнения , отладка с учетом ядра , профилирование

Добавить комментарий

Обратная связь

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

пишите мне на netdm@mail.ru