From 53c4bf5ab787c984d0ee08ee3e5df3232f18b473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Mon, 22 Jan 2024 08:17:27 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debug/los_mux_deadlock.c | 257 -------- debug/los_mux_debug.c | 189 ------ debug/los_queue_debug.c | 206 ------ debug/los_sched_debug.c | 347 ---------- debug/los_sem_debug.c | 299 --------- 文豪-用例描述.docx | Bin 14105 -> 0 bytes 文豪/cppsupport/los_cppsupport.c | 74 --- 文豪/cpup/cpup_shellcmd.c | 134 ---- 文豪/cpup/los_cpup.c | 593 ------------------ 文豪/los_cppsupport_pri.h | 53 -- 文豪/los_cpup_pri.h | 74 --- 文豪/los_trace_pri.h | 150 ----- 文豪/trace/los_trace.c | 424 ------------- .../pipeline/serial/trace_pipeline_serial.c | 98 --- .../pipeline/serial/trace_pipeline_serial.h | 50 -- 文豪/trace/pipeline/trace_pipeline.c | 156 ----- 文豪/trace/pipeline/trace_pipeline.h | 104 --- 文豪/trace/pipeline/trace_tlv.c | 121 ---- 文豪/trace/pipeline/trace_tlv.h | 95 --- 文豪/trace/trace_offline.c | 264 -------- 文豪/trace/trace_online.c | 117 ---- 21 files changed, 3805 deletions(-) delete mode 100644 debug/los_mux_deadlock.c delete mode 100644 debug/los_mux_debug.c delete mode 100644 debug/los_queue_debug.c delete mode 100644 debug/los_sched_debug.c delete mode 100644 debug/los_sem_debug.c delete mode 100644 文豪-用例描述.docx delete mode 100644 文豪/cppsupport/los_cppsupport.c delete mode 100644 文豪/cpup/cpup_shellcmd.c delete mode 100644 文豪/cpup/los_cpup.c delete mode 100644 文豪/los_cppsupport_pri.h delete mode 100644 文豪/los_cpup_pri.h delete mode 100644 文豪/los_trace_pri.h delete mode 100644 文豪/trace/los_trace.c delete mode 100644 文豪/trace/pipeline/serial/trace_pipeline_serial.c delete mode 100644 文豪/trace/pipeline/serial/trace_pipeline_serial.h delete mode 100644 文豪/trace/pipeline/trace_pipeline.c delete mode 100644 文豪/trace/pipeline/trace_pipeline.h delete mode 100644 文豪/trace/pipeline/trace_tlv.c delete mode 100644 文豪/trace/pipeline/trace_tlv.h delete mode 100644 文豪/trace/trace_offline.c delete mode 100644 文豪/trace/trace_online.c diff --git a/debug/los_mux_deadlock.c b/debug/los_mux_deadlock.c deleted file mode 100644 index 6862541..0000000 --- a/debug/los_mux_deadlock.c +++ /dev/null @@ -1,257 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Mutex Deadlock Check - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_mux_debug_pri.h" -#include "los_typedef.h" -#include "los_task.h" -#include "arch/exception.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */nbb - -typedef struct { - LOS_DL_LIST muxListHead; /* Task-held mutexs list */ //ڹеĻб// - UINT64 lastAccessTime; /* The last operation time */ //¼һβʱ// -} MuxDLinkCB; - -/*еĻб͸*/ -typedef struct { - LOS_DL_LIST muxList; /* Insert mutex into the owner task CB */ //ڽ뵽Ŀƿ// - VOID *muxCB; /* The Mutex CB pointer */ //ָ򻥳ƿָ// -} MuxDLinkNode; - -STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL; - -/* - * Mutex deadlock detection time threshold, will print out task information - * that has not been scheduled within this time. - * The unit is tick. - */ -#define OS_MUX_DEADLOCK_CHECK_THRESHOLD 60000 //μ黥֮СʱλΪ// - -UINT32 OsMuxDlockCheckInit(VOID) //ڷڴ沢ʼƿб// -{ - UINT32 index; - UINT32 size = (LOSCFG_BASE_CORE_TSK_LIMIT + 1) * sizeof(MuxDLinkCB); - - /* system resident memory, don't free */ - g_muxDeadlockCBArray = (MuxDLinkCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_muxDeadlockCBArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - - for (index = 0; index < LOSCFG_BASE_CORE_TSK_LIMIT + 1; index++) { - g_muxDeadlockCBArray[index].lastAccessTime = 0; - LOS_ListInit(&g_muxDeadlockCBArray[index].muxListHead); - } - return LOS_OK; -} - -VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) //ָĻвһڵ// -{ - MuxDLinkNode *muxDLNode = NULL; - - if ((taskId > LOSCFG_BASE_CORE_TSK_LIMIT) || (muxCB == NULL)) { - return; - } - - muxDLNode = (MuxDLinkNode *)LOS_MemAlloc(m_aucSysMem1, sizeof(MuxDLinkNode)); - if (muxDLNode == NULL) { - return; - } - (VOID)memset_s(muxDLNode, sizeof(MuxDLinkNode), 0, sizeof(MuxDLinkNode)); - muxDLNode->muxCB = muxCB; - - LOS_ListTailInsert(&g_muxDeadlockCBArray[taskId].muxListHead, &muxDLNode->muxList); -} - -VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB) //ڴָĻɾָĻڵ// -{ - MuxDLinkCB *muxDLCB = NULL; - LOS_DL_LIST *list = NULL; - MuxDLinkNode *muxDLNode = NULL; - - if ((taskId > LOSCFG_BASE_CORE_TSK_LIMIT) || (muxCB == NULL)) { - return; - } - - muxDLCB = &g_muxDeadlockCBArray[taskId]; - LOS_DL_LIST_FOR_EACH(list, &muxDLCB->muxListHead) { - muxDLNode = LOS_DL_LIST_ENTRY(list, MuxDLinkNode, muxList); - if (muxDLNode->muxCB == muxCB) { - LOS_ListDelete(&muxDLNode->muxList); - (VOID)LOS_MemFree(m_aucSysMem1, muxDLNode); - return; - } - } -} - -VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount) //ڸʱ// -{ - if (taskId > LOSCFG_BASE_CORE_TSK_LIMIT) { - return; - } - - g_muxDeadlockCBArray[taskId].lastAccessTime = tickCount; -} - -STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) //ڴӡĺջϢ// -{ - TaskContext *context = NULL; - - PRINTK("*******backtrace begin*******\n"); - context = (TaskContext *)taskCB->stackPointer; - ArchBackTraceWithSp(context); - PRINTK("********backtrace end********\n"); - return; -} - -STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) //ڴӡȴбϢ// -{ - LOS_DL_LIST *listTmp = NULL; - LosTaskCB *pendedTask = NULL; - CHAR *name = NULL; - UINT32 index = 0; - UINT32 id, intSave; - - SCHEDULER_LOCK(intSave); - if (LOS_ListEmpty(list) == TRUE) { - SCHEDULER_UNLOCK(intSave); - PRINTK("Pended Task: null\n"); - return; - } - - LOS_DL_LIST_FOR_EACH(listTmp, list) { - pendedTask = OS_TCB_FROM_PENDLIST(listTmp); - name = pendedTask->taskName; - id = pendedTask->taskId; - SCHEDULER_UNLOCK(intSave); - if (index == 0) { - PRINTK("Pended task: %u. name:%-15s, id:0x%-5x\n", index, name, id); - } else { - PRINTK(" %u. name:%-15s, id:0x%-5x\n", index, name, id); - } - index++; - SCHEDULER_LOCK(intSave); - } - SCHEDULER_UNLOCK(intSave); -} - -STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) //ڴӡеĻϢ// -{ - UINT32 index = 0; - MuxDLinkNode *muxDLNode = NULL; - CHAR *ownerName = NULL; - LosMuxCB *muxCB = NULL; - LOS_DL_LIST *list = NULL; - LOS_DL_LIST *listTmp = NULL; - UINT32 count, intSave; - - SCHEDULER_LOCK(intSave); - if (LOS_ListEmpty(&muxDLCB->muxListHead) == TRUE) { - SCHEDULER_UNLOCK(intSave); - PRINTK("null\n"); - } else { - LOS_DL_LIST_FOR_EACH(list, &muxDLCB->muxListHead) { - muxDLNode = LOS_DL_LIST_ENTRY(list, MuxDLinkNode, muxList); - muxCB = (LosMuxCB *)muxDLNode->muxCB; - count = muxCB->muxCount; - ownerName = muxCB->owner->taskName; - SCHEDULER_UNLOCK(intSave); - PRINTK("\n", index); - PRINTK("Ptr handle:%p\n", muxCB); - PRINTK("Owner:%s\n", ownerName); - PRINTK("Count:%u\n", count); - - listTmp = &muxCB->muxList; - OsMutexPendTaskList(listTmp); - - index++; - SCHEDULER_LOCK(intSave); - } - SCHEDULER_UNLOCK(intSave); - } -} - -VOID OsMutexDlockCheck(VOID) //ڼ⻥Ϣ// -{ - UINT32 loop, intSave; - UINT32 taskId; - CHAR *name = NULL; - LosTaskCB *taskCB = NULL; - MuxDLinkCB *muxDLCB = NULL; - - SCHEDULER_LOCK(intSave); - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (LosTaskCB *)g_taskCBArray + loop; - if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { - continue; - } - - muxDLCB = &g_muxDeadlockCBArray[taskCB->taskId]; - if ((LOS_TickCountGet() - muxDLCB->lastAccessTime) > OS_MUX_DEADLOCK_CHECK_THRESHOLD) { - name = taskCB->taskName; - taskId = taskCB->taskId; - SCHEDULER_UNLOCK(intSave); - PRINTK("Task_name:%s, ID:0x%x, holds the Mutexs below:\n", name, taskId); - OsTaskHoldMutexList(muxDLCB); - OsDeadlockBackTrace(taskCB); - PRINTK("\n"); - SCHEDULER_LOCK(intSave); - } - } - SCHEDULER_UNLOCK(intSave); -} - -#ifdef LOSCFG_SHELL //ִл鲢Ϣ// -UINT32 OsShellCmdMuxDeadlockCheck(UINT32 argc, const CHAR **argv) -{ - if (argc > 0) { - PRINTK("\nUsage: dlock\n"); - return OS_ERROR; - } - PRINTK("Start mutexs deadlock check: \n"); - OsMutexDlockCheck(); - PRINTK("-----------End-----------\n"); - return LOS_OK; -} -SHELLCMD_ENTRY(deadlock_shellcmd, CMD_TYPE_EX, "dlock", 0, (CmdCallBackFunc)OsShellCmdMuxDeadlockCheck); -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ diff --git a/debug/los_mux_debug.c b/debug/los_mux_debug.c deleted file mode 100644 index 5008bc5..0000000 --- a/debug/los_mux_debug.c +++ /dev/null @@ -1,189 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Mutex Debug - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_mux_debug_pri.h" -#include "los_typedef.h" -#include "los_task.h" -#include "los_misc_pri.h" -#include "arch/exception.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_MUTEX //ڱʾĵϢ// -typedef struct { - TSK_ENTRY_FUNC creator; /* The task entry who created this mutex */ - UINT64 lastAccessTime; /* The last access time */ -} MuxDebugCB; -STATIC MuxDebugCB *g_muxDebugArray = NULL; - -//ڱȽϢʱ// -STATIC BOOL MuxCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) -{ - return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > - *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); -} - -UINT32 OsMuxDbgInit(VOID) //ڳʼϢ// -{ - UINT32 size = LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(MuxDebugCB); - /* system resident memory, don't free */ - g_muxDebugArray = (MuxDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_muxDebugArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - (VOID)memset_s(g_muxDebugArray, size, 0, size); - return LOS_OK; -} - -VOID OsMuxDbgTimeUpdate(UINT32 muxId) //ڸָʱ// -{ - MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; - muxDebug->lastAccessTime = LOS_TickCountGet(); -} - -VOID OsMuxDbgUpdate(UINT32 muxId, TSK_ENTRY_FUNC creator) //ڸָĴߺʱ// -{ - MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; - muxDebug->creator = creator; - muxDebug->lastAccessTime = LOS_TickCountGet(); -} - -//ڶԻ򣬲ܴڵĻй©// -STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count) -{ - LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; - MuxDebugCB muxDebugNode = {0}; - UINT32 index, intSave; - SortParam muxSortParam; - muxSortParam.buf = (CHAR *)g_muxDebugArray; - muxSortParam.ctrlBlockSize = sizeof(MuxDebugCB); - muxSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_MUX_LIMIT; - muxSortParam.sortElemOff = LOS_OFF_SET_OF(MuxDebugCB, lastAccessTime); - - if (count > 0) { - SCHEDULER_LOCK(intSave); - OsArraySort(indexArray, 0, count - 1, &muxSortParam, MuxCompareValue); - SCHEDULER_UNLOCK(intSave); - for (index = 0; index < count; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&muxNode, sizeof(LosMuxCB), - GET_MUX(indexArray[index]), sizeof(LosMuxCB)); - (VOID)memcpy_s(&muxDebugNode, sizeof(MuxDebugCB), - &g_muxDebugArray[indexArray[index]], sizeof(MuxDebugCB)); - SCHEDULER_UNLOCK(intSave); - /* - * muxStat may be altered after the g_taskSpin is unlocked in OsMutexCheck. - * We should recheck the muxStat before the print. - */ - if ((muxNode.muxStat != LOS_USED) || - ((muxNode.muxStat == LOS_USED) && ((muxDebugNode.creator == NULL) || (muxNode.owner == NULL)))) { - continue; - } - PRINTK("Mutex ID <0x%x> may leak, TaskID of owner:0x%x, TaskEntry of owner: %p," - "TaskEntry of creator: %p,Latest operation time: 0x%llx\n", - muxNode.muxId, muxNode.owner->taskId, muxNode.owner->taskEntry, muxDebugNode.creator, - muxDebugNode.lastAccessTime); - } - } - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); -} - -VOID OsMutexCheck(VOID) //ڼ黥״̬ԿܴڵĻй©д// -{ - LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; - MuxDebugCB muxDebugNode = {0}; - UINT32 index, intSave; - UINT32 count = 0; - - /* - * This return value does not need to be judged immediately, - * and the following code logic has already distinguished the return value from null and non-empty, - * and there is no case of accessing the null pointer. - */ - UINT32 *indexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(UINT32)); - - for (index = 0; index < LOSCFG_BASE_IPC_MUX_LIMIT; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&muxNode, sizeof(LosMuxCB), GET_MUX(index), sizeof(LosMuxCB)); - (VOID)memcpy_s(&muxDebugNode, sizeof(MuxDebugCB), &g_muxDebugArray[index], sizeof(MuxDebugCB)); - SCHEDULER_UNLOCK(intSave); - - if ((muxNode.muxStat != LOS_USED) || - ((muxNode.muxStat == LOS_USED) && (muxDebugNode.creator == NULL))) { - continue; - } else if ((muxNode.muxStat == LOS_USED) && (muxNode.owner == NULL)) { - PRINTK("Mutex ID <0x%x> may leak, Owner is null, TaskEntry of creator: %p," - "Latest operation time: 0x%llx\n", - muxNode.muxId, muxDebugNode.creator, muxDebugNode.lastAccessTime); - } else { - if (indexArray != NULL) { - *(indexArray + count) = index; - count++; - } else { - PRINTK("Mutex ID <0x%x> may leak, TaskID of owner:0x%x, TaskEntry of owner: %p," - "TaskEntry of creator: %p,Latest operation time: 0x%llx\n", - muxNode.muxId, muxNode.owner->taskId, muxNode.owner->taskEntry, muxDebugNode.creator, - muxDebugNode.lastAccessTime); - } - } - } - - if (indexArray != NULL) { - SortMuxIndexArray(indexArray, count); - } -} - -#ifdef LOSCFG_SHELL -//ڻȡϢ// -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMuxInfoGet(UINT32 argc, const CHAR **argv) -{ - if (argc > 0) { - PRINTK("\nUsage: mutex\n"); - return OS_ERROR; - } - PRINTK("used mutexs information: \n"); - OsMutexCheck(); - return LOS_OK; -} -SHELLCMD_ENTRY(mutex_shellcmd, CMD_TYPE_EX, "mutex", 0, (CmdCallBackFunc)OsShellCmdMuxInfoGet); -#endif /* LOSCFG_SHELL */ -#endif /* LOSCFG_DEBUG_MUTEX */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ diff --git a/debug/los_queue_debug.c b/debug/los_queue_debug.c deleted file mode 100644 index 43ba6ad..0000000 --- a/debug/los_queue_debug.c +++ /dev/null @@ -1,206 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Queue Debug - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_queue_debug_pri.h" -#include "los_misc_pri.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_QUEUE //ڱеĵϢ// -typedef struct { - TSK_ENTRY_FUNC creator; /* The task entry who created this queue */ - UINT64 lastAccessTime; /* The last access time */ -} QueueDebugCB; -STATIC QueueDebugCB *g_queueDebugArray = NULL; - -//ڱȽ϶еԪֵ// -STATIC BOOL QueueCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) -{ - return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > - *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); -} - -UINT32 OsQueueDbgInit(VOID) //ڳʼеĵϢ// -{ - UINT32 size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(QueueDebugCB); - - /* system resident memory, don't free */ - g_queueDebugArray = (QueueDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_queueDebugArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - (VOID)memset_s(g_queueDebugArray, size, 0, size); - return LOS_OK; -} - -VOID OsQueueDbgTimeUpdate(UINT32 queueId) //ڸ¶еʱ// -{ - QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; - queueDebug->lastAccessTime = LOS_TickCountGet(); - return; -} - -VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry) //ڸ¶еĵϢ// -{ - QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; - queueDebug->creator = entry; - queueDebug->lastAccessTime = LOS_TickCountGet(); - return; -} - -STATIC INLINE VOID OsQueueInfoOutPut(const LosQueueCB *node) //еϢ// -{ - PRINTK("Queue ID <0x%x> may leak, queue len is 0x%x, " - "readable cnt:0x%x, writeable cnt:0x%x, ", - node->queueId, - node->queueLen, - node->readWriteableCnt[OS_QUEUE_READ], - node->readWriteableCnt[OS_QUEUE_WRITE]); -} - -STATIC INLINE VOID OsQueueOpsOutput(const QueueDebugCB *node) //вϢ// -{ - PRINTK("TaskEntry of creator:0x%p, Latest operation time: 0x%llx\n", - node->creator, node->lastAccessTime); -} - -STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) //ڶԶӦĶϢ// -{ - LosQueueCB queueNode = {0}; - QueueDebugCB queueDebugNode = {0}; - UINT32 index, intSave; - SortParam queueSortParam; - queueSortParam.buf = (CHAR *)g_queueDebugArray; - queueSortParam.ctrlBlockSize = sizeof(QueueDebugCB); - queueSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_QUEUE_LIMIT; - queueSortParam.sortElemOff = LOS_OFF_SET_OF(QueueDebugCB, lastAccessTime); - - if (count > 0) { - SCHEDULER_LOCK(intSave); - OsArraySort(indexArray, 0, count - 1, &queueSortParam, QueueCompareValue); - SCHEDULER_UNLOCK(intSave); - for (index = 0; index < count; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&queueNode, sizeof(LosQueueCB), - GET_QUEUE_HANDLE(indexArray[index]), sizeof(LosQueueCB)); - (VOID)memcpy_s(&queueDebugNode, sizeof(QueueDebugCB), - &g_queueDebugArray[indexArray[index]], sizeof(QueueDebugCB)); - SCHEDULER_UNLOCK(intSave); - if (queueNode.queueState == LOS_UNUSED) { - continue; - } - OsQueueInfoOutPut(&queueNode); - OsQueueOpsOutput(&queueDebugNode); - } - } - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); -} - -VOID OsQueueCheck(VOID) //ڼе״̬ӦϢ// -{ - LosQueueCB queueNode = {0}; - QueueDebugCB queueDebugNode = {0}; - UINT32 index, intSave; - UINT32 count = 0; - - /* - * This return value does not need to be judged immediately, - * and the following code logic has already distinguished the return value from null and non-empty, - * and there is no case of accessing the null pointer. - */ - UINT32 *indexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(UINT32)); - - for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&queueNode, sizeof(LosQueueCB), - GET_QUEUE_HANDLE(index), sizeof(LosQueueCB)); - (VOID)memcpy_s(&queueDebugNode, sizeof(QueueDebugCB), - &g_queueDebugArray[index], sizeof(QueueDebugCB)); - SCHEDULER_UNLOCK(intSave); - if ((queueNode.queueState == LOS_UNUSED) || - ((queueNode.queueState == LOS_USED) && (queueDebugNode.creator == NULL))) { - continue; - } - if ((queueNode.queueState == LOS_USED) && - (queueNode.queueLen == queueNode.readWriteableCnt[OS_QUEUE_WRITE]) && - LOS_ListEmpty(&queueNode.readWriteList[OS_QUEUE_READ]) && - LOS_ListEmpty(&queueNode.readWriteList[OS_QUEUE_WRITE]) && - LOS_ListEmpty(&queueNode.memList)) { - PRINTK("Queue ID <0x%x> may leak, No task uses it, " - "QueueLen is 0x%x, ", - queueNode.queueId, - queueNode.queueLen); - OsQueueOpsOutput(&queueDebugNode); - } else { - if (indexArray != NULL) { - *(indexArray + count) = index; - count++; - } else { - OsQueueInfoOutPut(&queueNode); - OsQueueOpsOutput(&queueDebugNode); - } - } - } - - if (indexArray != NULL) { - SortQueueIndexArray(indexArray, count); - } - - return; -} - -#ifdef LOSCFG_SHELL -//û "queue" ʱʹöеϢ// -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdQueueInfoGet(UINT32 argc, const CHAR **argv) -{ - if (argc > 0) { - PRINTK("\nUsage: queue\n"); - return OS_ERROR; - } - PRINTK("used queues information: \n"); - OsQueueCheck(); - return LOS_OK; -} - -SHELLCMD_ENTRY(queue_shellcmd, CMD_TYPE_EX, "queue", 0, (CmdCallBackFunc)OsShellCmdQueueInfoGet); -#endif /* LOSCFG_SHELL */ -#endif /* LOSCFG_DEBUG_QUEUE */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ diff --git a/debug/los_sched_debug.c b/debug/los_sched_debug.c deleted file mode 100644 index ec4a78b..0000000 --- a/debug/los_sched_debug.c +++ /dev/null @@ -1,347 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved. - * Description: Schedule Statistics - * Author: Huawei LiteOS Team - * Create: 2018-11-16 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_task_pri.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_SCHED_STATISTICS -#define HIGHTASKPRI 16 -#define NS_PER_MS 1000000 -#define DECIMAL_TO_PERCENTAGE 100 - -typedef struct { - UINT64 idleRuntime; //ʱ// - UINT64 idleStarttime; //ʱ// - UINT64 highTaskRuntime; //ȼʱ// - UINT64 highTaskStarttime; //ȼʱ// - UINT64 sumPriority; //ȼ֮// - UINT32 prioritySwitch; //л// - UINT32 highTaskSwitch; //ȼл// - UINT32 contexSwitch; //л// - UINT32 hwiNum; //Ӳжϴ// -#ifdef LOSCFG_KERNEL_SMP - UINT32 ipiIrqNum; //жϴڶ¶壩// -#endif -} StatPercpu; - -STATIC BOOL g_statisticsStartFlag = FALSE; -STATIC UINT64 g_statisticsStartTime; -STATIC StatPercpu g_statPercpu[LOSCFG_KERNEL_CORE_NUM]; - -//ÿ CPU Ͻеͳ// -STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *newTask) -{ - UINT32 cpuId; - UINT32 idleTaskId; - UINT64 now, runtime; - - if (g_statisticsStartFlag != TRUE) { - return; - } - - cpuId = ArchCurrCpuid(); - idleTaskId = OsGetIdleTaskId(); - now = LOS_CurrNanosec(); - - g_statPercpu[cpuId].contexSwitch++; - - if ((runTask->taskId != idleTaskId) && (newTask->taskId == idleTaskId)) { - g_statPercpu[cpuId].idleStarttime = now; - } - - if ((runTask->taskId == idleTaskId) && (newTask->taskId != idleTaskId)) { - runtime = now - g_statPercpu[cpuId].idleStarttime; - g_statPercpu[cpuId].idleRuntime += runtime; - g_statPercpu[cpuId].idleStarttime = 0; - } - - if ((runTask->priority >= HIGHTASKPRI) && (newTask->priority < HIGHTASKPRI)) { - g_statPercpu[cpuId].highTaskStarttime = now; - } - - if ((runTask->priority < HIGHTASKPRI) && (newTask->priority >= HIGHTASKPRI)) { - runtime = now - g_statPercpu[cpuId].highTaskStarttime; - g_statPercpu[cpuId].highTaskRuntime += runtime; - g_statPercpu[cpuId].highTaskStarttime = 0; - } - - if (newTask->priority < HIGHTASKPRI) { - g_statPercpu[cpuId].highTaskSwitch++; - } - - if (newTask->taskId != idleTaskId) { - g_statPercpu[cpuId].sumPriority += newTask->priority; - g_statPercpu[cpuId].prioritySwitch++; - } - - return; -} - -//ڸµͳϢ// -LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *newTask) -{ - UINT64 runtime; - UINT32 cpuId = ArchCurrCpuid(); - UINT64 now = LOS_CurrNanosec(); - - SchedStat *schedRun = &runTask->schedStat; - SchedStat *schedNew = &newTask->schedStat; - SchedPercpu *cpuRun = &schedRun->schedPercpu[cpuId]; - SchedPercpu *cpuNew = &schedNew->schedPercpu[cpuId]; - - /* calculate one chance of running time */ - runtime = now - schedRun->startRuntime; - - /* add running timer to running task statistics */ - cpuRun->runtime += runtime; - schedRun->allRuntime += runtime; - - /* add context switch counters and schedule start time */ - cpuNew->contexSwitch++; - schedNew->allContextSwitch++; - schedNew->startRuntime = now; - OsSchedStatisticsPerCpu(runTask, newTask); -} - -LITE_OS_SEC_TEXT_MINOR VOID OsHwiStatistics(size_t intNum) //ڸӲжϵͳϢ// -{ - UINT32 cpuId = ArchCurrCpuid(); - - if ((g_statisticsStartFlag != TRUE) || (intNum == OS_TICK_INT_NUM)) { - return; - } - - g_statPercpu[cpuId].hwiNum++; -#ifdef LOSCFG_KERNEL_SMP - /* 16: 0~15 is ipi interrupts */ - if (intNum < 16) { - g_statPercpu[cpuId].ipiIrqNum++; - } -#endif - return; -} - -LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) //ڴӡĵͳϢ// -{ - LosTaskCB *taskCB = NULL; - UINT32 loop; - UINT32 cpuId; -#ifdef LOSCFG_KERNEL_SMP - UINT32 affinity; -#endif - - PRINTK("\n"); - PRINTK("Task TID Total Time Total CST " - "CPU Time CST\n"); - PRINTK("---- --- ------------------ ---------- -" - "--- ------------------ ----------\n"); - - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (((LosTaskCB *)g_taskCBArray) + loop); - if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { - continue; - } -#ifdef LOSCFG_KERNEL_SMP - affinity = (UINT32)taskCB->cpuAffiMask; -#endif - PRINTK("%-30s0x%-6x%+16lf ms %10u\n", taskCB->taskName, taskCB->taskId, - (DOUBLE)(taskCB->schedStat.allRuntime) / NS_PER_MS, - taskCB->schedStat.allContextSwitch); - - for (cpuId = 0; cpuId < LOSCFG_KERNEL_CORE_NUM; cpuId++) { -#ifdef LOSCFG_KERNEL_SMP - if (!((1U << cpuId) & affinity)) { - continue; - } -#endif - PRINTK(" " - "CPU%u %+16lf ms %12u\n", cpuId, - (DOUBLE)(taskCB->schedStat.schedPercpu[cpuId].runtime) / NS_PER_MS, - taskCB->schedStat.schedPercpu[cpuId].contexSwitch); - } - } - - PRINTK("\n"); -} - -LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) //ʾϵͳͳϢ// -{ - UINT32 cpuId; - PRINTK("\n"); - PRINTK("Passed Time: %+16lf ms\n", ((DOUBLE)statisticsPastTime / NS_PER_MS)); - PRINTK("--------------------------------\n"); - PRINTK("CPU Idle(%%) ContexSwitch HwiNum " - "Avg Pri HiTask(%%) HiTask SwiNum HiTask P(ms)" -#ifdef LOSCFG_KERNEL_SMP - " MP Hwi\n"); -#else - "\n"); -#endif - PRINTK("---- --------- ----------- -------- --------- " - "---------- ------------ ----------" -#ifdef LOSCFG_KERNEL_SMP - " ------\n"); -#else - "\n"); -#endif - - for (cpuId = 0; cpuId < LOSCFG_KERNEL_CORE_NUM; cpuId++) { -#ifdef LOSCFG_KERNEL_SMP - PRINTK("CPU%u %+10lf%14u%14u %+11lf %+11lf%14u %+11lf %11u\n", cpuId, -#else - PRINTK("CPU%u %+10lf%14u%14u %+11lf %+11lf%14u %+11lf\n", cpuId, -#endif - ((DOUBLE)(g_statPercpu[cpuId].idleRuntime) / statisticsPastTime) * DECIMAL_TO_PERCENTAGE, - g_statPercpu[cpuId].contexSwitch, - g_statPercpu[cpuId].hwiNum, - (g_statPercpu[cpuId].prioritySwitch == 0) ? OS_TASK_PRIORITY_LOWEST : - ((DOUBLE)(g_statPercpu[cpuId].sumPriority) / (g_statPercpu[cpuId].prioritySwitch)), - ((DOUBLE)(g_statPercpu[cpuId].highTaskRuntime) / statisticsPastTime) * DECIMAL_TO_PERCENTAGE, - g_statPercpu[cpuId].highTaskSwitch, - (g_statPercpu[cpuId].highTaskSwitch == 0) ? 0 : - ((DOUBLE)(g_statPercpu[cpuId].highTaskRuntime) / (g_statPercpu[cpuId].highTaskSwitch)) / NS_PER_MS -#ifdef LOSCFG_KERNEL_SMP - , g_statPercpu[cpuId].ipiIrqNum); -#else - ); -#endif - } - - PRINTK("\n"); -} - -LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) //ڶϵͳͳƹ// -{ - LosTaskCB *taskCB = NULL; - UINT32 loop; - UINT32 cpuId = 0; - UINT32 intSave; - - SCHEDULER_LOCK(intSave); - - if (g_statisticsStartFlag) { - SCHEDULER_UNLOCK(intSave); - PRINT_WARN("mp static has started\n"); - return; - } - - g_statisticsStartTime = LOS_CurrNanosec(); - - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (((LosTaskCB *)g_taskCBArray) + loop); - if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { -#ifdef LOSCFG_KERNEL_SMP - cpuId = taskCB->currCpu; -#endif - if ((UINT32)(OS_TASK_INVALID_CPUID) == cpuId) { - continue; - } - if (!strcmp(taskCB->taskName, "IdleCore000")) { - g_statPercpu[cpuId].idleStarttime = g_statisticsStartTime; - } - if (taskCB->priority < HIGHTASKPRI) { - g_statPercpu[cpuId].highTaskStarttime = g_statisticsStartTime; - g_statPercpu[cpuId].highTaskSwitch++; - } - if (strcmp(taskCB->taskName, "IdleCore000")) { - g_statPercpu[cpuId].sumPriority += taskCB->priority; - g_statPercpu[cpuId].prioritySwitch++; - } - } - } - g_statisticsStartFlag = TRUE; - SCHEDULER_UNLOCK(intSave); - - PRINTK("mp static start\n"); - - return; -} - -//ڶϵͳֹͣͳƹܣͳݵĴչʾ// -LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStop(VOID) -{ - LosTaskCB *taskCB = NULL; - UINT32 loop; - UINT32 cpuId = 0; - UINT64 statisticsStopTime; - UINT64 statisticsPastTime; - UINT64 runtime; - UINT32 intSave; - - SCHEDULER_LOCK(intSave); - - if (g_statisticsStartFlag != TRUE) { - SCHEDULER_UNLOCK(intSave); - PRINT_WARN("Please set mp static start\n"); - return; - } - - g_statisticsStartFlag = FALSE; - statisticsStopTime = LOS_CurrNanosec(); - statisticsPastTime = statisticsStopTime - g_statisticsStartTime; - - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (((LosTaskCB *)g_taskCBArray) + loop); - if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { -#ifdef LOSCFG_KERNEL_SMP - cpuId = taskCB->currCpu; -#endif - if (cpuId == (UINT32)(OS_TASK_INVALID_CPUID)) { - continue; - } - if (!strcmp(taskCB->taskName, "IdleCore000")) { - runtime = statisticsStopTime - g_statPercpu[cpuId].idleStarttime; - g_statPercpu[cpuId].idleRuntime += runtime; - g_statPercpu[cpuId].idleStarttime = 0; - } - if (taskCB->priority < HIGHTASKPRI) { - runtime = statisticsStopTime - g_statPercpu[cpuId].highTaskStarttime; - g_statPercpu[cpuId].highTaskRuntime += runtime; - g_statPercpu[cpuId].highTaskStarttime = 0; - } - } - } - SCHEDULER_UNLOCK(intSave); - OsStatisticsShow(statisticsPastTime); - - (VOID)memset_s(g_statPercpu, sizeof(g_statPercpu), 0, sizeof(g_statPercpu)); - g_statisticsStartTime = 0; - return; -} -#endif - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/debug/los_sem_debug.c b/debug/los_sem_debug.c deleted file mode 100644 index 8f1774b..0000000 --- a/debug/los_sem_debug.c +++ /dev/null @@ -1,299 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Sem Debug - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_sem_debug_pri.h" -#include "stdlib.h" -#include "los_typedef.h" -#include "los_task_pri.h" -#include "los_misc_pri.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_SEMAPHORE -#define OS_ALL_SEM_MASK 0xffffffff - -STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) //ڴӡȴijźб// -{ - LosTaskCB *tskCB = NULL; - CHAR *nameArr[LOSCFG_BASE_CORE_TSK_LIMIT] = {0}; - UINT32 i, intSave; - UINT32 num = 0; - - SCHEDULER_LOCK(intSave); - if ((semNode->semStat == LOS_UNUSED) || (LOS_ListEmpty(&semNode->semList))) { - SCHEDULER_UNLOCK(intSave); - return; - } - - LOS_DL_LIST_FOR_EACH_ENTRY(tskCB, &semNode->semList, LosTaskCB, pendList) { - nameArr[num++] = tskCB->taskName; - if (num == LOSCFG_BASE_CORE_TSK_LIMIT) { - break; - } - } - SCHEDULER_UNLOCK(intSave); - - PRINTK("Pended task list : "); - for (i = 0; i < num; i++) { - if (i == 0) { - PRINTK("%s\n", nameArr[i]); - } else { - PRINTK(", %s", nameArr[i]); - } - } - PRINTK("\n"); -} - -typedef struct { //ڼ¼źĵϢ// - UINT16 origSemCount; /* Number of original available semaphores */ - UINT64 lastAccessTime; /* The last operation time */ - TSK_ENTRY_FUNC creator; /* The task entry who created this sem */ -} SemDebugCB; -STATIC SemDebugCB *g_semDebugArray = NULL; //ڴ洢źĵϢ// - -//ڱȽԪصֵ// -STATIC BOOL SemCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) -{ - return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > - *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); -} - -UINT32 OsSemDbgInit(VOID) //ڳʼźĵϢ// -{ - UINT32 size = LOSCFG_BASE_IPC_SEM_LIMIT * sizeof(SemDebugCB); - /* system resident memory, don't free */ - g_semDebugArray = (SemDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_semDebugArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - (VOID)memset_s(g_semDebugArray, size, 0, size); - return LOS_OK; -} - -VOID OsSemDbgTimeUpdate(UINT32 semId) //ڸָźһηʱ// -{ - SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; - semDebug->lastAccessTime = LOS_TickCountGet(); - return; -} - -VOID OsSemDbgUpdate(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) //ڸָźĵϢ// -{ - SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; - semDebug->creator = creator; - semDebug->lastAccessTime = LOS_TickCountGet(); - semDebug->origSemCount = count; - return; -} - -/*ڰźʱԵǰʹõź*/ -/*ӡÿźĵϢ͵ȴź*/ -STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount) -{ - UINT32 i, intSave; - LosSemCB *semCB = NULL; - LosSemCB semNode = {0}; - SemDebugCB semDebug = {0}; - SortParam semSortParam; - semSortParam.buf = (CHAR *)g_semDebugArray; - semSortParam.ctrlBlockSize = sizeof(SemDebugCB); - semSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_SEM_LIMIT; - semSortParam.sortElemOff = LOS_OFF_SET_OF(SemDebugCB, lastAccessTime); - - /* It will Print out ALL the Used Semaphore List. */ - PRINTK("Used Semaphore List: \n"); - PRINTK("\r\n SemID Count OriginalCount Creater(TaskEntry) LastAccessTime\n"); - PRINTK(" ------ ------ ------------- ------------------ -------------- \n"); - - SCHEDULER_LOCK(intSave); - OsArraySort(semIndexArray, 0, usedCount - 1, &semSortParam, SemCompareValue); - SCHEDULER_UNLOCK(intSave); - for (i = 0; i < usedCount; i++) { - semCB = GET_SEM(semIndexArray[i]); - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); - (VOID)memcpy_s(&semDebug, sizeof(SemDebugCB), &g_semDebugArray[semIndexArray[i]], sizeof(SemDebugCB)); - SCHEDULER_UNLOCK(intSave); - if ((semNode.semStat != LOS_USED) || (semDebug.creator == NULL)) { - continue; - } - PRINTK(" 0x%-07x0x%-07u0x%-14u%-22p0x%llx\n", semNode.semId, semDebug.origSemCount, - semNode.semCount, semDebug.creator, semDebug.lastAccessTime); - if (!LOS_ListEmpty(&semNode.semList)) { - OsSemPendedTaskNamePrint(semCB); - } - } -} -/*ڻȡǰʹõźϢźʱź*/ -UINT32 OsSemInfoGetFullData(VOID) -{ - UINT32 usedSemCnt = 0; - LosSemCB *semNode = NULL; - SemDebugCB *semDebug = NULL; - UINT32 i; - UINT32 *semIndexArray = NULL; - UINT32 count, intSave; - - SCHEDULER_LOCK(intSave); - /* Get the used semaphore count. */ - for (i = 0; i < LOSCFG_BASE_IPC_SEM_LIMIT; i++) { - semNode = GET_SEM(i); - semDebug = &g_semDebugArray[i]; - if ((semNode->semStat == LOS_USED) && (semDebug->creator != NULL)) { - usedSemCnt++; - } - } - SCHEDULER_UNLOCK(intSave); - - if (usedSemCnt > 0) { - semIndexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, usedSemCnt * sizeof(UINT32)); - if (semIndexArray == NULL) { - PRINTK("LOS_MemAlloc failed in %s \n", __func__); - return LOS_NOK; - } - - /* Fill the semIndexArray with the real index. */ - count = 0; - - SCHEDULER_LOCK(intSave); - for (i = 0; i < LOSCFG_BASE_IPC_SEM_LIMIT; i++) { - semNode = GET_SEM(i); - semDebug = &g_semDebugArray[i]; - if ((semNode->semStat != LOS_USED) || (semDebug->creator == NULL)) { - continue; - } - *(semIndexArray + count) = i; - count++; - /* if the count is touched usedSemCnt break. */ - if (count >= usedSemCnt) { - break; - } - } - SCHEDULER_UNLOCK(intSave); - OsSemSort(semIndexArray, count); - - /* free the index array. */ - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, semIndexArray); - } - return LOS_OK; -} - -#ifdef LOSCFG_SHELL -STATIC UINT32 OsSemInfoOutput(size_t semId) //źϢ// -{ - UINT32 loop, semCnt, intSave; - LosSemCB *semCB = NULL; - LosSemCB semNode = {0}; - - if (semId == OS_ALL_SEM_MASK) { - for (loop = 0, semCnt = 0; loop < LOSCFG_BASE_IPC_SEM_LIMIT; loop++) { - semCB = GET_SEM(loop); - SCHEDULER_LOCK(intSave); - if (semCB->semStat == LOS_USED) { - (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); - SCHEDULER_UNLOCK(intSave); - semCnt++; - PRINTK("\r\n SemID Count\n ---------- -----\n"); - PRINTK(" 0x%08x %u\n", semNode.semId, semNode.semCount); - continue; - } - SCHEDULER_UNLOCK(intSave); - } - PRINTK(" SemUsingNum : %u\n\n", semCnt); - return LOS_OK; - } else { - semCB = GET_SEM(semId); - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); - SCHEDULER_UNLOCK(intSave); - if ((semNode.semId != semId) || (semNode.semStat != LOS_USED)) { - PRINTK("\nThe semaphore is not in use!\n"); - return LOS_OK; - } - - PRINTK("\r\n SemID Count\n ---------- -----\n"); - PRINTK(" 0x%08x 0x%u\n", semNode.semId, semNode.semCount); - - if (LOS_ListEmpty(&semNode.semList)) { - PRINTK("No task is pended on this semaphore!\n"); - return LOS_OK; - } else { - OsSemPendedTaskNamePrint(semCB); - } - } - return LOS_OK; -} - -//ڻȡźϢ// -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSemInfoGet(UINT32 argc, const CHAR **argv) -{ - size_t semId; - CHAR *endPtr = NULL; - UINT32 ret; - - if (argc > 1) { - PRINTK("\nUsage: sem [fulldata|ID]\n"); - return OS_ERROR; - } - - if (argc == 0) { - semId = OS_ALL_SEM_MASK; - } else { - if (strcmp(argv[0], "fulldata") == 0) { - ret = OsSemInfoGetFullData(); - return ret; - } - - semId = strtoul(argv[0], &endPtr, 0); - if ((*endPtr != 0) || (GET_SEM_INDEX(semId) >= LOSCFG_BASE_IPC_SEM_LIMIT)) { - PRINTK("\nsem ID can't access %s.\n", argv[0]); - return OS_ERROR; - } - } - - ret = OsSemInfoOutput(semId); - return ret; -} - -SHELLCMD_ENTRY(sem_shellcmd, CMD_TYPE_EX, "sem", 1, (CmdCallBackFunc)OsShellCmdSemInfoGet); -#endif /* LOSCFG_SHELL */ -#endif /* LOSCFG_DEBUG_SEMAPHORE */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ diff --git a/文豪-用例描述.docx b/文豪-用例描述.docx deleted file mode 100644 index a5be5e412a48256759719611f03b383b2d93be84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14105 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 diff --git a/文豪/cppsupport/los_cppsupport.c b/文豪/cppsupport/los_cppsupport.c deleted file mode 100644 index e6239ab..0000000 --- a/文豪/cppsupport/los_cppsupport.c +++ /dev/null @@ -1,74 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: LiteOS Cpp Support Implementation - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_cppsupport_pri.h" -#include "los_printf.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -typedef VOID (*InitFunc)(VOID); - -/*------------------------------------------- -*`LITE_OS_SEC_TEXT_MINOR``UINTPTR`ȡ -*`LOS_CppSystemInit`Уһʼ飬 -*εЩʼݴ`flag` -*ضλִгʼ -*--------------------------------------------*/ -LITE_OS_SEC_TEXT_MINOR INT32 LOS_CppSystemInit(UINTPTR initArrayStart, UINTPTR initArrayEnd, INT32 flag) -{ - UINTPTR fastEnd = (UINTPTR)&__fast_end; - UINTPTR *start = (UINTPTR *)initArrayStart; - InitFunc initFunc = NULL; - -#ifdef LOSCFG_AARCH64 - __register_frame(__EH_FRAME_BEGIN__); -#endif - - for (; start != (UINTPTR *)initArrayEnd; ++start) { - if ((flag == BEFORE_SCATTER) && ((UINTPTR)*start > fastEnd)) { - continue; - } else if ((flag == AFTER_SCATTER) && ((UINTPTR)*start <= fastEnd)) { - continue; - } - - initFunc = (InitFunc)(*start); - initFunc(); - } - - return 0; -} - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/文豪/cpup/cpup_shellcmd.c b/文豪/cpup/cpup_shellcmd.c deleted file mode 100644 index 8e4160b..0000000 --- a/文豪/cpup/cpup_shellcmd.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. - * Description: ShellCmd Cpup - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_config.h" -#ifdef LOSCFG_SHELL -#include "stdio.h" -#include "stdlib.h" -#include "los_cpup_pri.h" -#include "los_task_pri.h" -#include "shcmd.h" -#include "shell.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -VOID OsCmdCpupOperateOneParam(UINT32 mode) //ݲmodeȡϵͳCPUʹʵʷ// -{ - UINT32 ret; - - if (mode == CPUP_LAST_TEN_SECONDS) { //ȥ10s// - PRINTK("\nSysCpuUsage in 10s: "); - } else if (mode == CPUP_LAST_ONE_SECONDS) { //ȥ1s// - PRINTK("\nSysCpuUsage in 1s: "); - } else { //ʷƽCPUʹ// - PRINTK("\nSysCpuUsage in all time: "); - } - ret = LOS_HistorySysCpuUsage(mode); //ȡCPUʹʵֵ// - PRINTK("%u.%u", ret / LOS_CPUP_PRECISION_MULT, ret % LOS_CPUP_PRECISION_MULT); -} - -VOID OsCmdCpupOperateTwoParam(UINT32 mode, UINT32 taskId) //ݲmodeȡtaskIdָ// -{ //CPUʹʵʷ// - UINT32 ret; - - if (mode == CPUP_LAST_TEN_SECONDS) { //ȥ10s// - PRINTK("\nTaskId %u CpuUsage in 10s: ", taskId); - } else if (mode == CPUP_LAST_ONE_SECONDS) { //ȥ1s// - PRINTK("\nTaskId %u CpuUsage in 1s: ", taskId); - } else { //ʷƽCPUʹ// - PRINTK("\nTaskId %u CpuUsage in all time: ", taskId); - } - ret = LOS_HistoryTaskCpuUsage(taskId, mode); //ȡCPUʹʵֵ// - PRINTK("%u.%u", ret / LOS_CPUP_PRECISION_MULT, ret % LOS_CPUP_PRECISION_MULT); -} - -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdCpup(INT32 argc, const CHAR **argv) //IJȡϵͳָCPUʹ// -{ - size_t mode, taskId; - CHAR *bufMode = NULL; - CHAR *bufId = NULL; - LosTaskCB *taskCB = NULL; - UINT32 ret; - - if (argc <= 0) { //ûвȡϵͳȥ10CPUʹʲӡ// - ret = LOS_HistorySysCpuUsage(CPUP_LAST_TEN_SECONDS); - PRINTK("\nSysCpuUsage in 10s: %u.%u", ret / LOS_CPUP_PRECISION_MULT, ret % LOS_CPUP_PRECISION_MULT); - return 0; - } - - mode = strtoul(argv[0], &bufMode, 0); //һתΪ޷modeʾCPUʹʵĻȡģʽ// -/*------------------------------------------------------------------*/ - //жmodeǷЧ// - if ((bufMode == NULL) || (*bufMode != 0)) { - PRINTK("\nThe input mode is invalid. Please try again.\n"); - return 0; - } - - if (mode > CPUP_ALL_TIME) { - mode = CPUP_ALL_TIME; - } -/*------------------------------------------------------------------*/ -//ֻһOsCmdCpupOperateOneParamȡϵͳCPUʹ// - if (argc == 1) { - OsCmdCpupOperateOneParam((UINT32)mode); - return 0; - } -/*------------------------------------------------------------------*/ -//жtaskIdǷЧ// - taskId = strtoul(argv[1], &bufId, 0); - if ((taskId >= g_taskMaxNum) || (*bufId != 0)) { - PRINTK("\nThe input taskId is invalid. Please try again.\n"); - return 0; - } - taskCB = OS_TCB_FROM_TID(taskId); - if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { - PRINTK("\nThe task is unused. Please try again.\n"); - return 0; - } -/*-----------------------------------------------------------------*/ -//ڶΪIDȻOsCmdCpupOperateTwoParamȡָCPUʹ// - if (argc == 2) { - OsCmdCpupOperateTwoParam((UINT32)mode, (UINT32)taskId); - return 0; - } - - PRINTK("cpup [MODE] \ncpup [MODE] [TASKID] \n"); - return 0; -} -//ͨShellնcpupӦIJȡCPUʹʵʷ// -SHELLCMD_ENTRY(cpup_shellcmd, CMD_TYPE_EX, "cpup", XARGS, (CmdCallBackFunc)OsShellCmdCpup); -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ -#endif /* LOSCFG_SHELL */ diff --git a/文豪/cpup/los_cpup.c b/文豪/cpup/los_cpup.c deleted file mode 100644 index 688ff34..0000000 --- a/文豪/cpup/los_cpup.c +++ /dev/null @@ -1,593 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. - * Description : LiteOS Cpu Usage Calculation Module Implementation - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_cpup_pri.h" -#include "los_task_pri.h" -#include "los_base.h" -#include "los_swtmr.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_KERNEL_CPUP - -LITE_OS_SEC_BSS STATIC UINT16 g_cpupSwtmrId; //ڼ¼CPUʹͳƶʱID// -LITE_OS_SEC_BSS STATIC UINT16 g_cpupInitFlg = 0; //ڱCPUʹģǷѾʼ// -LITE_OS_SEC_BSS OsCpupCB *g_cpup = NULL; //ڱCPUʹصϢ// -LITE_OS_SEC_BSS STATIC UINT16 g_cpupMaxNum; //ʾCPUʹͳϢ// -LITE_OS_SEC_BSS STATIC UINT16 g_cpupTaskMaxNum; //ʾCPUʹͳϢ// -LITE_OS_SEC_BSS STATIC UINT16 g_hisPos = 0; /* current Sampling point of historyTime */ -LITE_OS_SEC_DATA_INIT STATIC UINT32 runningTasks[LOSCFG_KERNEL_CORE_NUM] = { - [0 ... (LOSCFG_KERNEL_CORE_NUM - 1)] = (UINT32)-1 -}; //ڼ¼ÿеID// -LITE_OS_SEC_BSS STATIC UINT64 cpuHistoryTime[OS_CPUP_HISTORY_RECORD_NUM + 1]; - //ڱCPUʷʱ¼// -LITE_OS_SEC_BSS STATIC UINT64 g_startCycles = 0; //ڼ¼лǰʱ// -#ifdef LOSCFG_CPUP_INCLUDE_IRQ //жǷжصĹ// -//// -LITE_OS_SEC_BSS UINT64 g_timeInIrqPerTskSwitch[LOSCFG_KERNEL_CORE_NUM]; //ڼ¼ÿлڼ䷢жϵʱ// -LITE_OS_SEC_BSS STATIC UINT64 g_intTimeStart[LOSCFG_KERNEL_CORE_NUM]; //ڼ¼ÿжϿʼʱ// -#endif - -#define HIGH_BITS 32 - -#define CPUP_PRE_POS(pos) (((pos) == 0) ? (OS_CPUP_HISTORY_RECORD_NUM - 1) : ((pos) - 1)) -#define CPUP_POST_POS(pos) (((pos) == (OS_CPUP_HISTORY_RECORD_NUM - 1)) ? 0 : ((pos) + 1)) - -LITE_OS_SEC_TEXT_INIT OsCpupCB *OsCpupCBGet(UINT32 index) -{ - return &g_cpup[index]; -} - -/*ڸʷʱʷʱ䣬ԱCPUʹ*/ -LITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID) -{ - UINT16 prevPos = g_hisPos; - UINT16 loop; - UINT16 runTaskId; - UINT64 curCycle; - UINT32 intSave; - - if (g_cpupInitFlg == 0) { //ʾCPUʹģδʼֱӷ// - return; - } - //ѳʼֹжϣȡǰʱ// - intSave = LOS_IntLock(); - curCycle = OsCpupGetCycle(); - - g_hisPos = CPUP_POST_POS(g_hisPos); //ʷʱλ// - cpuHistoryTime[prevPos] = curCycle; //¼βʱ// - -/*ÿCPUĵʷʱ*/ - for (loop = 0; loop < g_cpupMaxNum; loop++) { - g_cpup[loop].historyTime[prevPos] = g_cpup[loop].allTime; - } - - for (loop = 0; loop < LOSCFG_KERNEL_CORE_NUM; loop++) { - runTaskId = runningTasks[loop]; //ȡڵǰϵID// - /* reacquire the cycle to prevent flip */ - curCycle = OsCpupGetCycle(); - /*ӿʼǰʱõʱʷʱϵʷʱ*/ - g_cpup[runTaskId].historyTime[prevPos] += curCycle - g_cpup[runTaskId].startTime; -#ifdef LOSCFG_CPUP_INCLUDE_IRQ //жжϹǷ񱻰// - /*Ӹʷʱмȥлڼ䷢жõʱ*/ - g_cpup[runTaskId].historyTime[prevPos] -= g_timeInIrqPerTskSwitch[loop]; -#endif - } - - LOS_IntRestore(intSave); //ָж״̬// -} - -/*һʱԱ㶨ڸʷʱʷʱ䣬ӶʵCPUʹʵͳ*/ -LITE_OS_SEC_TEXT_INIT VOID OsCpupGuardCreator(VOID) -{ - /*溯IJֱΪ*/ - //趨ʱÿӵĻʱӵδ// - //ģʽΪģʽ// - //ص// - //ʱIDg_cpupSwtmrId// - //һΪ0ʾЯ// - (VOID)LOS_SwtmrCreate(LOSCFG_BASE_CORE_TICK_PER_SECOND, LOS_SWTMR_MODE_PERIOD, - (SWTMR_PROC_FUNC)OsCpupGuard, &g_cpupSwtmrId, 0); - - (VOID)LOS_SwtmrStart(g_cpupSwtmrId); //ʱ// -} - -/*ʼCPUʹͳģ飬аһȼ -ںΪOsCpupGuardCreator -ڴԵOsCpupGuard()ʱ*/ -LITE_OS_SEC_TEXT_INIT VOID OsCpupGuardInit(VOID) -{ - TSK_INIT_PARAM_S taskInitParam; - UINT32 tempId; - //ʼtaskInitParam// - (VOID)memset_s((void *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); - taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsCpupGuardCreator; //ָںΪOsCpupGuardCreatorʱĺ// - taskInitParam.uwStackSize = LOS_TASK_MIN_STACK_SIZE; //ָջĴСΪСջС// - taskInitParam.pcName = "CpupGuardCreator"; //ָΪ"CpupGuardCreator"// - taskInitParam.usTaskPrio = OS_TASK_PRIORITY_HIGHEST; //ָȼΪȼ// - taskInitParam.uwResved = LOS_TASK_STATUS_DETACHED; //ָ״̬ΪLOS_TASK_STATUS_DETACHED// -#ifdef LOSCFG_KERNEL_SMP //жϲϵͳǷֶ֧// - taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid()); //CPU׺// -#endif - /*ʼõIJtaskInitParamIDtempId*/ - (VOID)LOS_TaskCreate(&tempId, &taskInitParam); -} - -/* - * Description: initialization of CPUP - * Return : LOS_OK or Error Information - */ -LITE_OS_SEC_TEXT_INIT UINT32 OsCpupInit(VOID) -{ - UINT32 size; - - g_cpupTaskMaxNum = g_taskMaxNum; - g_cpupMaxNum = g_cpupTaskMaxNum; -/*˰жϵCPUʹͳƣLOSCFG_CPUP_INCLUDE_IRQ -g_cpupMaxNumLOSCFG_PLATFORM_HWI_LIMIT*/ -#ifdef LOSCFG_CPUP_INCLUDE_IRQ - g_cpupMaxNum += LOSCFG_PLATFORM_HWI_LIMIT; -#endif - - /* every task has only one record, and it won't operated at the same time */ - size = g_cpupMaxNum * sizeof(OsCpupCB); //ҪڴռС// - g_cpup = (OsCpupCB *)LOS_MemAlloc(m_aucSysMem0, size); //ڴ棬ڴ洢OsCpupCBṹ// - if (g_cpup == NULL) { //ڴʧ// - return LOS_ERRNO_CPUP_NO_MEMORY; - } - - OsCpupGuardInit(); //ʼCPUʹͳģ// - - (VOID)memset_s(g_cpup, size, 0, size); //ڴռ// - g_cpupInitFlg = 1; //ʾCPUʹͳģѾʼ// - - return LOS_OK; //ʼɹ// -} - -LITE_OS_SEC_TEXT_INIT VOID LOS_CpupReset(VOID) //CPUʹͳģ// -{ - UINT32 cpupIndex; - UINT32 maxNum = g_cpupMaxNum; - UINT64 curCycle; - UINT16 loop; - UINT32 intSave; - - /*ȫֱg_cpupǷΪNULLǣֱӷأִκβ*/ - if (g_cpup == NULL) { - return; - } - - g_cpupInitFlg = 0; //ʾCPUʹͳģδʼ// - intSave = LOS_IntLock(); //жϣֹùзж// - (VOID)LOS_SwtmrStop(g_cpupSwtmrId); //ֹͣCPUʹͳƶʱ// - curCycle = OsCpupGetCycle(); //ȡǰCPU// - - /*cpuHistoryTimeеԪضΪcurCycleʷʱ¼*/ - for (loop = 0; loop < (OS_CPUP_HISTORY_RECORD_NUM + 1); loop++) { - cpuHistoryTime[loop] = curCycle; - } - - /*ÿCPUʹͳƽṹ壬 - ʼʱʱ䶼ΪcurCycle - ͬʱÿṹеʷʱ¼*/ - for (cpupIndex = 0; cpupIndex < maxNum; cpupIndex++) { - g_cpup[cpupIndex].startTime = curCycle; - g_cpup[cpupIndex].allTime = curCycle; - for (loop = 0; loop < (OS_CPUP_HISTORY_RECORD_NUM + 1); loop++) { - g_cpup[cpupIndex].historyTime[loop] = curCycle; - } - } - -/*˰жϵCPUʹͳƣ -g_timeInIrqPerTskSwitchеԪضΪ0 -ڼ¼лڼжʱ*/ -#ifdef LOSCFG_CPUP_INCLUDE_IRQ - for (loop = 0; loop < LOSCFG_KERNEL_CORE_NUM; loop++) { - g_timeInIrqPerTskSwitch[loop] = 0; - } -#endif - - (VOID)LOS_SwtmrStart(g_cpupSwtmrId); //CPUʹͳƶʱ// - LOS_IntRestore(intSave); //ָж״̬// - g_cpupInitFlg = 1; //ʾCPUʹͳģѾ³ʼ// - - return; -} - -/*CPUʼֵԱ¼ʱʱ -ܹȷCPUIJֵӶõʱ*/ -LITE_OS_SEC_TEXT_MINOR VOID OsCpupSetCycle(UINT64 startCycles) -{ - g_startCycles = startCycles; - return; -} - -/* - * Description: get current cycles count - * Return : current cycles count - */ -LITE_OS_SEC_TEXT_MINOR UINT64 OsCpupGetCycle(VOID) -{ - UINT32 high; - UINT32 low; - UINT64 cycles; - - LOS_GetCpuCycle(&high, &low); - cycles = ((UINT64)high << HIGH_BITS) + low; //λ͵λļֵϲһ64λֵ// - if (g_startCycles == 0) { - g_startCycles = cycles; - } - - /* - * The cycles should keep growing, if the checking failed, - * it mean LOS_GetCpuCycle has the problem which should be fixed. - */ - LOS_ASSERT(cycles >= g_startCycles); - - return (cycles - g_startCycles); -} - -/* - * Description: start task to get cycles count in current task beginning - */ -LITE_OS_SEC_TEXT_MINOR VOID OsTaskCycleStart(VOID) //ʼʱȡCPUڼ// -{ - UINT32 taskId; - LosTaskCB *runTask = NULL; - - if (g_cpupInitFlg == 0) { //Ϊ0ʾδCPUڼijʼֱӷ// - return; - } - - runTask = OsCurrTaskGet(); //ȡǰе// - taskId = runTask->taskId; //ȡǰID// - - g_cpup[taskId].id = taskId; - g_cpup[taskId].startTime = OsCpupGetCycle(); - - return; -} - -/* - * Description: quit task and get cycle count - */ -LITE_OS_SEC_TEXT_MINOR VOID OsTaskCycleEnd(VOID) -{ - UINT32 taskId; - UINT64 cpuCycle; - LosTaskCB *runTask = NULL; - - if (g_cpupInitFlg == 0) { - return; - } - - runTask = OsCurrTaskGet(); - taskId = runTask->taskId; - - if (g_cpup[taskId].startTime == 0) { //жǷѾ¼Ŀʼʱ䣬// - return; //Ϊ0ʾδ¼ʼʱ䣬ֱӷ// - } - - cpuCycle = OsCpupGetCycle(); - g_cpup[taskId].allTime += cpuCycle - g_cpup[taskId].startTime; //ȡӿʼCPU// - -#ifdef LOSCFG_CPUP_INCLUDE_IRQ //˰жϴʱͳƣҪʱ// - UINT32 cpuId = ArchCurrCpuid(); - g_cpup[taskId].allTime -= g_timeInIrqPerTskSwitch[cpuId]; //ȥǰCPUжϴռõʱ - g_timeInIrqPerTskSwitch[cpuId] = 0; -#endif - g_cpup[taskId].startTime = 0; //ʾʱͳƽ// - - return; -} - -/* - * Description: start task to get cycles count in current task ending - */ -LITE_OS_SEC_TEXT_MINOR VOID OsTaskCycleEndStart(const LosTaskCB *newTask) -{ - UINT64 cpuCycle; - LosTaskCB *runTask = NULL; - OsCpupCB *cpup = NULL; - UINT32 cpuId = ArchCurrCpuid(); - - if ((g_cpupInitFlg == 0) || (newTask == NULL)) { - return; - } - - runTask = OsCurrTaskGet(); - cpuCycle = OsCpupGetCycle(); - - cpup = &g_cpup[runTask->taskId]; - if (cpup->startTime != 0) { - cpup->allTime += cpuCycle - cpup->startTime; //ʾ֮ǰѾʼCPUڼҪʱи// -#ifdef LOSCFG_CPUP_INCLUDE_IRQ //Ƿãʱ// - cpup->allTime -= g_timeInIrqPerTskSwitch[cpuId]; - g_timeInIrqPerTskSwitch[cpuId] = 0; -#endif - } - - cpup = &g_cpup[newTask->taskId]; - /*ID͵ǰCPUڼֵ棬ʾCPUڼʼ*/ - cpup->id = newTask->taskId; - cpup->startTime = cpuCycle; - runningTasks[cpuId] = newTask->taskId; //µǰCPUеID// - - return; -} - -/*ڻȡCPUڼеλ*/ -LITE_OS_SEC_TEXT_MINOR STATIC VOID OsCpupGetPos(UINT32 mode, UINT16 *curPosPointer, UINT16 *prePosPointer) -{ - UINT16 curPos; - UINT16 tmpPos; - UINT16 prePos; - - tmpPos = g_hisPos; //ȡǰλ// - curPos = CPUP_PRE_POS(tmpPos); //ȡǰһλ// - - /* - * The current position has nothing to do with the CPUP modes, - * however, the previous position differs. - */ - switch (mode) { - /*ʾҪȡһڵCPUڼݣ - ʱǰһλΪǰλõǰһλ*/ - case CPUP_LAST_ONE_SECONDS: - prePos = CPUP_PRE_POS(curPos); - break; - /*ʾҪȡʮڵCPUڼݣ - ʱǰһλΪǰλ*/ - case CPUP_LAST_TEN_SECONDS: - prePos = tmpPos; - break; - /*ʾҪȡʱڵCPUڼݣ - ʱǰһλΪһλ*/ - case CPUP_ALL_TIME: - /* fall-through */ - default: - prePos = OS_CPUP_HISTORY_RECORD_NUM; - break; - } - - *curPosPointer = curPos; //浱ǰλ// - *prePosPointer = prePos; //ǰһλ// - - return; -} - -/*ڼCPUʹͳƲĺϷ*/ -LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsCpuUsageParaCheck(UINT32 taskId) -{ - if (g_cpupInitFlg == 0) { - return LOS_ERRNO_CPUP_NO_INIT; - } - - if (OS_TSK_GET_INDEX(taskId) >= g_taskMaxNum) { //IDֵ// - return LOS_ERRNO_CPUP_TSK_ID_INVALID; //ʾIDЧش// - } - - /* weather the task is created */ - if (g_cpup[taskId].id != taskId) { - return LOS_ERRNO_CPUP_THREAD_NO_CREATED; //ʾδش// - } - - if ((g_cpup[taskId].status & OS_TASK_STATUS_UNUSED) || (g_cpup[taskId].status == 0)) { - return LOS_ERRNO_CPUP_THREAD_NO_CREATED; //ʾδش// - } - - return LOS_OK; //ʾͨ// -} - -LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistorySysCpuUsage(UINT32 mode) //ڻȡʷϵͳCPUʹ// -{ - UINT64 cpuCycleAll; - UINT64 idleCycleAll = 0; - UINT32 cpup = 0; - UINT16 pos; - UINT16 prePos; - UINT32 intSave; - UINT32 idleTaskId; -#ifdef LOSCFG_KERNEL_SMP - UINT32 cpuId = 0; -#endif - - if (g_cpupInitFlg == 0) { - return LOS_ERRNO_CPUP_NO_INIT; - } - - /* get end time of current task */ - intSave = LOS_IntLock(); //ж״̬// - OsTaskCycleEnd(); //ȡǰĽʱ// - - OsCpupGetPos(mode, &pos, &prePos); //ȡʷCPUʹݵλϢ// - cpuCycleAll = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; //CPU// - -#ifdef LOSCFG_KERNEL_SMP //жǷΪSMPϵͳ// - /* For SMP system, each idle task needs to be accounted */ - while (cpuId < LOSCFG_KERNEL_CORE_NUM) { - idleTaskId = g_percpu[cpuId].idleTaskId; - //ۼӸĵĿidleCycleAll// - idleCycleAll += g_cpup[idleTaskId].historyTime[pos] - g_cpup[idleTaskId].historyTime[prePos]; - cpuId++; - } - cpuCycleAll *= LOSCFG_KERNEL_CORE_NUM; -#else - idleTaskId = OsGetIdleTaskId(); //ֱӻȡ// - idleCycleAll = g_cpup[idleTaskId].historyTime[pos] - g_cpup[idleTaskId].historyTime[prePos]; -#endif - - if (cpuCycleAll) { - cpup = (LOS_CPUP_PRECISION - (UINT32)((LOS_CPUP_PRECISION * idleCycleAll) / cpuCycleAll)); - } //óCPUʹ// - - OsTaskCycleStart(); //¿ʼʱͳ// - LOS_IntRestore(intSave); //ָж״̬// - - return cpup; -} - -LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistoryTaskCpuUsage(UINT32 taskId, UINT32 mode) -{ - UINT64 cpuCycleAll; - UINT64 cpuCycleCurTask; - UINT16 pos; - UINT16 prePos; - UINT32 intSave; - UINT32 cpup = 0; - UINT32 ret; - - if (g_cpupInitFlg == 0) { - return LOS_ERRNO_CPUP_NO_INIT; - } - - //ԴIDв飬LOS_OK򷵻ӦĴ// - ret = OsCpuUsageParaCheck(taskId); - if (ret != LOS_OK) { - return ret; - } - OsCpupCB *taskCpup = &g_cpup[taskId]; - - intSave = LOS_IntLock(); - OsTaskCycleEnd(); - - OsCpupGetPos(mode, &pos, &prePos); //ȡʷCPUʹݵλϢ// - cpuCycleAll = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; //CPU// - cpuCycleCurTask = taskCpup->historyTime[pos] - taskCpup->historyTime[prePos]; //㵱ǰCPU// - if (cpuCycleAll) { - cpup = (UINT32)((LOS_CPUP_PRECISION * cpuCycleCurTask) / cpuCycleAll); - } //óCPUʹ// - - OsTaskCycleStart(); - LOS_IntRestore(intSave); - - return cpup; -} - -//ڻȡʷCPUʹ// -LITE_OS_SEC_TEXT_MINOR UINT32 LOS_AllCpuUsage(UINT16 maxNum, CPUP_INFO_S *cpupInfo, UINT32 mode, UINT16 flag) -{ - UINT16 loop; - UINT16 pos; - UINT16 prePos; - UINT32 intSave; - UINT64 cpuCycleAll; - UINT64 cpuCycleCurTask; - UINT16 numTmpMax = maxNum; - UINT16 numTmpMin = 0; - UINT16 numMax = g_cpupTaskMaxNum; - - if (g_cpupInitFlg == 0) { - return LOS_ERRNO_CPUP_NO_INIT; - } - - if (cpupInfo == NULL) { //鴫ָcpupInfoǷΪգΪգش// - return LOS_ERRNO_CPUP_TASK_PTR_NULL; - } - - if (maxNum == 0) { //鴫maxNumǷ00ش// - return LOS_ERRNO_CPUP_MAXNUM_INVALID; - } - -#ifdef LOSCFG_CPUP_INCLUDE_IRQ //걻// - if (flag == 0) { - numTmpMax += g_cpupTaskMaxNum; - numTmpMin += g_cpupTaskMaxNum; - numMax = g_cpupMaxNum; - } -#endif - - if (numTmpMax > numMax) { - numTmpMax = numMax; - } - - intSave = LOS_IntLock(); - OsTaskCycleEnd(); - - OsCpupGetPos(mode, &pos, &prePos); //ȡʷCPUʹݵλϢ// - cpuCycleAll = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; //CPU// - - /*ͨѭCPUʹݣ㵱ǰCPU*/ - for (loop = numTmpMin; loop < numTmpMax; loop++) { - if ((g_cpup[loop].status & OS_TASK_STATUS_UNUSED) || (g_cpup[loop].status == 0)) { - continue; - } - - cpuCycleCurTask = g_cpup[loop].historyTime[pos] - g_cpup[loop].historyTime[prePos]; - cpupInfo[loop - numTmpMin].usStatus = g_cpup[loop].status; - - if (cpuCycleAll) { - cpupInfo[loop - numTmpMin].uwUsage = (UINT32)((LOS_CPUP_PRECISION * cpuCycleCurTask) / cpuCycleAll); - } - } - - OsTaskCycleStart(); - LOS_IntRestore(intSave); - - return LOS_OK; -} - -#ifdef LOSCFG_CPUP_INCLUDE_IRQ -/*жϿʼʱ¼ǰʱԱںжϴʱͳƺͷ*/ -LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(VOID) -{ - g_intTimeStart[ArchCurrCpuid()] = OsCpupGetCycle(); - return; -} - -/*жϽʱͳƲ -¼жϺšжڼлʱԼۼжڼʱ*/ -LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT32 intNum) -{ - UINT64 intTimeEnd = OsCpupGetCycle(); //ȡǰʱ// - UINT32 cpuId = ArchCurrCpuid(); //ȡǰCPUID// - - if (g_cpupInitFlg == 0) { - return; - } - - g_cpup[g_taskMaxNum + intNum].id = intNum; - g_cpup[g_taskMaxNum + intNum].status = OS_TASK_STATUS_RUNNING; //ж״̬Ϊ// - g_timeInIrqPerTskSwitch[cpuId] += (intTimeEnd - g_intTimeStart[cpuId]); //жڼлĵʱ// - g_cpup[g_taskMaxNum + intNum].allTime += (intTimeEnd - g_intTimeStart[cpuId]); - - return; -} -#endif - -#endif /* LOSCFG_KERNEL_CPUP */ -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - diff --git a/文豪/los_cppsupport_pri.h b/文豪/los_cppsupport_pri.h deleted file mode 100644 index 5e3fcb9..0000000 --- a/文豪/los_cppsupport_pri.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Cpp Support HeadFile - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#ifndef _LOS_CPPSUPPORT_PRI_H -#define _LOS_CPPSUPPORT_PRI_H //ֹΰͬһͷļ// - -#include "los_cppsupport.h" - -#ifdef __cplusplus //ݱǷΪC++// -#if __cplusplus //ʹáextern 'C'// -extern "C" { //´ݽ// -#endif /* __cplusplus */ //ȷ// -#endif /* __cplusplus */ - -extern CHAR __fast_end; //һ_fast_endCHARͱ// - -#ifdef LOSCFG_AARCH64 //// -extern UINT8 __EH_FRAME_BEGIN__[]; //һUINT8͵// -VOID __register_frame(VOID *begin); -#endif - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ //رextern'C'// -#endif /* __cplusplus */ - -#endif /* _LOS_CPPSUPPORT_PRI_H */ diff --git a/文豪/los_cpup_pri.h b/文豪/los_cpup_pri.h deleted file mode 100644 index f8da73e..0000000 --- a/文豪/los_cpup_pri.h +++ /dev/null @@ -1,74 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved. - * Description: Cpup HeadFile - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#ifndef _LOS_CPUP_PRI_H -#define _LOS_CPUP_PRI_H //ֹΰͬһͷļ// - -#include "los_cpup.h" //ܰһЩCPUʹ// -#include "los_task_pri.h" //ͳصĹͶ// - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#define OS_CPUP_HISTORY_RECORD_NUM 11 //ʷ¼Ϊ11// -#define LOS_CPUP_PRECISION 1000 //CPUʹʵľΪ1000// -#define LOS_CPUP_PRECISION_MULT (LOS_CPUP_PRECISION / 100) //ڼCPUʹ// - -typedef struct { - UINT32 id; /* Task ID */ - UINT16 status; /* Task status */ - UINT64 allTime; /* Total running time */ - UINT64 startTime; /* Time before a task is invoked */ - UINT64 historyTime[OS_CPUP_HISTORY_RECORD_NUM + 1]; /* Historical running time, the last one saves zero */ -} OsCpupCB; - -extern OsCpupCB *OsCpupCBGet(UINT32 index); //ȡ `OsCpupCB` ṹָ// -extern UINT32 OsCpupInit(VOID); //CPUʹͳģijʼ// -extern VOID OsCpupSetCycle(UINT64 startCycles); //CPUڼ// -extern UINT64 OsCpupGetCycle(VOID); //ȡCPUڼ// -extern VOID OsTaskCycleStart(VOID); //ڵʼ// -extern VOID OsTaskCycleEnd(VOID); //ڵĽ// -extern VOID OsTaskCycleEndStart(const LosTaskCB *newTask); //ڣʼµ// -#ifdef LOSCFG_CPUP_INCLUDE_IRQ -VOID OsCpupIrqStart(VOID); //ǰһ£ڴ// -VOID OsCpupIrqEnd(UINT32); //жϵCPUʹͳƺ// -#endif - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif /* _LOS_CPUP_PRI_H */ - -/*δ붨һЩCPUʹͳƵݽṹͺ -ڲϵͳʵֶжϵCPUʽмغͳơ*/ \ No newline at end of file diff --git a/文豪/los_trace_pri.h b/文豪/los_trace_pri.h deleted file mode 100644 index 762fd9f..0000000 --- a/文豪/los_trace_pri.h +++ /dev/null @@ -1,150 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2019-2020. All rights reserved. - * Description: LiteOS Trace Module Private HeadFile - * Author: Huawei LiteOS Team - * Create: 2019-08-30 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#ifndef _LOS_TRACE_PRI_H -#define _LOS_TRACE_PRI_H - -#include "los_trace.h" -#include "los_task_pri.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_TRACE_CONTROL_AGENT -#define TRACE_CMD_END_CHAR 0xD -#endif - -#define TRACE_ERROR PRINT_ERR -#define TRACE_MODE_OFFLINE 0 -#define TRACE_MODE_ONLINE 1 - -/* just task and hwi were traced */ -#define TRACE_DEFAULT_MASK (TRACE_HWI_FLAG | TRACE_TASK_FLAG) -#define TRACE_CTL_MAGIC_NUM 0xDEADBEEF -#define TRACE_BIGLITTLE_WORD 0x12345678 -#define TRACE_VERSION(MODE) (0xFFFFFFFF & (MODE)) -#define TRACE_MASK_COMBINE(c1, c2, c3, c4) (((c1) << 24) | ((c2) << 16) | ((c3) << 8) | (c4)) - -#define TRACE_GET_MODE_FLAG(type) ((type) & 0xFFFFFFF0) - -extern SPIN_LOCK_S g_traceSpin; -#define TRACE_LOCK(state) LOS_SpinLockSave(&g_traceSpin, &(state)) -#define TRACE_UNLOCK(state) LOS_SpinUnlockRestore(&g_traceSpin, (state)) - -typedef VOID (*TRACE_DUMP_HOOK)(BOOL toClient); -extern TRACE_DUMP_HOOK g_traceDumpHook; - -enum TraceCmd { - TRACE_CMD_START = 1, - TRACE_CMD_STOP, - TRACE_CMD_SET_EVENT_MASK, - TRACE_CMD_RECODE_DUMP, - TRACE_CMD_MAX_CODE, -}; - -/** - * @ingroup los_trace - * struct to store the trace cmd from traceClient. - */ -typedef struct { - UINT8 cmd; - UINT8 param1; - UINT8 param2; - UINT8 param3; - UINT8 param4; - UINT8 param5; - UINT8 end; -} TraceClientCmd; - -/** - * @ingroup los_trace - * struct to store the event infomation - */ -typedef struct { - UINT32 cmd; /* trace start or stop cmd */ - UINT32 param; /* magic numb stand for notify msg */ -} TraceNotifyFrame; - -/** - * @ingroup los_trace - * struct to store the trace config information. - */ -typedef struct { - struct WriteCtrl { - UINT16 curIndex; /* The current record index */ - UINT16 maxRecordCount; /* The max num of track items */ - UINT16 curObjIndex; /* The current obj index */ - UINT16 maxObjCount; /* The max num of obj index */ - ObjData *objBuf; /* Pointer to obj info data */ - TraceEventFrame *frameBuf; /* Pointer to the track items */ - } ctrl; - OfflineHead *head; -} TraceOfflineHeaderInfo; - -extern UINT32 OsTraceGetMaskTid(UINT32 taskId); -extern VOID OsTraceSetObj(ObjData *obj, const LosTaskCB *tcb); -extern VOID OsTraceWriteOrSendEvent(const TraceEventFrame *frame); -extern UINT32 OsTraceBufInit(VOID *buf, UINT32 size); -extern VOID OsTraceObjAdd(UINT32 eventType, UINT32 taskId); -extern BOOL OsTraceIsEnable(VOID); -extern OfflineHead *OsTraceRecordGet(VOID); - -#ifdef LOSCFG_RECORDER_MODE_ONLINE -extern VOID OsTraceSendHead(VOID); -extern VOID OsTraceSendObjTable(VOID); -extern VOID OsTraceSendNotify(UINT32 type, UINT32 value); - -#define OsTraceNotifyStart() do { \ - OsTraceSendNotify(SYS_START, TRACE_CTL_MAGIC_NUM); \ - OsTraceSendHead(); \ - OsTraceSendObjTable(); \ - } while (0) - -#define OsTraceNotifyStop() do { \ - OsTraceSendNotify(SYS_STOP, TRACE_CTL_MAGIC_NUM); \ - } while (0) - -#define OsTraceReset() -#define OsTraceRecordDump(toClient) -#else -extern VOID OsTraceReset(VOID); -extern VOID OsTraceRecordDump(BOOL toClient); -#define OsTraceNotifyStart() -#define OsTraceNotifyStop() -#endif - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif /* _LOS_TRACE_PRI_H */ diff --git a/文豪/trace/los_trace.c b/文豪/trace/los_trace.c deleted file mode 100644 index 1f19ec2..0000000 --- a/文豪/trace/los_trace.c +++ /dev/null @@ -1,424 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2019-2020. All rights reserved. - * Description: LiteOS Trace Implementation - * Author: Huawei LiteOS Team - * Create: 2019-08-31 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ -#include "uart.h" -#include "los_trace_pri.h" -#include "trace_pipeline.h" - -#ifdef LOSCFG_KERNEL_SMP -#include "los_mp_pri.h" -#endif - -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#include "shell.h" -#endif - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_KERNEL_TRACE -LITE_OS_SEC_BSS STATIC UINT32 g_traceEventCount; //׷¼// -LITE_OS_SEC_BSS STATIC volatile enum TraceState g_traceState = TRACE_UNINIT; //׷״̬// -LITE_OS_SEC_DATA_INIT STATIC volatile BOOL g_enableTrace = FALSE; //Ƿ׷ٹ// -LITE_OS_SEC_BSS STATIC UINT32 g_traceMask = TRACE_DEFAULT_MASK; //׷룬ڹ׷¼// - -#ifdef LOSCFG_TRACE_CONTROL_AGENT -LITE_OS_SEC_BSS STATIC UINT32 g_traceTaskId; //׷ID// -#endif - -#define EVENT_MASK 0xFFFFFFF0 -#define MIN(x, y) ((x) < (y) ? (x) : (y)) - -LITE_OS_SEC_BSS STATIC TRACE_HWI_FILTER_HOOK g_traceHwiFliterHook = NULL; - -LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_traceSpin); - -STATIC_INLINE BOOL OsTraceHwiFilter(UINT32 hwiNum) //жǷҪijӲж// -{ - BOOL ret = ((hwiNum == NUM_HAL_INTERRUPT_UART) || (hwiNum == OS_TICK_INT_NUM)); -#ifdef LOSCFG_KERNEL_SMP - ret |= (hwiNum == LOS_MP_IPI_SCHEDULE); -#endif - if (g_traceHwiFliterHook != NULL) { - ret |= g_traceHwiFliterHook(hwiNum); - } - return ret; -} - -//׷¼֡Ϣ// -STATIC VOID OsTraceSetFrame(TraceEventFrame *frame, UINT32 eventType, UINTPTR identity, const UINTPTR *params, - UINT16 paramCount) -{ - INT32 i; - UINT32 intSave; - - (VOID)memset_s(frame, sizeof(TraceEventFrame), 0, sizeof(TraceEventFrame)); - - if (paramCount > LOSCFG_TRACE_FRAME_MAX_PARAMS) { - paramCount = LOSCFG_TRACE_FRAME_MAX_PARAMS; - } - - TRACE_LOCK(intSave); - frame->curTask = OsTraceGetMaskTid(OsCurrTaskGet()->taskId); - frame->identity = identity; - frame->curTime = HalClockGetCycles(); - frame->eventType = eventType; - -#ifdef LOSCFG_TRACE_FRAME_CORE_MSG - frame->core.cpuId = ArchCurrCpuid(); //CPUID// - frame->core.hwiActive = OS_INT_ACTIVE ? TRUE : FALSE; //Ӳжϻ״̬// - frame->core.taskLockCnt = MIN(OsPercpuGet()->taskLockCnt, 0xF); /* taskLockCnt is 4 bits, max vaule = 0xF */ //// - frame->core.paramCount = paramCount; //Ŀ// -#endif - -#ifdef LOSCFG_TRACE_FRAME_EVENT_COUNT - frame->eventCount = g_traceEventCount; //׷¼ļ// - g_traceEventCount++; -#endif - TRACE_UNLOCK(intSave); - - for (i = 0; i < paramCount; i++) { - frame->params[i] = params[i]; - } -} - -VOID OsTraceSetObj(ObjData *obj, const LosTaskCB *tcb) //ö׷Ϣ// -{ - errno_t ret; - (VOID)memset_s(obj, sizeof(ObjData), 0, sizeof(ObjData)); - - obj->id = OsTraceGetMaskTid(tcb->taskId); //ȡID// - obj->prio = tcb->priority; //ȡȼ// - - ret = strncpy_s(obj->name, LOSCFG_TRACE_OBJ_MAX_NAME_SIZE, tcb->taskName, LOSCFG_TRACE_OBJ_MAX_NAME_SIZE - 1); - if (ret != EOK) { - TRACE_ERROR("Task name copy failed!\n"); - } -} - -//׷¼// -VOID OsTraceHook(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount) -{ - if ((eventType == TASK_CREATE) || (eventType == TASK_PRIOSET)) { - OsTraceObjAdd(eventType, identity); /* handle important obj info, these can not be filtered */ - } - - if ((g_enableTrace == TRUE) && (eventType & g_traceMask)) { - UINTPTR id = identity; - if (TRACE_GET_MODE_FLAG(eventType) == TRACE_HWI_FLAG) { - if (OsTraceHwiFilter(identity)) { - return; - } - } else if (TRACE_GET_MODE_FLAG(eventType) == TRACE_TASK_FLAG) { - id = OsTraceGetMaskTid(identity); - } else if (eventType == MEM_INFO_REQ) { - LOS_MEM_POOL_STATUS status; - LOS_MemInfoGet((VOID *)identity, &status); - LOS_TRACE(MEM_INFO, identity, status.uwTotalUsedSize, status.uwTotalFreeSize); - return; - } - - TraceEventFrame frame; - OsTraceSetFrame(&frame, eventType, id, params, paramCount); - - OsTraceWriteOrSendEvent(&frame); //׷¼Ϣдͳȥ// - } -} - -BOOL OsTraceIsEnable(VOID) //ж׷Ƿ״̬// -{ - return g_enableTrace == TRUE; -} - -STATIC VOID OsTraceHookInstall(VOID) //װ׷ٹ// -{ - g_traceEventHook = OsTraceHook; -#ifdef LOSCFG_RECORDER_MODE_OFFLINE - g_traceDumpHook = OsTraceRecordDump; //߼¼ģʽ׷ת// -#endif -} - -#ifdef LOSCFG_TRACE_CONTROL_AGENT -STATIC BOOL OsTraceCmdIsValid(const TraceClientCmd *msg) //жϴTraceClientCmdṹǷЧ// -{ - return ((msg->end == TRACE_CMD_END_CHAR) && (msg->cmd < TRACE_CMD_MAX_CODE)); -} - -STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg) //TraceClientCmdṹ// -{ - if (!OsTraceCmdIsValid(msg)) { - return; - } - - switch (msg->cmd) { - case TRACE_CMD_START: //׷// - LOS_TraceStart(); - break; - case TRACE_CMD_STOP: //ֹͣ׷// - LOS_TraceStop(); - break; - case TRACE_CMD_SET_EVENT_MASK: //¼// - /* 4 params(UINT8) composition the mask(UINT32) */ - LOS_TraceEventMaskSet(TRACE_MASK_COMBINE(msg->param1, msg->param2, msg->param3, msg->param4)); - break; - case TRACE_CMD_RECODE_DUMP: //׷ټ¼ת// - LOS_TraceRecordDump(TRUE); - break; - default: - break; - } -} - -VOID TraceAgent(VOID) //ϵȴ׷ݵĵյ׷// -{ - UINT32 ret; - TraceClientCmd msg; - - while (1) { - (VOID)memset_s(&msg, sizeof(TraceClientCmd), 0, sizeof(TraceClientCmd)); - ret = OsTraceDataWait(); - if (ret == LOS_OK) { - OsTraceDataRecv((UINT8 *)&msg, sizeof(TraceClientCmd), 0); - OsTraceCmdHandle(&msg); - } - } -} - -STATIC UINT32 OsCreateTraceAgentTask(VOID) //һ׷ٴִ׷߼// -{ - UINT32 ret; - TSK_INIT_PARAM_S taskInitParam; - - (VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); - taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)TraceAgent; - taskInitParam.usTaskPrio = LOSCFG_TRACE_TASK_PRIORITY; - taskInitParam.pcName = "TraceAgent"; - taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; -#ifdef LOSCFG_KERNEL_SMP - taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid()); -#endif - ret = LOS_TaskCreate(&g_traceTaskId, &taskInitParam); - return ret; -} -#endif - -UINT32 LOS_TraceInit(VOID *buf, UINT32 size) //ʼ׷ٹ// -{ - UINT32 intSave; - UINT32 ret; - - TRACE_LOCK(intSave); - if (g_traceState != TRACE_UNINIT) { - TRACE_ERROR("trace has been initialized already, the current state is :%d\n", g_traceState); - ret = LOS_ERRNO_TRACE_ERROR_STATUS; - goto LOS_ERREND; - } - -#ifdef LOSCFG_TRACE_CLIENT_INTERACT //жǷҪʼ׷ٹܵ// - ret = OsTracePipelineInit(); - if (ret != LOS_OK) { - goto LOS_ERREND; - } -#endif - -#ifdef LOSCFG_TRACE_CONTROL_AGENT //жǷҪ׷ٴ// - ret = OsCreateTraceAgentTask(); - if (ret != LOS_OK) { - TRACE_ERROR("trace init create agentTask error :0x%x\n", ret); - goto LOS_ERREND; - } -#endif - - ret = OsTraceBufInit(buf, size); //ʼ׷ٻ// - if (ret != LOS_OK) { - goto LOS_RELEASE; - } - - OsTraceHookInstall(); //װ׷ٹ// - - g_traceEventCount = 0; - - /*жǷҪȴ׷ٿͻ׷*/ -#ifdef LOSCFG_RECORDER_MODE_ONLINE /* Wait trace client to start trace */ - g_enableTrace = FALSE; - g_traceState = TRACE_INITED; -#else - g_enableTrace = TRUE; - g_traceState = TRACE_STARTED; -#endif - TRACE_UNLOCK(intSave); - return LOS_OK; -LOS_RELEASE: -#ifdef LOSCFG_TRACE_CONTROL_AGENT //жǷҪɾ׷ٴ// - LOS_TaskDelete(g_traceTaskId); -#endif -LOS_ERREND: - TRACE_UNLOCK(intSave); - return ret; -} - -UINT32 LOS_TraceStart(VOID) //׷ٹ// -{ - UINT32 intSave; - UINT32 ret = LOS_OK; - - TRACE_LOCK(intSave); - if (g_traceState == TRACE_STARTED) { - goto START_END; - } - - if (g_traceState == TRACE_UNINIT) { - TRACE_ERROR("trace not inited, be sure LOS_TraceInit excute success\n"); - ret = LOS_ERRNO_TRACE_ERROR_STATUS; - goto START_END; - } - - OsTraceNotifyStart(); //֪ͨ׷ٹܿʼ// - - g_enableTrace = TRUE; - g_traceState = TRACE_STARTED; - - TRACE_UNLOCK(intSave); - LOS_TRACE(MEM_INFO_REQ, m_aucSysMem0); //׷Ϣ// - return ret; -START_END: - TRACE_UNLOCK(intSave); - return ret; -} - -VOID LOS_TraceStop(VOID) //ֹͣ׷ٹ// -{ - UINT32 intSave; - - TRACE_LOCK(intSave); - if (g_traceState != TRACE_STARTED) { - goto STOP_END; - } - - g_enableTrace = FALSE; - g_traceState = TRACE_STOPED; - OsTraceNotifyStop(); //֪ͨ׷ٹֹͣ// -STOP_END: - TRACE_UNLOCK(intSave); -} - -VOID LOS_TraceEventMaskSet(UINT32 mask) //׷¼// -{ - g_traceMask = mask & EVENT_MASK; -} - -VOID LOS_TraceRecordDump(BOOL toClient) //ת׷ټ¼// -{ - if (g_traceState != TRACE_STOPED) { - TRACE_ERROR("trace dump must after trace stopped , the current state is : %d\n", g_traceState); - return; - } - OsTraceRecordDump(toClient); -} - -OfflineHead *LOS_TraceRecordGet(VOID) //ȡ׷ټ¼// -{ - return OsTraceRecordGet(); -} - -VOID LOS_TraceReset(VOID) //׷ٹ// -{ - if (g_traceState == TRACE_UNINIT) { - TRACE_ERROR("trace not inited, be sure LOS_TraceInit excute success\n"); - return; - } - - OsTraceReset(); -} - -VOID LOS_TraceHwiFilterHookReg(TRACE_HWI_FILTER_HOOK hook) //עжϹ˹// -{ - UINT32 intSave; - - TRACE_LOCK(intSave); - g_traceHwiFliterHook = hook; - TRACE_UNLOCK(intSave); -} - -#ifdef LOSCFG_SHELL -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceSetMask(INT32 argc, const CHAR **argv) //׷¼// -{ - size_t mask; - CHAR *endPtr = NULL; - - if (argc >= 2) { /* 2:Just as number of parameters */ - PRINTK("\nUsage: trace_mask or trace_mask ID\n"); - return OS_ERROR; - } - - if (argc == 0) { - mask = TRACE_DEFAULT_MASK; - } else { - mask = strtoul(argv[0], &endPtr, 0); - } - LOS_TraceEventMaskSet((UINT32)mask); - return LOS_OK; -} - -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceDump(INT32 argc, const CHAR **argv) //׷ټ¼ת// -{ - BOOL toClient; - CHAR *endPtr = NULL; - - if (argc >= 2) { /* 2:Just as number of parameters */ - PRINTK("\nUsage: trace_dump or trace_dump [1/0]\n"); - return OS_ERROR; - } - - if (argc == 0) { - toClient = FALSE; - } else { - toClient = strtoul(argv[0], &endPtr, 0) != 0 ? TRUE : FALSE; - } - LOS_TraceRecordDump(toClient); - return LOS_OK; -} - -/*кע*/ -SHELLCMD_ENTRY(tracestart_shellcmd, CMD_TYPE_EX, "trace_start", 0, (CmdCallBackFunc)LOS_TraceStart); //׷ٹܵ// -SHELLCMD_ENTRY(tracestop_shellcmd, CMD_TYPE_EX, "trace_stop", 0, (CmdCallBackFunc)LOS_TraceStop); //׷ٹֹܵͣ// -SHELLCMD_ENTRY(tracesetmask_shellcmd, CMD_TYPE_EX, "trace_mask", 1, (CmdCallBackFunc)OsShellCmdTraceSetMask); //׷¼// -SHELLCMD_ENTRY(tracereset_shellcmd, CMD_TYPE_EX, "trace_reset", 0, (CmdCallBackFunc)LOS_TraceReset); //׷ټ¼// -SHELLCMD_ENTRY(tracedump_shellcmd, CMD_TYPE_EX, "trace_dump", 1, (CmdCallBackFunc)OsShellCmdTraceDump); //ת׷ټ¼// -#endif - -#endif /* LOSCFG_KERNEL_TRACE */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/文豪/trace/pipeline/serial/trace_pipeline_serial.c b/文豪/trace/pipeline/serial/trace_pipeline_serial.c deleted file mode 100644 index e61300b..0000000 --- a/文豪/trace/pipeline/serial/trace_pipeline_serial.c +++ /dev/null @@ -1,98 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Pipeline of Serial Implementation - * Author: Huawei LiteOS Team - * Create: 2020-03-31 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "trace_pipeline_serial.h" -#include "trace_pipeline.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_TRACE_CONTROL_AGENT -UINT32 SerialPipelineInit(VOID) //ڳʼйܵ// -{ - return uart_hwiCreate(); -} - -UINT32 SerialDataReceive(UINT8 *data, UINT32 size, UINT32 timeout) //ڴӴйܵ// -{ - return uart_read(data, size, timeout); -} - -UINT32 SerialWait(VOID) //ڵȴйܵ׼// -{ - return uart_wait_adapt(); -} - -#else//4ų2930 - -UINT32 SerialPipelineInit(VOID) //ʾʼɹ// -{ - return LOS_OK; -} - -UINT32 SerialDataReceive(UINT8 *data, UINT32 size, UINT32 timeout) //ʾյ// -{ - return LOS_OK; -} - -UINT32 SerialWait(VOID) //ʾѾ׼// -{ - return LOS_OK; -} -#endif - -VOID SerialDataSend(UINT16 len, UINT8 *data) //йܵ// -{ - UINT32 i; - - for (i = 0; i < len; i++) { - UART_PUTC(data[i]); - } -} - -STATIC const TracePipelineOps g_serialOps = { - .init = SerialPipelineInit, - .dataSend = SerialDataSend, - .dataRecv = SerialDataReceive, - .wait = SerialWait, -}; - -UINT32 OsTracePipelineInit(VOID) //ڳʼ׷ٹܵע֮صIJӿ// -{ - OsTracePipelineReg(&g_serialOps); - return g_serialOps.init(); -} - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/文豪/trace/pipeline/serial/trace_pipeline_serial.h b/文豪/trace/pipeline/serial/trace_pipeline_serial.h deleted file mode 100644 index a3cf977..0000000 --- a/文豪/trace/pipeline/serial/trace_pipeline_serial.h +++ /dev/null @@ -1,50 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Pipeline of Serial Implementation HeadFile - * Author: Huawei LiteOS Team - * Create: 2020-03-16 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#ifndef _TRACE_PIPELINE_SERIAL_H -#define _TRACE_PIPELINE_SERIAL_H - -#include "los_typedef.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -extern INT32 uart_putc(CHAR c); //򴮿ڷһַ// - -#define UART_PUTC(c) uart_putc((c)) //uart_putc// - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif /* _TRACE_PIPELINE_SERIAL_H */ diff --git a/文豪/trace/pipeline/trace_pipeline.c b/文豪/trace/pipeline/trace_pipeline.c deleted file mode 100644 index 33e5f63..0000000 --- a/文豪/trace/pipeline/trace_pipeline.c +++ /dev/null @@ -1,156 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Pipeline Implementation - * Author: Huawei LiteOS Team - * Create: 2020-03-31 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "trace_pipeline.h" -#include "trace_tlv.h" -#include "los_trace_pri.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -//ֹ// -LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_pipeSpin); //ʼһ// -#define PIPE_LOCK(state) LOS_SpinLockSave(&g_pipeSpin, &(state)) //// -#define PIPE_UNLOCK(state) LOS_SpinUnlockRestore(&g_pipeSpin, (state)) //// - -STATIC TlvTable g_traceTlvTblNotify[] = { //ṹijԱͺʹС// - { CMD, LOS_OFF_SET_OF(TraceNotifyFrame, cmd), sizeof(UINT32) }, - { PARAMS, LOS_OFF_SET_OF(TraceNotifyFrame, param), sizeof(UINT32) }, - { TRACE_TLV_TYPE_NULL, 0, 0 }, -}; - -STATIC TlvTable g_traceTlvTblHead[] = { //ṹijԱͺʹС// - { ENDIAN, LOS_OFF_SET_OF(TraceBaseHeaderInfo, bigLittleEndian), sizeof(UINT32) }, - { VERSION, LOS_OFF_SET_OF(TraceBaseHeaderInfo, version), sizeof(UINT32) }, - { CLOCK_FREQ, LOS_OFF_SET_OF(TraceBaseHeaderInfo, clockFreq), sizeof(UINT32) }, - { TRACE_TLV_TYPE_NULL, 0, 0 }, -}; - -STATIC TlvTable g_traceTlvTblObj[] = { //ṹijԱ͡ƫλúʹС// - { ADDR, LOS_OFF_SET_OF(ObjData, id), sizeof(UINT32) }, - { PRIO, LOS_OFF_SET_OF(ObjData, prio), sizeof(UINT32) }, - { NAME, LOS_OFF_SET_OF(ObjData, name), sizeof(CHAR) * LOSCFG_TRACE_OBJ_MAX_NAME_SIZE }, - { TRACE_TLV_TYPE_NULL, 0, 0 }, -}; - -STATIC TlvTable g_traceTlvTblEvent[] = { //ṹijԱͺʹС// -#ifdef LOSCFG_TRACE_FRAME_CORE_MSG - { CORE, LOS_OFF_SET_OF(TraceEventFrame, core), sizeof(UINT32) }, -#endif - { EVENT_CODE, LOS_OFF_SET_OF(TraceEventFrame, eventType), sizeof(UINT32) }, - { CUR_TIME, LOS_OFF_SET_OF(TraceEventFrame, curTime), sizeof(UINT64) }, - -#ifdef LOSCFG_TRACE_FRAME_EVENT_COUNT - { EVENT_COUNT, LOS_OFF_SET_OF(TraceEventFrame, eventCount), sizeof(UINT32) }, -#endif - { CUR_TASK, LOS_OFF_SET_OF(TraceEventFrame, curTask), sizeof(UINT32) }, - { IDENTITY, LOS_OFF_SET_OF(TraceEventFrame, identity), sizeof(UINTPTR) }, - { EVENT_PARAMS, LOS_OFF_SET_OF(TraceEventFrame, params), sizeof(UINTPTR) * LOSCFG_TRACE_FRAME_MAX_PARAMS }, - { TRACE_TLV_TYPE_NULL, 0, 0 }, -}; - -STATIC TlvTable *g_traceTlvTbl[] = { - g_traceTlvTblNotify, - g_traceTlvTblHead, - g_traceTlvTblObj, - g_traceTlvTblEvent -}; - -STATIC UINT32 DefaultPipelineInit(VOID) -{ - return LOS_OK; -} - -STATIC VOID DefaultDataSend(UINT16 len, UINT8 *data) -{ //lendataΪ"δʹ"// - (VOID)len; //// - (VOID)data; -} - -STATIC UINT32 DefaultDataReceive(UINT8 *data, UINT32 size, UINT32 timeout) -{ - (VOID)data; //datasizetimeoutΪ"δʹ"// - (VOID)size; - (VOID)timeout; - return LOS_OK; -} - -STATIC UINT32 DefaultWait(VOID) -{ - return LOS_OK; -} - -STATIC TracePipelineOps g_defaultOps = { - .init = DefaultPipelineInit, - .dataSend = DefaultDataSend, - .dataRecv = DefaultDataReceive, - .wait = DefaultWait, -}; - -STATIC const TracePipelineOps *g_tracePipelineOps = &g_defaultOps; - -VOID OsTracePipelineReg(const TracePipelineOps *ops) -{ - g_tracePipelineOps = ops; //עһTracePipelineOpsṹָ// -} - -VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data) //ڷ׷// -{ - UINT32 intSave; - UINT8 outBuf[LOSCFG_TRACE_TLV_BUF_SIZE] = {0}; - - if ((type > TRACE_MSG_MAX) || (len > LOSCFG_TRACE_TLV_BUF_SIZE)) { //ĺϷԼ// - return; - } - - //ݽб// - len = OsTraceDataEncode(type, g_traceTlvTbl[type], data, &outBuf[0], sizeof(outBuf)); - - PIPE_LOCK(intSave); //ȡֹ̲ܵ߳// - g_tracePipelineOps->dataSend(len, &outBuf[0]); //ͱ// - PIPE_UNLOCK(intSave); //ͷŹܵ// -} - -UINT32 OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout) //ڽ׷// -{ - return g_tracePipelineOps->dataRecv(data, size, timeout); -} - -UINT32 OsTraceDataWait(VOID) //ڵȴ׷// -{ - return g_tracePipelineOps->wait(); -} - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/文豪/trace/pipeline/trace_pipeline.h b/文豪/trace/pipeline/trace_pipeline.h deleted file mode 100644 index 49e292b..0000000 --- a/文豪/trace/pipeline/trace_pipeline.h +++ /dev/null @@ -1,104 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Pipeline Implementation HeadFile - * Author: Huawei LiteOS Team - * Create: 2020-03-16 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#ifndef _TRACE_PIPELINE_H -#define _TRACE_PIPELINE_H - -#include "los_typedef.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -/*ʵ׷ˮߵĹ*/ -typedef struct { - UINT32 (*init)(VOID); //ڳʼ// - VOID (*dataSend)(UINT16 len, UINT8 *data); //ڷ// - UINT32 (*dataRecv)(UINT8 *data, UINT32 size, UINT32 timeout); //ڽ// - UINT32 (*wait)(VOID); //ڵȴ// -} TracePipelineOps; - -/* used as tlv's tag */ -enum TraceMsgType { //ڱʾ׷Ϣ// - //// - NOTIFY, //֪ͨ// - HEAD, //ͷ// - OBJ, //// - EVENT, //¼// - - TRACE_MSG_MAX, //ֵ// -}; - -enum TraceNotifySubType { //ڱʾ֪ͨϢ// - CMD = 0x1, - PARAMS, -}; - -enum TraceHeadSubType { //ڱʾ׷ͷϢ// - ENDIAN = 0x1, //ֽ// - VERSION, //汾// - OBJ_SIZE, //С// - OBJ_COUNT, //// - CUR_INDEX, //ǰ// - MAX_RECODE, - CUR_OBJ_INDEX, - CLOCK_FREQ, -}; - -enum TraceObjSubType { //ڱʾ׷ٶ// - ADDR = 0x1, //ַ// - PRIO, //ȼ/ - NAME, //// -}; - -enum TraceEvtSubType { //ڱʾ׷¼// - CORE = 0x1, //ı// - EVENT_CODE, //¼// - CUR_TIME, //ǰʱ// - EVENT_COUNT, //¼// - CUR_TASK, //ǰ// - IDENTITY, //Ϣ// - EVENT_PARAMS, //¼// -}; - -extern VOID OsTracePipelineReg(const TracePipelineOps *ops); //ע׷ٹܵ// -extern UINT32 OsTracePipelineInit(VOID); //ڳʼ׷ٹܵ// - -extern VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data); //ڷ׷// -extern UINT32 OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout); //ڽ׷// -extern UINT32 OsTraceDataWait(VOID); //ڵȴ׷// - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif /* _TRACE_PIPELINE_H */ diff --git a/文豪/trace/pipeline/trace_tlv.c b/文豪/trace/pipeline/trace_tlv.c deleted file mode 100644 index 4545766..0000000 --- a/文豪/trace/pipeline/trace_tlv.c +++ /dev/null @@ -1,121 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Tlv Implementation - * Author: Huawei LiteOS Team - * Create: 2020-03-31 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "trace_tlv.h" -#include "securec.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#define CRC_WIDTH 8 //CRCλ// -#define CRC_POLY 0x1021 //CRCʽ// -#define CRC_TOPBIT 0x8000 //CRCеλ// - -STATIC UINT16 CalcCrc16(const UINT8 *buf, UINT32 len) //ڼ16λCRCУֵ// -{ - UINT32 i; - UINT16 crc = 0; - - for (; len > 0; len--) { - crc = crc ^ (*buf++ << CRC_WIDTH); - for (i = 0; i < CRC_WIDTH; i++) { - if (crc & CRC_TOPBIT) { - crc = (crc << 1) ^ CRC_POLY; - } else { - crc <<= 1; - } - } - } - return crc; -} - -STATIC UINT32 OsWriteTlv(UINT8 *tlvBuf, UINT8 type, UINT8 len, UINT8 *value) //TLVдTLV// -{ - TraceMsgTlvBody *body = (TraceMsgTlvBody *)tlvBuf; - - if (len == 0) { - return 0; - } - - body->type = type; - body->len = len; - /* Do not check return value for performance, if copy failed, only this package will be discarded */ - (VOID)memcpy_s(body->value, len, value, len); - return len + sizeof(body->type) + sizeof(body->len); //ʵдֽ// -} - -/*TLVеĶ壬ԴݱTLVʽдTLV*/ -STATIC UINT32 OsTlvEncode(const TlvTable *table, UINT8 *srcBuf, UINT8 *tlvBuf, INT32 tlvBufLen) -{ - UINT32 len = 0; - const TlvTable *tlvTableItem = table; - - while (tlvTableItem->tag != TRACE_TLV_TYPE_NULL) { - if ((len + tlvTableItem->elemSize + sizeof(UINT8) + sizeof(UINT8)) > tlvBufLen) { - break; - } - len += OsWriteTlv(tlvBuf + len, tlvTableItem->tag, tlvTableItem->elemSize, srcBuf + tlvTableItem->elemOffset); - tlvTableItem++; - } - return len; -} - -/*ԴݰTLVĶ룬дĿ껺*/ -UINT32 OsTraceDataEncode(UINT8 type, const TlvTable *table, UINT8 *src, UINT8 *dest, INT32 destLen) -{ - UINT16 crc; - INT32 len; - INT32 tlvBufLen; - UINT8 *tlvBuf = NULL; - - TraceMsgTlvHead *head = (TraceMsgTlvHead *)dest; - tlvBufLen = destLen - sizeof(TraceMsgTlvHead); - - if ((tlvBufLen <= 0) || (table == NULL)) { - return 0; - } - - tlvBuf = dest + sizeof(TraceMsgTlvHead); - len = OsTlvEncode(table, src, tlvBuf, tlvBufLen); - crc = CalcCrc16(tlvBuf, len); - - head->magicNum = TRACE_TLV_MSG_HEAD; - head->msgType = type; - head->len = len; - head->crc = crc; - return len + sizeof(TraceMsgTlvHead); -} - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/文豪/trace/pipeline/trace_tlv.h b/文豪/trace/pipeline/trace_tlv.h deleted file mode 100644 index 1871012..0000000 --- a/文豪/trace/pipeline/trace_tlv.h +++ /dev/null @@ -1,95 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Tlv Implementation HeadFile - * Author: Huawei LiteOS Team - * Create: 2020-03-16 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#ifndef _TRACE_TLV_H -#define _TRACE_TLV_H - -#include "los_typedef.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#define TRACE_TLV_MSG_HEAD 0xFF -#define TRACE_TLV_TYPE_NULL 0xFF - -typedef struct { - UINT8 magicNum; //ħ// - UINT8 msgType; //Ϣ// - UINT16 len; //Ϣ// - UINT16 crc; //CRCУ// -} TraceMsgTlvHead; //TLVϢͷ// - -typedef struct { - UINT8 type; //Ϣ/// - UINT8 len; //Ϣ// - UINT8 value[]; //// -} TraceMsgTlvBody; //TLVϢϢ// - -typedef struct { - UINT8 tag; //ǩ// - UINT8 elemOffset; //Ԫƫ// - UINT8 elemSize; //ԪشС// -} TlvTable; //TLV// - -/** - * @ingroup los_trace - * @brief Encode trace raw data. - * - * @par Description: - * This API is used to encode trace raw data to tlv data. - * @attention - *
    - *
  • Encade trace data
  • - *
- * - * @param type [IN] Type #UINT8. The type stands for different struct of src data. - * @param src [IN] Type #UINT8 *. The raw trace data. - * @param table [IN] Type #const TlvTable *. The tlv table descript elemOffset and elemSize. - * @param dest [OUT] Type #UINT8 *. The tlv data. - * @param destLen [IN] Type #UINT8 *. The tlv buf max len. - - * @retval #0 convert failed. - * @retval #UINT32 convert success bytes. - * - * @par Dependency: - *
  • trace_tlv.h: the header file that contains the API declaration.
- * @see LOS_TraceDataEncode - * @since Huawei LiteOS V200R005C00 - */ -extern UINT32 OsTraceDataEncode(UINT8 type, const TlvTable *table, UINT8 *src, UINT8 *dest, INT32 destLen); -/*TLVϢԭʼ׷ݽб룬ӦTLV*/ -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif /* _TRACE_TLV_H */ \ No newline at end of file diff --git a/文豪/trace/trace_offline.c b/文豪/trace/trace_offline.c deleted file mode 100644 index f23a43f..0000000 --- a/文豪/trace/trace_offline.c +++ /dev/null @@ -1,264 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Offline Mode Implementation - * Author: Huawei LiteOS Team - * Create: 2020-03-31 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_trace_pri.h" -#include "trace_pipeline.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_RECORDER_MODE_OFFLINE -#define BITS_NUM_FOR_TASK_ID 16 //ָIDλ// - -LITE_OS_SEC_BSS STATIC TraceOfflineHeaderInfo g_traceRecoder; //¼߸ټ¼Ϣ// -LITE_OS_SEC_BSS STATIC UINT32 g_tidMask[LOSCFG_BASE_CORE_TSK_LIMIT] = {0}; //ڴ洢ID// - -UINT32 OsTraceGetMaskTid(UINT32 tid) //ڻȡID// -{ - return tid | ((tid < LOSCFG_BASE_CORE_TSK_LIMIT) ? g_tidMask[tid] << BITS_NUM_FOR_TASK_ID : 0); /* tid < 65535 */ -} - -UINT32 OsTraceBufInit(VOID *buf, UINT32 size) //ڳʼ߸ٻ// -{ - UINT32 headSize; - - headSize = sizeof(OfflineHead) + sizeof(ObjData) * LOSCFG_TRACE_OBJ_MAX_NUM; //ڴ洢߸ټ¼ͷϢ// - if (size <= headSize) { - TRACE_ERROR("trace buf size not enough than 0x%x\n", headSize); - return LOS_ERRNO_TRACE_BUF_TOO_SMALL; - } - - if (buf == NULL) { - buf = LOS_MemAlloc(m_aucSysMem1, size); - if (buf == NULL) { - return LOS_ERRNO_TRACE_NO_MEMORY; - } - } - - (VOID)memset_s(buf, size, 0, size); - g_traceRecoder.head = (OfflineHead *)buf; - g_traceRecoder.head->baseInfo.bigLittleEndian = TRACE_BIGLITTLE_WORD; - g_traceRecoder.head->baseInfo.version = TRACE_VERSION(TRACE_MODE_OFFLINE); - g_traceRecoder.head->baseInfo.clockFreq = GET_SYS_CLOCK(); - g_traceRecoder.head->objSize = sizeof(ObjData); - g_traceRecoder.head->frameSize = sizeof(TraceEventFrame); - g_traceRecoder.head->objOffset = sizeof(OfflineHead); - g_traceRecoder.head->frameOffset = headSize; - g_traceRecoder.head->totalLen = size; - - g_traceRecoder.ctrl.curIndex = 0; - g_traceRecoder.ctrl.curObjIndex = 0; - g_traceRecoder.ctrl.maxObjCount = LOSCFG_TRACE_OBJ_MAX_NUM; - g_traceRecoder.ctrl.maxRecordCount = (size - headSize) / sizeof(TraceEventFrame); - g_traceRecoder.ctrl.objBuf = (ObjData *)((UINTPTR)buf + g_traceRecoder.head->objOffset); - g_traceRecoder.ctrl.frameBuf = (TraceEventFrame *)((UINTPTR)buf + g_traceRecoder.head->frameOffset); - - return LOS_OK; -} - -VOID OsTraceObjAdd(UINT32 eventType, UINT32 taskId) //߸ٻӶ// -{ - UINT32 intSave; - UINT32 index; - ObjData *obj = NULL; - - TRACE_LOCK(intSave); - /* add obj begin */ - index = g_traceRecoder.ctrl.curObjIndex; - if (index >= LOSCFG_TRACE_OBJ_MAX_NUM) { /* do nothing when config LOSCFG_TRACE_OBJ_MAX_NUM = 0 */ - TRACE_UNLOCK(intSave); - return; - } - obj = &g_traceRecoder.ctrl.objBuf[index]; - - if (taskId < LOSCFG_BASE_CORE_TSK_LIMIT) { - g_tidMask[taskId]++; - } - - OsTraceSetObj(obj, OS_TCB_FROM_TID(taskId)); - - g_traceRecoder.ctrl.curObjIndex++; - if (g_traceRecoder.ctrl.curObjIndex >= g_traceRecoder.ctrl.maxObjCount) { - g_traceRecoder.ctrl.curObjIndex = 0; /* turn around */ - } - /* add obj end */ - TRACE_UNLOCK(intSave); -} - -VOID OsTraceWriteOrSendEvent(const TraceEventFrame *frame) //߸ٻд¼֡// -{ - UINT16 index; - UINT32 intSave; - - TRACE_LOCK(intSave); - index = g_traceRecoder.ctrl.curIndex; - (VOID)memcpy_s(&g_traceRecoder.ctrl.frameBuf[index], sizeof(TraceEventFrame), frame, sizeof(TraceEventFrame)); - - g_traceRecoder.ctrl.curIndex++; - if (g_traceRecoder.ctrl.curIndex >= g_traceRecoder.ctrl.maxRecordCount) { - g_traceRecoder.ctrl.curIndex = 0; - } - TRACE_UNLOCK(intSave); -} - -VOID OsTraceReset(VOID) //߸ٻ// -{ - UINT32 intSave; - UINT32 bufLen; - - TRACE_LOCK(intSave); - bufLen = sizeof(TraceEventFrame) * g_traceRecoder.ctrl.maxRecordCount; - (VOID)memset_s(g_traceRecoder.ctrl.frameBuf, bufLen, 0, bufLen); - g_traceRecoder.ctrl.curIndex = 0; - TRACE_UNLOCK(intSave); -} - -STATIC VOID OsTraceInfoObj(VOID) //ڴӡ߸ٶϢ// -{ - UINT32 i; - ObjData *obj = &g_traceRecoder.ctrl.objBuf[0]; - - if (g_traceRecoder.ctrl.maxObjCount > 0) { - PRINTK("CurObjIndex = %u\n", g_traceRecoder.ctrl.curObjIndex); - PRINTK("Index TaskID TaskPrio TaskName \n"); - for (i = 0; i < g_traceRecoder.ctrl.maxObjCount; i++, obj++) { - PRINTK("%-7u 0x%-6x %-10u %s\n", i, obj->id, obj->prio, obj->name); - } - PRINTK("\n"); - } -} - -STATIC VOID OsTraceInfoEventTitle(VOID) //ڴӡ߸¼// -{ - PRINTK("CurEvtIndex = %u\n", g_traceRecoder.ctrl.curIndex); - - PRINTK("Index Time(cycles) EventType CurTask Identity "); -#ifdef LOSCFG_TRACE_FRAME_CORE_MSG - PRINTK("cpuId hwiActive taskLockCnt "); -#endif -#ifdef LOSCFG_TRACE_FRAME_EVENT_COUNT - PRINTK("eventCount "); -#endif - if (LOSCFG_TRACE_FRAME_MAX_PARAMS > 0) { - PRINTK("params "); - } - PRINTK("\n"); -} - -STATIC VOID OsTraceInfoEventData(VOID) //ڴӡ߸¼// -{ - UINT32 i, j; - TraceEventFrame *frame = &g_traceRecoder.ctrl.frameBuf[0]; - - for (i = 0; i < g_traceRecoder.ctrl.maxRecordCount; i++, frame++) { - PRINTK("%-7u 0x%-15llx 0x%-12x 0x%-7x 0x%-11x ", i, frame->curTime, frame->eventType, - frame->curTask, frame->identity); -#ifdef LOSCFG_TRACE_FRAME_CORE_MSG - UINT32 taskLockCnt = frame->core.taskLockCnt; -#ifdef LOSCFG_KERNEL_SMP - /* - * For smp systems, TRACE_LOCK will requst taskLock, and this counter - * will increase by 1 in that case. - */ - taskLockCnt -= 1; -#endif - PRINTK("%-11u %-11u %-11u", frame->core.cpuId, frame->core.hwiActive, taskLockCnt); -#endif -#ifdef LOSCFG_TRACE_FRAME_EVENT_COUNT - PRINTK("%-11u", frame->eventCount); -#endif - for (j = 0; j < LOSCFG_TRACE_FRAME_MAX_PARAMS; j++) { - PRINTK("0x%-11x", frame->params[j]); - } - PRINTK("\n"); - } -} - -STATIC VOID OsTraceInfoDisplay(VOID) //ʾ߸Ϣ// -{ - OfflineHead *head = g_traceRecoder.head; - - PRINTK("*******TraceInfo begin*******\n"); - PRINTK("clockFreq = %u\n", head->baseInfo.clockFreq); - - OsTraceInfoObj(); - - OsTraceInfoEventTitle(); - OsTraceInfoEventData(); - - PRINTK("*******TraceInfo end*******\n"); -} - -#ifdef LOSCFG_TRACE_CLIENT_INTERACT -STATIC VOID OsTraceSendInfo(VOID) //ڷ߸Ϣ// -{ - UINT32 i; - ObjData *obj = NULL; - TraceEventFrame *frame = NULL; - - OsTraceDataSend(HEAD, sizeof(OfflineHead), (UINT8 *)g_traceRecoder.head); - - obj = &g_traceRecoder.ctrl.objBuf[0]; - for (i = 0; i < g_traceRecoder.ctrl.maxObjCount; i++) { - OsTraceDataSend(OBJ, sizeof(ObjData), (UINT8 *)(obj + i)); - } - - frame = &g_traceRecoder.ctrl.frameBuf[0]; - for (i = 0; i < g_traceRecoder.ctrl.maxRecordCount; i++) { - OsTraceDataSend(EVENT, sizeof(TraceEventFrame), (UINT8 *)(frame + i)); - } -} -#endif - -VOID OsTraceRecordDump(BOOL toClient) //߸Ϣ// -{ - if (!toClient) { //ָʾǷ߸Ϣ// - OsTraceInfoDisplay(); - return; - } - -#ifdef LOSCFG_TRACE_CLIENT_INTERACT - OsTraceSendInfo(); -#endif -} - -OfflineHead *OsTraceRecordGet(VOID) //ڻȡ߸ټ¼ͷϢ// -{ - return g_traceRecoder.head; -} - -#endif /* LOSCFG_RECORDER_MODE_OFFLINE */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/文豪/trace/trace_online.c b/文豪/trace/trace_online.c deleted file mode 100644 index 6faba44..0000000 --- a/文豪/trace/trace_online.c +++ /dev/null @@ -1,117 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. - * Description: LiteOS Trace Online Mode Implementation - * Author: Huawei LiteOS Team - * Create: 2020-03-31 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_trace_pri.h" -#include "trace_pipeline.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_RECORDER_MODE_ONLINE -UINT32 OsTraceGetMaskTid(UINT32 taskId) //ڻȡID// -{ - return taskId; -} - -UINT32 OsTraceBufInit(VOID *buf, UINT32 size) //ʼٻ// -{ - (VOID)buf; - (VOID)size; - return LOS_OK; -} - -VOID OsTraceSendHead(VOID) //͸ݵͷϢ// -{ - TraceBaseHeaderInfo head = { - .bigLittleEndian = TRACE_BIGLITTLE_WORD, - .version = TRACE_VERSION(TRACE_MODE_ONLINE), - .clockFreq = GET_SYS_CLOCK(), - }; - - OsTraceDataSend(HEAD, sizeof(TraceBaseHeaderInfo), (UINT8 *)&head); -} - -VOID OsTraceSendNotify(UINT32 type, UINT32 value) //֪ͨ͵ĸ// -{ - TraceNotifyFrame frame = { - .cmd = type, - .param = value, - }; - - OsTraceDataSend(NOTIFY, sizeof(TraceNotifyFrame), (UINT8 *)&frame); -} - -STATIC VOID OsTraceSendObj(const LosTaskCB *tcb) //ͶΪobjĸ// -{ - ObjData obj; - - OsTraceSetObj(&obj, tcb); - OsTraceDataSend(OBJ, sizeof(ObjData), (UINT8 *)&obj); -} - -VOID OsTraceSendObjTable(VOID) //Ͷ͵ĸ// -{ - UINT32 loop; - LosTaskCB *tcb = NULL; - - for (loop = 0; loop < g_taskMaxNum; ++loop) { - tcb = g_taskCBArray + loop; - if (tcb->taskStatus & OS_TASK_STATUS_UNUSED) { - continue; - } - OsTraceSendObj(tcb); - } -} - -VOID OsTraceObjAdd(UINT32 eventType, UINT32 taskId) //ټ¼Ӷ// -{ - if (OsTraceIsEnable()) { - OsTraceSendObj(OS_TCB_FROM_TID(taskId)); - } -} - -VOID OsTraceWriteOrSendEvent(const TraceEventFrame *frame) //¼// -{ - OsTraceDataSend(EVENT, sizeof(TraceEventFrame), (UINT8 *)frame); -} - -OfflineHead *OsTraceRecordGet(VOID) //ȡ߸ټ¼ͷ// -{ - return NULL; //ʾû߸ټ¼// -} - -#endif /* LOSCFG_RECORDER_MODE_ONLINE */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ -- 2.34.1 From 68154d7ad8a4ab69d2218942b4a283375a92419d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Mon, 22 Jan 2024 08:23:01 +0800 Subject: [PATCH 2/8] wenhao --- doc/文豪-用例描述.docx | Bin 0 -> 14105 bytes src/debug/los_mux_deadlock.c | 257 ++++++++++++++++++++++++++ src/debug/los_mux_debug.c | 189 +++++++++++++++++++ src/debug/los_queue_debug.c | 206 +++++++++++++++++++++ src/debug/los_sched_debug.c | 347 +++++++++++++++++++++++++++++++++++ src/debug/los_sem_debug.c | 299 ++++++++++++++++++++++++++++++ 6 files changed, 1298 insertions(+) create mode 100644 doc/文豪-用例描述.docx create mode 100644 src/debug/los_mux_deadlock.c create mode 100644 src/debug/los_mux_debug.c create mode 100644 src/debug/los_queue_debug.c create mode 100644 src/debug/los_sched_debug.c create mode 100644 src/debug/los_sem_debug.c diff --git a/doc/文豪-用例描述.docx b/doc/文豪-用例描述.docx new file mode 100644 index 0000000000000000000000000000000000000000..a5be5e412a48256759719611f03b383b2d93be84 GIT binary patch literal 14105 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 literal 0 HcmV?d00001 diff --git a/src/debug/los_mux_deadlock.c b/src/debug/los_mux_deadlock.c new file mode 100644 index 0000000..6862541 --- /dev/null +++ b/src/debug/los_mux_deadlock.c @@ -0,0 +1,257 @@ +/* ---------------------------------------------------------------------------- + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. + * Description: Mutex Deadlock Check + * Author: Huawei LiteOS Team + * Create: 2013-01-01 + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * --------------------------------------------------------------------------- */ + +#include "los_mux_debug_pri.h" +#include "los_typedef.h" +#include "los_task.h" +#include "arch/exception.h" +#ifdef LOSCFG_SHELL +#include "shcmd.h" +#endif /* LOSCFG_SHELL */ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */nbb + +typedef struct { + LOS_DL_LIST muxListHead; /* Task-held mutexs list */ //ڹеĻб// + UINT64 lastAccessTime; /* The last operation time */ //¼һβʱ// +} MuxDLinkCB; + +/*еĻб͸*/ +typedef struct { + LOS_DL_LIST muxList; /* Insert mutex into the owner task CB */ //ڽ뵽Ŀƿ// + VOID *muxCB; /* The Mutex CB pointer */ //ָ򻥳ƿָ// +} MuxDLinkNode; + +STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL; + +/* + * Mutex deadlock detection time threshold, will print out task information + * that has not been scheduled within this time. + * The unit is tick. + */ +#define OS_MUX_DEADLOCK_CHECK_THRESHOLD 60000 //μ黥֮СʱλΪ// + +UINT32 OsMuxDlockCheckInit(VOID) //ڷڴ沢ʼƿб// +{ + UINT32 index; + UINT32 size = (LOSCFG_BASE_CORE_TSK_LIMIT + 1) * sizeof(MuxDLinkCB); + + /* system resident memory, don't free */ + g_muxDeadlockCBArray = (MuxDLinkCB *)LOS_MemAlloc(m_aucSysMem1, size); + if (g_muxDeadlockCBArray == NULL) { + PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); + return LOS_NOK; + } + + for (index = 0; index < LOSCFG_BASE_CORE_TSK_LIMIT + 1; index++) { + g_muxDeadlockCBArray[index].lastAccessTime = 0; + LOS_ListInit(&g_muxDeadlockCBArray[index].muxListHead); + } + return LOS_OK; +} + +VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) //ָĻвһڵ// +{ + MuxDLinkNode *muxDLNode = NULL; + + if ((taskId > LOSCFG_BASE_CORE_TSK_LIMIT) || (muxCB == NULL)) { + return; + } + + muxDLNode = (MuxDLinkNode *)LOS_MemAlloc(m_aucSysMem1, sizeof(MuxDLinkNode)); + if (muxDLNode == NULL) { + return; + } + (VOID)memset_s(muxDLNode, sizeof(MuxDLinkNode), 0, sizeof(MuxDLinkNode)); + muxDLNode->muxCB = muxCB; + + LOS_ListTailInsert(&g_muxDeadlockCBArray[taskId].muxListHead, &muxDLNode->muxList); +} + +VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB) //ڴָĻɾָĻڵ// +{ + MuxDLinkCB *muxDLCB = NULL; + LOS_DL_LIST *list = NULL; + MuxDLinkNode *muxDLNode = NULL; + + if ((taskId > LOSCFG_BASE_CORE_TSK_LIMIT) || (muxCB == NULL)) { + return; + } + + muxDLCB = &g_muxDeadlockCBArray[taskId]; + LOS_DL_LIST_FOR_EACH(list, &muxDLCB->muxListHead) { + muxDLNode = LOS_DL_LIST_ENTRY(list, MuxDLinkNode, muxList); + if (muxDLNode->muxCB == muxCB) { + LOS_ListDelete(&muxDLNode->muxList); + (VOID)LOS_MemFree(m_aucSysMem1, muxDLNode); + return; + } + } +} + +VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount) //ڸʱ// +{ + if (taskId > LOSCFG_BASE_CORE_TSK_LIMIT) { + return; + } + + g_muxDeadlockCBArray[taskId].lastAccessTime = tickCount; +} + +STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) //ڴӡĺջϢ// +{ + TaskContext *context = NULL; + + PRINTK("*******backtrace begin*******\n"); + context = (TaskContext *)taskCB->stackPointer; + ArchBackTraceWithSp(context); + PRINTK("********backtrace end********\n"); + return; +} + +STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) //ڴӡȴбϢ// +{ + LOS_DL_LIST *listTmp = NULL; + LosTaskCB *pendedTask = NULL; + CHAR *name = NULL; + UINT32 index = 0; + UINT32 id, intSave; + + SCHEDULER_LOCK(intSave); + if (LOS_ListEmpty(list) == TRUE) { + SCHEDULER_UNLOCK(intSave); + PRINTK("Pended Task: null\n"); + return; + } + + LOS_DL_LIST_FOR_EACH(listTmp, list) { + pendedTask = OS_TCB_FROM_PENDLIST(listTmp); + name = pendedTask->taskName; + id = pendedTask->taskId; + SCHEDULER_UNLOCK(intSave); + if (index == 0) { + PRINTK("Pended task: %u. name:%-15s, id:0x%-5x\n", index, name, id); + } else { + PRINTK(" %u. name:%-15s, id:0x%-5x\n", index, name, id); + } + index++; + SCHEDULER_LOCK(intSave); + } + SCHEDULER_UNLOCK(intSave); +} + +STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) //ڴӡеĻϢ// +{ + UINT32 index = 0; + MuxDLinkNode *muxDLNode = NULL; + CHAR *ownerName = NULL; + LosMuxCB *muxCB = NULL; + LOS_DL_LIST *list = NULL; + LOS_DL_LIST *listTmp = NULL; + UINT32 count, intSave; + + SCHEDULER_LOCK(intSave); + if (LOS_ListEmpty(&muxDLCB->muxListHead) == TRUE) { + SCHEDULER_UNLOCK(intSave); + PRINTK("null\n"); + } else { + LOS_DL_LIST_FOR_EACH(list, &muxDLCB->muxListHead) { + muxDLNode = LOS_DL_LIST_ENTRY(list, MuxDLinkNode, muxList); + muxCB = (LosMuxCB *)muxDLNode->muxCB; + count = muxCB->muxCount; + ownerName = muxCB->owner->taskName; + SCHEDULER_UNLOCK(intSave); + PRINTK("\n", index); + PRINTK("Ptr handle:%p\n", muxCB); + PRINTK("Owner:%s\n", ownerName); + PRINTK("Count:%u\n", count); + + listTmp = &muxCB->muxList; + OsMutexPendTaskList(listTmp); + + index++; + SCHEDULER_LOCK(intSave); + } + SCHEDULER_UNLOCK(intSave); + } +} + +VOID OsMutexDlockCheck(VOID) //ڼ⻥Ϣ// +{ + UINT32 loop, intSave; + UINT32 taskId; + CHAR *name = NULL; + LosTaskCB *taskCB = NULL; + MuxDLinkCB *muxDLCB = NULL; + + SCHEDULER_LOCK(intSave); + for (loop = 0; loop < g_taskMaxNum; loop++) { + taskCB = (LosTaskCB *)g_taskCBArray + loop; + if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { + continue; + } + + muxDLCB = &g_muxDeadlockCBArray[taskCB->taskId]; + if ((LOS_TickCountGet() - muxDLCB->lastAccessTime) > OS_MUX_DEADLOCK_CHECK_THRESHOLD) { + name = taskCB->taskName; + taskId = taskCB->taskId; + SCHEDULER_UNLOCK(intSave); + PRINTK("Task_name:%s, ID:0x%x, holds the Mutexs below:\n", name, taskId); + OsTaskHoldMutexList(muxDLCB); + OsDeadlockBackTrace(taskCB); + PRINTK("\n"); + SCHEDULER_LOCK(intSave); + } + } + SCHEDULER_UNLOCK(intSave); +} + +#ifdef LOSCFG_SHELL //ִл鲢Ϣ// +UINT32 OsShellCmdMuxDeadlockCheck(UINT32 argc, const CHAR **argv) +{ + if (argc > 0) { + PRINTK("\nUsage: dlock\n"); + return OS_ERROR; + } + PRINTK("Start mutexs deadlock check: \n"); + OsMutexDlockCheck(); + PRINTK("-----------End-----------\n"); + return LOS_OK; +} +SHELLCMD_ENTRY(deadlock_shellcmd, CMD_TYPE_EX, "dlock", 0, (CmdCallBackFunc)OsShellCmdMuxDeadlockCheck); +#endif /* LOSCFG_SHELL */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ diff --git a/src/debug/los_mux_debug.c b/src/debug/los_mux_debug.c new file mode 100644 index 0000000..5008bc5 --- /dev/null +++ b/src/debug/los_mux_debug.c @@ -0,0 +1,189 @@ +/* ---------------------------------------------------------------------------- + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. + * Description: Mutex Debug + * Author: Huawei LiteOS Team + * Create: 2013-01-01 + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * --------------------------------------------------------------------------- */ + +#include "los_mux_debug_pri.h" +#include "los_typedef.h" +#include "los_task.h" +#include "los_misc_pri.h" +#include "arch/exception.h" +#ifdef LOSCFG_SHELL +#include "shcmd.h" +#endif /* LOSCFG_SHELL */ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#ifdef LOSCFG_DEBUG_MUTEX //ڱʾĵϢ// +typedef struct { + TSK_ENTRY_FUNC creator; /* The task entry who created this mutex */ + UINT64 lastAccessTime; /* The last access time */ +} MuxDebugCB; +STATIC MuxDebugCB *g_muxDebugArray = NULL; + +//ڱȽϢʱ// +STATIC BOOL MuxCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) +{ + return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > + *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); +} + +UINT32 OsMuxDbgInit(VOID) //ڳʼϢ// +{ + UINT32 size = LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(MuxDebugCB); + /* system resident memory, don't free */ + g_muxDebugArray = (MuxDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); + if (g_muxDebugArray == NULL) { + PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); + return LOS_NOK; + } + (VOID)memset_s(g_muxDebugArray, size, 0, size); + return LOS_OK; +} + +VOID OsMuxDbgTimeUpdate(UINT32 muxId) //ڸָʱ// +{ + MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; + muxDebug->lastAccessTime = LOS_TickCountGet(); +} + +VOID OsMuxDbgUpdate(UINT32 muxId, TSK_ENTRY_FUNC creator) //ڸָĴߺʱ// +{ + MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; + muxDebug->creator = creator; + muxDebug->lastAccessTime = LOS_TickCountGet(); +} + +//ڶԻ򣬲ܴڵĻй©// +STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count) +{ + LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; + MuxDebugCB muxDebugNode = {0}; + UINT32 index, intSave; + SortParam muxSortParam; + muxSortParam.buf = (CHAR *)g_muxDebugArray; + muxSortParam.ctrlBlockSize = sizeof(MuxDebugCB); + muxSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_MUX_LIMIT; + muxSortParam.sortElemOff = LOS_OFF_SET_OF(MuxDebugCB, lastAccessTime); + + if (count > 0) { + SCHEDULER_LOCK(intSave); + OsArraySort(indexArray, 0, count - 1, &muxSortParam, MuxCompareValue); + SCHEDULER_UNLOCK(intSave); + for (index = 0; index < count; index++) { + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(&muxNode, sizeof(LosMuxCB), + GET_MUX(indexArray[index]), sizeof(LosMuxCB)); + (VOID)memcpy_s(&muxDebugNode, sizeof(MuxDebugCB), + &g_muxDebugArray[indexArray[index]], sizeof(MuxDebugCB)); + SCHEDULER_UNLOCK(intSave); + /* + * muxStat may be altered after the g_taskSpin is unlocked in OsMutexCheck. + * We should recheck the muxStat before the print. + */ + if ((muxNode.muxStat != LOS_USED) || + ((muxNode.muxStat == LOS_USED) && ((muxDebugNode.creator == NULL) || (muxNode.owner == NULL)))) { + continue; + } + PRINTK("Mutex ID <0x%x> may leak, TaskID of owner:0x%x, TaskEntry of owner: %p," + "TaskEntry of creator: %p,Latest operation time: 0x%llx\n", + muxNode.muxId, muxNode.owner->taskId, muxNode.owner->taskEntry, muxDebugNode.creator, + muxDebugNode.lastAccessTime); + } + } + (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); +} + +VOID OsMutexCheck(VOID) //ڼ黥״̬ԿܴڵĻй©д// +{ + LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; + MuxDebugCB muxDebugNode = {0}; + UINT32 index, intSave; + UINT32 count = 0; + + /* + * This return value does not need to be judged immediately, + * and the following code logic has already distinguished the return value from null and non-empty, + * and there is no case of accessing the null pointer. + */ + UINT32 *indexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(UINT32)); + + for (index = 0; index < LOSCFG_BASE_IPC_MUX_LIMIT; index++) { + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(&muxNode, sizeof(LosMuxCB), GET_MUX(index), sizeof(LosMuxCB)); + (VOID)memcpy_s(&muxDebugNode, sizeof(MuxDebugCB), &g_muxDebugArray[index], sizeof(MuxDebugCB)); + SCHEDULER_UNLOCK(intSave); + + if ((muxNode.muxStat != LOS_USED) || + ((muxNode.muxStat == LOS_USED) && (muxDebugNode.creator == NULL))) { + continue; + } else if ((muxNode.muxStat == LOS_USED) && (muxNode.owner == NULL)) { + PRINTK("Mutex ID <0x%x> may leak, Owner is null, TaskEntry of creator: %p," + "Latest operation time: 0x%llx\n", + muxNode.muxId, muxDebugNode.creator, muxDebugNode.lastAccessTime); + } else { + if (indexArray != NULL) { + *(indexArray + count) = index; + count++; + } else { + PRINTK("Mutex ID <0x%x> may leak, TaskID of owner:0x%x, TaskEntry of owner: %p," + "TaskEntry of creator: %p,Latest operation time: 0x%llx\n", + muxNode.muxId, muxNode.owner->taskId, muxNode.owner->taskEntry, muxDebugNode.creator, + muxDebugNode.lastAccessTime); + } + } + } + + if (indexArray != NULL) { + SortMuxIndexArray(indexArray, count); + } +} + +#ifdef LOSCFG_SHELL +//ڻȡϢ// +LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMuxInfoGet(UINT32 argc, const CHAR **argv) +{ + if (argc > 0) { + PRINTK("\nUsage: mutex\n"); + return OS_ERROR; + } + PRINTK("used mutexs information: \n"); + OsMutexCheck(); + return LOS_OK; +} +SHELLCMD_ENTRY(mutex_shellcmd, CMD_TYPE_EX, "mutex", 0, (CmdCallBackFunc)OsShellCmdMuxInfoGet); +#endif /* LOSCFG_SHELL */ +#endif /* LOSCFG_DEBUG_MUTEX */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ diff --git a/src/debug/los_queue_debug.c b/src/debug/los_queue_debug.c new file mode 100644 index 0000000..43ba6ad --- /dev/null +++ b/src/debug/los_queue_debug.c @@ -0,0 +1,206 @@ +/* ---------------------------------------------------------------------------- + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. + * Description: Queue Debug + * Author: Huawei LiteOS Team + * Create: 2013-01-01 + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * --------------------------------------------------------------------------- */ + +#include "los_queue_debug_pri.h" +#include "los_misc_pri.h" +#ifdef LOSCFG_SHELL +#include "shcmd.h" +#endif /* LOSCFG_SHELL */ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#ifdef LOSCFG_DEBUG_QUEUE //ڱеĵϢ// +typedef struct { + TSK_ENTRY_FUNC creator; /* The task entry who created this queue */ + UINT64 lastAccessTime; /* The last access time */ +} QueueDebugCB; +STATIC QueueDebugCB *g_queueDebugArray = NULL; + +//ڱȽ϶еԪֵ// +STATIC BOOL QueueCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) +{ + return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > + *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); +} + +UINT32 OsQueueDbgInit(VOID) //ڳʼеĵϢ// +{ + UINT32 size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(QueueDebugCB); + + /* system resident memory, don't free */ + g_queueDebugArray = (QueueDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); + if (g_queueDebugArray == NULL) { + PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); + return LOS_NOK; + } + (VOID)memset_s(g_queueDebugArray, size, 0, size); + return LOS_OK; +} + +VOID OsQueueDbgTimeUpdate(UINT32 queueId) //ڸ¶еʱ// +{ + QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; + queueDebug->lastAccessTime = LOS_TickCountGet(); + return; +} + +VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry) //ڸ¶еĵϢ// +{ + QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; + queueDebug->creator = entry; + queueDebug->lastAccessTime = LOS_TickCountGet(); + return; +} + +STATIC INLINE VOID OsQueueInfoOutPut(const LosQueueCB *node) //еϢ// +{ + PRINTK("Queue ID <0x%x> may leak, queue len is 0x%x, " + "readable cnt:0x%x, writeable cnt:0x%x, ", + node->queueId, + node->queueLen, + node->readWriteableCnt[OS_QUEUE_READ], + node->readWriteableCnt[OS_QUEUE_WRITE]); +} + +STATIC INLINE VOID OsQueueOpsOutput(const QueueDebugCB *node) //вϢ// +{ + PRINTK("TaskEntry of creator:0x%p, Latest operation time: 0x%llx\n", + node->creator, node->lastAccessTime); +} + +STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) //ڶԶӦĶϢ// +{ + LosQueueCB queueNode = {0}; + QueueDebugCB queueDebugNode = {0}; + UINT32 index, intSave; + SortParam queueSortParam; + queueSortParam.buf = (CHAR *)g_queueDebugArray; + queueSortParam.ctrlBlockSize = sizeof(QueueDebugCB); + queueSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_QUEUE_LIMIT; + queueSortParam.sortElemOff = LOS_OFF_SET_OF(QueueDebugCB, lastAccessTime); + + if (count > 0) { + SCHEDULER_LOCK(intSave); + OsArraySort(indexArray, 0, count - 1, &queueSortParam, QueueCompareValue); + SCHEDULER_UNLOCK(intSave); + for (index = 0; index < count; index++) { + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(&queueNode, sizeof(LosQueueCB), + GET_QUEUE_HANDLE(indexArray[index]), sizeof(LosQueueCB)); + (VOID)memcpy_s(&queueDebugNode, sizeof(QueueDebugCB), + &g_queueDebugArray[indexArray[index]], sizeof(QueueDebugCB)); + SCHEDULER_UNLOCK(intSave); + if (queueNode.queueState == LOS_UNUSED) { + continue; + } + OsQueueInfoOutPut(&queueNode); + OsQueueOpsOutput(&queueDebugNode); + } + } + (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); +} + +VOID OsQueueCheck(VOID) //ڼе״̬ӦϢ// +{ + LosQueueCB queueNode = {0}; + QueueDebugCB queueDebugNode = {0}; + UINT32 index, intSave; + UINT32 count = 0; + + /* + * This return value does not need to be judged immediately, + * and the following code logic has already distinguished the return value from null and non-empty, + * and there is no case of accessing the null pointer. + */ + UINT32 *indexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(UINT32)); + + for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) { + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(&queueNode, sizeof(LosQueueCB), + GET_QUEUE_HANDLE(index), sizeof(LosQueueCB)); + (VOID)memcpy_s(&queueDebugNode, sizeof(QueueDebugCB), + &g_queueDebugArray[index], sizeof(QueueDebugCB)); + SCHEDULER_UNLOCK(intSave); + if ((queueNode.queueState == LOS_UNUSED) || + ((queueNode.queueState == LOS_USED) && (queueDebugNode.creator == NULL))) { + continue; + } + if ((queueNode.queueState == LOS_USED) && + (queueNode.queueLen == queueNode.readWriteableCnt[OS_QUEUE_WRITE]) && + LOS_ListEmpty(&queueNode.readWriteList[OS_QUEUE_READ]) && + LOS_ListEmpty(&queueNode.readWriteList[OS_QUEUE_WRITE]) && + LOS_ListEmpty(&queueNode.memList)) { + PRINTK("Queue ID <0x%x> may leak, No task uses it, " + "QueueLen is 0x%x, ", + queueNode.queueId, + queueNode.queueLen); + OsQueueOpsOutput(&queueDebugNode); + } else { + if (indexArray != NULL) { + *(indexArray + count) = index; + count++; + } else { + OsQueueInfoOutPut(&queueNode); + OsQueueOpsOutput(&queueDebugNode); + } + } + } + + if (indexArray != NULL) { + SortQueueIndexArray(indexArray, count); + } + + return; +} + +#ifdef LOSCFG_SHELL +//û "queue" ʱʹöеϢ// +LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdQueueInfoGet(UINT32 argc, const CHAR **argv) +{ + if (argc > 0) { + PRINTK("\nUsage: queue\n"); + return OS_ERROR; + } + PRINTK("used queues information: \n"); + OsQueueCheck(); + return LOS_OK; +} + +SHELLCMD_ENTRY(queue_shellcmd, CMD_TYPE_EX, "queue", 0, (CmdCallBackFunc)OsShellCmdQueueInfoGet); +#endif /* LOSCFG_SHELL */ +#endif /* LOSCFG_DEBUG_QUEUE */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ diff --git a/src/debug/los_sched_debug.c b/src/debug/los_sched_debug.c new file mode 100644 index 0000000..ec4a78b --- /dev/null +++ b/src/debug/los_sched_debug.c @@ -0,0 +1,347 @@ +/* ---------------------------------------------------------------------------- + * Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved. + * Description: Schedule Statistics + * Author: Huawei LiteOS Team + * Create: 2018-11-16 + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * --------------------------------------------------------------------------- */ + +#include "los_task_pri.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#ifdef LOSCFG_DEBUG_SCHED_STATISTICS +#define HIGHTASKPRI 16 +#define NS_PER_MS 1000000 +#define DECIMAL_TO_PERCENTAGE 100 + +typedef struct { + UINT64 idleRuntime; //ʱ// + UINT64 idleStarttime; //ʱ// + UINT64 highTaskRuntime; //ȼʱ// + UINT64 highTaskStarttime; //ȼʱ// + UINT64 sumPriority; //ȼ֮// + UINT32 prioritySwitch; //л// + UINT32 highTaskSwitch; //ȼл// + UINT32 contexSwitch; //л// + UINT32 hwiNum; //Ӳжϴ// +#ifdef LOSCFG_KERNEL_SMP + UINT32 ipiIrqNum; //жϴڶ¶壩// +#endif +} StatPercpu; + +STATIC BOOL g_statisticsStartFlag = FALSE; +STATIC UINT64 g_statisticsStartTime; +STATIC StatPercpu g_statPercpu[LOSCFG_KERNEL_CORE_NUM]; + +//ÿ CPU Ͻеͳ// +STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *newTask) +{ + UINT32 cpuId; + UINT32 idleTaskId; + UINT64 now, runtime; + + if (g_statisticsStartFlag != TRUE) { + return; + } + + cpuId = ArchCurrCpuid(); + idleTaskId = OsGetIdleTaskId(); + now = LOS_CurrNanosec(); + + g_statPercpu[cpuId].contexSwitch++; + + if ((runTask->taskId != idleTaskId) && (newTask->taskId == idleTaskId)) { + g_statPercpu[cpuId].idleStarttime = now; + } + + if ((runTask->taskId == idleTaskId) && (newTask->taskId != idleTaskId)) { + runtime = now - g_statPercpu[cpuId].idleStarttime; + g_statPercpu[cpuId].idleRuntime += runtime; + g_statPercpu[cpuId].idleStarttime = 0; + } + + if ((runTask->priority >= HIGHTASKPRI) && (newTask->priority < HIGHTASKPRI)) { + g_statPercpu[cpuId].highTaskStarttime = now; + } + + if ((runTask->priority < HIGHTASKPRI) && (newTask->priority >= HIGHTASKPRI)) { + runtime = now - g_statPercpu[cpuId].highTaskStarttime; + g_statPercpu[cpuId].highTaskRuntime += runtime; + g_statPercpu[cpuId].highTaskStarttime = 0; + } + + if (newTask->priority < HIGHTASKPRI) { + g_statPercpu[cpuId].highTaskSwitch++; + } + + if (newTask->taskId != idleTaskId) { + g_statPercpu[cpuId].sumPriority += newTask->priority; + g_statPercpu[cpuId].prioritySwitch++; + } + + return; +} + +//ڸµͳϢ// +LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *newTask) +{ + UINT64 runtime; + UINT32 cpuId = ArchCurrCpuid(); + UINT64 now = LOS_CurrNanosec(); + + SchedStat *schedRun = &runTask->schedStat; + SchedStat *schedNew = &newTask->schedStat; + SchedPercpu *cpuRun = &schedRun->schedPercpu[cpuId]; + SchedPercpu *cpuNew = &schedNew->schedPercpu[cpuId]; + + /* calculate one chance of running time */ + runtime = now - schedRun->startRuntime; + + /* add running timer to running task statistics */ + cpuRun->runtime += runtime; + schedRun->allRuntime += runtime; + + /* add context switch counters and schedule start time */ + cpuNew->contexSwitch++; + schedNew->allContextSwitch++; + schedNew->startRuntime = now; + OsSchedStatisticsPerCpu(runTask, newTask); +} + +LITE_OS_SEC_TEXT_MINOR VOID OsHwiStatistics(size_t intNum) //ڸӲжϵͳϢ// +{ + UINT32 cpuId = ArchCurrCpuid(); + + if ((g_statisticsStartFlag != TRUE) || (intNum == OS_TICK_INT_NUM)) { + return; + } + + g_statPercpu[cpuId].hwiNum++; +#ifdef LOSCFG_KERNEL_SMP + /* 16: 0~15 is ipi interrupts */ + if (intNum < 16) { + g_statPercpu[cpuId].ipiIrqNum++; + } +#endif + return; +} + +LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) //ڴӡĵͳϢ// +{ + LosTaskCB *taskCB = NULL; + UINT32 loop; + UINT32 cpuId; +#ifdef LOSCFG_KERNEL_SMP + UINT32 affinity; +#endif + + PRINTK("\n"); + PRINTK("Task TID Total Time Total CST " + "CPU Time CST\n"); + PRINTK("---- --- ------------------ ---------- -" + "--- ------------------ ----------\n"); + + for (loop = 0; loop < g_taskMaxNum; loop++) { + taskCB = (((LosTaskCB *)g_taskCBArray) + loop); + if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { + continue; + } +#ifdef LOSCFG_KERNEL_SMP + affinity = (UINT32)taskCB->cpuAffiMask; +#endif + PRINTK("%-30s0x%-6x%+16lf ms %10u\n", taskCB->taskName, taskCB->taskId, + (DOUBLE)(taskCB->schedStat.allRuntime) / NS_PER_MS, + taskCB->schedStat.allContextSwitch); + + for (cpuId = 0; cpuId < LOSCFG_KERNEL_CORE_NUM; cpuId++) { +#ifdef LOSCFG_KERNEL_SMP + if (!((1U << cpuId) & affinity)) { + continue; + } +#endif + PRINTK(" " + "CPU%u %+16lf ms %12u\n", cpuId, + (DOUBLE)(taskCB->schedStat.schedPercpu[cpuId].runtime) / NS_PER_MS, + taskCB->schedStat.schedPercpu[cpuId].contexSwitch); + } + } + + PRINTK("\n"); +} + +LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) //ʾϵͳͳϢ// +{ + UINT32 cpuId; + PRINTK("\n"); + PRINTK("Passed Time: %+16lf ms\n", ((DOUBLE)statisticsPastTime / NS_PER_MS)); + PRINTK("--------------------------------\n"); + PRINTK("CPU Idle(%%) ContexSwitch HwiNum " + "Avg Pri HiTask(%%) HiTask SwiNum HiTask P(ms)" +#ifdef LOSCFG_KERNEL_SMP + " MP Hwi\n"); +#else + "\n"); +#endif + PRINTK("---- --------- ----------- -------- --------- " + "---------- ------------ ----------" +#ifdef LOSCFG_KERNEL_SMP + " ------\n"); +#else + "\n"); +#endif + + for (cpuId = 0; cpuId < LOSCFG_KERNEL_CORE_NUM; cpuId++) { +#ifdef LOSCFG_KERNEL_SMP + PRINTK("CPU%u %+10lf%14u%14u %+11lf %+11lf%14u %+11lf %11u\n", cpuId, +#else + PRINTK("CPU%u %+10lf%14u%14u %+11lf %+11lf%14u %+11lf\n", cpuId, +#endif + ((DOUBLE)(g_statPercpu[cpuId].idleRuntime) / statisticsPastTime) * DECIMAL_TO_PERCENTAGE, + g_statPercpu[cpuId].contexSwitch, + g_statPercpu[cpuId].hwiNum, + (g_statPercpu[cpuId].prioritySwitch == 0) ? OS_TASK_PRIORITY_LOWEST : + ((DOUBLE)(g_statPercpu[cpuId].sumPriority) / (g_statPercpu[cpuId].prioritySwitch)), + ((DOUBLE)(g_statPercpu[cpuId].highTaskRuntime) / statisticsPastTime) * DECIMAL_TO_PERCENTAGE, + g_statPercpu[cpuId].highTaskSwitch, + (g_statPercpu[cpuId].highTaskSwitch == 0) ? 0 : + ((DOUBLE)(g_statPercpu[cpuId].highTaskRuntime) / (g_statPercpu[cpuId].highTaskSwitch)) / NS_PER_MS +#ifdef LOSCFG_KERNEL_SMP + , g_statPercpu[cpuId].ipiIrqNum); +#else + ); +#endif + } + + PRINTK("\n"); +} + +LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) //ڶϵͳͳƹ// +{ + LosTaskCB *taskCB = NULL; + UINT32 loop; + UINT32 cpuId = 0; + UINT32 intSave; + + SCHEDULER_LOCK(intSave); + + if (g_statisticsStartFlag) { + SCHEDULER_UNLOCK(intSave); + PRINT_WARN("mp static has started\n"); + return; + } + + g_statisticsStartTime = LOS_CurrNanosec(); + + for (loop = 0; loop < g_taskMaxNum; loop++) { + taskCB = (((LosTaskCB *)g_taskCBArray) + loop); + if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { +#ifdef LOSCFG_KERNEL_SMP + cpuId = taskCB->currCpu; +#endif + if ((UINT32)(OS_TASK_INVALID_CPUID) == cpuId) { + continue; + } + if (!strcmp(taskCB->taskName, "IdleCore000")) { + g_statPercpu[cpuId].idleStarttime = g_statisticsStartTime; + } + if (taskCB->priority < HIGHTASKPRI) { + g_statPercpu[cpuId].highTaskStarttime = g_statisticsStartTime; + g_statPercpu[cpuId].highTaskSwitch++; + } + if (strcmp(taskCB->taskName, "IdleCore000")) { + g_statPercpu[cpuId].sumPriority += taskCB->priority; + g_statPercpu[cpuId].prioritySwitch++; + } + } + } + g_statisticsStartFlag = TRUE; + SCHEDULER_UNLOCK(intSave); + + PRINTK("mp static start\n"); + + return; +} + +//ڶϵͳֹͣͳƹܣͳݵĴչʾ// +LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStop(VOID) +{ + LosTaskCB *taskCB = NULL; + UINT32 loop; + UINT32 cpuId = 0; + UINT64 statisticsStopTime; + UINT64 statisticsPastTime; + UINT64 runtime; + UINT32 intSave; + + SCHEDULER_LOCK(intSave); + + if (g_statisticsStartFlag != TRUE) { + SCHEDULER_UNLOCK(intSave); + PRINT_WARN("Please set mp static start\n"); + return; + } + + g_statisticsStartFlag = FALSE; + statisticsStopTime = LOS_CurrNanosec(); + statisticsPastTime = statisticsStopTime - g_statisticsStartTime; + + for (loop = 0; loop < g_taskMaxNum; loop++) { + taskCB = (((LosTaskCB *)g_taskCBArray) + loop); + if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { +#ifdef LOSCFG_KERNEL_SMP + cpuId = taskCB->currCpu; +#endif + if (cpuId == (UINT32)(OS_TASK_INVALID_CPUID)) { + continue; + } + if (!strcmp(taskCB->taskName, "IdleCore000")) { + runtime = statisticsStopTime - g_statPercpu[cpuId].idleStarttime; + g_statPercpu[cpuId].idleRuntime += runtime; + g_statPercpu[cpuId].idleStarttime = 0; + } + if (taskCB->priority < HIGHTASKPRI) { + runtime = statisticsStopTime - g_statPercpu[cpuId].highTaskStarttime; + g_statPercpu[cpuId].highTaskRuntime += runtime; + g_statPercpu[cpuId].highTaskStarttime = 0; + } + } + } + SCHEDULER_UNLOCK(intSave); + OsStatisticsShow(statisticsPastTime); + + (VOID)memset_s(g_statPercpu, sizeof(g_statPercpu), 0, sizeof(g_statPercpu)); + g_statisticsStartTime = 0; + return; +} +#endif + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ diff --git a/src/debug/los_sem_debug.c b/src/debug/los_sem_debug.c new file mode 100644 index 0000000..8f1774b --- /dev/null +++ b/src/debug/los_sem_debug.c @@ -0,0 +1,299 @@ +/* ---------------------------------------------------------------------------- + * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. + * Description: Sem Debug + * Author: Huawei LiteOS Team + * Create: 2013-01-01 + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * --------------------------------------------------------------------------- */ + +#include "los_sem_debug_pri.h" +#include "stdlib.h" +#include "los_typedef.h" +#include "los_task_pri.h" +#include "los_misc_pri.h" +#ifdef LOSCFG_SHELL +#include "shcmd.h" +#endif /* LOSCFG_SHELL */ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#ifdef LOSCFG_DEBUG_SEMAPHORE +#define OS_ALL_SEM_MASK 0xffffffff + +STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) //ڴӡȴijźб// +{ + LosTaskCB *tskCB = NULL; + CHAR *nameArr[LOSCFG_BASE_CORE_TSK_LIMIT] = {0}; + UINT32 i, intSave; + UINT32 num = 0; + + SCHEDULER_LOCK(intSave); + if ((semNode->semStat == LOS_UNUSED) || (LOS_ListEmpty(&semNode->semList))) { + SCHEDULER_UNLOCK(intSave); + return; + } + + LOS_DL_LIST_FOR_EACH_ENTRY(tskCB, &semNode->semList, LosTaskCB, pendList) { + nameArr[num++] = tskCB->taskName; + if (num == LOSCFG_BASE_CORE_TSK_LIMIT) { + break; + } + } + SCHEDULER_UNLOCK(intSave); + + PRINTK("Pended task list : "); + for (i = 0; i < num; i++) { + if (i == 0) { + PRINTK("%s\n", nameArr[i]); + } else { + PRINTK(", %s", nameArr[i]); + } + } + PRINTK("\n"); +} + +typedef struct { //ڼ¼źĵϢ// + UINT16 origSemCount; /* Number of original available semaphores */ + UINT64 lastAccessTime; /* The last operation time */ + TSK_ENTRY_FUNC creator; /* The task entry who created this sem */ +} SemDebugCB; +STATIC SemDebugCB *g_semDebugArray = NULL; //ڴ洢źĵϢ// + +//ڱȽԪصֵ// +STATIC BOOL SemCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) +{ + return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > + *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); +} + +UINT32 OsSemDbgInit(VOID) //ڳʼźĵϢ// +{ + UINT32 size = LOSCFG_BASE_IPC_SEM_LIMIT * sizeof(SemDebugCB); + /* system resident memory, don't free */ + g_semDebugArray = (SemDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); + if (g_semDebugArray == NULL) { + PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); + return LOS_NOK; + } + (VOID)memset_s(g_semDebugArray, size, 0, size); + return LOS_OK; +} + +VOID OsSemDbgTimeUpdate(UINT32 semId) //ڸָźһηʱ// +{ + SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; + semDebug->lastAccessTime = LOS_TickCountGet(); + return; +} + +VOID OsSemDbgUpdate(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) //ڸָźĵϢ// +{ + SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; + semDebug->creator = creator; + semDebug->lastAccessTime = LOS_TickCountGet(); + semDebug->origSemCount = count; + return; +} + +/*ڰźʱԵǰʹõź*/ +/*ӡÿźĵϢ͵ȴź*/ +STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount) +{ + UINT32 i, intSave; + LosSemCB *semCB = NULL; + LosSemCB semNode = {0}; + SemDebugCB semDebug = {0}; + SortParam semSortParam; + semSortParam.buf = (CHAR *)g_semDebugArray; + semSortParam.ctrlBlockSize = sizeof(SemDebugCB); + semSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_SEM_LIMIT; + semSortParam.sortElemOff = LOS_OFF_SET_OF(SemDebugCB, lastAccessTime); + + /* It will Print out ALL the Used Semaphore List. */ + PRINTK("Used Semaphore List: \n"); + PRINTK("\r\n SemID Count OriginalCount Creater(TaskEntry) LastAccessTime\n"); + PRINTK(" ------ ------ ------------- ------------------ -------------- \n"); + + SCHEDULER_LOCK(intSave); + OsArraySort(semIndexArray, 0, usedCount - 1, &semSortParam, SemCompareValue); + SCHEDULER_UNLOCK(intSave); + for (i = 0; i < usedCount; i++) { + semCB = GET_SEM(semIndexArray[i]); + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); + (VOID)memcpy_s(&semDebug, sizeof(SemDebugCB), &g_semDebugArray[semIndexArray[i]], sizeof(SemDebugCB)); + SCHEDULER_UNLOCK(intSave); + if ((semNode.semStat != LOS_USED) || (semDebug.creator == NULL)) { + continue; + } + PRINTK(" 0x%-07x0x%-07u0x%-14u%-22p0x%llx\n", semNode.semId, semDebug.origSemCount, + semNode.semCount, semDebug.creator, semDebug.lastAccessTime); + if (!LOS_ListEmpty(&semNode.semList)) { + OsSemPendedTaskNamePrint(semCB); + } + } +} +/*ڻȡǰʹõźϢźʱź*/ +UINT32 OsSemInfoGetFullData(VOID) +{ + UINT32 usedSemCnt = 0; + LosSemCB *semNode = NULL; + SemDebugCB *semDebug = NULL; + UINT32 i; + UINT32 *semIndexArray = NULL; + UINT32 count, intSave; + + SCHEDULER_LOCK(intSave); + /* Get the used semaphore count. */ + for (i = 0; i < LOSCFG_BASE_IPC_SEM_LIMIT; i++) { + semNode = GET_SEM(i); + semDebug = &g_semDebugArray[i]; + if ((semNode->semStat == LOS_USED) && (semDebug->creator != NULL)) { + usedSemCnt++; + } + } + SCHEDULER_UNLOCK(intSave); + + if (usedSemCnt > 0) { + semIndexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, usedSemCnt * sizeof(UINT32)); + if (semIndexArray == NULL) { + PRINTK("LOS_MemAlloc failed in %s \n", __func__); + return LOS_NOK; + } + + /* Fill the semIndexArray with the real index. */ + count = 0; + + SCHEDULER_LOCK(intSave); + for (i = 0; i < LOSCFG_BASE_IPC_SEM_LIMIT; i++) { + semNode = GET_SEM(i); + semDebug = &g_semDebugArray[i]; + if ((semNode->semStat != LOS_USED) || (semDebug->creator == NULL)) { + continue; + } + *(semIndexArray + count) = i; + count++; + /* if the count is touched usedSemCnt break. */ + if (count >= usedSemCnt) { + break; + } + } + SCHEDULER_UNLOCK(intSave); + OsSemSort(semIndexArray, count); + + /* free the index array. */ + (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, semIndexArray); + } + return LOS_OK; +} + +#ifdef LOSCFG_SHELL +STATIC UINT32 OsSemInfoOutput(size_t semId) //źϢ// +{ + UINT32 loop, semCnt, intSave; + LosSemCB *semCB = NULL; + LosSemCB semNode = {0}; + + if (semId == OS_ALL_SEM_MASK) { + for (loop = 0, semCnt = 0; loop < LOSCFG_BASE_IPC_SEM_LIMIT; loop++) { + semCB = GET_SEM(loop); + SCHEDULER_LOCK(intSave); + if (semCB->semStat == LOS_USED) { + (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); + SCHEDULER_UNLOCK(intSave); + semCnt++; + PRINTK("\r\n SemID Count\n ---------- -----\n"); + PRINTK(" 0x%08x %u\n", semNode.semId, semNode.semCount); + continue; + } + SCHEDULER_UNLOCK(intSave); + } + PRINTK(" SemUsingNum : %u\n\n", semCnt); + return LOS_OK; + } else { + semCB = GET_SEM(semId); + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); + SCHEDULER_UNLOCK(intSave); + if ((semNode.semId != semId) || (semNode.semStat != LOS_USED)) { + PRINTK("\nThe semaphore is not in use!\n"); + return LOS_OK; + } + + PRINTK("\r\n SemID Count\n ---------- -----\n"); + PRINTK(" 0x%08x 0x%u\n", semNode.semId, semNode.semCount); + + if (LOS_ListEmpty(&semNode.semList)) { + PRINTK("No task is pended on this semaphore!\n"); + return LOS_OK; + } else { + OsSemPendedTaskNamePrint(semCB); + } + } + return LOS_OK; +} + +//ڻȡźϢ// +LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSemInfoGet(UINT32 argc, const CHAR **argv) +{ + size_t semId; + CHAR *endPtr = NULL; + UINT32 ret; + + if (argc > 1) { + PRINTK("\nUsage: sem [fulldata|ID]\n"); + return OS_ERROR; + } + + if (argc == 0) { + semId = OS_ALL_SEM_MASK; + } else { + if (strcmp(argv[0], "fulldata") == 0) { + ret = OsSemInfoGetFullData(); + return ret; + } + + semId = strtoul(argv[0], &endPtr, 0); + if ((*endPtr != 0) || (GET_SEM_INDEX(semId) >= LOSCFG_BASE_IPC_SEM_LIMIT)) { + PRINTK("\nsem ID can't access %s.\n", argv[0]); + return OS_ERROR; + } + } + + ret = OsSemInfoOutput(semId); + return ret; +} + +SHELLCMD_ENTRY(sem_shellcmd, CMD_TYPE_EX, "sem", 1, (CmdCallBackFunc)OsShellCmdSemInfoGet); +#endif /* LOSCFG_SHELL */ +#endif /* LOSCFG_DEBUG_SEMAPHORE */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ -- 2.34.1 From 546f123087de541a40fafc7dbfc1de4c41e12bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Mon, 22 Jan 2024 08:29:27 +0800 Subject: [PATCH 3/8] zhangxinyuan --- doc/用例描述_张鑫源.docx | Bin 0 -> 15374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/用例描述_张鑫源.docx diff --git a/doc/用例描述_张鑫源.docx b/doc/用例描述_张鑫源.docx new file mode 100644 index 0000000000000000000000000000000000000000..84326a775a658c89bed0fa8736f555d4a3dc585a GIT binary patch literal 15374 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 j-{boJYIXCUz`vsW0h#em0 literal 0 HcmV?d00001 -- 2.34.1 From ed0a4b9db01d8ec0393a9a0cbf390d2053526dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Mon, 22 Jan 2024 22:26:10 +0800 Subject: [PATCH 4/8] wenhao --- doc/文豪泛读报告.docx | Bin 0 -> 38391 bytes doc/用例描述_张鑫源.docx | Bin 15374 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/文豪泛读报告.docx delete mode 100644 doc/用例描述_张鑫源.docx diff --git a/doc/文豪泛读报告.docx b/doc/文豪泛读报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..6625bd670f355e66f10b465cdd71ed5d663c899b GIT binary patch literal 38391 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 auNy8jSLIF|vVa)kKrdpz)U2;_8vQTX!fp@% literal 0 HcmV?d00001 diff --git a/doc/用例描述_张鑫源.docx b/doc/用例描述_张鑫源.docx deleted file mode 100644 index 84326a775a658c89bed0fa8736f555d4a3dc585a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15374 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 j-{boJYIXCUz`vsW0h#em0 -- 2.34.1 From 99a8d906ff98e89ca113b61010b79f55ee469c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Mon, 22 Jan 2024 22:37:20 +0800 Subject: [PATCH 5/8] wenhao --- doc/文豪泛读报告.docx | Bin 38391 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/文豪泛读报告.docx diff --git a/doc/文豪泛读报告.docx b/doc/文豪泛读报告.docx deleted file mode 100644 index 6625bd670f355e66f10b465cdd71ed5d663c899b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38391 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 auNy8jSLIF|vVa)kKrdpz)U2;_8vQTX!fp@% -- 2.34.1 From 9241837ea7b33cda0fd7d1fa2ad10775dc88aff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Tue, 23 Jan 2024 00:05:43 +0800 Subject: [PATCH 6/8] wenhao --- src/kernel/base/debug/los_mux_deadlock.c | 31 ++++++++++++------------ src/kernel/base/debug/los_mux_debug.c | 13 ++++++---- src/kernel/base/debug/los_queue_debug.c | 18 ++++++++------ src/kernel/base/debug/los_sched_debug.c | 31 +++++++++++++----------- src/kernel/base/debug/los_sem_debug.c | 22 ++++++++++------- 5 files changed, 64 insertions(+), 51 deletions(-) diff --git a/src/kernel/base/debug/los_mux_deadlock.c b/src/kernel/base/debug/los_mux_deadlock.c index fa71774..6862541 100644 --- a/src/kernel/base/debug/los_mux_deadlock.c +++ b/src/kernel/base/debug/los_mux_deadlock.c @@ -38,16 +38,17 @@ #if __cplusplus extern "C" { #endif -#endif /* __cplusplus */ +#endif /* __cplusplus */nbb typedef struct { - LOS_DL_LIST muxListHead; /* Task-held mutexs list */ - UINT64 lastAccessTime; /* The last operation time */ + LOS_DL_LIST muxListHead; /* Task-held mutexs list */ //ڹеĻб// + UINT64 lastAccessTime; /* The last operation time */ //¼һβʱ// } MuxDLinkCB; +/*еĻб͸*/ typedef struct { - LOS_DL_LIST muxList; /* Insert mutex into the owner task CB */ - VOID *muxCB; /* The Mutex CB pointer */ + LOS_DL_LIST muxList; /* Insert mutex into the owner task CB */ //ڽ뵽Ŀƿ// + VOID *muxCB; /* The Mutex CB pointer */ //ָ򻥳ƿָ// } MuxDLinkNode; STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL; @@ -57,9 +58,9 @@ STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL; * that has not been scheduled within this time. * The unit is tick. */ -#define OS_MUX_DEADLOCK_CHECK_THRESHOLD 60000 +#define OS_MUX_DEADLOCK_CHECK_THRESHOLD 60000 //μ黥֮СʱλΪ// -UINT32 OsMuxDlockCheckInit(VOID) +UINT32 OsMuxDlockCheckInit(VOID) //ڷڴ沢ʼƿб// { UINT32 index; UINT32 size = (LOSCFG_BASE_CORE_TSK_LIMIT + 1) * sizeof(MuxDLinkCB); @@ -78,7 +79,7 @@ UINT32 OsMuxDlockCheckInit(VOID) return LOS_OK; } -VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) +VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) //ָĻвһڵ// { MuxDLinkNode *muxDLNode = NULL; @@ -96,7 +97,7 @@ VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) LOS_ListTailInsert(&g_muxDeadlockCBArray[taskId].muxListHead, &muxDLNode->muxList); } -VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB) +VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB) //ڴָĻɾָĻڵ// { MuxDLinkCB *muxDLCB = NULL; LOS_DL_LIST *list = NULL; @@ -117,7 +118,7 @@ VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB) } } -VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount) +VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount) //ڸʱ// { if (taskId > LOSCFG_BASE_CORE_TSK_LIMIT) { return; @@ -126,7 +127,7 @@ VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount) g_muxDeadlockCBArray[taskId].lastAccessTime = tickCount; } -STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) +STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) //ڴӡĺջϢ// { TaskContext *context = NULL; @@ -137,7 +138,7 @@ STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) return; } -STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) +STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) //ڴӡȴбϢ// { LOS_DL_LIST *listTmp = NULL; LosTaskCB *pendedTask = NULL; @@ -168,7 +169,7 @@ STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) SCHEDULER_UNLOCK(intSave); } -STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) +STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) //ڴӡеĻϢ// { UINT32 index = 0; MuxDLinkNode *muxDLNode = NULL; @@ -204,7 +205,7 @@ STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) } } -VOID OsMutexDlockCheck(VOID) +VOID OsMutexDlockCheck(VOID) //ڼ⻥Ϣ// { UINT32 loop, intSave; UINT32 taskId; @@ -234,7 +235,7 @@ VOID OsMutexDlockCheck(VOID) SCHEDULER_UNLOCK(intSave); } -#ifdef LOSCFG_SHELL +#ifdef LOSCFG_SHELL //ִл鲢Ϣ// UINT32 OsShellCmdMuxDeadlockCheck(UINT32 argc, const CHAR **argv) { if (argc > 0) { diff --git a/src/kernel/base/debug/los_mux_debug.c b/src/kernel/base/debug/los_mux_debug.c index 9ac8f6d..5008bc5 100644 --- a/src/kernel/base/debug/los_mux_debug.c +++ b/src/kernel/base/debug/los_mux_debug.c @@ -41,20 +41,21 @@ extern "C" { #endif #endif /* __cplusplus */ -#ifdef LOSCFG_DEBUG_MUTEX +#ifdef LOSCFG_DEBUG_MUTEX //ڱʾĵϢ// typedef struct { TSK_ENTRY_FUNC creator; /* The task entry who created this mutex */ UINT64 lastAccessTime; /* The last access time */ } MuxDebugCB; STATIC MuxDebugCB *g_muxDebugArray = NULL; +//ڱȽϢʱ// STATIC BOOL MuxCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) { return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); } -UINT32 OsMuxDbgInit(VOID) +UINT32 OsMuxDbgInit(VOID) //ڳʼϢ// { UINT32 size = LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(MuxDebugCB); /* system resident memory, don't free */ @@ -67,19 +68,20 @@ UINT32 OsMuxDbgInit(VOID) return LOS_OK; } -VOID OsMuxDbgTimeUpdate(UINT32 muxId) +VOID OsMuxDbgTimeUpdate(UINT32 muxId) //ڸָʱ// { MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; muxDebug->lastAccessTime = LOS_TickCountGet(); } -VOID OsMuxDbgUpdate(UINT32 muxId, TSK_ENTRY_FUNC creator) +VOID OsMuxDbgUpdate(UINT32 muxId, TSK_ENTRY_FUNC creator) //ڸָĴߺʱ// { MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; muxDebug->creator = creator; muxDebug->lastAccessTime = LOS_TickCountGet(); } +//ڶԻ򣬲ܴڵĻй©// STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count) { LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; @@ -119,7 +121,7 @@ STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count) (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); } -VOID OsMutexCheck(VOID) +VOID OsMutexCheck(VOID) //ڼ黥״̬ԿܴڵĻй©д// { LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; MuxDebugCB muxDebugNode = {0}; @@ -165,6 +167,7 @@ VOID OsMutexCheck(VOID) } #ifdef LOSCFG_SHELL +//ڻȡϢ// LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMuxInfoGet(UINT32 argc, const CHAR **argv) { if (argc > 0) { diff --git a/src/kernel/base/debug/los_queue_debug.c b/src/kernel/base/debug/los_queue_debug.c index fdd1f18..43ba6ad 100644 --- a/src/kernel/base/debug/los_queue_debug.c +++ b/src/kernel/base/debug/los_queue_debug.c @@ -38,20 +38,21 @@ extern "C" { #endif #endif /* __cplusplus */ -#ifdef LOSCFG_DEBUG_QUEUE +#ifdef LOSCFG_DEBUG_QUEUE //ڱеĵϢ// typedef struct { TSK_ENTRY_FUNC creator; /* The task entry who created this queue */ UINT64 lastAccessTime; /* The last access time */ } QueueDebugCB; STATIC QueueDebugCB *g_queueDebugArray = NULL; +//ڱȽ϶еԪֵ// STATIC BOOL QueueCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) { return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); } -UINT32 OsQueueDbgInit(VOID) +UINT32 OsQueueDbgInit(VOID) //ڳʼеĵϢ// { UINT32 size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(QueueDebugCB); @@ -65,14 +66,14 @@ UINT32 OsQueueDbgInit(VOID) return LOS_OK; } -VOID OsQueueDbgTimeUpdate(UINT32 queueId) +VOID OsQueueDbgTimeUpdate(UINT32 queueId) //ڸ¶еʱ// { QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; queueDebug->lastAccessTime = LOS_TickCountGet(); return; } -VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry) +VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry) //ڸ¶еĵϢ// { QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; queueDebug->creator = entry; @@ -80,7 +81,7 @@ VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry) return; } -STATIC INLINE VOID OsQueueInfoOutPut(const LosQueueCB *node) +STATIC INLINE VOID OsQueueInfoOutPut(const LosQueueCB *node) //еϢ// { PRINTK("Queue ID <0x%x> may leak, queue len is 0x%x, " "readable cnt:0x%x, writeable cnt:0x%x, ", @@ -90,13 +91,13 @@ STATIC INLINE VOID OsQueueInfoOutPut(const LosQueueCB *node) node->readWriteableCnt[OS_QUEUE_WRITE]); } -STATIC INLINE VOID OsQueueOpsOutput(const QueueDebugCB *node) +STATIC INLINE VOID OsQueueOpsOutput(const QueueDebugCB *node) //вϢ// { PRINTK("TaskEntry of creator:0x%p, Latest operation time: 0x%llx\n", node->creator, node->lastAccessTime); } -STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) +STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) //ڶԶӦĶϢ// { LosQueueCB queueNode = {0}; QueueDebugCB queueDebugNode = {0}; @@ -128,7 +129,7 @@ STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); } -VOID OsQueueCheck(VOID) +VOID OsQueueCheck(VOID) //ڼе״̬ӦϢ// { LosQueueCB queueNode = {0}; QueueDebugCB queueDebugNode = {0}; @@ -182,6 +183,7 @@ VOID OsQueueCheck(VOID) } #ifdef LOSCFG_SHELL +//û "queue" ʱʹöеϢ// LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdQueueInfoGet(UINT32 argc, const CHAR **argv) { if (argc > 0) { diff --git a/src/kernel/base/debug/los_sched_debug.c b/src/kernel/base/debug/los_sched_debug.c index 6683fe7..ec4a78b 100644 --- a/src/kernel/base/debug/los_sched_debug.c +++ b/src/kernel/base/debug/los_sched_debug.c @@ -40,17 +40,17 @@ extern "C" { #define DECIMAL_TO_PERCENTAGE 100 typedef struct { - UINT64 idleRuntime; - UINT64 idleStarttime; - UINT64 highTaskRuntime; - UINT64 highTaskStarttime; - UINT64 sumPriority; - UINT32 prioritySwitch; - UINT32 highTaskSwitch; - UINT32 contexSwitch; - UINT32 hwiNum; + UINT64 idleRuntime; //ʱ// + UINT64 idleStarttime; //ʱ// + UINT64 highTaskRuntime; //ȼʱ// + UINT64 highTaskStarttime; //ȼʱ// + UINT64 sumPriority; //ȼ֮// + UINT32 prioritySwitch; //л// + UINT32 highTaskSwitch; //ȼл// + UINT32 contexSwitch; //л// + UINT32 hwiNum; //Ӳжϴ// #ifdef LOSCFG_KERNEL_SMP - UINT32 ipiIrqNum; + UINT32 ipiIrqNum; //жϴڶ¶壩// #endif } StatPercpu; @@ -58,6 +58,7 @@ STATIC BOOL g_statisticsStartFlag = FALSE; STATIC UINT64 g_statisticsStartTime; STATIC StatPercpu g_statPercpu[LOSCFG_KERNEL_CORE_NUM]; +//ÿ CPU Ͻеͳ// STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *newTask) { UINT32 cpuId; @@ -106,6 +107,7 @@ STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *n return; } +//ڸµͳϢ// LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *newTask) { UINT64 runtime; @@ -131,7 +133,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *new OsSchedStatisticsPerCpu(runTask, newTask); } -LITE_OS_SEC_TEXT_MINOR VOID OsHwiStatistics(size_t intNum) +LITE_OS_SEC_TEXT_MINOR VOID OsHwiStatistics(size_t intNum) //ڸӲжϵͳϢ// { UINT32 cpuId = ArchCurrCpuid(); @@ -149,7 +151,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsHwiStatistics(size_t intNum) return; } -LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) +LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) //ڴӡĵͳϢ// { LosTaskCB *taskCB = NULL; UINT32 loop; @@ -192,7 +194,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) PRINTK("\n"); } -LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) +LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) //ʾϵͳͳϢ// { UINT32 cpuId; PRINTK("\n"); @@ -238,7 +240,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) PRINTK("\n"); } -LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) +LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) //ڶϵͳͳƹ// { LosTaskCB *taskCB = NULL; UINT32 loop; @@ -285,6 +287,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) return; } +//ڶϵͳֹͣͳƹܣͳݵĴչʾ// LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStop(VOID) { LosTaskCB *taskCB = NULL; diff --git a/src/kernel/base/debug/los_sem_debug.c b/src/kernel/base/debug/los_sem_debug.c index 81ee7e7..8f1774b 100644 --- a/src/kernel/base/debug/los_sem_debug.c +++ b/src/kernel/base/debug/los_sem_debug.c @@ -44,7 +44,7 @@ extern "C" { #ifdef LOSCFG_DEBUG_SEMAPHORE #define OS_ALL_SEM_MASK 0xffffffff -STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) +STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) //ڴӡȴijźб// { LosTaskCB *tskCB = NULL; CHAR *nameArr[LOSCFG_BASE_CORE_TSK_LIMIT] = {0}; @@ -76,20 +76,21 @@ STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) PRINTK("\n"); } -typedef struct { +typedef struct { //ڼ¼źĵϢ// UINT16 origSemCount; /* Number of original available semaphores */ UINT64 lastAccessTime; /* The last operation time */ TSK_ENTRY_FUNC creator; /* The task entry who created this sem */ } SemDebugCB; -STATIC SemDebugCB *g_semDebugArray = NULL; +STATIC SemDebugCB *g_semDebugArray = NULL; //ڴ洢źĵϢ// +//ڱȽԪصֵ// STATIC BOOL SemCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) { return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); } -UINT32 OsSemDbgInit(VOID) +UINT32 OsSemDbgInit(VOID) //ڳʼźĵϢ// { UINT32 size = LOSCFG_BASE_IPC_SEM_LIMIT * sizeof(SemDebugCB); /* system resident memory, don't free */ @@ -102,14 +103,14 @@ UINT32 OsSemDbgInit(VOID) return LOS_OK; } -VOID OsSemDbgTimeUpdate(UINT32 semId) +VOID OsSemDbgTimeUpdate(UINT32 semId) //ڸָźһηʱ// { SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; semDebug->lastAccessTime = LOS_TickCountGet(); return; } -VOID OsSemDbgUpdate(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) +VOID OsSemDbgUpdate(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) //ڸָźĵϢ// { SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; semDebug->creator = creator; @@ -118,7 +119,9 @@ VOID OsSemDbgUpdate(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) return; } -STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount) +/*ڰźʱԵǰʹõź*/ +/*ӡÿźĵϢ͵ȴź*/ +STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount) { UINT32 i, intSave; LosSemCB *semCB = NULL; @@ -154,7 +157,7 @@ STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount) } } } - +/*ڻȡǰʹõźϢźʱź*/ UINT32 OsSemInfoGetFullData(VOID) { UINT32 usedSemCnt = 0; @@ -209,7 +212,7 @@ UINT32 OsSemInfoGetFullData(VOID) } #ifdef LOSCFG_SHELL -STATIC UINT32 OsSemInfoOutput(size_t semId) +STATIC UINT32 OsSemInfoOutput(size_t semId) //źϢ// { UINT32 loop, semCnt, intSave; LosSemCB *semCB = NULL; @@ -254,6 +257,7 @@ STATIC UINT32 OsSemInfoOutput(size_t semId) return LOS_OK; } +//ڻȡźϢ// LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSemInfoGet(UINT32 argc, const CHAR **argv) { size_t semId; -- 2.34.1 From 3e4cd4c158bc58cf66aea7779f4c5d6f4d498b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Tue, 23 Jan 2024 00:09:51 +0800 Subject: [PATCH 7/8] src --- doc/文豪-用例描述.docx | Bin 14105 -> 0 bytes doc/蔡伦_LiteOS阅读泛读报告.docx | 0 src/debug/los_mux_deadlock.c | 257 ----------------- src/debug/los_mux_debug.c | 189 ------------ src/debug/los_queue_debug.c | 206 -------------- src/debug/los_sched_debug.c | 347 ----------------------- src/debug/los_sem_debug.c | 299 ------------------- 7 files changed, 1298 deletions(-) delete mode 100644 doc/文豪-用例描述.docx delete mode 100644 doc/蔡伦_LiteOS阅读泛读报告.docx delete mode 100644 src/debug/los_mux_deadlock.c delete mode 100644 src/debug/los_mux_debug.c delete mode 100644 src/debug/los_queue_debug.c delete mode 100644 src/debug/los_sched_debug.c delete mode 100644 src/debug/los_sem_debug.c diff --git a/doc/文豪-用例描述.docx b/doc/文豪-用例描述.docx deleted file mode 100644 index a5be5e412a48256759719611f03b383b2d93be84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14105 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 diff --git a/doc/蔡伦_LiteOS阅读泛读报告.docx b/doc/蔡伦_LiteOS阅读泛读报告.docx deleted file mode 100644 index e69de29..0000000 diff --git a/src/debug/los_mux_deadlock.c b/src/debug/los_mux_deadlock.c deleted file mode 100644 index 6862541..0000000 --- a/src/debug/los_mux_deadlock.c +++ /dev/null @@ -1,257 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Mutex Deadlock Check - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_mux_debug_pri.h" -#include "los_typedef.h" -#include "los_task.h" -#include "arch/exception.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */nbb - -typedef struct { - LOS_DL_LIST muxListHead; /* Task-held mutexs list */ //ڹеĻб// - UINT64 lastAccessTime; /* The last operation time */ //¼һβʱ// -} MuxDLinkCB; - -/*еĻб͸*/ -typedef struct { - LOS_DL_LIST muxList; /* Insert mutex into the owner task CB */ //ڽ뵽Ŀƿ// - VOID *muxCB; /* The Mutex CB pointer */ //ָ򻥳ƿָ// -} MuxDLinkNode; - -STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL; - -/* - * Mutex deadlock detection time threshold, will print out task information - * that has not been scheduled within this time. - * The unit is tick. - */ -#define OS_MUX_DEADLOCK_CHECK_THRESHOLD 60000 //μ黥֮СʱλΪ// - -UINT32 OsMuxDlockCheckInit(VOID) //ڷڴ沢ʼƿб// -{ - UINT32 index; - UINT32 size = (LOSCFG_BASE_CORE_TSK_LIMIT + 1) * sizeof(MuxDLinkCB); - - /* system resident memory, don't free */ - g_muxDeadlockCBArray = (MuxDLinkCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_muxDeadlockCBArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - - for (index = 0; index < LOSCFG_BASE_CORE_TSK_LIMIT + 1; index++) { - g_muxDeadlockCBArray[index].lastAccessTime = 0; - LOS_ListInit(&g_muxDeadlockCBArray[index].muxListHead); - } - return LOS_OK; -} - -VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) //ָĻвһڵ// -{ - MuxDLinkNode *muxDLNode = NULL; - - if ((taskId > LOSCFG_BASE_CORE_TSK_LIMIT) || (muxCB == NULL)) { - return; - } - - muxDLNode = (MuxDLinkNode *)LOS_MemAlloc(m_aucSysMem1, sizeof(MuxDLinkNode)); - if (muxDLNode == NULL) { - return; - } - (VOID)memset_s(muxDLNode, sizeof(MuxDLinkNode), 0, sizeof(MuxDLinkNode)); - muxDLNode->muxCB = muxCB; - - LOS_ListTailInsert(&g_muxDeadlockCBArray[taskId].muxListHead, &muxDLNode->muxList); -} - -VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB) //ڴָĻɾָĻڵ// -{ - MuxDLinkCB *muxDLCB = NULL; - LOS_DL_LIST *list = NULL; - MuxDLinkNode *muxDLNode = NULL; - - if ((taskId > LOSCFG_BASE_CORE_TSK_LIMIT) || (muxCB == NULL)) { - return; - } - - muxDLCB = &g_muxDeadlockCBArray[taskId]; - LOS_DL_LIST_FOR_EACH(list, &muxDLCB->muxListHead) { - muxDLNode = LOS_DL_LIST_ENTRY(list, MuxDLinkNode, muxList); - if (muxDLNode->muxCB == muxCB) { - LOS_ListDelete(&muxDLNode->muxList); - (VOID)LOS_MemFree(m_aucSysMem1, muxDLNode); - return; - } - } -} - -VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount) //ڸʱ// -{ - if (taskId > LOSCFG_BASE_CORE_TSK_LIMIT) { - return; - } - - g_muxDeadlockCBArray[taskId].lastAccessTime = tickCount; -} - -STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) //ڴӡĺջϢ// -{ - TaskContext *context = NULL; - - PRINTK("*******backtrace begin*******\n"); - context = (TaskContext *)taskCB->stackPointer; - ArchBackTraceWithSp(context); - PRINTK("********backtrace end********\n"); - return; -} - -STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) //ڴӡȴбϢ// -{ - LOS_DL_LIST *listTmp = NULL; - LosTaskCB *pendedTask = NULL; - CHAR *name = NULL; - UINT32 index = 0; - UINT32 id, intSave; - - SCHEDULER_LOCK(intSave); - if (LOS_ListEmpty(list) == TRUE) { - SCHEDULER_UNLOCK(intSave); - PRINTK("Pended Task: null\n"); - return; - } - - LOS_DL_LIST_FOR_EACH(listTmp, list) { - pendedTask = OS_TCB_FROM_PENDLIST(listTmp); - name = pendedTask->taskName; - id = pendedTask->taskId; - SCHEDULER_UNLOCK(intSave); - if (index == 0) { - PRINTK("Pended task: %u. name:%-15s, id:0x%-5x\n", index, name, id); - } else { - PRINTK(" %u. name:%-15s, id:0x%-5x\n", index, name, id); - } - index++; - SCHEDULER_LOCK(intSave); - } - SCHEDULER_UNLOCK(intSave); -} - -STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) //ڴӡеĻϢ// -{ - UINT32 index = 0; - MuxDLinkNode *muxDLNode = NULL; - CHAR *ownerName = NULL; - LosMuxCB *muxCB = NULL; - LOS_DL_LIST *list = NULL; - LOS_DL_LIST *listTmp = NULL; - UINT32 count, intSave; - - SCHEDULER_LOCK(intSave); - if (LOS_ListEmpty(&muxDLCB->muxListHead) == TRUE) { - SCHEDULER_UNLOCK(intSave); - PRINTK("null\n"); - } else { - LOS_DL_LIST_FOR_EACH(list, &muxDLCB->muxListHead) { - muxDLNode = LOS_DL_LIST_ENTRY(list, MuxDLinkNode, muxList); - muxCB = (LosMuxCB *)muxDLNode->muxCB; - count = muxCB->muxCount; - ownerName = muxCB->owner->taskName; - SCHEDULER_UNLOCK(intSave); - PRINTK("\n", index); - PRINTK("Ptr handle:%p\n", muxCB); - PRINTK("Owner:%s\n", ownerName); - PRINTK("Count:%u\n", count); - - listTmp = &muxCB->muxList; - OsMutexPendTaskList(listTmp); - - index++; - SCHEDULER_LOCK(intSave); - } - SCHEDULER_UNLOCK(intSave); - } -} - -VOID OsMutexDlockCheck(VOID) //ڼ⻥Ϣ// -{ - UINT32 loop, intSave; - UINT32 taskId; - CHAR *name = NULL; - LosTaskCB *taskCB = NULL; - MuxDLinkCB *muxDLCB = NULL; - - SCHEDULER_LOCK(intSave); - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (LosTaskCB *)g_taskCBArray + loop; - if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { - continue; - } - - muxDLCB = &g_muxDeadlockCBArray[taskCB->taskId]; - if ((LOS_TickCountGet() - muxDLCB->lastAccessTime) > OS_MUX_DEADLOCK_CHECK_THRESHOLD) { - name = taskCB->taskName; - taskId = taskCB->taskId; - SCHEDULER_UNLOCK(intSave); - PRINTK("Task_name:%s, ID:0x%x, holds the Mutexs below:\n", name, taskId); - OsTaskHoldMutexList(muxDLCB); - OsDeadlockBackTrace(taskCB); - PRINTK("\n"); - SCHEDULER_LOCK(intSave); - } - } - SCHEDULER_UNLOCK(intSave); -} - -#ifdef LOSCFG_SHELL //ִл鲢Ϣ// -UINT32 OsShellCmdMuxDeadlockCheck(UINT32 argc, const CHAR **argv) -{ - if (argc > 0) { - PRINTK("\nUsage: dlock\n"); - return OS_ERROR; - } - PRINTK("Start mutexs deadlock check: \n"); - OsMutexDlockCheck(); - PRINTK("-----------End-----------\n"); - return LOS_OK; -} -SHELLCMD_ENTRY(deadlock_shellcmd, CMD_TYPE_EX, "dlock", 0, (CmdCallBackFunc)OsShellCmdMuxDeadlockCheck); -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ diff --git a/src/debug/los_mux_debug.c b/src/debug/los_mux_debug.c deleted file mode 100644 index 5008bc5..0000000 --- a/src/debug/los_mux_debug.c +++ /dev/null @@ -1,189 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Mutex Debug - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_mux_debug_pri.h" -#include "los_typedef.h" -#include "los_task.h" -#include "los_misc_pri.h" -#include "arch/exception.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_MUTEX //ڱʾĵϢ// -typedef struct { - TSK_ENTRY_FUNC creator; /* The task entry who created this mutex */ - UINT64 lastAccessTime; /* The last access time */ -} MuxDebugCB; -STATIC MuxDebugCB *g_muxDebugArray = NULL; - -//ڱȽϢʱ// -STATIC BOOL MuxCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) -{ - return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > - *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); -} - -UINT32 OsMuxDbgInit(VOID) //ڳʼϢ// -{ - UINT32 size = LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(MuxDebugCB); - /* system resident memory, don't free */ - g_muxDebugArray = (MuxDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_muxDebugArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - (VOID)memset_s(g_muxDebugArray, size, 0, size); - return LOS_OK; -} - -VOID OsMuxDbgTimeUpdate(UINT32 muxId) //ڸָʱ// -{ - MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; - muxDebug->lastAccessTime = LOS_TickCountGet(); -} - -VOID OsMuxDbgUpdate(UINT32 muxId, TSK_ENTRY_FUNC creator) //ڸָĴߺʱ// -{ - MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; - muxDebug->creator = creator; - muxDebug->lastAccessTime = LOS_TickCountGet(); -} - -//ڶԻ򣬲ܴڵĻй©// -STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count) -{ - LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; - MuxDebugCB muxDebugNode = {0}; - UINT32 index, intSave; - SortParam muxSortParam; - muxSortParam.buf = (CHAR *)g_muxDebugArray; - muxSortParam.ctrlBlockSize = sizeof(MuxDebugCB); - muxSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_MUX_LIMIT; - muxSortParam.sortElemOff = LOS_OFF_SET_OF(MuxDebugCB, lastAccessTime); - - if (count > 0) { - SCHEDULER_LOCK(intSave); - OsArraySort(indexArray, 0, count - 1, &muxSortParam, MuxCompareValue); - SCHEDULER_UNLOCK(intSave); - for (index = 0; index < count; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&muxNode, sizeof(LosMuxCB), - GET_MUX(indexArray[index]), sizeof(LosMuxCB)); - (VOID)memcpy_s(&muxDebugNode, sizeof(MuxDebugCB), - &g_muxDebugArray[indexArray[index]], sizeof(MuxDebugCB)); - SCHEDULER_UNLOCK(intSave); - /* - * muxStat may be altered after the g_taskSpin is unlocked in OsMutexCheck. - * We should recheck the muxStat before the print. - */ - if ((muxNode.muxStat != LOS_USED) || - ((muxNode.muxStat == LOS_USED) && ((muxDebugNode.creator == NULL) || (muxNode.owner == NULL)))) { - continue; - } - PRINTK("Mutex ID <0x%x> may leak, TaskID of owner:0x%x, TaskEntry of owner: %p," - "TaskEntry of creator: %p,Latest operation time: 0x%llx\n", - muxNode.muxId, muxNode.owner->taskId, muxNode.owner->taskEntry, muxDebugNode.creator, - muxDebugNode.lastAccessTime); - } - } - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); -} - -VOID OsMutexCheck(VOID) //ڼ黥״̬ԿܴڵĻй©д// -{ - LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; - MuxDebugCB muxDebugNode = {0}; - UINT32 index, intSave; - UINT32 count = 0; - - /* - * This return value does not need to be judged immediately, - * and the following code logic has already distinguished the return value from null and non-empty, - * and there is no case of accessing the null pointer. - */ - UINT32 *indexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(UINT32)); - - for (index = 0; index < LOSCFG_BASE_IPC_MUX_LIMIT; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&muxNode, sizeof(LosMuxCB), GET_MUX(index), sizeof(LosMuxCB)); - (VOID)memcpy_s(&muxDebugNode, sizeof(MuxDebugCB), &g_muxDebugArray[index], sizeof(MuxDebugCB)); - SCHEDULER_UNLOCK(intSave); - - if ((muxNode.muxStat != LOS_USED) || - ((muxNode.muxStat == LOS_USED) && (muxDebugNode.creator == NULL))) { - continue; - } else if ((muxNode.muxStat == LOS_USED) && (muxNode.owner == NULL)) { - PRINTK("Mutex ID <0x%x> may leak, Owner is null, TaskEntry of creator: %p," - "Latest operation time: 0x%llx\n", - muxNode.muxId, muxDebugNode.creator, muxDebugNode.lastAccessTime); - } else { - if (indexArray != NULL) { - *(indexArray + count) = index; - count++; - } else { - PRINTK("Mutex ID <0x%x> may leak, TaskID of owner:0x%x, TaskEntry of owner: %p," - "TaskEntry of creator: %p,Latest operation time: 0x%llx\n", - muxNode.muxId, muxNode.owner->taskId, muxNode.owner->taskEntry, muxDebugNode.creator, - muxDebugNode.lastAccessTime); - } - } - } - - if (indexArray != NULL) { - SortMuxIndexArray(indexArray, count); - } -} - -#ifdef LOSCFG_SHELL -//ڻȡϢ// -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMuxInfoGet(UINT32 argc, const CHAR **argv) -{ - if (argc > 0) { - PRINTK("\nUsage: mutex\n"); - return OS_ERROR; - } - PRINTK("used mutexs information: \n"); - OsMutexCheck(); - return LOS_OK; -} -SHELLCMD_ENTRY(mutex_shellcmd, CMD_TYPE_EX, "mutex", 0, (CmdCallBackFunc)OsShellCmdMuxInfoGet); -#endif /* LOSCFG_SHELL */ -#endif /* LOSCFG_DEBUG_MUTEX */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ diff --git a/src/debug/los_queue_debug.c b/src/debug/los_queue_debug.c deleted file mode 100644 index 43ba6ad..0000000 --- a/src/debug/los_queue_debug.c +++ /dev/null @@ -1,206 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Queue Debug - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_queue_debug_pri.h" -#include "los_misc_pri.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_QUEUE //ڱеĵϢ// -typedef struct { - TSK_ENTRY_FUNC creator; /* The task entry who created this queue */ - UINT64 lastAccessTime; /* The last access time */ -} QueueDebugCB; -STATIC QueueDebugCB *g_queueDebugArray = NULL; - -//ڱȽ϶еԪֵ// -STATIC BOOL QueueCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) -{ - return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > - *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); -} - -UINT32 OsQueueDbgInit(VOID) //ڳʼеĵϢ// -{ - UINT32 size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(QueueDebugCB); - - /* system resident memory, don't free */ - g_queueDebugArray = (QueueDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_queueDebugArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - (VOID)memset_s(g_queueDebugArray, size, 0, size); - return LOS_OK; -} - -VOID OsQueueDbgTimeUpdate(UINT32 queueId) //ڸ¶еʱ// -{ - QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; - queueDebug->lastAccessTime = LOS_TickCountGet(); - return; -} - -VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry) //ڸ¶еĵϢ// -{ - QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; - queueDebug->creator = entry; - queueDebug->lastAccessTime = LOS_TickCountGet(); - return; -} - -STATIC INLINE VOID OsQueueInfoOutPut(const LosQueueCB *node) //еϢ// -{ - PRINTK("Queue ID <0x%x> may leak, queue len is 0x%x, " - "readable cnt:0x%x, writeable cnt:0x%x, ", - node->queueId, - node->queueLen, - node->readWriteableCnt[OS_QUEUE_READ], - node->readWriteableCnt[OS_QUEUE_WRITE]); -} - -STATIC INLINE VOID OsQueueOpsOutput(const QueueDebugCB *node) //вϢ// -{ - PRINTK("TaskEntry of creator:0x%p, Latest operation time: 0x%llx\n", - node->creator, node->lastAccessTime); -} - -STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) //ڶԶӦĶϢ// -{ - LosQueueCB queueNode = {0}; - QueueDebugCB queueDebugNode = {0}; - UINT32 index, intSave; - SortParam queueSortParam; - queueSortParam.buf = (CHAR *)g_queueDebugArray; - queueSortParam.ctrlBlockSize = sizeof(QueueDebugCB); - queueSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_QUEUE_LIMIT; - queueSortParam.sortElemOff = LOS_OFF_SET_OF(QueueDebugCB, lastAccessTime); - - if (count > 0) { - SCHEDULER_LOCK(intSave); - OsArraySort(indexArray, 0, count - 1, &queueSortParam, QueueCompareValue); - SCHEDULER_UNLOCK(intSave); - for (index = 0; index < count; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&queueNode, sizeof(LosQueueCB), - GET_QUEUE_HANDLE(indexArray[index]), sizeof(LosQueueCB)); - (VOID)memcpy_s(&queueDebugNode, sizeof(QueueDebugCB), - &g_queueDebugArray[indexArray[index]], sizeof(QueueDebugCB)); - SCHEDULER_UNLOCK(intSave); - if (queueNode.queueState == LOS_UNUSED) { - continue; - } - OsQueueInfoOutPut(&queueNode); - OsQueueOpsOutput(&queueDebugNode); - } - } - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); -} - -VOID OsQueueCheck(VOID) //ڼе״̬ӦϢ// -{ - LosQueueCB queueNode = {0}; - QueueDebugCB queueDebugNode = {0}; - UINT32 index, intSave; - UINT32 count = 0; - - /* - * This return value does not need to be judged immediately, - * and the following code logic has already distinguished the return value from null and non-empty, - * and there is no case of accessing the null pointer. - */ - UINT32 *indexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(UINT32)); - - for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) { - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&queueNode, sizeof(LosQueueCB), - GET_QUEUE_HANDLE(index), sizeof(LosQueueCB)); - (VOID)memcpy_s(&queueDebugNode, sizeof(QueueDebugCB), - &g_queueDebugArray[index], sizeof(QueueDebugCB)); - SCHEDULER_UNLOCK(intSave); - if ((queueNode.queueState == LOS_UNUSED) || - ((queueNode.queueState == LOS_USED) && (queueDebugNode.creator == NULL))) { - continue; - } - if ((queueNode.queueState == LOS_USED) && - (queueNode.queueLen == queueNode.readWriteableCnt[OS_QUEUE_WRITE]) && - LOS_ListEmpty(&queueNode.readWriteList[OS_QUEUE_READ]) && - LOS_ListEmpty(&queueNode.readWriteList[OS_QUEUE_WRITE]) && - LOS_ListEmpty(&queueNode.memList)) { - PRINTK("Queue ID <0x%x> may leak, No task uses it, " - "QueueLen is 0x%x, ", - queueNode.queueId, - queueNode.queueLen); - OsQueueOpsOutput(&queueDebugNode); - } else { - if (indexArray != NULL) { - *(indexArray + count) = index; - count++; - } else { - OsQueueInfoOutPut(&queueNode); - OsQueueOpsOutput(&queueDebugNode); - } - } - } - - if (indexArray != NULL) { - SortQueueIndexArray(indexArray, count); - } - - return; -} - -#ifdef LOSCFG_SHELL -//û "queue" ʱʹöеϢ// -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdQueueInfoGet(UINT32 argc, const CHAR **argv) -{ - if (argc > 0) { - PRINTK("\nUsage: queue\n"); - return OS_ERROR; - } - PRINTK("used queues information: \n"); - OsQueueCheck(); - return LOS_OK; -} - -SHELLCMD_ENTRY(queue_shellcmd, CMD_TYPE_EX, "queue", 0, (CmdCallBackFunc)OsShellCmdQueueInfoGet); -#endif /* LOSCFG_SHELL */ -#endif /* LOSCFG_DEBUG_QUEUE */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ diff --git a/src/debug/los_sched_debug.c b/src/debug/los_sched_debug.c deleted file mode 100644 index ec4a78b..0000000 --- a/src/debug/los_sched_debug.c +++ /dev/null @@ -1,347 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved. - * Description: Schedule Statistics - * Author: Huawei LiteOS Team - * Create: 2018-11-16 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_task_pri.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_SCHED_STATISTICS -#define HIGHTASKPRI 16 -#define NS_PER_MS 1000000 -#define DECIMAL_TO_PERCENTAGE 100 - -typedef struct { - UINT64 idleRuntime; //ʱ// - UINT64 idleStarttime; //ʱ// - UINT64 highTaskRuntime; //ȼʱ// - UINT64 highTaskStarttime; //ȼʱ// - UINT64 sumPriority; //ȼ֮// - UINT32 prioritySwitch; //л// - UINT32 highTaskSwitch; //ȼл// - UINT32 contexSwitch; //л// - UINT32 hwiNum; //Ӳжϴ// -#ifdef LOSCFG_KERNEL_SMP - UINT32 ipiIrqNum; //жϴڶ¶壩// -#endif -} StatPercpu; - -STATIC BOOL g_statisticsStartFlag = FALSE; -STATIC UINT64 g_statisticsStartTime; -STATIC StatPercpu g_statPercpu[LOSCFG_KERNEL_CORE_NUM]; - -//ÿ CPU Ͻеͳ// -STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *newTask) -{ - UINT32 cpuId; - UINT32 idleTaskId; - UINT64 now, runtime; - - if (g_statisticsStartFlag != TRUE) { - return; - } - - cpuId = ArchCurrCpuid(); - idleTaskId = OsGetIdleTaskId(); - now = LOS_CurrNanosec(); - - g_statPercpu[cpuId].contexSwitch++; - - if ((runTask->taskId != idleTaskId) && (newTask->taskId == idleTaskId)) { - g_statPercpu[cpuId].idleStarttime = now; - } - - if ((runTask->taskId == idleTaskId) && (newTask->taskId != idleTaskId)) { - runtime = now - g_statPercpu[cpuId].idleStarttime; - g_statPercpu[cpuId].idleRuntime += runtime; - g_statPercpu[cpuId].idleStarttime = 0; - } - - if ((runTask->priority >= HIGHTASKPRI) && (newTask->priority < HIGHTASKPRI)) { - g_statPercpu[cpuId].highTaskStarttime = now; - } - - if ((runTask->priority < HIGHTASKPRI) && (newTask->priority >= HIGHTASKPRI)) { - runtime = now - g_statPercpu[cpuId].highTaskStarttime; - g_statPercpu[cpuId].highTaskRuntime += runtime; - g_statPercpu[cpuId].highTaskStarttime = 0; - } - - if (newTask->priority < HIGHTASKPRI) { - g_statPercpu[cpuId].highTaskSwitch++; - } - - if (newTask->taskId != idleTaskId) { - g_statPercpu[cpuId].sumPriority += newTask->priority; - g_statPercpu[cpuId].prioritySwitch++; - } - - return; -} - -//ڸµͳϢ// -LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *newTask) -{ - UINT64 runtime; - UINT32 cpuId = ArchCurrCpuid(); - UINT64 now = LOS_CurrNanosec(); - - SchedStat *schedRun = &runTask->schedStat; - SchedStat *schedNew = &newTask->schedStat; - SchedPercpu *cpuRun = &schedRun->schedPercpu[cpuId]; - SchedPercpu *cpuNew = &schedNew->schedPercpu[cpuId]; - - /* calculate one chance of running time */ - runtime = now - schedRun->startRuntime; - - /* add running timer to running task statistics */ - cpuRun->runtime += runtime; - schedRun->allRuntime += runtime; - - /* add context switch counters and schedule start time */ - cpuNew->contexSwitch++; - schedNew->allContextSwitch++; - schedNew->startRuntime = now; - OsSchedStatisticsPerCpu(runTask, newTask); -} - -LITE_OS_SEC_TEXT_MINOR VOID OsHwiStatistics(size_t intNum) //ڸӲжϵͳϢ// -{ - UINT32 cpuId = ArchCurrCpuid(); - - if ((g_statisticsStartFlag != TRUE) || (intNum == OS_TICK_INT_NUM)) { - return; - } - - g_statPercpu[cpuId].hwiNum++; -#ifdef LOSCFG_KERNEL_SMP - /* 16: 0~15 is ipi interrupts */ - if (intNum < 16) { - g_statPercpu[cpuId].ipiIrqNum++; - } -#endif - return; -} - -LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) //ڴӡĵͳϢ// -{ - LosTaskCB *taskCB = NULL; - UINT32 loop; - UINT32 cpuId; -#ifdef LOSCFG_KERNEL_SMP - UINT32 affinity; -#endif - - PRINTK("\n"); - PRINTK("Task TID Total Time Total CST " - "CPU Time CST\n"); - PRINTK("---- --- ------------------ ---------- -" - "--- ------------------ ----------\n"); - - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (((LosTaskCB *)g_taskCBArray) + loop); - if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { - continue; - } -#ifdef LOSCFG_KERNEL_SMP - affinity = (UINT32)taskCB->cpuAffiMask; -#endif - PRINTK("%-30s0x%-6x%+16lf ms %10u\n", taskCB->taskName, taskCB->taskId, - (DOUBLE)(taskCB->schedStat.allRuntime) / NS_PER_MS, - taskCB->schedStat.allContextSwitch); - - for (cpuId = 0; cpuId < LOSCFG_KERNEL_CORE_NUM; cpuId++) { -#ifdef LOSCFG_KERNEL_SMP - if (!((1U << cpuId) & affinity)) { - continue; - } -#endif - PRINTK(" " - "CPU%u %+16lf ms %12u\n", cpuId, - (DOUBLE)(taskCB->schedStat.schedPercpu[cpuId].runtime) / NS_PER_MS, - taskCB->schedStat.schedPercpu[cpuId].contexSwitch); - } - } - - PRINTK("\n"); -} - -LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) //ʾϵͳͳϢ// -{ - UINT32 cpuId; - PRINTK("\n"); - PRINTK("Passed Time: %+16lf ms\n", ((DOUBLE)statisticsPastTime / NS_PER_MS)); - PRINTK("--------------------------------\n"); - PRINTK("CPU Idle(%%) ContexSwitch HwiNum " - "Avg Pri HiTask(%%) HiTask SwiNum HiTask P(ms)" -#ifdef LOSCFG_KERNEL_SMP - " MP Hwi\n"); -#else - "\n"); -#endif - PRINTK("---- --------- ----------- -------- --------- " - "---------- ------------ ----------" -#ifdef LOSCFG_KERNEL_SMP - " ------\n"); -#else - "\n"); -#endif - - for (cpuId = 0; cpuId < LOSCFG_KERNEL_CORE_NUM; cpuId++) { -#ifdef LOSCFG_KERNEL_SMP - PRINTK("CPU%u %+10lf%14u%14u %+11lf %+11lf%14u %+11lf %11u\n", cpuId, -#else - PRINTK("CPU%u %+10lf%14u%14u %+11lf %+11lf%14u %+11lf\n", cpuId, -#endif - ((DOUBLE)(g_statPercpu[cpuId].idleRuntime) / statisticsPastTime) * DECIMAL_TO_PERCENTAGE, - g_statPercpu[cpuId].contexSwitch, - g_statPercpu[cpuId].hwiNum, - (g_statPercpu[cpuId].prioritySwitch == 0) ? OS_TASK_PRIORITY_LOWEST : - ((DOUBLE)(g_statPercpu[cpuId].sumPriority) / (g_statPercpu[cpuId].prioritySwitch)), - ((DOUBLE)(g_statPercpu[cpuId].highTaskRuntime) / statisticsPastTime) * DECIMAL_TO_PERCENTAGE, - g_statPercpu[cpuId].highTaskSwitch, - (g_statPercpu[cpuId].highTaskSwitch == 0) ? 0 : - ((DOUBLE)(g_statPercpu[cpuId].highTaskRuntime) / (g_statPercpu[cpuId].highTaskSwitch)) / NS_PER_MS -#ifdef LOSCFG_KERNEL_SMP - , g_statPercpu[cpuId].ipiIrqNum); -#else - ); -#endif - } - - PRINTK("\n"); -} - -LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) //ڶϵͳͳƹ// -{ - LosTaskCB *taskCB = NULL; - UINT32 loop; - UINT32 cpuId = 0; - UINT32 intSave; - - SCHEDULER_LOCK(intSave); - - if (g_statisticsStartFlag) { - SCHEDULER_UNLOCK(intSave); - PRINT_WARN("mp static has started\n"); - return; - } - - g_statisticsStartTime = LOS_CurrNanosec(); - - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (((LosTaskCB *)g_taskCBArray) + loop); - if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { -#ifdef LOSCFG_KERNEL_SMP - cpuId = taskCB->currCpu; -#endif - if ((UINT32)(OS_TASK_INVALID_CPUID) == cpuId) { - continue; - } - if (!strcmp(taskCB->taskName, "IdleCore000")) { - g_statPercpu[cpuId].idleStarttime = g_statisticsStartTime; - } - if (taskCB->priority < HIGHTASKPRI) { - g_statPercpu[cpuId].highTaskStarttime = g_statisticsStartTime; - g_statPercpu[cpuId].highTaskSwitch++; - } - if (strcmp(taskCB->taskName, "IdleCore000")) { - g_statPercpu[cpuId].sumPriority += taskCB->priority; - g_statPercpu[cpuId].prioritySwitch++; - } - } - } - g_statisticsStartFlag = TRUE; - SCHEDULER_UNLOCK(intSave); - - PRINTK("mp static start\n"); - - return; -} - -//ڶϵͳֹͣͳƹܣͳݵĴչʾ// -LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStop(VOID) -{ - LosTaskCB *taskCB = NULL; - UINT32 loop; - UINT32 cpuId = 0; - UINT64 statisticsStopTime; - UINT64 statisticsPastTime; - UINT64 runtime; - UINT32 intSave; - - SCHEDULER_LOCK(intSave); - - if (g_statisticsStartFlag != TRUE) { - SCHEDULER_UNLOCK(intSave); - PRINT_WARN("Please set mp static start\n"); - return; - } - - g_statisticsStartFlag = FALSE; - statisticsStopTime = LOS_CurrNanosec(); - statisticsPastTime = statisticsStopTime - g_statisticsStartTime; - - for (loop = 0; loop < g_taskMaxNum; loop++) { - taskCB = (((LosTaskCB *)g_taskCBArray) + loop); - if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { -#ifdef LOSCFG_KERNEL_SMP - cpuId = taskCB->currCpu; -#endif - if (cpuId == (UINT32)(OS_TASK_INVALID_CPUID)) { - continue; - } - if (!strcmp(taskCB->taskName, "IdleCore000")) { - runtime = statisticsStopTime - g_statPercpu[cpuId].idleStarttime; - g_statPercpu[cpuId].idleRuntime += runtime; - g_statPercpu[cpuId].idleStarttime = 0; - } - if (taskCB->priority < HIGHTASKPRI) { - runtime = statisticsStopTime - g_statPercpu[cpuId].highTaskStarttime; - g_statPercpu[cpuId].highTaskRuntime += runtime; - g_statPercpu[cpuId].highTaskStarttime = 0; - } - } - } - SCHEDULER_UNLOCK(intSave); - OsStatisticsShow(statisticsPastTime); - - (VOID)memset_s(g_statPercpu, sizeof(g_statPercpu), 0, sizeof(g_statPercpu)); - g_statisticsStartTime = 0; - return; -} -#endif - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ diff --git a/src/debug/los_sem_debug.c b/src/debug/los_sem_debug.c deleted file mode 100644 index 8f1774b..0000000 --- a/src/debug/los_sem_debug.c +++ /dev/null @@ -1,299 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Copyright (c) Huawei Technologies Co., Ltd. 2013-2019. All rights reserved. - * Description: Sem Debug - * Author: Huawei LiteOS Team - * Create: 2013-01-01 - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --------------------------------------------------------------------------- */ - -#include "los_sem_debug_pri.h" -#include "stdlib.h" -#include "los_typedef.h" -#include "los_task_pri.h" -#include "los_misc_pri.h" -#ifdef LOSCFG_SHELL -#include "shcmd.h" -#endif /* LOSCFG_SHELL */ - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#ifdef LOSCFG_DEBUG_SEMAPHORE -#define OS_ALL_SEM_MASK 0xffffffff - -STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) //ڴӡȴijźб// -{ - LosTaskCB *tskCB = NULL; - CHAR *nameArr[LOSCFG_BASE_CORE_TSK_LIMIT] = {0}; - UINT32 i, intSave; - UINT32 num = 0; - - SCHEDULER_LOCK(intSave); - if ((semNode->semStat == LOS_UNUSED) || (LOS_ListEmpty(&semNode->semList))) { - SCHEDULER_UNLOCK(intSave); - return; - } - - LOS_DL_LIST_FOR_EACH_ENTRY(tskCB, &semNode->semList, LosTaskCB, pendList) { - nameArr[num++] = tskCB->taskName; - if (num == LOSCFG_BASE_CORE_TSK_LIMIT) { - break; - } - } - SCHEDULER_UNLOCK(intSave); - - PRINTK("Pended task list : "); - for (i = 0; i < num; i++) { - if (i == 0) { - PRINTK("%s\n", nameArr[i]); - } else { - PRINTK(", %s", nameArr[i]); - } - } - PRINTK("\n"); -} - -typedef struct { //ڼ¼źĵϢ// - UINT16 origSemCount; /* Number of original available semaphores */ - UINT64 lastAccessTime; /* The last operation time */ - TSK_ENTRY_FUNC creator; /* The task entry who created this sem */ -} SemDebugCB; -STATIC SemDebugCB *g_semDebugArray = NULL; //ڴ洢źĵϢ// - -//ڱȽԪصֵ// -STATIC BOOL SemCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) -{ - return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > - *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); -} - -UINT32 OsSemDbgInit(VOID) //ڳʼźĵϢ// -{ - UINT32 size = LOSCFG_BASE_IPC_SEM_LIMIT * sizeof(SemDebugCB); - /* system resident memory, don't free */ - g_semDebugArray = (SemDebugCB *)LOS_MemAlloc(m_aucSysMem1, size); - if (g_semDebugArray == NULL) { - PRINT_ERR("%s: malloc failed!\n", __FUNCTION__); - return LOS_NOK; - } - (VOID)memset_s(g_semDebugArray, size, 0, size); - return LOS_OK; -} - -VOID OsSemDbgTimeUpdate(UINT32 semId) //ڸָźһηʱ// -{ - SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; - semDebug->lastAccessTime = LOS_TickCountGet(); - return; -} - -VOID OsSemDbgUpdate(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) //ڸָźĵϢ// -{ - SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; - semDebug->creator = creator; - semDebug->lastAccessTime = LOS_TickCountGet(); - semDebug->origSemCount = count; - return; -} - -/*ڰźʱԵǰʹõź*/ -/*ӡÿźĵϢ͵ȴź*/ -STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount) -{ - UINT32 i, intSave; - LosSemCB *semCB = NULL; - LosSemCB semNode = {0}; - SemDebugCB semDebug = {0}; - SortParam semSortParam; - semSortParam.buf = (CHAR *)g_semDebugArray; - semSortParam.ctrlBlockSize = sizeof(SemDebugCB); - semSortParam.ctrlBlockCnt = LOSCFG_BASE_IPC_SEM_LIMIT; - semSortParam.sortElemOff = LOS_OFF_SET_OF(SemDebugCB, lastAccessTime); - - /* It will Print out ALL the Used Semaphore List. */ - PRINTK("Used Semaphore List: \n"); - PRINTK("\r\n SemID Count OriginalCount Creater(TaskEntry) LastAccessTime\n"); - PRINTK(" ------ ------ ------------- ------------------ -------------- \n"); - - SCHEDULER_LOCK(intSave); - OsArraySort(semIndexArray, 0, usedCount - 1, &semSortParam, SemCompareValue); - SCHEDULER_UNLOCK(intSave); - for (i = 0; i < usedCount; i++) { - semCB = GET_SEM(semIndexArray[i]); - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); - (VOID)memcpy_s(&semDebug, sizeof(SemDebugCB), &g_semDebugArray[semIndexArray[i]], sizeof(SemDebugCB)); - SCHEDULER_UNLOCK(intSave); - if ((semNode.semStat != LOS_USED) || (semDebug.creator == NULL)) { - continue; - } - PRINTK(" 0x%-07x0x%-07u0x%-14u%-22p0x%llx\n", semNode.semId, semDebug.origSemCount, - semNode.semCount, semDebug.creator, semDebug.lastAccessTime); - if (!LOS_ListEmpty(&semNode.semList)) { - OsSemPendedTaskNamePrint(semCB); - } - } -} -/*ڻȡǰʹõźϢźʱź*/ -UINT32 OsSemInfoGetFullData(VOID) -{ - UINT32 usedSemCnt = 0; - LosSemCB *semNode = NULL; - SemDebugCB *semDebug = NULL; - UINT32 i; - UINT32 *semIndexArray = NULL; - UINT32 count, intSave; - - SCHEDULER_LOCK(intSave); - /* Get the used semaphore count. */ - for (i = 0; i < LOSCFG_BASE_IPC_SEM_LIMIT; i++) { - semNode = GET_SEM(i); - semDebug = &g_semDebugArray[i]; - if ((semNode->semStat == LOS_USED) && (semDebug->creator != NULL)) { - usedSemCnt++; - } - } - SCHEDULER_UNLOCK(intSave); - - if (usedSemCnt > 0) { - semIndexArray = (UINT32 *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, usedSemCnt * sizeof(UINT32)); - if (semIndexArray == NULL) { - PRINTK("LOS_MemAlloc failed in %s \n", __func__); - return LOS_NOK; - } - - /* Fill the semIndexArray with the real index. */ - count = 0; - - SCHEDULER_LOCK(intSave); - for (i = 0; i < LOSCFG_BASE_IPC_SEM_LIMIT; i++) { - semNode = GET_SEM(i); - semDebug = &g_semDebugArray[i]; - if ((semNode->semStat != LOS_USED) || (semDebug->creator == NULL)) { - continue; - } - *(semIndexArray + count) = i; - count++; - /* if the count is touched usedSemCnt break. */ - if (count >= usedSemCnt) { - break; - } - } - SCHEDULER_UNLOCK(intSave); - OsSemSort(semIndexArray, count); - - /* free the index array. */ - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, semIndexArray); - } - return LOS_OK; -} - -#ifdef LOSCFG_SHELL -STATIC UINT32 OsSemInfoOutput(size_t semId) //źϢ// -{ - UINT32 loop, semCnt, intSave; - LosSemCB *semCB = NULL; - LosSemCB semNode = {0}; - - if (semId == OS_ALL_SEM_MASK) { - for (loop = 0, semCnt = 0; loop < LOSCFG_BASE_IPC_SEM_LIMIT; loop++) { - semCB = GET_SEM(loop); - SCHEDULER_LOCK(intSave); - if (semCB->semStat == LOS_USED) { - (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); - SCHEDULER_UNLOCK(intSave); - semCnt++; - PRINTK("\r\n SemID Count\n ---------- -----\n"); - PRINTK(" 0x%08x %u\n", semNode.semId, semNode.semCount); - continue; - } - SCHEDULER_UNLOCK(intSave); - } - PRINTK(" SemUsingNum : %u\n\n", semCnt); - return LOS_OK; - } else { - semCB = GET_SEM(semId); - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(&semNode, sizeof(LosSemCB), semCB, sizeof(LosSemCB)); - SCHEDULER_UNLOCK(intSave); - if ((semNode.semId != semId) || (semNode.semStat != LOS_USED)) { - PRINTK("\nThe semaphore is not in use!\n"); - return LOS_OK; - } - - PRINTK("\r\n SemID Count\n ---------- -----\n"); - PRINTK(" 0x%08x 0x%u\n", semNode.semId, semNode.semCount); - - if (LOS_ListEmpty(&semNode.semList)) { - PRINTK("No task is pended on this semaphore!\n"); - return LOS_OK; - } else { - OsSemPendedTaskNamePrint(semCB); - } - } - return LOS_OK; -} - -//ڻȡźϢ// -LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSemInfoGet(UINT32 argc, const CHAR **argv) -{ - size_t semId; - CHAR *endPtr = NULL; - UINT32 ret; - - if (argc > 1) { - PRINTK("\nUsage: sem [fulldata|ID]\n"); - return OS_ERROR; - } - - if (argc == 0) { - semId = OS_ALL_SEM_MASK; - } else { - if (strcmp(argv[0], "fulldata") == 0) { - ret = OsSemInfoGetFullData(); - return ret; - } - - semId = strtoul(argv[0], &endPtr, 0); - if ((*endPtr != 0) || (GET_SEM_INDEX(semId) >= LOSCFG_BASE_IPC_SEM_LIMIT)) { - PRINTK("\nsem ID can't access %s.\n", argv[0]); - return OS_ERROR; - } - } - - ret = OsSemInfoOutput(semId); - return ret; -} - -SHELLCMD_ENTRY(sem_shellcmd, CMD_TYPE_EX, "sem", 1, (CmdCallBackFunc)OsShellCmdSemInfoGet); -#endif /* LOSCFG_SHELL */ -#endif /* LOSCFG_DEBUG_SEMAPHORE */ - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ -- 2.34.1 From 80558986693c36bb3a99b576acaf4be1e4606759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E8=B1=AA?= <2548632733@qq.com> Date: Tue, 23 Jan 2024 00:11:05 +0800 Subject: [PATCH 8/8] doc --- doc/文豪泛读报告.docx | Bin 0 -> 42299 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/文豪泛读报告.docx diff --git a/doc/文豪泛读报告.docx b/doc/文豪泛读报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..d04ab4e9962a8d7eabe432fa0ad2f49ed4190aa1 GIT binary patch literal 42299 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 Yxzg&yA#B$MXoWCG44B%3boRIZ1+p1O>Hq)$ literal 0 HcmV?d00001 -- 2.34.1