Напишу небольшой мануал по подключению и тестированию 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 );
}
}Проект здесь мой Ссылка
Что нового буду обновлять топик.

