更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
trace_online.c 文件参考

在线模式需要配合IDE使用,实时将trace frame记录发送给IDE,IDE端进行解析并可视化展示 更多...

浏览源代码.

函数

UINT32 OsTraceGetMaskTid (UINT32 taskId)
 
VOID OsTraceSendHead (VOID)
 发送头信息 更多...
 
VOID OsTraceSendNotify (UINT32 type, UINT32 value)
 发送通知类信息(启动,停止 trace 等通知) 更多...
 
STATIC VOID OsTraceSendObj (const LosTaskCB *tcb)
 向串口发送一个类型为对象的trace 更多...
 
VOID OsTraceSendObjTable (VOID)
 发送所有任务对象至串口 更多...
 
VOID OsTraceObjAdd (UINT32 eventType, UINT32 taskId)
 添加一个对象(任务) trace 更多...
 
VOID OsTraceWriteOrSendEvent (const TraceEventFrame *frame)
 在线模式下发送数据给 IDE, Trace模块会对输入信息进行封装,添加Trace帧头信息,包含事件类型、运行的cpuid、运行的任务id、运行的相对时间戳等信息 更多...
 
OfflineHeadOsTraceRecordGet (VOID)
 

详细描述

在线模式需要配合IDE使用,实时将trace frame记录发送给IDE,IDE端进行解析并可视化展示

Trace调测旨在帮助开发者获取内核的运行流程,各个模块、任务的执行顺序,从而可以辅助开发者定位一些时序问题或者了解内核的代码运行过程。

内核提供一套Hook框架,将Hook点预埋在各个模块的主要流程中, 在内核启动初期完成Trace功能的初始化,并注册Trace的处理函数到Hook中。

当系统触发到一个Hook点时,Trace模块会对输入信息进行封装,添加Trace帧头信息,包含事件类型、运行的cpuid、运行的任务id、运行的相对时间戳等信息;

Trace提供2种工作模式,离线模式和在线模式。
本文件为 在线模式
版本
作者
weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
日期
2021-11-22

在文件 trace_online.c 中定义.

函数说明

◆ OsTraceGetMaskTid()

UINT32 OsTraceGetMaskTid ( UINT32  taskId)

在文件 trace_online.c53 行定义.

54{
55 return taskId;
56}
这是这个函数的调用关系图:

◆ OsTraceObjAdd()

VOID OsTraceObjAdd ( UINT32  eventType,
UINT32  taskId 
)

添加一个对象(任务) trace

添加一个任务

在文件 trace_online.c101 行定义.

102{
103 if (OsTraceIsEnable()) {
104 OsTraceSendObj(OS_TCB_FROM_TID(taskId));
105 }
106}
BOOL OsTraceIsEnable(VOID)
Definition: los_trace.c:215
STATIC VOID OsTraceSendObj(const LosTaskCB *tcb)
向串口发送一个类型为对象的trace
Definition: trace_online.c:79
函数调用图:
这是这个函数的调用关系图:

◆ OsTraceRecordGet()

OfflineHead * OsTraceRecordGet ( VOID  )

在文件 trace_online.c113 行定义.

114{
115 return NULL;
116}
这是这个函数的调用关系图:

◆ OsTraceSendHead()

VOID OsTraceSendHead ( VOID  )

发送头信息

在文件 trace_online.c58 行定义.

59{
60 TraceBaseHeaderInfo head = {
61 .bigLittleEndian = TRACE_BIGLITTLE_WORD,
62 .version = TRACE_VERSION(TRACE_MODE_ONLINE),
63 .clockFreq = OS_SYS_CLOCK,
64 };
65
67}
unsigned char UINT8
Definition: los_typedef.h:55
http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-mini-memory-trace....
Definition: los_trace.h:244
UINT32 bigLittleEndian
Definition: los_trace.h:245
VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data)
@ HEAD
数据头信息, 即发送 TraceBaseHeaderInfo
函数调用图:

◆ OsTraceSendNotify()

VOID OsTraceSendNotify ( UINT32  type,
UINT32  value 
)

发送通知类信息(启动,停止 trace 等通知)

在文件 trace_online.c69 行定义.

70{
71 TraceNotifyFrame frame = {
72 .cmd = type,
73 .param = value,
74 };
75
76 OsTraceDataSend(NOTIFY, sizeof(TraceNotifyFrame), (UINT8 *)&frame);
77}
@ NOTIFY
通知信息 即发送 TraceNotifyFrame
函数调用图:

◆ OsTraceSendObj()

STATIC VOID OsTraceSendObj ( const LosTaskCB tcb)

向串口发送一个类型为对象的trace

在文件 trace_online.c79 行定义.

80{
81 ObjData obj;
82
83 OsTraceSetObj(&obj, tcb);
84 OsTraceDataSend(OBJ, sizeof(ObjData), (UINT8 *)&obj);//发送任务信息到串口
85}
VOID OsTraceSetObj(ObjData *obj, const LosTaskCB *tcb)
Definition: los_trace.c:161
@ OBJ
指对象(例如:任务) 即发送 ObjData
函数调用图:
这是这个函数的调用关系图:

◆ OsTraceSendObjTable()

VOID OsTraceSendObjTable ( VOID  )

发送所有任务对象至串口

在文件 trace_online.c87 行定义.

88{
89 UINT32 loop;
90 LosTaskCB *tcb = NULL;
91
92 for (loop = 0; loop < g_taskMaxNum; ++loop) {
93 tcb = g_taskCBArray + loop;
94 if (tcb->taskStatus & OS_TASK_STATUS_UNUSED) {//过滤掉已使用任务
95 continue;
96 }
97 OsTraceSendObj(tcb);//向串口发送数据
98 }
99}
LITE_OS_SEC_BSS UINT32 g_taskMaxNum
任务最大数量 默认128个
Definition: los_task.c:150
LITE_OS_SEC_BSS LosTaskCB * g_taskCBArray
外部变量 任务池 默认128个
Definition: los_task.c:147
unsigned int UINT32
Definition: los_typedef.h:57
UINT16 taskStatus
函数调用图:

◆ OsTraceWriteOrSendEvent()

VOID OsTraceWriteOrSendEvent ( const TraceEventFrame frame)

在线模式下发送数据给 IDE, Trace模块会对输入信息进行封装,添加Trace帧头信息,包含事件类型、运行的cpuid、运行的任务id、运行的相对时间戳等信息

离线模式下保存帧数据 @note_thinking 此处未封装好,会懵逼,文件名中体现了对离线模式的保存或对在线模式的发送这样真的好吗? .

在文件 trace_online.c108 行定义.

109{
110 OsTraceDataSend(EVENT, sizeof(TraceEventFrame), (UINT8 *)frame);// 编码TLV并向串口发送
111}
@ EVENT
指事件(例如:定时器开始) 即发送 TraceEventFrame
函数调用图:
这是这个函数的调用关系图: