Azure RTOS TraceX是一个Microsoft系统分析工具,它显示由运行在嵌入式目标上的ThreadX收集的系统事件信息。用户负责将存储在嵌入式目标中RAM中的跟踪缓冲区转移到主机上的二进制文件中。然后,用户可以使用TraceX打开此文件,并以图形方式分析目标事件,诊断系统问题并调整工作的应用程序以提高性能和资源管理。
点击下载:TraceX
UINT tx_trace_enable (VOID *trace_buffer_start,
ULONG trace_buffer_size, ULONG registry_entries);
输入参数
返回值
VOID tx_trace_buffer_full_notify (VOID (*full_buffer_callback)(VOID *));
输入参数
example
trace_is_full(void *trace_buffer_start)
{
/*停止跟踪 or 另辟buffer*/
}
/* 注册回调函数 */
tx_trace_buffer_full_notify (trace_is_full);
具体API详情: 点击访问
/*
*
* SPDX-License-Identifier: GPL-2.0-or-later
* main.c
* Change Logs:
* Date Author Notes
* 2020年8月21日 henji the first version
*/
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "tx_api.h"
/* USER CODE END Includes */
........
/* USER CODE BEGIN PV */
TX_THREAD my_thread_1;
TX_THREAD my_thread_2;
TX_THREAD trace_thread;
uint8_t pData[] = "=========ThreadX=========\n";
uint8_t pData1[] = "I am thread1 ";
uint8_t pData2[] = "I am thread2 ";
/* Tracex使用 */
/*跟踪缓冲区的内存大小*/
#define trace_buffer_size 64000
/*要保留在跟踪注册表中的应用程序ThreadX对象的数量*/
#define registry_entries 40
UCHAR trace_buffer_start[trace_buffer_size];
UINT trace_status;
/* USER CODE END PV */
int main(void)
{
.......
/* USER CODE BEGIN 2 */
tx_kernel_enter(); //threadx 入口
/* USER CODE END 2 */
while (1);
}
/* USER CODE BEGIN 4 */
void thread1_entry(ULONG entry_input)
{
INT count = 0;
uint8_t init_data[] = "start now";
while (1)
{
HAL_UART_Transmit(&huart1, pData1, sizeof(pData1), HAL_MAX_DELAY);
if (count == 0)
{
HAL_UART_Transmit(&huart1, init_data, sizeof(init_data),
HAL_MAX_DELAY);
}
count++;
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_7 | GPIO_PIN_8);
tx_thread_sleep(100);
}
}
void thread2_entry(ULONG entry_input)
{
INT count = 0;
while (1)
{
HAL_UART_Transmit(&huart1, pData2, sizeof(pData2), HAL_MAX_DELAY);
if (count == 3)
{
/*挂起线程1*/
tx_thread_suspend(&my_thread_1);
}
else if (count == 6)
{
/*恢复线程1*/
tx_thread_resume(&my_thread_1);
}
else if (count == 9)
{
/*终止线程1*/
tx_thread_terminate(&my_thread_1);
}
else if (count == 12)
{
/*重置线程1*/
tx_thread_reset(&my_thread_1);
/*恢复线程1*/
tx_thread_resume(&my_thread_1);
}
else if (count == 13)
{
/*终止线程1*/
//tx_thread_terminate(&my_thread_1);
//tx_thread_terminate(&my_thread_2);
}
else
{
;
}
count++;
tx_thread_sleep(200);
}
}
void trace_thread_input(ULONG entry_input)
{
while (1)
{
/*使能追踪*/
trace_status = tx_trace_enable(&trace_buffer_start, trace_buffer_size, registry_entries);
if (trace_status == TX_SUCCESS)
{
; //使能成功
}
if (trace_status == TX_NOT_DONE)
{
; //在追踪
}
tx_thread_sleep(100);
}
}
void my_entry_exit_notify(TX_THREAD *thread_ptr, UINT condition)
{
uint8_t entry_data[] = " thread1-entry ";
uint8_t exit_data[] = " thread1-exit ";
/* Determine if the thread was entered or exited. */
if (condition == TX_THREAD_ENTRY)
{
/* Thread entry! */
HAL_UART_Transmit(&huart1, entry_data, sizeof(pData2), HAL_MAX_DELAY);
}
if (condition == TX_THREAD_EXIT)
{
/* Thread exit! */
HAL_UART_Transmit(&huart1, exit_data, sizeof(pData2), HAL_MAX_DELAY);
}
}
void tx_application_define(void *first_unused_memory)
{
/*线程1*/
tx_thread_create(&my_thread_1, //线程控制块指针
"my_thread1",//线程名字
thread1_entry,//线程入口函数
0,//线程入口参数
first_unused_memory,//线程的起始地址(这里偷懒,没有进行分配,直接使用未用的起始地址)
1024,//内存区域大小K
3,//优先级3 (0~TX_MAX_PRIORITES-1)0 表示最高优先级
3,//禁用抢占的最高优先级
TX_NO_TIME_SLICE,//时间切片值范围为 1 ~ 0xFFFF(TX_NO_TIME_SLICE = 0)
TX_AUTO_START//线程自动启动
);
/*线程2*/
tx_thread_create(&my_thread_2, //线程控制块指针
"my_thread2",//线程名字
thread2_entry,//线程入口函数
0,//线程入口参数
first_unused_memory+1024,//线程的起始地址+1024 (-被前面线程用掉了)
1024,//内存区域大小K
2,//优先级2 (0~TX_MAX_PRIORITES-1)0 表示最高优先级
2,//禁用抢占的最高优先级
TX_NO_TIME_SLICE,//时间切片值范围为 1 ~ 0xFFFF(TX_NO_TIME_SLICE = 0)
TX_AUTO_START//线程自动启动
);
/*trace 线程*/
tx_thread_create(&trace_thread, //线程控制块指针
"trace_thread",//线程名字
trace_thread_input,//线程入口函数
0,//线程入口参数
first_unused_memory+2048, 1024, //内存区域大小K
1,//优先级2 (0~TX_MAX_PRIORITES-1)0 表示最高优先级
1,//禁用抢占的最高优先级
TX_NO_TIME_SLICE,//时间切片值范围为 1 ~ 0xFFFF(TX_NO_TIME_SLICE = 0)
TX_AUTO_START//线程自动启动
);
/*线程进入和退出时通知*/
tx_thread_entry_exit_notify(&my_thread_1, my_entry_exit_notify);
}
/* USER CODE END 4 */