Отладка FreeRTOS в Eclipse, TrueStudio и CubeIDE
Небольшая заметка о плагине, с помощью которого можно отслеживать ресурсы потребляемые задачами FreeRTOS.
Первым делом установим плагин, я буду это делать в CubeIDE (в Eclipse и TrueStudio процесс точно такой же).
Переходим в меню
В появившемся окне нажимаем кнопочку
http://freescale.com/lgfiles/updates/Eclipse/KDS
Нажимаем кнопку
Нажимаем
Жмём
После рестарта всё будет готово к работе. На этом установка закончена.
Теперь открываем проект с FreeRTOS, идём в файл
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_TRACE_FACILITY 1
#define configRECORD_STACK_HIGH_ADDRESS 1
Ещё может потребоваться отключить совместимость со старыми версиями…
#define configENABLE_BACKWARD_COMPATIBILITY 0
У меня работает и так и так.
Если работаете в Кубе, тогда включите (Enabled) это в разделе
Далее пересобираем проект и запускаем отладку. IDE переключится на перспективу отладки, в меню которой появился новый пункт —
Тыкаем по очереди все четыре пункта, и у нас появятся соответствующие вкладки…
Task List
Выбираем вкладку
Semaphore_hcs301 = xSemaphoreCreateBinary();
if(Semaphore_hcs301 == NULL)
{
My_Error_Handler(1);
}
vQueueAddToRegistry(Semaphore_hcs301, "sem_hcs301"); // присвоили имя семафору
Помимо этого нужно чтоб значение
Первым делом нужно настроить какой-нибудь таймер для отсчёта микросекунд…
Предделитель указан исходя из того, что системная частота равна 72МГц. Этот таймер будет просто тикать, а FreeRTOS будет смотреть сколько он насчитал микросекунд.
Далее, предполагается что в настройках FreeRTOS в Кубе вы выбрали CMSIS_V2…
У вас должен был создаться файл
Объявим в этом файле переменную структуры таймера как extern…
/* USER CODE BEGIN Variables */
extern TIM_HandleTypeDef htim3;
/* USER CODE END Variables */
В первую функцию добавим запуск таймера…
__weak void configureTimerForRunTimeStats(void)
{
HAL_TIM_Base_Start(&htim3);
}
А во вторую вот такой код…
__weak unsigned long getRunTimeCounterValue(void)
{
static unsigned long counter = 0;
counter += __HAL_TIM_GET_COUNTER(&htim3);
__HAL_TIM_SET_COUNTER(&htim3, 0);
return counter;
}
Переменная
Если хотите, можете перенести эти функции куда вам удобнее, без атрибута
На этом настройка закончена и можно посмотреть что получилось. Однако есть один нюанс, если у вас включена оптимизация, то вы опять увидите всё те же жёлтенькие значки.
Можно конечно отключить оптимизацию, это делается в свойствах проекта…
… но лучше всё таки устранить эту проблему.
Тут дело вот в чём, в недрах FreeRTOS есть переменная, которая отвечает за наш счётчик микросекунд, а компилятор почему-то оптимизирует её и тем самым портит всю «малину». Чтобы это дело исправить, нужно найти в файле
Конкретно нас интересует переменная
#if ( configGENERATE_RUN_TIME_STATS == 1 )
PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL;
PRIVILEGED_DATA static
#ifdef __GNUC__
__attribute__((used))
#endif
uint32_t ulTotalRunTime = 0UL;
#endif
Опять же, помните что при перегенерации проекта в Кубе, это затрётся.
Ну, а теперь компилируем проект, жмём дебаг и смотрим что получилось…
HEX значение, это количество микросекунд, которое потратила каждая из задач с момента старта программы до того как мы нажали паузу.
Программа у меня работала около 10 секунд, из них задача
Задача
Задача
Больше всех работала задача IDLE, то есть можно сказать что программа практически ничего не делала.
Теперь загрузим задачу
void StartDefaultTask(void *argument)
{
for(;;)
{
for(volatile uint32_t i = 0; i < 10000000; i++)
{
__NOP();
}
//osDelay(1);
}
}
И в результате получим совсем другую картину…
Из-за нашей ужасной конструкции задача
Queue List
Различная информация об очередях, семафорах и мьтексах. Думаю тут и без комментариев всё понятно. Чтоб они отображались, нужно присвоить им имена как написано выше.
Timer List
То же самое что и выше, только о программных таймерах. У меня там ничего не настроено поэтому показать нечего.
Heap Usage
Тут подробно об использовании «кучи», опять же думаю что объяснять нечего. Вначале общие данные — сколько использовано, сколько всего, а ниже как её раздербанили задачи.
Собственно это всё. Информацию я взял тут, там описываются ещё какие-то методы отладки, но я не стал разбираться.
Всем спасибо
Телеграм-чат istarik
Телеграм-чат STM32
- 0
- stD
19000
Поддержать автора
Комментарии (0)