Отладка FreeRTOS в Eclipse, TrueStudio и CubeIDE
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/676c60.jpg)
Небольшая заметка о плагине, с помощью которого можно отслеживать ресурсы потребляемые задачами FreeRTOS.
Первым делом установим плагин, я буду это делать в CubeIDE (в Eclipse и TrueStudio процесс точно такой же).
Переходим в меню
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/2fead4.jpg)
В появившемся окне нажимаем кнопочку
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/b884a4.jpg)
http://freescale.com/lgfiles/updates/Eclipse/KDS
Нажимаем кнопку
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/ae8321.png)
Нажимаем
![](https://istarik.ru/uploads/images/00/00/01/2020/08/18/31a377.png)
Жмём
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/c56cd1.png)
После рестарта всё будет готово к работе. На этом установка закончена.
Теперь открываем проект с 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 переключится на перспективу отладки, в меню которой появился новый пункт —
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/0cf7da.jpg)
Тыкаем по очереди все четыре пункта, и у нас появятся соответствующие вкладки…
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/00c047.jpg)
Task List
Выбираем вкладку
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/d54447.jpg)
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/66fe6d.jpg)
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/b804f8.jpg)
Semaphore_hcs301 = xSemaphoreCreateBinary();
if(Semaphore_hcs301 == NULL)
{
My_Error_Handler(1);
}
vQueueAddToRegistry(Semaphore_hcs301, "sem_hcs301"); // присвоили имя семафору
Помимо этого нужно чтоб значение
Первым делом нужно настроить какой-нибудь таймер для отсчёта микросекунд…
![](http://istarik.ru/uploads/images/00/00/01/2020/08/19/6f9818.jpg)
Предделитель указан исходя из того, что системная частота равна 72МГц. Этот таймер будет просто тикать, а FreeRTOS будет смотреть сколько он насчитал микросекунд.
Далее, предполагается что в настройках FreeRTOS в Кубе вы выбрали CMSIS_V2…
![](http://istarik.ru/uploads/images/00/00/01/2020/08/19/282aed.jpg)
У вас должен был создаться файл
![](http://istarik.ru/uploads/images/00/00/01/2020/08/19/7ea444.jpg)
Объявим в этом файле переменную структуры таймера как 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;
}
Переменная
Если хотите, можете перенести эти функции куда вам удобнее, без атрибута
На этом настройка закончена и можно посмотреть что получилось. Однако есть один нюанс, если у вас включена оптимизация, то вы опять увидите всё те же жёлтенькие значки.
Можно конечно отключить оптимизацию, это делается в свойствах проекта…
![](http://istarik.ru/uploads/images/00/00/01/2020/08/19/bd030a.png)
… но лучше всё таки устранить эту проблему.
Тут дело вот в чём, в недрах FreeRTOS есть переменная, которая отвечает за наш счётчик микросекунд, а компилятор почему-то оптимизирует её и тем самым портит всю «малину». Чтобы это дело исправить, нужно найти в файле
![](http://istarik.ru/uploads/images/00/00/01/2020/08/19/dbff47.jpg)
Конкретно нас интересует переменная
#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
Опять же, помните что при перегенерации проекта в Кубе, это затрётся.
Ну, а теперь компилируем проект, жмём дебаг и смотрим что получилось…
![](http://istarik.ru/uploads/images/00/00/01/2020/08/19/c4722f.jpg)
HEX значение, это количество микросекунд, которое потратила каждая из задач с момента старта программы до того как мы нажали паузу.
Программа у меня работала около 10 секунд, из них задача
Задача
Задача
Больше всех работала задача IDLE, то есть можно сказать что программа практически ничего не делала.
Теперь загрузим задачу
void StartDefaultTask(void *argument)
{
for(;;)
{
for(volatile uint32_t i = 0; i < 10000000; i++)
{
__NOP();
}
//osDelay(1);
}
}
И в результате получим совсем другую картину…
![](http://istarik.ru/uploads/images/00/00/01/2020/08/20/d6ade5.jpg)
Из-за нашей ужасной конструкции задача
Queue List
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/546f47.jpg)
Различная информация об очередях, семафорах и мьтексах. Думаю тут и без комментариев всё понятно. Чтоб они отображались, нужно присвоить им имена как написано выше.
Timer List
То же самое что и выше, только о программных таймерах. У меня там ничего не настроено поэтому показать нечего.
Heap Usage
![](http://istarik.ru/uploads/images/00/00/01/2020/08/18/0a67ee.jpg)
Тут подробно об использовании «кучи», опять же думаю что объяснять нечего. Вначале общие данные — сколько использовано, сколько всего, а ниже как её раздербанили задачи.
Собственно это всё. Информацию я взял тут, там описываются ещё какие-то методы отладки, но я не стал разбираться.
Всем спасибо
![](https://istarik.ru/uploads/images/00/00/01/2019/10/17/1db9cc.jpg)
Телеграм-чат istarik
Телеграм-чат STM32
![](http://istarik.ru/uploads/images/thnd.png)
- 0
- stD
18098
Поддержать автора
Комментарии (0)