更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_trace.c
浏览该文件的文档.
1/*!
2 * @file los_trace.c
3 * @brief
4 * @link kernel-small-debug-trace http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-debug-trace.html @endlink
5 @verbatim
6 基本概念
7 Trace调测旨在帮助开发者获取内核的运行流程,各个模块、任务的执行顺序,从而可以辅助开发者定位一些时序问题
8 或者了解内核的代码运行过程。
9 相关宏
10 LOSCFG_KERNEL_TRACE Trace模块的裁剪开关 YES/NO
11 LOSCFG_RECORDER_MODE_OFFLINE Trace工作模式为离线模式 YES/NO
12 LOSCFG_RECORDER_MODE_ONLINE Trace工作模式为在线模式 YES/NO
13 LOSCFG_TRACE_CLIENT_INTERACT 使能与Trace IDE (dev tools)的交互,包括数据可视化和流程控制 YES/NO
14 LOSCFG_TRACE_FRAME_CORE_MSG 记录CPUID、中断状态、锁任务状态 YES/NO
15 LOSCFG_TRACE_FRAME_EVENT_COUNT 记录事件的次序编号 YES/NO
16 LOSCFG_TRACE_FRAME_MAX_PARAMS 配置记录事件的最大参数个数 INT
17 LOSCFG_TRACE_BUFFER_SIZE 配置Trace的缓冲区大小 INT
18 运行机制
19 内核提供一套Hook框架,将Hook点预埋在各个模块的主要流程中, 在内核启动初期完成Trace功能的初始化,
20 并注册Trace的处理函数到Hook中。
21
22 当系统触发到一个Hook点时,Trace模块会对输入信息进行封装,添加Trace帧头信息,包含事件类型、
23 运行的cpuid、运行的任务id、运行的相对时间戳等信息;
24
25 Trace提供2种工作模式,离线模式和在线模式。
26 在线模式需要配合IDE使用,实时将trace frame记录发送给IDE,IDE端进行解析并可视化展示。
27 离线模式会将trace frame记录到预先申请好的循环buffer中。如果循环buffer记录的frame过多则可能出现翻转,
28 会覆盖之前的记录,故保持记录的信息始终是最新的信息。Trace循环buffer的数据可以通过shell命令导出进行详细分析,
29 导出信息已按照时间戳信息完成排序。
30 @endverbatim
31 * @image html https://gitee.com/weharmonyos/resources/raw/master/80/trace.png
32 * @version
33 * @author weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
34 * @date 2021-11-20
35 */
36/*
37 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
38 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
39 *
40 * Redistribution and use in source and binary forms, with or without modification,
41 * are permitted provided that the following conditions are met:
42 *
43 * 1. Redistributions of source code must retain the above copyright notice, this list of
44 * conditions and the following disclaimer.
45 *
46 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
47 * of conditions and the following disclaimer in the documentation and/or other materials
48 * provided with the distribution.
49 *
50 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
51 * to endorse or promote products derived from this software without specific prior written
52 * permission.
53 *
54 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
55 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
56 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
57 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
58 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
59 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
60 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
61 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
62 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
63 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
64 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65 */
66
67#include "los_trace_pri.h"
68#include "trace_pipeline.h"
69#include "los_memory.h"
70#include "los_config.h"
71#include "securec.h"
72#include "trace_cnv.h"
73#include "los_init.h"
74#include "los_process.h"
75#include "los_sched_pri.h"
76
77#ifdef LOSCFG_KERNEL_SMP
78#include "los_mp.h"
79#endif
80
81#ifdef LOSCFG_SHELL
82#include "shcmd.h"
83#include "shell.h"
84#endif
85
86LITE_OS_SEC_BSS STATIC UINT32 g_traceEventCount;
87LITE_OS_SEC_BSS STATIC volatile enum TraceState g_traceState = TRACE_UNINIT;
88LITE_OS_SEC_DATA_INIT STATIC volatile BOOL g_enableTrace = FALSE; ///< trace开关
89LITE_OS_SEC_BSS STATIC UINT32 g_traceMask = TRACE_DEFAULT_MASK; ///< 全局变量设置事件掩码,仅记录某些模块的事件
90
91TRACE_EVENT_HOOK g_traceEventHook = NULL; ///< 事件钩子函数
92TRACE_DUMP_HOOK g_traceDumpHook = NULL; ///< 输出缓冲区数据
93
94#ifdef LOSCFG_TRACE_CONTROL_AGENT
95LITE_OS_SEC_BSS STATIC UINT32 g_traceTaskId;
96#endif
97
98#define EVENT_MASK 0xFFFFFFF0
99#define MIN(x, y) ((x) < (y) ? (x) : (y))
100
101LITE_OS_SEC_BSS STATIC TRACE_HWI_FILTER_HOOK g_traceHwiFilterHook = NULL; ///< 用于跟踪硬中断过滤的钩子函数
102
103#ifdef LOSCFG_KERNEL_SMP
105#endif
106
107STATIC_INLINE BOOL OsTraceHwiFilter(UINT32 hwiNum)
108{
109 BOOL ret = ((hwiNum == NUM_HAL_INTERRUPT_UART) || (hwiNum == OS_TICK_INT_NUM));
110#ifdef LOSCFG_KERNEL_SMP
111 ret |= (hwiNum == LOS_MP_IPI_SCHEDULE);
112#endif
113 if (g_traceHwiFilterHook != NULL) {
114 ret |= g_traceHwiFilterHook(hwiNum);
115 }
116 return ret;
117}
118
119STATIC VOID OsTraceSetFrame(TraceEventFrame *frame, UINT32 eventType, UINTPTR identity, const UINTPTR *params,
120 UINT16 paramCount)
121{
122 INT32 i;
123 UINT32 intSave;
124
125 (VOID)memset_s(frame, sizeof(TraceEventFrame), 0, sizeof(TraceEventFrame));
126
127 if (paramCount > LOSCFG_TRACE_FRAME_MAX_PARAMS) {
128 paramCount = LOSCFG_TRACE_FRAME_MAX_PARAMS;
129 }
130
131 TRACE_LOCK(intSave);
133 frame->curPid = LOS_GetCurrProcessID();
134 frame->identity = identity;
135 frame->curTime = HalClockGetCycles();
136 frame->eventType = eventType;
137
138#ifdef LOSCFG_TRACE_FRAME_CORE_MSG
139 frame->core.cpuid = ArchCurrCpuid();
140 frame->core.hwiActive = OS_INT_ACTIVE ? TRUE : FALSE;
141 frame->core.taskLockCnt = MIN(OsSchedLockCountGet(), 0xF); /* taskLockCnt is 4 bits, max value = 0xF */
142 frame->core.paramCount = paramCount;
143#endif
144
145#ifdef LOS_TRACE_FRAME_LR
146 /* Get the linkreg from stack fp and storage to frame */
147 LOS_RecordLR(frame->linkReg, LOS_TRACE_LR_RECORD, LOS_TRACE_LR_RECORD, LOS_TRACE_LR_IGNORE);
148#endif
149
150#ifdef LOSCFG_TRACE_FRAME_EVENT_COUNT
153#endif
154 TRACE_UNLOCK(intSave);
155
156 for (i = 0; i < paramCount; i++) {
157 frame->params[i] = params[i];
158 }
159}
160
161VOID OsTraceSetObj(ObjData *obj, const LosTaskCB *tcb)
162{
163 errno_t ret;
164 SchedParam param = { 0 };
165 (VOID)memset_s(obj, sizeof(ObjData), 0, sizeof(ObjData));
166
167 obj->id = OsTraceGetMaskTid(tcb->taskID);
168 tcb->ops->schedParamGet(tcb, &param);
169 obj->prio = param.priority;
170
171 ret = strncpy_s(obj->name, LOSCFG_TRACE_OBJ_MAX_NAME_SIZE, tcb->taskName, LOSCFG_TRACE_OBJ_MAX_NAME_SIZE - 1);
172 if (ret != EOK) {
173 TRACE_ERROR("Task name copy failed!\n");
174 }
175}
176
177/*!
178 * @brief OsTraceHook
179 * 事件统一处理函数
180 * @param eventType
181 * @param identity
182 * @param paramCount
183 * @param params
184 * @return
185 *
186 * @see
187 */
188VOID OsTraceHook(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount)
189{
190 TraceEventFrame frame;//离线和在线模式下, trace数据的保存和传送以帧为单位
191 if ((eventType == TASK_CREATE) || (eventType == TASK_PRIOSET)) {//创建任务和设置任务优先级
192 OsTraceObjAdd(eventType, identity); /* handle important obj info, these can not be filtered */
193 }
194
195 if ((g_enableTrace == TRUE) && (eventType & g_traceMask)) {//使能跟踪模块且事件未屏蔽
196 UINTPTR id = identity;
197 if (TRACE_GET_MODE_FLAG(eventType) == TRACE_HWI_FLAG) {//关于硬中断的事件
198 if (OsTraceHwiFilter(identity)) {//检查中断号是否过滤掉了,注意:中断控制器本身是可以屏蔽中断号的
199 return;
200 }
201 } else if (TRACE_GET_MODE_FLAG(eventType) == TRACE_TASK_FLAG) {//关于任务的事件
202 id = OsTraceGetMaskTid(identity);//获取任务ID
203 } else if (eventType == MEM_INFO_REQ) {//内存信息事件
204 LOS_MEM_POOL_STATUS status;
205 LOS_MemInfoGet((VOID *)identity, &status);//获取内存各项信息
206 LOS_TRACE(MEM_INFO, identity, status.totalUsedSize, status.totalFreeSize);//打印信息
207 return;
208 }
209
210 OsTraceSetFrame(&frame, eventType, id, params, paramCount);//创建帧数据
211 OsTraceWriteOrSendEvent(&frame);//保存(离线模式下)或者发送(在线模式下)帧数据
212 }
213}
214
216{
217 return g_enableTrace;
218}
219/// 初始化事件处理函数
220STATIC VOID OsTraceHookInstall(VOID)
221{
223#ifdef LOSCFG_RECORDER_MODE_OFFLINE
225#endif
226}
227
228#ifdef LOSCFG_TRACE_CONTROL_AGENT
230{
231 return ((msg->end == TRACE_CMD_END_CHAR) && (msg->cmd < TRACE_CMD_MAX_CODE));
232}
233
234STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg)
235{
236 if (!OsTraceCmdIsValid(msg)) {
237 return;
238 }
239
240 switch (msg->cmd) {
241 case TRACE_CMD_START:
242 LOS_TraceStart();//启动trace
243 break;
244 case TRACE_CMD_STOP:
245 LOS_TraceStop();//关闭trace
246 break;
247 case TRACE_CMD_SET_EVENT_MASK://设置事件掩码
248 /* 4 params(UINT8) composition the mask(UINT32) */
249 LOS_TraceEventMaskSet(TRACE_MASK_COMBINE(msg->param1, msg->param2, msg->param3, msg->param4));
250 break;
253 break;
254 default:
255 break;
256 }
257}
258///< trace任务的入口函数,接收串口数据
259VOID TraceAgent(VOID)
260{
261 UINT32 ret;
262 TraceClientCmd msg;
263
264 while (1) {
265 (VOID)memset_s(&msg, sizeof(TraceClientCmd), 0, sizeof(TraceClientCmd));
266 ret = OsTraceDataWait();//等待数据到来
267 if (ret == LOS_OK) {
268 OsTraceDataRecv((UINT8 *)&msg, sizeof(TraceClientCmd), 0);
269 OsTraceCmdHandle(&msg);//处理数据
270 }
271 }
272}
273
274/*!
275 * @brief OsCreateTraceAgentTask 创建trace任务
276 *
277 * @return
278 *
279 * @see
280 */
282{
283 UINT32 ret;
284 TSK_INIT_PARAM_S taskInitParam;
285
286 (VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
287 taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)TraceAgent; //任务入口函数
288 taskInitParam.usTaskPrio = LOSCFG_TRACE_TASK_PRIORITY; //任务优先级 2
289 taskInitParam.pcName = "TraceAgent"; //任务名称
290 taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; //内核栈大小 16K
291#ifdef LOSCFG_KERNEL_SMP
292 taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid());//指定为当前CPU执行
293#endif
294 ret = LOS_TaskCreate(&g_traceTaskId, &taskInitParam);//创建任务并产生调度
295 return ret;
296}
297#endif
298/// 跟踪模块初始化
299STATIC UINT32 OsTraceInit(VOID)
300{
301 UINT32 ret;
302
303 if (g_traceState != TRACE_UNINIT) {
304 TRACE_ERROR("trace has been initialized already, the current state is :%d\n", g_traceState);
305 ret = LOS_ERRNO_TRACE_ERROR_STATUS;
306 goto LOS_ERREND;
307 }
308
309#ifdef LOSCFG_TRACE_CLIENT_INTERACT //使能与Trace IDE (dev tools)的交互,包括数据可视化和流程控制
310 ret = OsTracePipelineInit();//在线模式(管道模式)的初始化
311 if (ret != LOS_OK) {
312 goto LOS_ERREND;
313 }
314#endif
315
316#ifdef LOSCFG_TRACE_CONTROL_AGENT //trace任务代理开关,所谓代理是创建专门的任务来处理 trace
318 if (ret != LOS_OK) {
319 TRACE_ERROR("trace init create agentTask error :0x%x\n", ret);
320 goto LOS_ERREND;
321 }
322#endif
323
324#ifdef LOSCFG_RECORDER_MODE_OFFLINE //trace离线模式开关
325//离线模式会将trace frame记录到预先申请好的循环buffer中。如果循环buffer记录的frame过多则可能出现翻转,
326//会覆盖之前的记录,故保持记录的信息始终是最新的信息。
327 ret = OsTraceBufInit(LOSCFG_TRACE_BUFFER_SIZE); //离线模式下buf 大小,这个大小决定了装多少 ObjData 和 TraceEventFrame
328 if (ret != LOS_OK) {
329#ifdef LOSCFG_TRACE_CONTROL_AGENT
331#endif
332 goto LOS_ERREND;
333 }
334#endif
335
336 OsTraceHookInstall();//安装HOOK框架
337 OsTraceCnvInit();//将事件处理函数注册到HOOK框架
338
340
341#ifdef LOSCFG_RECORDER_MODE_ONLINE /* Wait trace client to start trace */
342 g_enableTrace = FALSE;
344#else
345 g_enableTrace = TRUE;
347#endif
348 return LOS_OK;
349LOS_ERREND:
350 return ret;
351}
352/// 启动Trace
354{
355 UINT32 intSave;
356 UINT32 ret = LOS_OK;
357
358 TRACE_LOCK(intSave);
360 goto START_END;
361 }
362
363 if (g_traceState == TRACE_UNINIT) {//必须初始化好
364 TRACE_ERROR("trace not inited, be sure LOS_TraceInit excute success\n");
365 ret = LOS_ERRNO_TRACE_ERROR_STATUS;
366 goto START_END;
367 }
368
369 OsTraceNotifyStart();//通知系统开始
370
371 g_enableTrace = TRUE; //使能trace功能
372 g_traceState = TRACE_STARTED;//设置状态,已开始
373
374 TRACE_UNLOCK(intSave);
375 LOS_TRACE(MEM_INFO_REQ, m_aucSysMem0);//输出日志
376 return ret;
377START_END:
378 TRACE_UNLOCK(intSave);
379 return ret;
380}
381/// 停止Trace(跟踪)
383{
384 UINT32 intSave;
385
386 TRACE_LOCK(intSave);
388 goto STOP_END;
389 }
390
391 g_enableTrace = FALSE;
393 OsTraceNotifyStop();
394STOP_END:
395 TRACE_UNLOCK(intSave);
396}
397/// 设置事件掩码,仅记录某些模块的事件
399{
400 g_traceMask = mask & EVENT_MASK;
401}
402/// 输出Trace缓冲区数据
404{
405 if (g_traceState != TRACE_STOPED) {
406 TRACE_ERROR("trace dump must after trace stopped , the current state is : %d\n", g_traceState);
407 return;
408 }
409 OsTraceRecordDump(toClient);
410}
411/// 获取Trace缓冲区的首地址
413{
414 return OsTraceRecordGet();
415}
416/// 清除Trace缓冲区中的事件
418{
419 if (g_traceState == TRACE_UNINIT) {
420 TRACE_ERROR("trace not inited, be sure LOS_TraceInit excute success\n");
421 return;
422 }
423
424 OsTraceReset();
425}
426/// 注册过滤特定中断号事件的钩子函数
428{
429 UINT32 intSave;
430
431 TRACE_LOCK(intSave);
432 g_traceHwiFilterHook = hook;// 注册全局钩子函数
433 TRACE_UNLOCK(intSave);
434}
435
436#ifdef LOSCFG_SHELL
437/// 通过shell命令 设置事件掩码,仅记录某些模块的事件
438LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceSetMask(INT32 argc, const CHAR **argv)
439{
440 size_t mask;
441 CHAR *endPtr = NULL;
442
443 if (argc >= 2) { /* 2:Just as number of parameters */
444 PRINTK("\nUsage: trace_mask or trace_mask ID\n");
445 return OS_ERROR;
446 }
447
448 if (argc == 0) {
449 mask = TRACE_DEFAULT_MASK;
450 } else {
451 mask = strtoul(argv[0], &endPtr, 0);
452 }
454 return LOS_OK;
455}
456
457LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceDump(INT32 argc, const CHAR **argv)
458{
459 BOOL toClient;
460 CHAR *endPtr = NULL;
461
462 if (argc >= 2) { /* 2:Just as number of parameters */
463 PRINTK("\nUsage: trace_dump or trace_dump [1/0]\n");
464 return OS_ERROR;
465 }
466
467 if (argc == 0) {
468 toClient = FALSE;
469 } else {
470 toClient = strtoul(argv[0], &endPtr, 0) != 0 ? TRUE : FALSE;
471 }
472 LOS_TraceRecordDump(toClient);
473 return LOS_OK;
474}
475
476SHELLCMD_ENTRY(tracestart_shellcmd, CMD_TYPE_EX, "trace_start", 0, (CmdCallBackFunc)LOS_TraceStart);//通过shell 启动trace
477SHELLCMD_ENTRY(tracestop_shellcmd, CMD_TYPE_EX, "trace_stop", 0, (CmdCallBackFunc)LOS_TraceStop);
478SHELLCMD_ENTRY(tracesetmask_shellcmd, CMD_TYPE_EX, "trace_mask", 1, (CmdCallBackFunc)OsShellCmdTraceSetMask);//设置事件掩码,仅记录某些模块的事件
479SHELLCMD_ENTRY(tracereset_shellcmd, CMD_TYPE_EX, "trace_reset", 0, (CmdCallBackFunc)LOS_TraceReset);
480SHELLCMD_ENTRY(tracedump_shellcmd, CMD_TYPE_EX, "trace_dump", 1, (CmdCallBackFunc)OsShellCmdTraceDump);
481#endif
482
483LOS_MODULE_INIT(OsTraceInit, LOS_INIT_LEVEL_KMOD_EXTENDED);
@ CMD_TYPE_EX
不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
Definition: shell.h:91
VOID LOS_RecordLR(UINTPTR *LR, UINT32 LRSize, UINT32 recordCount, UINT32 jumpCount)
record LR function.
Definition: los_exc.c:1353
UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)
LOS_MemInfoGet 获取指定内存池的内存结构信息,包括空闲内存大小、已使用内存大小、空闲内存块数量、已使用的内存块数量、最大的空闲内存块大小
Definition: los_memory.c:1965
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
Delete a task.
Definition: los_task.c:968
LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
Obtain current running task ID.
Definition: los_task.c:331
struct tagTskInitParam TSK_INIT_PARAM_S
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *initParam)
创建任务,并使该任务进入ready状态,如果就绪队列中没有更高优先级的任务,则运行该任务
Definition: los_task.c:718
VOID *(* TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param2, UINTPTR param3, UINTPTR param4)
Define the type of a task entrance function.
Definition: los_task.h:480
BOOL(* TRACE_HWI_FILTER_HOOK)(UINT32 hwiNum)
Define the type of trace hardware interrupt filter hook function.
Definition: los_trace.h:336
OfflineHead * LOS_TraceRecordGet(VOID)
获取Trace缓冲区的首地址
Definition: los_trace.c:412
VOID LOS_TraceEventMaskSet(UINT32 mask)
设置事件掩码,仅记录某些模块的事件
Definition: los_trace.c:398
VOID LOS_TraceReset(VOID)
清除Trace缓冲区中的事件
Definition: los_trace.c:417
UINT32 LOS_TraceStart(VOID)
启动Trace
Definition: los_trace.c:353
VOID LOS_TraceHwiFilterHookReg(TRACE_HWI_FILTER_HOOK hook)
注册过滤特定中断号事件的钩子函数
Definition: los_trace.c:427
TraceState
Definition: los_trace.h:109
VOID LOS_TraceStop(VOID)
停止Trace(跟踪)
Definition: los_trace.c:382
VOID LOS_TraceRecordDump(BOOL toClient)
输出Trace缓冲区数据
Definition: los_trace.c:403
@ TRACE_HWI_FLAG
跟踪硬中断
Definition: los_trace.h:123
@ TRACE_TASK_FLAG
跟踪任务/线程
Definition: los_trace.h:124
@ MEM_INFO
Definition: los_trace.h:190
@ TASK_PRIOSET
Definition: los_trace.h:170
@ TASK_CREATE
Definition: los_trace.h:169
@ MEM_INFO_REQ
Definition: los_trace.h:189
@ TRACE_UNINIT
Definition: los_trace.h:110
@ TRACE_INITED
Definition: los_trace.h:111
@ TRACE_STOPED
Definition: los_trace.h:113
@ TRACE_STARTED
Definition: los_trace.h:112
UINT64 HalClockGetCycles(VOID)
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
Definition: los_hw_cpu.h:168
@ LOS_MP_IPI_SCHEDULE
!< 唤醒CPU
Definition: los_mp.h:51
LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
获取当前进程的进程ID
Definition: los_process.c:2161
STATIC INLINE UINT32 OsSchedLockCountGet(VOID)
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceDump(INT32 argc, const CHAR **argv)
Definition: los_trace.c:457
STATIC UINT32 OsCreateTraceAgentTask(VOID)
OsCreateTraceAgentTask 创建trace任务
Definition: los_trace.c:281
LITE_OS_SEC_BSS STATIC UINT32 g_traceTaskId
Definition: los_trace.c:95
TRACE_EVENT_HOOK g_traceEventHook
事件钩子函数
Definition: los_trace.c:91
LOS_MODULE_INIT(OsTraceInit, LOS_INIT_LEVEL_KMOD_EXTENDED)
VOID OsTraceHook(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount)
OsTraceHook 事件统一处理函数
Definition: los_trace.c:188
TRACE_DUMP_HOOK g_traceDumpHook
输出缓冲区数据
Definition: los_trace.c:92
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceSetMask(INT32 argc, const CHAR **argv)
通过shell命令 设置事件掩码,仅记录某些模块的事件
Definition: los_trace.c:438
LITE_OS_SEC_BSS STATIC TRACE_HWI_FILTER_HOOK g_traceHwiFilterHook
用于跟踪硬中断过滤的钩子函数
Definition: los_trace.c:101
LITE_OS_SEC_BSS STATIC UINT32 g_traceEventCount
Definition: los_trace.c:86
STATIC VOID OsTraceHookInstall(VOID)
初始化事件处理函数
Definition: los_trace.c:220
STATIC BOOL OsTraceCmdIsValid(const TraceClientCmd *msg)
Definition: los_trace.c:229
SHELLCMD_ENTRY(tracestart_shellcmd, CMD_TYPE_EX, "trace_start", 0,(CmdCallBackFunc) LOS_TraceStart)
STATIC VOID OsTraceSetFrame(TraceEventFrame *frame, UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount)
Definition: los_trace.c:119
STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg)
trace任务的入口函数,接收串口数据
Definition: los_trace.c:234
LITE_OS_SEC_BSS STATIC enum TraceState g_traceState
Definition: los_trace.c:87
LITE_OS_SEC_DATA_INIT STATIC volatile BOOL g_enableTrace
trace开关
Definition: los_trace.c:88
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_traceSpin)
BOOL OsTraceIsEnable(VOID)
Definition: los_trace.c:215
VOID OsTraceSetObj(ObjData *obj, const LosTaskCB *tcb)
Definition: los_trace.c:161
STATIC_INLINE BOOL OsTraceHwiFilter(UINT32 hwiNum)
Definition: los_trace.c:107
LITE_OS_SEC_BSS STATIC UINT32 g_traceMask
全局变量设置事件掩码,仅记录某些模块的事件
Definition: los_trace.c:89
STATIC UINT32 OsTraceInit(VOID)
跟踪模块初始化
Definition: los_trace.c:299
VOID TraceAgent(VOID)
Definition: los_trace.c:259
VOID(* TRACE_EVENT_HOOK)(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount)
Definition: los_trace.h:338
UINT32 OsTraceBufInit(UINT32 size)
trace离线模式初始化
Definition: trace_offline.c:63
VOID(* TRACE_DUMP_HOOK)(BOOL toClient)
Definition: los_trace_pri.h:70
VOID OsTraceReset(VOID)
重置循环buf
@ TRACE_CMD_STOP
Definition: los_trace_pri.h:75
@ TRACE_CMD_SET_EVENT_MASK
Definition: los_trace_pri.h:76
@ TRACE_CMD_START
Definition: los_trace_pri.h:74
@ TRACE_CMD_MAX_CODE
Definition: los_trace_pri.h:78
@ TRACE_CMD_RECODE_DUMP
Definition: los_trace_pri.h:77
OfflineHead * OsTraceRecordGet(VOID)
VOID OsTraceRecordDump(BOOL toClient)
UINT32 OsTraceGetMaskTid(UINT32 taskId)
Definition: trace_offline.c:58
VOID OsTraceObjAdd(UINT32 eventType, UINT32 taskId)
添加一个任务
VOID OsTraceWriteOrSendEvent(const TraceEventFrame *frame)
离线模式下保存帧数据 @note_thinking 此处未封装好,会懵逼,文件名中体现了对离线模式的保存或对在线模式的发送这样真的好吗? .
SPIN_LOCK_S g_traceSpin
unsigned short UINT16
Definition: los_typedef.h:56
signed int INT32
Definition: los_typedef.h:60
unsigned char UINT8
Definition: los_typedef.h:55
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
size_t BOOL
Definition: los_typedef.h:88
UINT32 id
Definition: los_trace.h:298
CHAR name[LOSCFG_TRACE_OBJ_MAX_NAME_SIZE]
Definition: los_trace.h:300
UINT32 prio
Definition: los_trace.h:299
UINT32(* schedParamGet)(const LosTaskCB *taskCB, SchedParam *param)
获取调度参数
UINT16 priority
UINT32 taskID
CHAR taskName[OS_TCB_NAME_LEN]
const SchedOps * ops
UINT64 curTime
Definition: los_trace.h:259
UINT32 eventCount
Definition: los_trace.h:272
UINTPTR params[LOSCFG_TRACE_FRAME_MAX_PARAMS]
Definition: los_trace.h:280
UINTPTR identity
Definition: los_trace.h:260
UINTPTR linkReg[LOS_TRACE_LR_RECORD]
Definition: los_trace.h:276
struct TraceEventFrame::CoreStatus core
UINT32 curTask
Definition: los_trace.h:257
UINT32 eventType
Definition: los_trace.h:256
UINT16 usTaskPrio
Definition: los_task.h:505
UINT16 usCpuAffiMask
Definition: los_task.h:511
UINT32 uwStackSize
Definition: los_task.h:508
CHAR * pcName
Definition: los_task.h:509
TSK_ENTRY_FUNC pfnTaskEntry
Definition: los_task.h:504
VOID OsTraceCnvInit(VOID)
Definition: trace_cnv.c:298
UINT32 OsTraceDataWait(VOID)
UINT32 OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout)
UINT32 OsTracePipelineInit(VOID)
u32_t(* CmdCallBackFunc)(u32_t argc, const char **argv)
Definition: types_adapt.h:86