feat: L0-L1 支持Trace
1.【需求描述】
L0~L1 支持Trace,提供两种工作模式:在线模式、离线缓存模式, 用于按时间线追踪系统事件,如任务切换、中断、ipc等。
2.【方案描述】
L0:
(1).在内核模块预置静态代码桩
(2).触发桩后,收集系统上下文信息
(3).离线模式则写入内存,用户可通过dump导出;
(4).在线模式通过pipeline对接IDE进行可视化解析和展示;
L1:
新增trace字符设备,位于"/dev/trace",通过对设备节点的read\write\ioctl,实现用户态trace;
BREAKING CHANGE:
1.新增一系列trace的对外API,位于los_trace.h中.
LOS_TRACE_EASY简易插桩
LOS_TRACE标准插桩
LOS_TraceInit配置Trace缓冲区的地址和大小
LOS_TraceStart开启事件记录
LOS_TraceStop停止事件记录
LOS_TraceRecordDump输出Trace缓冲区数据
LOS_TraceRecordGet获取Trace缓冲区的首地址
LOS_TraceReset清除Trace缓冲区中的事件
LOS_TraceEventMaskSet设置事件掩码,仅记录某些模块的事件
LOS_TraceHwiFilterHookReg注册过滤特定中断号事件的钩子函数
Close #I46WA0
Signed-off-by: LiteOS2021 <dinglu@huawei.com>
Change-Id: I6a8e64794c4852f2c2980993a06180e09ec6ee0d
This commit is contained in:
@@ -38,7 +38,7 @@
|
||||
#include "los_spinlock.h"
|
||||
#include "los_mp.h"
|
||||
#include "los_percpu_pri.h"
|
||||
|
||||
#include "los_hook.h"
|
||||
|
||||
#ifdef LOSCFG_BASE_IPC_SEM
|
||||
|
||||
@@ -118,7 +118,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSemCreate(UINT16 count, UINT16 maxCount, UINT32 *
|
||||
semCreated->maxSemCount = maxCount;
|
||||
LOS_ListInit(&semCreated->semList);
|
||||
*semHandle = semCreated->semID;
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_CREATE, semCreated);
|
||||
OsSemDbgUpdateHook(semCreated->semID, OsCurrTaskGet()->taskEntry, count);
|
||||
return LOS_OK;
|
||||
|
||||
@@ -165,6 +165,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemDelete(UINT32 semHandle)
|
||||
semDeleted->semStat = OS_SEM_UNUSED;
|
||||
semDeleted->semID = SET_SEM_ID(GET_SEM_COUNT(semDeleted->semID) + 1, GET_SEM_INDEX(semDeleted->semID));
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_DELETE, semDeleted);
|
||||
OsSemDbgUpdateHook(semDeleted->semID, NULL, 0);
|
||||
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
@@ -203,12 +204,12 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
|
||||
retErr = LOS_ERRNO_SEM_INVALID;
|
||||
goto OUT;
|
||||
}
|
||||
|
||||
/* Update the operate time, no matter the actual Pend success or not */
|
||||
OsSemDbgTimeUpdateHook(semHandle);
|
||||
|
||||
if (semPended->semCount > 0) {
|
||||
semPended->semCount--;
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runTask, timeout);
|
||||
goto OUT;
|
||||
} else if (!timeout) {
|
||||
retErr = LOS_ERRNO_SEM_UNAVAILABLE;
|
||||
@@ -222,6 +223,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
|
||||
goto OUT;
|
||||
}
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runTask, timeout);
|
||||
OsTaskWaitSetPendMask(OS_TASK_WAIT_SEM, semPended->semID, timeout);
|
||||
retErr = OsSchedTaskWait(&semPended->semList, timeout, TRUE);
|
||||
if (retErr == LOS_ERRNO_TSK_TIMEOUT) {
|
||||
@@ -259,7 +261,7 @@ LITE_OS_SEC_TEXT UINT32 OsSemPostUnsafe(UINT32 semHandle, BOOL *needSched)
|
||||
} else {
|
||||
semPosted->semCount++;
|
||||
}
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_POST, semPosted, resumedTask);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user