Напишу небольшой мануал по подключению и тестированию Tracealyzer для FreeRtos.
Начну с официальной документации по настройки и подключении document
Сам только недавно стал пользоваться и ощутил уже сразу как отловил пару багов своих.Также удобно отслеживать загрузку очередей и нагрузку процессора каждой задачей. Пользуюсь jlink v 9.4. Keil v 5.26.2.0 .
Создаем проект стандартно с FreeRtos , описание есть в топике. Качаем сами исходники трасера Ссылка
Далее по шагам :
1) Закидываем исходники Tracealyzer в проект свой отдельной папочкой
2) Подключаем все папки в ваш проект,кроме streamports . В streamports подключаем в папочке Jlink_RTT все файлы в ваш проект
3) Идем в FreeRTOSConfig.h и подключаем трасер:
#define configUSE_TRACE_FACILITY 1 #if ( configUSE_TRACE_FACILITY == 1 ) #include "trcRecorder.h" #endif
4) Подключаем определение регистров в trcConfig.h
#include "stm32f10x.h"
5) Настраиваем поток в trcConfig.h
a) порт на cortex_m
#define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_ARM_Cortex_M
б) поток
#define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_STREAMING
с) какая версия freertos
#define TRC_CFG_FREERTOS_VERSION TRC_FREERTOS_VERSION_10_0_0
6) Теперь до создания задач и т д мы прописываем команду
vTraceEnable(TRC_START_AWAIT_HOST);
7) Для примера создал три задачи и в них отладочные сообщения с показанием сообщений, почитать документацию можно там и очередям дать названия
Компиляции и если нет ошибок то прошивка,программа не запускается,а ждет команды трассера.
8) Идем в Tracealyzer настраиваю jlink и какой проц
Запускаем Tracealyzer идет запись в комп,останавливаем и начинаем изучать поток выполнения задач и прерываний.....
сам иходник с майн и задачами
#include "stm32f10x.h" #include "FreeRTOS.h" #include "task.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include "queue.h" #include "semphr.h" #include "timers.h" /*** descript RTOS ***/ TaskHandle_t xTask_task1_Handle,xTask_task2_Handle,xTask_task3_Handle; TimerHandle_t xTimer; void vTask_task1( void *pvParametrs); void vTask_task2(void *pvParametrs); void vTask_task3(void *pvParametrs); ////////////////////////////////////////////////////////// // TIMER RTOS void vAutoReloadTimerFunction(TimerHandle_t xTimer) { GPIOC->ODR ^= GPIO_ODR_ODR13; } //---------------------------------------------------------------------- int main(void) { uint8_t error_timer; RCC->APB2ENR|=RCC_APB2ENR_IOPCEN; // miganie PC13 GPIOC->CRH&=~GPIO_CRH_MODE13; GPIOC->CRH|=GPIO_CRH_MODE13_1; // 50 mgh GPIOC->CRH|=GPIO_CRH_MODE13_0; GPIOC->CRH&=~GPIO_CRH_CNF13; vTraceEnable(TRC_START_AWAIT_HOST); // Task setup------------------------------------------------------------- xTaskCreate( vTask_task1, ( const char * ) "Task_task1", configMINIMAL_STACK_SIZE, NULL, 3, &xTask_task1_Handle ); xTaskCreate( vTask_task2, ( const char * ) "Task_task2", configMINIMAL_STACK_SIZE, NULL, 1, &xTask_task2_Handle ); xTaskCreate( vTask_task3, ( const char * ) "Task_task3", configMINIMAL_STACK_SIZE, NULL, 2, &xTask_task3_Handle ); // Timer Rtos xTimer=xTimerCreate ( /* Just a text name, not used by the RTOS kernel. */ "Timer", /* The timer period in ticks, must be greater than 0. */ 500/portTICK_PERIOD_MS, /* The timers will auto-reload themselves when they expire. */ pdTRUE, /* The ID is used to store a count of the number of times the timer has expired, which is initialised to 0. */ ( void * ) 0, /* Each timer calls the same callback when it expires. */ vAutoReloadTimerFunction ); if( xTimer == NULL ) { /* The timer was not created. */ error_timer=1; } else { /* Start the timer. No block time is specified, and even if one was it would be ignored because the RTOS scheduler has not yet been started. */ if( xTimerStart( xTimer, 0 ) != pdPASS ) { /* The timer could not be set into the Active state. */ error_timer=0; } } vTaskStartScheduler(); while (1) { } } // Task.............................. void vTask_task1(void *pvParameters ) { char t=0; for(;;) { t++; traceString task1 = xTraceRegisterString("task1"); vTracePrintF(task1, "t= %d", t); vTaskDelay( 10/portTICK_PERIOD_MS ); } } void vTask_task2(void *pvParameters ) { char d=0; for(;;) { d++; traceString task2 = xTraceRegisterString("task2"); vTracePrintF(task2, "d= %d", d); vTaskDelay( 10/portTICK_PERIOD_MS ); } } void vTask_task3(void *pvParameters ) { char c=0; for(;;) { c++; traceString task3 = xTraceRegisterString("task3"); vTracePrintF(task3, "c= %d", c); vTaskDelay( 10/portTICK_PERIOD_MS ); } }
Проект здесь мой Ссылка
Что нового буду обновлять топик.