Compare commits

..

No commits in common. 'master' and 'fuaojia_branch' have entirely different histories.

Binary file not shown.

Binary file not shown.

@ -38,17 +38,16 @@
#if __cplusplus #if __cplusplus
extern "C" { extern "C" {
#endif #endif
#endif /* __cplusplus */nbb #endif /* __cplusplus */
typedef struct { typedef struct {
LOS_DL_LIST muxListHead; /* Task-held mutexs list */ //用于管理任务持有的互斥锁列表// LOS_DL_LIST muxListHead; /* Task-held mutexs list */
UINT64 lastAccessTime; /* The last operation time */ //记录最后一次操作的时间// UINT64 lastAccessTime; /* The last operation time */
} MuxDLinkCB; } MuxDLinkCB;
/*管理任务持有的互斥锁列表和跟踪死锁情况*/
typedef struct { typedef struct {
LOS_DL_LIST muxList; /* Insert mutex into the owner task CB */ //用于将互斥锁插入到所属任务的控制块中// LOS_DL_LIST muxList; /* Insert mutex into the owner task CB */
VOID *muxCB; /* The Mutex CB pointer */ //指向互斥锁控制块的指针// VOID *muxCB; /* The Mutex CB pointer */
} MuxDLinkNode; } MuxDLinkNode;
STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL; STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL;
@ -58,9 +57,9 @@ STATIC MuxDLinkCB *g_muxDeadlockCBArray = NULL;
* that has not been scheduled within this time. * that has not been scheduled within this time.
* The unit is tick. * 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 index;
UINT32 size = (LOSCFG_BASE_CORE_TSK_LIMIT + 1) * sizeof(MuxDLinkCB); UINT32 size = (LOSCFG_BASE_CORE_TSK_LIMIT + 1) * sizeof(MuxDLinkCB);
@ -79,7 +78,7 @@ UINT32 OsMuxDlockCheckInit(VOID) //
return LOS_OK; return LOS_OK;
} }
VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) //用于向指定任务的互斥锁链表中插入一个互斥锁节点// VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB)
{ {
MuxDLinkNode *muxDLNode = NULL; MuxDLinkNode *muxDLNode = NULL;
@ -97,7 +96,7 @@ VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB) //
LOS_ListTailInsert(&g_muxDeadlockCBArray[taskId].muxListHead, &muxDLNode->muxList); 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; MuxDLinkCB *muxDLCB = NULL;
LOS_DL_LIST *list = NULL; LOS_DL_LIST *list = NULL;
@ -118,7 +117,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) { if (taskId > LOSCFG_BASE_CORE_TSK_LIMIT) {
return; return;
@ -127,7 +126,7 @@ VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount) //
g_muxDeadlockCBArray[taskId].lastAccessTime = tickCount; g_muxDeadlockCBArray[taskId].lastAccessTime = tickCount;
} }
STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) //用于打印任务的函数调用栈信息// STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB)
{ {
TaskContext *context = NULL; TaskContext *context = NULL;
@ -138,7 +137,7 @@ STATIC VOID OsDeadlockBackTrace(const LosTaskCB *taskCB) //
return; return;
} }
STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) //用于打印互斥锁等待任务的列表信息// STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list)
{ {
LOS_DL_LIST *listTmp = NULL; LOS_DL_LIST *listTmp = NULL;
LosTaskCB *pendedTask = NULL; LosTaskCB *pendedTask = NULL;
@ -169,7 +168,7 @@ STATIC VOID OsMutexPendTaskList(LOS_DL_LIST *list) //
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) //用于打印任务持有的互斥锁的信息// STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB)
{ {
UINT32 index = 0; UINT32 index = 0;
MuxDLinkNode *muxDLNode = NULL; MuxDLinkNode *muxDLNode = NULL;
@ -205,7 +204,7 @@ STATIC VOID OsTaskHoldMutexList(MuxDLinkCB *muxDLCB) //
} }
} }
VOID OsMutexDlockCheck(VOID) //用于检测互斥锁死锁情况并输出相关信息// VOID OsMutexDlockCheck(VOID)
{ {
UINT32 loop, intSave; UINT32 loop, intSave;
UINT32 taskId; UINT32 taskId;
@ -235,7 +234,7 @@ VOID OsMutexDlockCheck(VOID) //
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
#ifdef LOSCFG_SHELL //用于在命令行中执行互斥锁死锁检查并输出相关信息// #ifdef LOSCFG_SHELL
UINT32 OsShellCmdMuxDeadlockCheck(UINT32 argc, const CHAR **argv) UINT32 OsShellCmdMuxDeadlockCheck(UINT32 argc, const CHAR **argv)
{ {
if (argc > 0) { if (argc > 0) {

@ -41,21 +41,20 @@ extern "C" {
#endif #endif
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef LOSCFG_DEBUG_MUTEX //用于表示互斥锁的调试信息// #ifdef LOSCFG_DEBUG_MUTEX
typedef struct { typedef struct {
TSK_ENTRY_FUNC creator; /* The task entry who created this mutex */ TSK_ENTRY_FUNC creator; /* The task entry who created this mutex */
UINT64 lastAccessTime; /* The last access time */ UINT64 lastAccessTime; /* The last access time */
} MuxDebugCB; } MuxDebugCB;
STATIC MuxDebugCB *g_muxDebugArray = NULL; STATIC MuxDebugCB *g_muxDebugArray = NULL;
//用于比较两个互斥锁调试信息的最后访问时间//
STATIC BOOL MuxCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) STATIC BOOL MuxCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right)
{ {
return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) >
*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right)));
} }
UINT32 OsMuxDbgInit(VOID) //用于初始化互斥锁调试信息数组// UINT32 OsMuxDbgInit(VOID)
{ {
UINT32 size = LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(MuxDebugCB); UINT32 size = LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(MuxDebugCB);
/* system resident memory, don't free */ /* system resident memory, don't free */
@ -68,20 +67,19 @@ UINT32 OsMuxDbgInit(VOID) //
return LOS_OK; return LOS_OK;
} }
VOID OsMuxDbgTimeUpdate(UINT32 muxId) //用于更新指定互斥锁的最后访问时间// VOID OsMuxDbgTimeUpdate(UINT32 muxId)
{ {
MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)]; MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)];
muxDebug->lastAccessTime = LOS_TickCountGet(); 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)]; MuxDebugCB *muxDebug = &g_muxDebugArray[GET_MUX_INDEX(muxId)];
muxDebug->creator = creator; muxDebug->creator = creator;
muxDebug->lastAccessTime = LOS_TickCountGet(); muxDebug->lastAccessTime = LOS_TickCountGet();
} }
//用于对互斥锁索引数组进行排序,并检查可能存在的互斥锁泄漏//
STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count) STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count)
{ {
LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0};
@ -121,7 +119,7 @@ STATIC VOID SortMuxIndexArray(UINT32 *indexArray, UINT32 count)
(VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray);
} }
VOID OsMutexCheck(VOID) //用于检查互斥锁的状态并对可能存在的互斥锁泄漏进行处理// VOID OsMutexCheck(VOID)
{ {
LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0}; LosMuxCB muxNode = {{0, 0}, 0, 0, 0, 0};
MuxDebugCB muxDebugNode = {0}; MuxDebugCB muxDebugNode = {0};
@ -167,7 +165,6 @@ VOID OsMutexCheck(VOID) //
} }
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
//用于获取互斥锁信息//
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMuxInfoGet(UINT32 argc, const CHAR **argv) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMuxInfoGet(UINT32 argc, const CHAR **argv)
{ {
if (argc > 0) { if (argc > 0) {

@ -38,21 +38,20 @@ extern "C" {
#endif #endif
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef LOSCFG_DEBUG_QUEUE //用于保存队列的调试信息// #ifdef LOSCFG_DEBUG_QUEUE
typedef struct { typedef struct {
TSK_ENTRY_FUNC creator; /* The task entry who created this queue */ TSK_ENTRY_FUNC creator; /* The task entry who created this queue */
UINT64 lastAccessTime; /* The last access time */ UINT64 lastAccessTime; /* The last access time */
} QueueDebugCB; } QueueDebugCB;
STATIC QueueDebugCB *g_queueDebugArray = NULL; STATIC QueueDebugCB *g_queueDebugArray = NULL;
//用于比较队列中的元素值//
STATIC BOOL QueueCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) STATIC BOOL QueueCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right)
{ {
return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) >
*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right)));
} }
UINT32 OsQueueDbgInit(VOID) //用于初始化队列的调试信息// UINT32 OsQueueDbgInit(VOID)
{ {
UINT32 size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(QueueDebugCB); UINT32 size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(QueueDebugCB);
@ -66,14 +65,14 @@ UINT32 OsQueueDbgInit(VOID) //
return LOS_OK; return LOS_OK;
} }
VOID OsQueueDbgTimeUpdate(UINT32 queueId) //用于更新队列的最后访问时间// VOID OsQueueDbgTimeUpdate(UINT32 queueId)
{ {
QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)]; QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)];
queueDebug->lastAccessTime = LOS_TickCountGet(); queueDebug->lastAccessTime = LOS_TickCountGet();
return; 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)]; QueueDebugCB *queueDebug = &g_queueDebugArray[GET_QUEUE_INDEX(queueId)];
queueDebug->creator = entry; queueDebug->creator = entry;
@ -81,7 +80,7 @@ VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry) //
return; 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, " PRINTK("Queue ID <0x%x> may leak, queue len is 0x%x, "
"readable cnt:0x%x, writeable cnt:0x%x, ", "readable cnt:0x%x, writeable cnt:0x%x, ",
@ -91,13 +90,13 @@ STATIC INLINE VOID OsQueueInfoOutPut(const LosQueueCB *node) //
node->readWriteableCnt[OS_QUEUE_WRITE]); 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", PRINTK("TaskEntry of creator:0x%p, Latest operation time: 0x%llx\n",
node->creator, node->lastAccessTime); node->creator, node->lastAccessTime);
} }
STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) //用于对队列索引数组进行排序并输出相应的队列信息// STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count)
{ {
LosQueueCB queueNode = {0}; LosQueueCB queueNode = {0};
QueueDebugCB queueDebugNode = {0}; QueueDebugCB queueDebugNode = {0};
@ -129,7 +128,7 @@ STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) //
(VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray);
} }
VOID OsQueueCheck(VOID) //用于检查队列的状态并输出相应信息// VOID OsQueueCheck(VOID)
{ {
LosQueueCB queueNode = {0}; LosQueueCB queueNode = {0};
QueueDebugCB queueDebugNode = {0}; QueueDebugCB queueDebugNode = {0};
@ -183,7 +182,6 @@ VOID OsQueueCheck(VOID) //
} }
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
//当用户输入 "queue" 命令时,会输出已使用队列的信息//
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdQueueInfoGet(UINT32 argc, const CHAR **argv) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdQueueInfoGet(UINT32 argc, const CHAR **argv)
{ {
if (argc > 0) { if (argc > 0) {

@ -40,17 +40,17 @@ extern "C" {
#define DECIMAL_TO_PERCENTAGE 100 #define DECIMAL_TO_PERCENTAGE 100
typedef struct { typedef struct {
UINT64 idleRuntime; //空闲任务的运行时间// UINT64 idleRuntime;
UINT64 idleStarttime; //空闲任务的启动时间// UINT64 idleStarttime;
UINT64 highTaskRuntime; //高优先级任务的运行时间// UINT64 highTaskRuntime;
UINT64 highTaskStarttime; //高优先级任务的启动时间// UINT64 highTaskStarttime;
UINT64 sumPriority; //任务优先级之和// UINT64 sumPriority;
UINT32 prioritySwitch; //任务切换次数// UINT32 prioritySwitch;
UINT32 highTaskSwitch; //高优先级任务切换次数// UINT32 highTaskSwitch;
UINT32 contexSwitch; //上下文切换次数// UINT32 contexSwitch;
UINT32 hwiNum; //硬件中断次数// UINT32 hwiNum;
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
UINT32 ipiIrqNum; //中断次数(仅在多核配置下定义)// UINT32 ipiIrqNum;
#endif #endif
} StatPercpu; } StatPercpu;
@ -58,7 +58,6 @@ STATIC BOOL g_statisticsStartFlag = FALSE;
STATIC UINT64 g_statisticsStartTime; STATIC UINT64 g_statisticsStartTime;
STATIC StatPercpu g_statPercpu[LOSCFG_KERNEL_CORE_NUM]; STATIC StatPercpu g_statPercpu[LOSCFG_KERNEL_CORE_NUM];
//用于在每个 CPU 核心上进行调度统计//
STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *newTask) STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *newTask)
{ {
UINT32 cpuId; UINT32 cpuId;
@ -107,7 +106,6 @@ STATIC VOID OsSchedStatisticsPerCpu(const LosTaskCB *runTask, const LosTaskCB *n
return; return;
} }
//用于更新调度统计信息//
LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *newTask) LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *newTask)
{ {
UINT64 runtime; UINT64 runtime;
@ -133,7 +131,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsSchedStatistics(LosTaskCB *runTask, LosTaskCB *new
OsSchedStatisticsPerCpu(runTask, newTask); 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(); UINT32 cpuId = ArchCurrCpuid();
@ -151,7 +149,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsHwiStatistics(size_t intNum) //
return; return;
} }
LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) //用于打印任务的调度统计信息// LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID)
{ {
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
UINT32 loop; UINT32 loop;
@ -194,7 +192,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdDumpSched(VOID) //
PRINTK("\n"); PRINTK("\n");
} }
LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) //用于显示系统的统计信息// LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime)
{ {
UINT32 cpuId; UINT32 cpuId;
PRINTK("\n"); PRINTK("\n");
@ -240,7 +238,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsStatisticsShow(UINT64 statisticsPastTime) //
PRINTK("\n"); PRINTK("\n");
} }
LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) //用于在多核系统中启动统计功能// LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID)
{ {
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
UINT32 loop; UINT32 loop;
@ -287,7 +285,6 @@ LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStart(VOID) //
return; return;
} }
//用于在多核系统中停止统计功能,并进行统计数据的处理和展示//
LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStop(VOID) LITE_OS_SEC_TEXT_MINOR VOID OsShellStatisticsStop(VOID)
{ {
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;

@ -44,7 +44,7 @@ extern "C" {
#ifdef LOSCFG_DEBUG_SEMAPHORE #ifdef LOSCFG_DEBUG_SEMAPHORE
#define OS_ALL_SEM_MASK 0xffffffff #define OS_ALL_SEM_MASK 0xffffffff
STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) //用于打印等待某个信号量的任务列表// STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode)
{ {
LosTaskCB *tskCB = NULL; LosTaskCB *tskCB = NULL;
CHAR *nameArr[LOSCFG_BASE_CORE_TSK_LIMIT] = {0}; CHAR *nameArr[LOSCFG_BASE_CORE_TSK_LIMIT] = {0};
@ -76,21 +76,20 @@ STATIC VOID OsSemPendedTaskNamePrint(LosSemCB *semNode) //
PRINTK("\n"); PRINTK("\n");
} }
typedef struct { //用于记录信号量的调试信息// typedef struct {
UINT16 origSemCount; /* Number of original available semaphores */ UINT16 origSemCount; /* Number of original available semaphores */
UINT64 lastAccessTime; /* The last operation time */ UINT64 lastAccessTime; /* The last operation time */
TSK_ENTRY_FUNC creator; /* The task entry who created this sem */ TSK_ENTRY_FUNC creator; /* The task entry who created this sem */
} SemDebugCB; } SemDebugCB;
STATIC SemDebugCB *g_semDebugArray = NULL; //用于存储所有信号量的调试信息// STATIC SemDebugCB *g_semDebugArray = NULL;
//用于比较两个排序元素的值//
STATIC BOOL SemCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right) STATIC BOOL SemCompareValue(const SortParam *sortParam, UINT32 left, UINT32 right)
{ {
return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) > return (*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, left)) >
*((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right))); *((UINT64 *)(VOID *)SORT_ELEM_ADDR(sortParam, right)));
} }
UINT32 OsSemDbgInit(VOID) //用于初始化信号量的调试信息数组// UINT32 OsSemDbgInit(VOID)
{ {
UINT32 size = LOSCFG_BASE_IPC_SEM_LIMIT * sizeof(SemDebugCB); UINT32 size = LOSCFG_BASE_IPC_SEM_LIMIT * sizeof(SemDebugCB);
/* system resident memory, don't free */ /* system resident memory, don't free */
@ -103,14 +102,14 @@ UINT32 OsSemDbgInit(VOID) //
return LOS_OK; return LOS_OK;
} }
VOID OsSemDbgTimeUpdate(UINT32 semId) //用于更新指定信号量的最后一次访问时间// VOID OsSemDbgTimeUpdate(UINT32 semId)
{ {
SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)]; SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)];
semDebug->lastAccessTime = LOS_TickCountGet(); semDebug->lastAccessTime = LOS_TickCountGet();
return; 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)]; SemDebugCB *semDebug = &g_semDebugArray[GET_SEM_INDEX(semId)];
semDebug->creator = creator; semDebug->creator = creator;
@ -119,9 +118,7 @@ VOID OsSemDbgUpdate(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) //
return; return;
} }
/*用于按照信号量的最后访问时间对当前正在使用的信号量进行排序,*/ STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount)
/*并打印每个信号量的调试信息和等待该信号量的任务名*/
STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount)
{ {
UINT32 i, intSave; UINT32 i, intSave;
LosSemCB *semCB = NULL; LosSemCB *semCB = NULL;
@ -157,7 +154,7 @@ STATIC VOID OsSemSort(UINT32 *semIndexArray, UINT32 usedCount)
} }
} }
} }
/*用于获取当前正在使用的信号量信息,并按照信号量的最后访问时间对信号量进行排序*/
UINT32 OsSemInfoGetFullData(VOID) UINT32 OsSemInfoGetFullData(VOID)
{ {
UINT32 usedSemCnt = 0; UINT32 usedSemCnt = 0;
@ -212,7 +209,7 @@ UINT32 OsSemInfoGetFullData(VOID)
} }
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
STATIC UINT32 OsSemInfoOutput(size_t semId) //用于输出信号量信息// STATIC UINT32 OsSemInfoOutput(size_t semId)
{ {
UINT32 loop, semCnt, intSave; UINT32 loop, semCnt, intSave;
LosSemCB *semCB = NULL; LosSemCB *semCB = NULL;
@ -257,7 +254,6 @@ STATIC UINT32 OsSemInfoOutput(size_t semId) //
return LOS_OK; return LOS_OK;
} }
//用于获取信号量信息//
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSemInfoGet(UINT32 argc, const CHAR **argv) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSemInfoGet(UINT32 argc, const CHAR **argv)
{ {
size_t semId; size_t semId;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义了与二叉树相关的结构体和函数,用于实现对数据的快速查找和插入。
#ifndef _LOS_BINARYTREE_PRI_H #ifndef _LOS_BINARYTREE_PRI_H
#define _LOS_BINARYTREE_PRI_H #define _LOS_BINARYTREE_PRI_H
@ -35,76 +35,67 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//定义二叉树节点的模型
typedef struct tagBinNode { typedef struct tagBinNode {
struct tagBinNode *left;//左子树节点 struct tagBinNode *left;
struct tagBinNode *right;//右子树节点 struct tagBinNode *right;
UINT32 nodeId;//节点的编号 UINT32 nodeId;
CHAR keyValue[0];//节点记录的值(柔性数组,动态分配内存) CHAR keyValue[0];
} BinNode; } BinNode;
//链接二叉树节点
typedef struct { typedef struct {
BinNode leaf;//一个二叉树 BinNode leaf;
UINTPTR linkReg1;//无符号数的指针,可连接三个节点 UINTPTR linkReg1;
UINTPTR linkReg2; UINTPTR linkReg2;
UINTPTR linkReg3; UINTPTR linkReg3;
} LinkRegNode; } LinkRegNode;
#define LR_COUNT 4096 #define LR_COUNT 4096
extern LinkRegNode g_linkRegNode[LR_COUNT];//4096个链接二叉树节点 extern LinkRegNode g_linkRegNode[LR_COUNT];
extern UINT32 g_linkRegNodeIndex;//链接二叉树节点的索引 extern UINT32 g_linkRegNodeIndex;
extern LinkRegNode *g_linkRegRoot;//链接二叉树节点的指针 extern LinkRegNode *g_linkRegRoot;
//地址二叉树节点
typedef struct { typedef struct {
BinNode leaf;//一个二叉树节点 BinNode leaf;
UINTPTR addr;//二叉树节点记录的地址 UINTPTR addr;
} AddrNode; } AddrNode;
#define ADDR_COUNT 40960 #define ADDR_COUNT 40960
extern AddrNode g_addrNode[ADDR_COUNT];//40960个地址二叉树节点 extern AddrNode g_addrNode[ADDR_COUNT];
extern UINT32 g_addrNodeIndex;//地址二叉树节点的索引 extern UINT32 g_addrNodeIndex;
extern AddrNode *g_addrRoot;//地址二叉树节点的指针 extern AddrNode *g_addrRoot;
//请求大小二叉树节点
typedef struct { typedef struct {
BinNode leaf;//一个二叉树 BinNode leaf;
UINT32 reqSize;//请求数据大小 UINT32 reqSize;
} ReqSizeNode; } ReqSizeNode;
#define REQ_SIZE_COUNT 4096 #define REQ_SIZE_COUNT 4096
extern ReqSizeNode g_reqSizeNode[REQ_SIZE_COUNT];//4096个请求大小二叉树节点 extern ReqSizeNode g_reqSizeNode[REQ_SIZE_COUNT];
extern UINT32 g_reqSizeNodeIndex;//请求大小二叉树节点的索引 extern UINT32 g_reqSizeNodeIndex;
extern ReqSizeNode *g_reqSizeRoot;//请求大小二叉树节点的指针 extern ReqSizeNode *g_reqSizeRoot;
//任务编号二叉树节点
typedef struct { typedef struct {
BinNode leaf; BinNode leaf;
UINT32 taskId; UINT32 taskId;
} TaskIDNode; } TaskIDNode;
#define TASK_ID_COUNT 1024//1024个任务编号 #define TASK_ID_COUNT 1024
//将节点插入二叉树的函数
extern UINT32 OsBinTreeInsert(const VOID *node, UINT32 nodeLen, BinNode **leaf, extern UINT32 OsBinTreeInsert(const VOID *node, UINT32 nodeLen, BinNode **leaf,
BinNode *(*GetMyBinNode)(UINT32 *nodeId), BinNode *(*GetMyBinNode)(UINT32 *nodeId),
INT32 (*CompareNode)(const VOID *node1, const VOID *node2)); INT32 (*CompareNode)(const VOID *node1, const VOID *node2));
//比较两个二叉树节点
extern INT32 OsCompareLRNode(const VOID *node1, const VOID *node2); extern INT32 OsCompareLRNode(const VOID *node1, const VOID *node2);
//通过二叉树节点的编号得到二叉树
extern BinNode *OsGetLRBinNode(UINT32 *nodeId); extern BinNode *OsGetLRBinNode(UINT32 *nodeId);
//比较两个地址二叉树节点
extern INT32 OsCompareAddrNode(const VOID *node1, const VOID *node2); extern INT32 OsCompareAddrNode(const VOID *node1, const VOID *node2);
//通过地址二叉树节点的编号得到地址二叉树
extern BinNode *OsGetAddrBinNode(UINT32 *nodeId); extern BinNode *OsGetAddrBinNode(UINT32 *nodeId);
//比较两个请求大小二叉树节点
extern INT32 OsCompareReqSizeNode(const VOID *node1, const VOID *node2); extern INT32 OsCompareReqSizeNode(const VOID *node1, const VOID *node2);
//通过请求大小二叉树节点的编号得到请求大小二叉树
extern BinNode *OsGetReqSizeBinNode(UINT32 *nodeId); extern BinNode *OsGetReqSizeBinNode(UINT32 *nodeId);
//比较两个任务编号二叉树节点
extern INT32 OsCompareTaskIDNode(const VOID *node1, const VOID *node2); extern INT32 OsCompareTaskIDNode(const VOID *node1, const VOID *node2);
//通过任务编号二叉树节点的编号得到任务编号二叉树
extern BinNode *OsGetTaskIDBinNode(UINT32 *nodeId); extern BinNode *OsGetTaskIDBinNode(UINT32 *nodeId);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//用于定义一些错误处理相关的宏和函数。
#ifndef _LOS_ERR_PRI_H #ifndef _LOS_ERR_PRI_H
#define _LOS_ERR_PRI_H #define _LOS_ERR_PRI_H
@ -40,7 +40,6 @@ extern "C" {
#define OS_ERR_MAGIC_WORD 0xa1b2c3f8 #define OS_ERR_MAGIC_WORD 0xa1b2c3f8
/* used to call the error handling function by using an error code and return the same error code. */ /* used to call the error handling function by using an error code and return the same error code. */
//通过调用处理异常的错误码返回错误码
#define OS_RETURN_ERROR(errNo) do { \ #define OS_RETURN_ERROR(errNo) do { \
(VOID)LOS_ErrHandle("os_unspecific_file", OS_ERR_MAGIC_WORD, errNo, 0, NULL); \ (VOID)LOS_ErrHandle("os_unspecific_file", OS_ERR_MAGIC_WORD, errNo, 0, NULL); \
return errNo; \ return errNo; \
@ -50,14 +49,12 @@ extern "C" {
* Call the error handling function by using an error code and the line number of * Call the error handling function by using an error code and the line number of
* the erroneous line, and return the same error code. * the erroneous line, and return the same error code.
*/ */
//通过调用异常发生行的位置返回错误码
#define OS_RETURN_ERROR_P2(errLine, errNo) do { \ #define OS_RETURN_ERROR_P2(errLine, errNo) do { \
(VOID)LOS_ErrHandle("os_unspecific_file", errLine, errNo, 0, NULL); \ (VOID)LOS_ErrHandle("os_unspecific_file", errLine, errNo, 0, NULL); \
return errNo; \ return errNo; \
} while (0) } while (0)
/* Used to call the error handling function by using an error code. */ /* Used to call the error handling function by using an error code. */
//通过错误码进行调用处理异常的函数
#define OS_GOTO_ERR_HANDLER(errorNo) do { \ #define OS_GOTO_ERR_HANDLER(errorNo) do { \
errNo = errorNo; \ errNo = errorNo; \
errLine = OS_ERR_MAGIC_WORD; \ errLine = OS_ERR_MAGIC_WORD; \

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义了一些与事件操作相关的私有函数和结构体。
#ifndef _LOS_EVENT_PRI_H #ifndef _LOS_EVENT_PRI_H
#define _LOS_EVENT_PRI_H #define _LOS_EVENT_PRI_H
@ -38,11 +38,10 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef LOSCFG_COMPAT_POSIX #ifdef LOSCFG_COMPAT_POSIX
//定义时间状态的结构体
typedef struct { typedef struct {
volatile INT32 *realValue;//指向的是一个共享资源的计数器 volatile INT32 *realValue;
INT32 value;//条件变量的值 INT32 value;
UINT32 clearEvent;//需要清除的事件标志 UINT32 clearEvent;
} EventCond; } EventCond;
extern UINT32 OsEventReadWithCond(const EventCond *cond, PEVENT_CB_S eventCB, extern UINT32 OsEventReadWithCond(const EventCond *cond, PEVENT_CB_S eventCB,

@ -25,14 +25,12 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义了一些与异常处理相关的私有函数和宏
//防止同一个头文件被多次包含
#ifndef _LOS_EXC_PRI_H #ifndef _LOS_EXC_PRI_H
#define _LOS_EXC_PRI_H #define _LOS_EXC_PRI_H
#include "los_exc.h" #include "los_exc.h"
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
extern "C" { extern "C" {
@ -40,28 +38,17 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef LOSCFG_SHELL_EXCINFO_DUMP #ifdef LOSCFG_SHELL_EXCINFO_DUMP
//用于设置异常信息读写函数的指针。
extern VOID OsSetExcInfoRW(LogReadWriteFunc func); extern VOID OsSetExcInfoRW(LogReadWriteFunc func);
extern LogReadWriteFunc OsGetExcInfoRW(VOID); extern LogReadWriteFunc OsGetExcInfoRW(VOID);
//用于设置异常信息缓冲区的指针。
extern VOID OsSetExcInfoBuf(CHAR *buf); extern VOID OsSetExcInfoBuf(CHAR *buf);
//用于获取异常信息缓冲区的指针。
extern CHAR *OsGetExcInfoBuf(VOID); extern CHAR *OsGetExcInfoBuf(VOID);
//用于设置异常信息在缓冲区中的偏移量。
extern VOID OsSetExcInfoOffset(UINT32 offset); extern VOID OsSetExcInfoOffset(UINT32 offset);
//用于获取异常信息在缓冲区中的偏移量。
extern UINT32 OsGetExcInfoOffset(VOID); extern UINT32 OsGetExcInfoOffset(VOID);
//用于设置异常信息转储地址。
extern VOID OsSetExcInfoDumpAddr(UINTPTR addr); extern VOID OsSetExcInfoDumpAddr(UINTPTR addr);
//用于获取异常信息转储地址。
extern UINTPTR OsGetExcInfoDumpAddr(VOID); extern UINTPTR OsGetExcInfoDumpAddr(VOID);
//用于设置异常信息的长度。
extern VOID OsSetExcInfoLen(UINT32 len); extern VOID OsSetExcInfoLen(UINT32 len);
//用于获取异常信息的长度。
extern UINT32 OsGetExcInfoLen(VOID); extern UINT32 OsGetExcInfoLen(VOID);
//用于记录异常信息的时间戳。
extern VOID OsRecordExcInfoTime(VOID); extern VOID OsRecordExcInfoTime(VOID);
//用于将格式化的字符串写入异常信息缓冲区。
extern VOID WriteExcBufVa(const CHAR *format, va_list arg); extern VOID WriteExcBufVa(const CHAR *format, va_list arg);
extern VOID WriteExcInfoToBuf(const CHAR *format, ...); extern VOID WriteExcInfoToBuf(const CHAR *format, ...);
#endif #endif

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义了一些与硬件中断处理相关的数据结构和函数接口,用于操作和管理系统中的硬件中断。
#ifndef _LOS_HWI_PRI_H #ifndef _LOS_HWI_PRI_H
#define _LOS_HWI_PRI_H #define _LOS_HWI_PRI_H
@ -67,11 +67,9 @@ typedef struct {
} HwiControllerOps; } HwiControllerOps;
extern const HwiControllerOps *g_hwiOps; extern const HwiControllerOps *g_hwiOps;
//用于初始化硬件中断
extern VOID OsHwiInit(VOID); extern VOID OsHwiInit(VOID);
//用于获取当前中断嵌套的计数值,可以用于检查当前是否处于中断嵌套状态。
extern size_t OsIrqNestingCntGet(VOID); extern size_t OsIrqNestingCntGet(VOID);
//用于设置中断嵌套的计数值。
extern VOID OsIrqNestingCntSet(size_t val); extern VOID OsIrqNestingCntSet(size_t val);
/** /**
@ -79,9 +77,8 @@ extern VOID OsIrqNestingCntSet(size_t val);
* by the kernel. The handleIrq hook function MUST be registered in the interrupt controller driver layer, otherwise it * by the kernel. The handleIrq hook function MUST be registered in the interrupt controller driver layer, otherwise it
* will not respond. eg: Used for arm(cortex-a/r)/arm64. * will not respond. eg: Used for arm(cortex-a/r)/arm64.
*/ */
//一个汇编入口函数由汇编代码在dispatch.S中调用用于统一处理外部中断的入口由内核接管中断处理流程。
extern VOID OsIntEntry(VOID); extern VOID OsIntEntry(VOID);
//根据中断号获取中断处理信息的指针
STATIC INLINE HwiHandleInfo *OsGetHwiForm(UINT32 hwiNum) STATIC INLINE HwiHandleInfo *OsGetHwiForm(UINT32 hwiNum)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->getHandleForm == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->getHandleForm == NULL)) {
@ -89,7 +86,7 @@ STATIC INLINE HwiHandleInfo *OsGetHwiForm(UINT32 hwiNum)
} }
return g_hwiOps->getHandleForm(hwiNum); return g_hwiOps->getHandleForm(hwiNum);
} }
//用于获取指定中断的响应计数值
STATIC INLINE UINT32 OsGetHwiFormCnt(UINT32 hwiNum) STATIC INLINE UINT32 OsGetHwiFormCnt(UINT32 hwiNum)
{ {
HwiHandleInfo *hwiForm = OsGetHwiForm(hwiNum); HwiHandleInfo *hwiForm = OsGetHwiForm(hwiNum);
@ -99,7 +96,7 @@ STATIC INLINE UINT32 OsGetHwiFormCnt(UINT32 hwiNum)
} }
return hwiForm->respCount; return hwiForm->respCount;
} }
//用于获取当前正在处理的中断号。
STATIC INLINE UINT32 OsIntNumGet(VOID) STATIC INLINE UINT32 OsIntNumGet(VOID)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->getCurIrqNum == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->getCurIrqNum == NULL)) {
@ -107,7 +104,7 @@ STATIC INLINE UINT32 OsIntNumGet(VOID)
} }
return g_hwiOps->getCurIrqNum(); return g_hwiOps->getCurIrqNum();
} }
//用于判断指定的中断号是否已经注册了相应的处理函数。
STATIC INLINE BOOL OsIntIsRegisted(UINT32 num) STATIC INLINE BOOL OsIntIsRegisted(UINT32 num)
{ {
HwiHandleInfo *hwiForm = OsGetHwiForm(num); HwiHandleInfo *hwiForm = OsGetHwiForm(num);
@ -121,7 +118,7 @@ STATIC INLINE BOOL OsIntIsRegisted(UINT32 num)
return (hwiForm->hook != NULL); return (hwiForm->hook != NULL);
#endif #endif
} }
//用于获取指定中断的注册参数信息。
STATIC INLINE HWI_ARG_T OsIntGetPara(UINT32 num) STATIC INLINE HWI_ARG_T OsIntGetPara(UINT32 num)
{ {
HwiHandleInfo *hwiForm = OsGetHwiForm(num); HwiHandleInfo *hwiForm = OsGetHwiForm(num);
@ -131,7 +128,7 @@ STATIC INLINE HWI_ARG_T OsIntGetPara(UINT32 num)
} }
return hwiForm->registerInfo; return hwiForm->registerInfo;
} }
//用于获取中断版本信息。
STATIC INLINE CHAR *OsIntVersionGet(VOID) STATIC INLINE CHAR *OsIntVersionGet(VOID)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->getIrqVersion == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->getIrqVersion == NULL)) {
@ -146,7 +143,6 @@ STATIC INLINE CHAR *OsIntVersionGet(VOID)
* handleForm to this interface. * handleForm to this interface.
* eg: Used for arm(cortex-m),xtensa,riscv. * eg: Used for arm(cortex-m),xtensa,riscv.
*/ */
//在中断控制器驱动层实现通用的中断处理入口,用于传递中断号和处理信息给相应的处理函数。
extern VOID OsIntHandle(UINT32 hwiNum, HwiHandleInfo *handleForm); extern VOID OsIntHandle(UINT32 hwiNum, HwiHandleInfo *handleForm);
/** /**
@ -155,7 +151,6 @@ extern VOID OsIntHandle(UINT32 hwiNum, HwiHandleInfo *handleForm);
* HwiControllerOps need to be registered. If this function is not supported, you can call the LOS_Panic interface in * HwiControllerOps need to be registered. If this function is not supported, you can call the LOS_Panic interface in
* the implementation of the stub function to report an error in time. * the implementation of the stub function to report an error in time.
*/ */
//用于注册中断控制器相关的操作函数,需要在中断控制器初始化时被调用。
STATIC INLINE VOID OsHwiControllerReg(const HwiControllerOps *ops) STATIC INLINE VOID OsHwiControllerReg(const HwiControllerOps *ops)
{ {
g_hwiOps = ops; g_hwiOps = ops;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件的作用是定义了与内存池相关的私有函数和数据结构。
#ifndef _LOS_MEMBOX_PRI_H #ifndef _LOS_MEMBOX_PRI_H
#define _LOS_MEMBOX_PRI_H #define _LOS_MEMBOX_PRI_H

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义内存管理的私有接口和数据结构。
#ifndef _LOS_MEMORY_PRI_H #ifndef _LOS_MEMORY_PRI_H
#define _LOS_MEMORY_PRI_H #define _LOS_MEMORY_PRI_H
@ -35,8 +35,6 @@
#include "los_spinlock.h" #include "los_spinlock.h"
#include "los_misc_pri.h" #include "los_misc_pri.h"
//关于内存管理的私有接口声明
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
extern "C" { extern "C" {
@ -62,7 +60,6 @@ typedef struct {
struct LosSlabControlHeader slabCtrlHdr; struct LosSlabControlHeader slabCtrlHdr;
#endif #endif
} LosMemPoolInfo; } LosMemPoolInfo;
//用于描述内存池的信息,包括内存池的起始地址、大小等信息。
#elif defined(LOSCFG_KERNEL_MEM_BESTFIT_LITTLE) #elif defined(LOSCFG_KERNEL_MEM_BESTFIT_LITTLE)
@ -93,7 +90,6 @@ extern SPIN_LOCK_S g_memSpin;
#define MEM_LOCK(state) LOS_SpinLockSave(&g_memSpin, &(state)) #define MEM_LOCK(state) LOS_SpinLockSave(&g_memSpin, &(state))
#define MEM_UNLOCK(state) LOS_SpinUnlockRestore(&g_memSpin, (state)) #define MEM_UNLOCK(state) LOS_SpinUnlockRestore(&g_memSpin, (state))
//用于系统内存的初始化。
extern UINTPTR g_sys_mem_addr_end; extern UINTPTR g_sys_mem_addr_end;
extern UINT32 OsMemSystemInit(UINTPTR memStart); extern UINT32 OsMemSystemInit(UINTPTR memStart);
@ -108,12 +104,11 @@ extern UINT32 OsMemMulPoolInit(VOID *pool, UINT32 size);
extern UINT32 OsMemMulPoolDeinit(const VOID *pool); extern UINT32 OsMemMulPoolDeinit(const VOID *pool);
extern VOID *OsMemMulPoolHeadGet(VOID); extern VOID *OsMemMulPoolHeadGet(VOID);
#else /* LOSCFG_MEM_MUL_POOL */ #else /* LOSCFG_MEM_MUL_POOL */
//用于初始化多内存池,接受内存池的起始地址和大小作为参数。
STATIC INLINE UINT32 OsMemMulPoolInit(VOID *pool, UINT32 size) STATIC INLINE UINT32 OsMemMulPoolInit(VOID *pool, UINT32 size)
{ {
return LOS_OK; return LOS_OK;
} }
//用于反初始化多内存池,接受内存池的指针作为参数。
STATIC INLINE UINT32 OsMemMulPoolDeinit(const VOID *pool) STATIC INLINE UINT32 OsMemMulPoolDeinit(const VOID *pool)
{ {
return LOS_OK; return LOS_OK;
@ -121,21 +116,16 @@ STATIC INLINE UINT32 OsMemMulPoolDeinit(const VOID *pool)
#endif /* LOSCFG_MEM_MUL_POOL */ #endif /* LOSCFG_MEM_MUL_POOL */
#ifdef LOSCFG_EXC_INTERACTION #ifdef LOSCFG_EXC_INTERACTION
//于初始化内存异常交互,接受内存起始地址作为参数。
extern UINT32 OsMemExcInteractionInit(UINTPTR memStart); extern UINT32 OsMemExcInteractionInit(UINTPTR memStart);
#endif #endif
#ifdef LOSCFG_MEM_LEAKCHECK #ifdef LOSCFG_MEM_LEAKCHECK
//用于展示已使用的内存节点信息,接受内存池指针作为参数。
extern VOID OsMemUsedNodeShow(VOID *pool); extern VOID OsMemUsedNodeShow(VOID *pool);
#endif #endif
//用于重置内存池的结束节点,接受内存池指针和前一个地址作为参数。
extern VOID OsMemResetEndNode(VOID *pool, UINTPTR preAddr); extern VOID OsMemResetEndNode(VOID *pool, UINTPTR preAddr);
//用于打印内存信息,接受内存池指针作为参数。
extern VOID OsMemInfoPrint(const VOID *pool); extern VOID OsMemInfoPrint(const VOID *pool);
//用于执行内存检查的 shell 命令,接受命令参数作为输入。
extern UINT32 OsShellCmdMemCheck(INT32 argc, const CHAR *argv[]); extern UINT32 OsShellCmdMemCheck(INT32 argc, const CHAR *argv[]);
//用于执行多重内存完整性检查。
extern VOID OsMemIntegrityMultiCheck(VOID); extern VOID OsMemIntegrityMultiCheck(VOID);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义了一些用于内存统计的数据结构和函数接口,用于跟踪和管理任务使用的内存情况。
#ifndef _LOS_MEMSTAT_PRI_H #ifndef _LOS_MEMSTAT_PRI_H
#define _LOS_MEMSTAT_PRI_H #define _LOS_MEMSTAT_PRI_H
@ -43,22 +43,19 @@ extern "C" {
#ifdef LOSCFG_MEM_TASK_STAT #ifdef LOSCFG_MEM_TASK_STAT
typedef struct { typedef struct {
UINT32 memUsed;//内存使用 UINT32 memUsed;
UINT32 memPeak;//内存峰值 UINT32 memPeak;
} TaskMemUsedInfo; } TaskMemUsedInfo;
typedef struct { typedef struct {
UINT32 memTotalUsed;//内存使用量 UINT32 memTotalUsed;
UINT32 memTotalPeak;//内存使用峰值 UINT32 memTotalPeak;
TaskMemUsedInfo taskMemstats[TASK_NUM];//使用内存的任务列表 TaskMemUsedInfo taskMemstats[TASK_NUM];
} Memstat; } Memstat;
//用于增加任务的内存使用量和峰值。
extern VOID OsMemstatTaskUsedInc(Memstat *stat, UINT32 usedSize, UINT32 taskId); extern VOID OsMemstatTaskUsedInc(Memstat *stat, UINT32 usedSize, UINT32 taskId);
//用于减少任务的内存使用量和峰值。
extern VOID OsMemstatTaskUsedDec(Memstat *stat, UINT32 usedSize, UINT32 taskId); extern VOID OsMemstatTaskUsedDec(Memstat *stat, UINT32 usedSize, UINT32 taskId);
//用于清除任务的内存统计信息。
extern VOID OsMemstatTaskClear(Memstat *stat, UINT32 taskId); extern VOID OsMemstatTaskClear(Memstat *stat, UINT32 taskId);
//用于获取任务的内存使用率。
extern UINT32 OsMemstatTaskUsage(const Memstat *stat, UINT32 taskId); extern UINT32 OsMemstatTaskUsage(const Memstat *stat, UINT32 taskId);
#endif #endif
@ -66,13 +63,9 @@ extern VOID OsMemTaskClear(UINT32 taskId);
extern UINT32 OsMemTaskUsage(UINT32 taskId); extern UINT32 OsMemTaskUsage(UINT32 taskId);
#ifdef LOSCFG_MEM_TASK_STAT #ifdef LOSCFG_MEM_TASK_STAT
//增加任务的内存使用量和峰值。
#define OS_MEM_ADD_USED(stat, usedSize, taskId) OsMemstatTaskUsedInc(stat, usedSize, taskId) #define OS_MEM_ADD_USED(stat, usedSize, taskId) OsMemstatTaskUsedInc(stat, usedSize, taskId)
//减少任务的内存使用量和峰值。
#define OS_MEM_REDUCE_USED(stat, usedSize, taskId) OsMemstatTaskUsedDec(stat, usedSize, taskId) #define OS_MEM_REDUCE_USED(stat, usedSize, taskId) OsMemstatTaskUsedDec(stat, usedSize, taskId)
//清除任务的内存统计信息。
#define OS_MEM_CLEAR(taskId) OsMemTaskClear(taskId) #define OS_MEM_CLEAR(taskId) OsMemTaskClear(taskId)
//获取任务的内存使用率。
#define OS_MEM_USAGE(taskId) OsMemTaskUsage(taskId) #define OS_MEM_USAGE(taskId) OsMemTaskUsage(taskId)
#else #else
#define OS_MEM_ADD_USED(stat, usedSize, taskId) #define OS_MEM_ADD_USED(stat, usedSize, taskId)

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义了一些私有接口和数据结构,主要涉及与内存相关的功能和调试功能。
#ifndef _LOS_MISC_PRI_H #ifndef _LOS_MISC_PRI_H
#define _LOS_MISC_PRI_H #define _LOS_MISC_PRI_H
@ -36,7 +36,7 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//定义了一个用于将指定地址开始的连续内存字节进行转储的函数。可以用于调试和观察内存中的数据。
VOID OsDumpMemByte(size_t length, UINTPTR addr); VOID OsDumpMemByte(size_t length, UINTPTR addr);
#if defined(LOSCFG_DEBUG_SEMAPHORE) || defined(LOSCFG_DEBUG_MUTEX) || defined(LOSCFG_DEBUG_QUEUE) #if defined(LOSCFG_DEBUG_SEMAPHORE) || defined(LOSCFG_DEBUG_MUTEX) || defined(LOSCFG_DEBUG_QUEUE)
@ -48,16 +48,13 @@ typedef struct {
} SortParam; } SortParam;
/* Compare the size of the last access time */ /* Compare the size of the last access time */
//用于排序时比较控制块成员的大小。
typedef BOOL (*OsCompareFunc)(const SortParam *sortParam, UINT32 left, UINT32 right); typedef BOOL (*OsCompareFunc)(const SortParam *sortParam, UINT32 left, UINT32 right);
/* Get the address of the comparison member variable */ /* Get the address of the comparison member variable */
//用于获取控制块成员变量的地址。
#define SORT_ELEM_ADDR(sortParam, index) \ #define SORT_ELEM_ADDR(sortParam, index) \
((sortParam)->buf + ((index) * (sortParam)->ctrlBlockSize) + (sortParam)->sortElemOff) ((sortParam)->buf + ((index) * (sortParam)->ctrlBlockSize) + (sortParam)->sortElemOff)
/* Sort this index array. */ /* Sort this index array. */
//用于对索引数组进行排序。
extern VOID OsArraySort(UINT32 *sortArray, UINT32 start, UINT32 end, const SortParam *sortParam, extern VOID OsArraySort(UINT32 *sortArray, UINT32 start, UINT32 end, const SortParam *sortParam,
OsCompareFunc compareFunc); OsCompareFunc compareFunc);
#endif #endif

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//定义了一些私有接口、数据结构和宏主要涉及多处理器MP相关的功能。
#ifndef _LOS_MP_PRI_H #ifndef _LOS_MP_PRI_H
#define _LOS_MP_PRI_H #define _LOS_MP_PRI_H
@ -56,15 +56,10 @@ typedef enum {
typedef VOID (*SMP_FUNC_CALL)(VOID *args); typedef VOID (*SMP_FUNC_CALL)(VOID *args);
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
//定义了一个用于在多处理器系统中切换调度目标的函数。
extern VOID LOS_MpSchedule(UINT32 target); extern VOID LOS_MpSchedule(UINT32 target);
//定义了一个用于处理多处理器唤醒事件的函数。
extern VOID OsMpWakeHandler(VOID); extern VOID OsMpWakeHandler(VOID);
//定义了一个用于处理多处理器调度事件的函数。
extern VOID OsMpScheduleHandler(VOID); extern VOID OsMpScheduleHandler(VOID);
//定义了一个用于处理多处理器停机事件的函数。
extern VOID OsMpHaltHandler(VOID); extern VOID OsMpHaltHandler(VOID);
//定义了一个用于初始化多处理器相关功能的函数。
extern UINT32 OsMpInit(VOID); extern UINT32 OsMpInit(VOID);
#else #else
STATIC INLINE VOID LOS_MpSchedule(UINT32 target) STATIC INLINE VOID LOS_MpSchedule(UINT32 target)
@ -74,7 +69,7 @@ STATIC INLINE VOID LOS_MpSchedule(UINT32 target)
#endif #endif
#ifdef LOSCFG_KERNEL_SMP_CALL #ifdef LOSCFG_KERNEL_SMP_CALL
//用于在目标 CPU 上调用函数
typedef struct { typedef struct {
LOS_DL_LIST node; LOS_DL_LIST node;
SMP_FUNC_CALL func; SMP_FUNC_CALL func;
@ -87,7 +82,6 @@ typedef struct {
extern VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args); extern VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args);
extern VOID OsMpFuncCallHandler(VOID); extern VOID OsMpFuncCallHandler(VOID);
#else #else
//用于处理多处理器函数调用事件。
STATIC INLINE VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args) STATIC INLINE VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args)
{ {
(VOID)target; (VOID)target;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件定义了一个多重双向链表头的私有接口和数据结构。
#ifndef _LOS_MULTIPLE_DLINK_HEAD_PRI_H #ifndef _LOS_MULTIPLE_DLINK_HEAD_PRI_H
#define _LOS_MULTIPLE_DLINK_HEAD_PRI_H #define _LOS_MULTIPLE_DLINK_HEAD_PRI_H
@ -37,30 +37,25 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//表示最大的多重双向链表的大小的对数值。
#define OS_MAX_MULTI_DLNK_LOG2 29 #define OS_MAX_MULTI_DLNK_LOG2 29
//表示最小的多重双向链表的大小的对数值。
#define OS_MIN_MULTI_DLNK_LOG2 4 #define OS_MIN_MULTI_DLNK_LOG2 4
//表示多重双向链表的数量,通过最大和最小的对数值计算得到。
#define OS_MULTI_DLNK_NUM ((OS_MAX_MULTI_DLNK_LOG2 - OS_MIN_MULTI_DLNK_LOG2) + 1) #define OS_MULTI_DLNK_NUM ((OS_MAX_MULTI_DLNK_LOG2 - OS_MIN_MULTI_DLNK_LOG2) + 1)
//表示多重双向链表头的大小。
#define OS_DLNK_HEAD_SIZE OS_MULTI_DLNK_HEAD_SIZE #define OS_DLNK_HEAD_SIZE OS_MULTI_DLNK_HEAD_SIZE
//表示多重双向链表头结构体的大小。
#define OS_MULTI_DLNK_HEAD_SIZE sizeof(LosMultipleDlinkHead) #define OS_MULTI_DLNK_HEAD_SIZE sizeof(LosMultipleDlinkHead)
//用于存储多重双向链表的头指针数组。
typedef struct { typedef struct {
LOS_DL_LIST listHead[OS_MULTI_DLNK_NUM]; LOS_DL_LIST listHead[OS_MULTI_DLNK_NUM];
} LosMultipleDlinkHead; } LosMultipleDlinkHead;
//根据给定的头地址和链表节点头指针,返回下一个多重链表的头指针。
STATIC INLINE LOS_DL_LIST *OsDLnkNextMultiHead(VOID *headAddr, LOS_DL_LIST *listNodeHead) STATIC INLINE LOS_DL_LIST *OsDLnkNextMultiHead(VOID *headAddr, LOS_DL_LIST *listNodeHead)
{ {
LosMultipleDlinkHead *head = (LosMultipleDlinkHead *)headAddr; LosMultipleDlinkHead *head = (LosMultipleDlinkHead *)headAddr;
return (&head->listHead[OS_MULTI_DLNK_NUM - 1] == listNodeHead) ? NULL : (listNodeHead + 1); return (&head->listHead[OS_MULTI_DLNK_NUM - 1] == listNodeHead) ? NULL : (listNodeHead + 1);
} }
//对给定的头地址进行初始化,将多重双向链表的头指针数组中的所有指针置为 NULL。
extern VOID OsDLnkInitMultiHead(VOID *headAddr); extern VOID OsDLnkInitMultiHead(VOID *headAddr);
//根据给定的头地址和大小,返回对应的多重双向链表的头指针。
extern LOS_DL_LIST *OsDLnkMultiHead(VOID *headAddr, UINT32 size); extern LOS_DL_LIST *OsDLnkMultiHead(VOID *headAddr, UINT32 size);
#ifdef __cplusplus #ifdef __cplusplus

@ -26,9 +26,6 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这个头文件定义了一些用于互斥锁mutex调试的接口和函数包括死锁检测、互斥锁状态跟踪、互斥锁泄漏检查等。
使*/
#ifndef _LOS_MUX_DEBUG_PRI_H #ifndef _LOS_MUX_DEBUG_PRI_H
#define _LOS_MUX_DEBUG_PRI_H #define _LOS_MUX_DEBUG_PRI_H
@ -38,7 +35,7 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//初始化死锁检测机制
/* Deadlock detection initialization interface */ /* Deadlock detection initialization interface */
extern UINT32 OsMuxDlockCheckInit(VOID); extern UINT32 OsMuxDlockCheckInit(VOID);
STATIC INLINE UINT32 OsMuxDlockCheckInitHook(VOID) STATIC INLINE UINT32 OsMuxDlockCheckInitHook(VOID)
@ -49,7 +46,7 @@ STATIC INLINE UINT32 OsMuxDlockCheckInitHook(VOID)
return LOS_OK; return LOS_OK;
#endif #endif
} }
//向死锁检测机制中添加任务持有的互斥锁信息
/* Add holding mutex lock node information */ /* Add holding mutex lock node information */
extern VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB); extern VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB);
STATIC INLINE VOID OsMuxDlockNodeInsertHook(UINT32 taskId, VOID *muxCB) STATIC INLINE VOID OsMuxDlockNodeInsertHook(UINT32 taskId, VOID *muxCB)
@ -58,7 +55,6 @@ STATIC INLINE VOID OsMuxDlockNodeInsertHook(UINT32 taskId, VOID *muxCB)
OsMuxDlockNodeInsert(taskId, muxCB); OsMuxDlockNodeInsert(taskId, muxCB);
#endif #endif
} }
//从死锁检测机制中删除任务持有的互斥锁信息
/* Delete holding mutex lock node information */ /* Delete holding mutex lock node information */
extern VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB); extern VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB);
STATIC INLINE VOID OsMuxDlockNodeDeleteHook(UINT32 taskId, const VOID *muxCB) STATIC INLINE VOID OsMuxDlockNodeDeleteHook(UINT32 taskId, const VOID *muxCB)
@ -67,7 +63,6 @@ STATIC INLINE VOID OsMuxDlockNodeDeleteHook(UINT32 taskId, const VOID *muxCB)
OsMuxDlockNodeDelete(taskId, muxCB); OsMuxDlockNodeDelete(taskId, muxCB);
#endif #endif
} }
//更新任务最后执行的时间
/* Update the last time the task was executed */ /* Update the last time the task was executed */
extern VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount); extern VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount);
STATIC INLINE VOID OsTaskTimeUpdateHook(UINT32 taskId, UINT64 tickCount) STATIC INLINE VOID OsTaskTimeUpdateHook(UINT32 taskId, UINT64 tickCount)
@ -76,7 +71,7 @@ STATIC INLINE VOID OsTaskTimeUpdateHook(UINT32 taskId, UINT64 tickCount)
OsTaskTimeUpdate(taskId, tickCount); OsTaskTimeUpdate(taskId, tickCount);
#endif #endif
} }
//初始化互斥锁状态跟踪机制
/* mutex debug initialization interface */ /* mutex debug initialization interface */
extern UINT32 OsMuxDbgInit(VOID); extern UINT32 OsMuxDbgInit(VOID);
STATIC INLINE UINT32 OsMuxDbgInitHook(VOID) STATIC INLINE UINT32 OsMuxDbgInitHook(VOID)
@ -87,7 +82,6 @@ STATIC INLINE UINT32 OsMuxDbgInitHook(VOID)
return LOS_OK; return LOS_OK;
#endif #endif
} }
//更新互斥锁最后执行的时间
/* Update the last time the mutex was executed */ /* Update the last time the mutex was executed */
extern VOID OsMuxDbgTimeUpdate(UINT32 muxId); extern VOID OsMuxDbgTimeUpdate(UINT32 muxId);
STATIC INLINE VOID OsMuxDbgTimeUpdateHook(UINT32 muxId) STATIC INLINE VOID OsMuxDbgTimeUpdateHook(UINT32 muxId)
@ -96,7 +90,6 @@ STATIC INLINE VOID OsMuxDbgTimeUpdateHook(UINT32 muxId)
OsMuxDbgTimeUpdate(muxId); OsMuxDbgTimeUpdate(muxId);
#endif #endif
} }
//在创建或删除互斥锁时更新互斥锁的状态跟踪信息
/* Update the MUX_DEBUG_CB of the mutex when created or deleted */ /* Update the MUX_DEBUG_CB of the mutex when created or deleted */
extern VOID OsMuxDbgUpdate(UINT32 muxID, TSK_ENTRY_FUNC creator); extern VOID OsMuxDbgUpdate(UINT32 muxID, TSK_ENTRY_FUNC creator);
STATIC INLINE VOID OsMuxDbgUpdateHook(UINT32 muxId, TSK_ENTRY_FUNC creator) STATIC INLINE VOID OsMuxDbgUpdateHook(UINT32 muxId, TSK_ENTRY_FUNC creator)
@ -105,7 +98,6 @@ STATIC INLINE VOID OsMuxDbgUpdateHook(UINT32 muxId, TSK_ENTRY_FUNC creator)
OsMuxDbgUpdate(muxId, creator); OsMuxDbgUpdate(muxId, creator);
#endif #endif
} }
//检查互斥锁是否泄漏
/* check the leak of mutex */ /* check the leak of mutex */
extern VOID OsMutexCheck(VOID); extern VOID OsMutexCheck(VOID);
STATIC INLINE VOID OsMutexCheckHook(VOID) STATIC INLINE VOID OsMutexCheckHook(VOID)

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//一个关于互斥锁的内部实现的头文件
#ifndef _LOS_MUX_PRI_H #ifndef _LOS_MUX_PRI_H
#define _LOS_MUX_PRI_H #define _LOS_MUX_PRI_H
@ -45,13 +45,12 @@ extern "C" {
* Mutex base object must be the same as the first three member names of LosMuxCB, * Mutex base object must be the same as the first three member names of LosMuxCB,
* so that pthread_mutex_t can share the kernel mutex mechanism. * so that pthread_mutex_t can share the kernel mutex mechanism.
*/ */
//这是互斥锁的基本控制块,包含了互斥锁的一些基本信息
typedef struct { typedef struct {
LOS_DL_LIST muxList;//连接列表 /* Mutex linked list */ LOS_DL_LIST muxList; /* Mutex linked list */
LosTaskCB *owner; //互斥锁的拥有者 /* The current thread that is locking a mutex */ LosTaskCB *owner; /* The current thread that is locking a mutex */
UINT16 muxCount; //被锁定的次数 /* Times of locking a mutex */ UINT16 muxCount; /* Times of locking a mutex */
} MuxBaseCB; } MuxBaseCB;
//这是互斥锁的控制块,包含了更多的互斥锁信息
typedef struct { typedef struct {
LOS_DL_LIST muxList; /* Mutex linked list */ LOS_DL_LIST muxList; /* Mutex linked list */
LosTaskCB *owner; /* The current thread that is locking a mutex */ LosTaskCB *owner; /* The current thread that is locking a mutex */
@ -61,29 +60,21 @@ typedef struct {
} LosMuxCB; } LosMuxCB;
/* Mutex global array address, which can be obtained by using a handle ID. */ /* Mutex global array address, which can be obtained by using a handle ID. */
//全局变量:这是一个互斥锁的全局数组地址,可以通过互斥锁的 ID 来获取对应的互斥锁对象。
extern LosMuxCB *g_allMux; extern LosMuxCB *g_allMux;
/* COUNT | INDEX split bit */ /* COUNT | INDEX split bit */
#define MUX_SPLIT_BIT 16 #define MUX_SPLIT_BIT 16
/* Set the mutex id */ /* Set the mutex id */
//设置互斥锁的 ID
#define SET_MUX_ID(count, muxId) (((count) << MUX_SPLIT_BIT) | (muxId)) #define SET_MUX_ID(count, muxId) (((count) << MUX_SPLIT_BIT) | (muxId))
//根据互斥锁的 ID 获取索引
#define GET_MUX_INDEX(muxId) ((muxId) & ((1U << MUX_SPLIT_BIT) - 1)) #define GET_MUX_INDEX(muxId) ((muxId) & ((1U << MUX_SPLIT_BIT) - 1))
//根据互斥锁的 ID 获取计数值
#define GET_MUX_COUNT(muxId) ((muxId) >> MUX_SPLIT_BIT) #define GET_MUX_COUNT(muxId) ((muxId) >> MUX_SPLIT_BIT)
/* Obtain the pointer to a mutex object of the mutex that has a specified handle. */ /* Obtain the pointer to a mutex object of the mutex that has a specified handle. */
//根据互斥锁的 ID 获取对应的互斥锁对象指针
#define GET_MUX(muxId) (((LosMuxCB *)g_allMux) + GET_MUX_INDEX(muxId)) #define GET_MUX(muxId) (((LosMuxCB *)g_allMux) + GET_MUX_INDEX(muxId))
//初始化互斥锁
extern UINT32 OsMuxInit(VOID); extern UINT32 OsMuxInit(VOID);
//执行互斥锁的等待操作
extern UINT32 OsMuxPendOp(LosTaskCB *runTask, MuxBaseCB *muxPended, UINT32 timeout, UINT32 *intSave); extern UINT32 OsMuxPendOp(LosTaskCB *runTask, MuxBaseCB *muxPended, UINT32 timeout, UINT32 *intSave);
//执行互斥锁的释放操作
extern UINT32 OsMuxPostOp(LosTaskCB *runTask, MuxBaseCB *muxPosted); extern UINT32 OsMuxPostOp(LosTaskCB *runTask, MuxBaseCB *muxPosted);
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件定义了关于每个CPU的私有数据结构这个结构体存储了与每个 CPU 相关的一些信息。
#ifndef _LOS_PERCPU_PRI_H #ifndef _LOS_PERCPU_PRI_H
#define _LOS_PERCPU_PRI_H #define _LOS_PERCPU_PRI_H
@ -47,34 +47,35 @@ typedef enum {
CPU_EXC /* cpu in the exc */ CPU_EXC /* cpu in the exc */
} ExcFlag; } ExcFlag;
#endif #endif
//排序链表的属性结构体,用于表示任务链表和软件定时器链表
typedef struct { typedef struct {
SortLinkAttribute taskSortLink; /* task sort link */ SortLinkAttribute taskSortLink; /* task sort link */
#ifdef LOSCFG_BASE_CORE_SWTMR #ifdef LOSCFG_BASE_CORE_SWTMR
SortLinkAttribute swtmrSortLink; /* swtmr sort link */ SortLinkAttribute swtmrSortLink; /* swtmr sort link */
#endif #endif
UINT32 idleTaskId;//空闲任务的任务 ID /* idle task id */ UINT32 idleTaskId; /* idle task id */
UINT32 taskLockCnt;//任务锁计数,用于标记任务是否被锁定 /* task lock flag */ UINT32 taskLockCnt; /* task lock flag */
UINT32 swtmrHandlerQueue;//软件定时器的超时队列 ID /* software timer timeout queue id */ UINT32 swtmrHandlerQueue; /* software timer timeout queue id */
UINT32 swtmrTaskId;//软件定时器任务的 ID /* software timer task id */ UINT32 swtmrTaskId; /* software timer task id */
UINT32 schedFlag;//调度标志,用于表示是否需要进行调度 /* pending scheduler flag */
UINT32 schedFlag; /* pending scheduler flag */
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
UINT32 excFlag;//CPU 异常标志,用于表示 CPU 的运行状态,包括运行、休眠和异常状态 /* cpu halt or exc flag */ UINT32 excFlag; /* cpu halt or exc flag */
#ifdef LOSCFG_KERNEL_SMP_CALL #ifdef LOSCFG_KERNEL_SMP_CALL
LOS_DL_LIST funcLink;//多处理器函数调用链表,用于多处理器间的函数调用 /* mp function call link */ LOS_DL_LIST funcLink; /* mp function call link */
#endif #endif
#endif #endif
} Percpu; } Percpu;
/* the kernel per-cpu structure */ /* the kernel per-cpu structure */
extern Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM]; extern Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM];
//用于获取当前CPU
STATIC INLINE Percpu *OsPercpuGet(VOID) STATIC INLINE Percpu *OsPercpuGet(VOID)
{ {
return &g_percpu[ArchCurrCpuid()]; return &g_percpu[ArchCurrCpuid()];
} }
//用于获取指定CPU的Percpu结构体指针
STATIC INLINE Percpu *OsPercpuGetByID(UINT32 cpuid) STATIC INLINE Percpu *OsPercpuGetByID(UINT32 cpuid)
{ {
return &g_percpu[cpuid]; return &g_percpu[cpuid];

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//关于打印函数的私有头文件
#ifndef _LOS_PRINTF_PRI_H #ifndef _LOS_PRINTF_PRI_H
#define _LOS_PRINTF_PRI_H #define _LOS_PRINTF_PRI_H
@ -36,16 +36,13 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//在控制台上打印格式化字符串
extern VOID ConsoleVprintf(const CHAR *fmt, va_list ap); extern VOID ConsoleVprintf(const CHAR *fmt, va_list ap);
//在串口上打印格式化字符串
extern VOID UartVprintf(const CHAR *fmt, va_list ap); extern VOID UartVprintf(const CHAR *fmt, va_list ap);
//打印异常信息
extern VOID PrintExcInfo(const CHAR *fmt, ...); extern VOID PrintExcInfo(const CHAR *fmt, ...);
//打印内核调试信息
extern VOID LkDprintf(const CHAR *fmt, va_list ap); extern VOID LkDprintf(const CHAR *fmt, va_list ap);
#ifdef LOSCFG_SHELL_DMESG #ifdef LOSCFG_SHELL_DMESG
//打印系统日志信息
extern VOID DmesgPrintf(const CHAR *fmt, va_list ap); extern VOID DmesgPrintf(const CHAR *fmt, va_list ap);
#endif #endif

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这个头文件定义了优先级队列的相关操作函数,
*/
#ifndef _LOS_PRIQUEUE_PRI_H #ifndef _LOS_PRIQUEUE_PRI_H
#define _LOS_PRIQUEUE_PRI_H #define _LOS_PRIQUEUE_PRI_H
@ -58,7 +57,6 @@ extern "C" {
* @see none. * @see none.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
//初始化优先级队列
extern UINT32 OsPriQueueInit(VOID); extern UINT32 OsPriQueueInit(VOID);
/** /**
@ -81,7 +79,6 @@ extern UINT32 OsPriQueueInit(VOID);
* @see OsPriQueueDequeue. * @see OsPriQueueDequeue.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
//根据项目的优先级将项目插入到优先级队列中
extern VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority); extern VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority);
/** /**
@ -102,7 +99,6 @@ extern VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority);
* @see OsPriQueueEnqueue. * @see OsPriQueueEnqueue.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
//从优先级队列中删除一个项目
extern VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem); extern VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem);
/** /**
@ -124,7 +120,6 @@ extern VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem);
* @see none. * @see none.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
//获取优先级队列中具有最高优先级的项目
extern LOS_DL_LIST *OsPriQueueTop(VOID); extern LOS_DL_LIST *OsPriQueueTop(VOID);
/** /**
@ -145,7 +140,6 @@ extern LOS_DL_LIST *OsPriQueueTop(VOID);
* @see none. * @see none.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
//获取具有指定优先级的项目数量
extern UINT32 OsPriQueueSize(UINT32 priority); extern UINT32 OsPriQueueSize(UINT32 priority);
/** /**
@ -165,7 +159,6 @@ extern UINT32 OsPriQueueSize(UINT32 priority);
* @see none. * @see none.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
//获取优先级队列中项目的总数
extern UINT32 OsPriQueueTotalSize(VOID); extern UINT32 OsPriQueueTotalSize(VOID);
/** /**
@ -188,7 +181,6 @@ extern UINT32 OsPriQueueTotalSize(VOID);
* @see OsPriQueueDequeue. * @see OsPriQueueDequeue.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
//根据项目的优先级将项目插入到优先级队列的头部
extern VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority); extern VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件提供了针对队列调试的相关函数声明
#ifndef _LOS_QUEUE_DEBUG_PRI_H #ifndef _LOS_QUEUE_DEBUG_PRI_H
#define _LOS_QUEUE_DEBUG_PRI_H #define _LOS_QUEUE_DEBUG_PRI_H
@ -40,9 +40,7 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* queue debug initialization interface */ /* queue debug initialization interface */
//队列调试初始化接口
extern UINT32 OsQueueDbgInit(VOID); extern UINT32 OsQueueDbgInit(VOID);
//队列调试初始化的钩子函数根据配置是否开启队列调试功能来调用OsQueueDbgInit
STATIC INLINE UINT32 OsQueueDbgInitHook(VOID) STATIC INLINE UINT32 OsQueueDbgInitHook(VOID)
{ {
#ifdef LOSCFG_DEBUG_QUEUE #ifdef LOSCFG_DEBUG_QUEUE
@ -52,9 +50,7 @@ STATIC INLINE UINT32 OsQueueDbgInitHook(VOID)
#endif #endif
} }
/* Update the last time the queue was executed */ /* Update the last time the queue was executed */
//更新队列上次执行的时间
extern VOID OsQueueDbgTimeUpdate(UINT32 queueId); extern VOID OsQueueDbgTimeUpdate(UINT32 queueId);
//更新队列执行时间的钩子函数
STATIC INLINE VOID OsQueueDbgTimeUpdateHook(UINT32 queueId) STATIC INLINE VOID OsQueueDbgTimeUpdateHook(UINT32 queueId)
{ {
#ifdef LOSCFG_DEBUG_QUEUE #ifdef LOSCFG_DEBUG_QUEUE
@ -62,9 +58,7 @@ STATIC INLINE VOID OsQueueDbgTimeUpdateHook(UINT32 queueId)
#endif #endif
} }
/* Update the task entry of the queue debug info when created or deleted */ /* Update the task entry of the queue debug info when created or deleted */
//当队列被创建或删除时,更新队列调试信息中的任务入口信息
extern VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry); extern VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry);
//新队列调试信息的钩子函数
STATIC INLINE VOID OsQueueDbgUpdateHook(UINT32 queueId, TSK_ENTRY_FUNC entry) STATIC INLINE VOID OsQueueDbgUpdateHook(UINT32 queueId, TSK_ENTRY_FUNC entry)
{ {
#ifdef LOSCFG_DEBUG_QUEUE #ifdef LOSCFG_DEBUG_QUEUE
@ -72,9 +66,7 @@ STATIC INLINE VOID OsQueueDbgUpdateHook(UINT32 queueId, TSK_ENTRY_FUNC entry)
#endif #endif
} }
/* check the leak of queue */ /* check the leak of queue */
//检查队列内存泄漏
extern VOID OsQueueCheck(VOID); extern VOID OsQueueCheck(VOID);
//检查队列内存泄漏的钩子函数
STATIC INLINE VOID OsQueueCheckHook(VOID) STATIC INLINE VOID OsQueueCheckHook(VOID)
{ {
#ifdef LOSCFG_DEBUG_QUEUE #ifdef LOSCFG_DEBUG_QUEUE

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件定义了私有队列相关的一些结构体、宏和函数声明
#ifndef _LOS_QUEUE_PRI_H #ifndef _LOS_QUEUE_PRI_H
#define _LOS_QUEUE_PRI_H #define _LOS_QUEUE_PRI_H
@ -42,12 +42,12 @@ typedef enum {
OS_QUEUE_WRITE = 1, OS_QUEUE_WRITE = 1,
OS_QUEUE_N_RW = 2 OS_QUEUE_N_RW = 2
} QueueReadWrite; } QueueReadWrite;
//枚举类型,分别表示队列的读写操作和队列头尾操作
typedef enum { typedef enum {
OS_QUEUE_HEAD = 0, OS_QUEUE_HEAD = 0,
OS_QUEUE_TAIL = 1 OS_QUEUE_TAIL = 1
} QueueHeadTail; } QueueHeadTail;
//用于生成或获取队列操作类型和读写类型
#define OS_QUEUE_OPERATE_TYPE(ReadOrWrite, HeadOrTail) (((UINT32)(HeadOrTail) << 1) | (ReadOrWrite)) #define OS_QUEUE_OPERATE_TYPE(ReadOrWrite, HeadOrTail) (((UINT32)(HeadOrTail) << 1) | (ReadOrWrite))
#define OS_QUEUE_READ_WRITE_GET(type) ((type) & 0x01U) #define OS_QUEUE_READ_WRITE_GET(type) ((type) & 0x01U)
#define OS_QUEUE_READ_HEAD (OS_QUEUE_READ | (OS_QUEUE_HEAD << 1)) #define OS_QUEUE_READ_HEAD (OS_QUEUE_READ | (OS_QUEUE_HEAD << 1))
@ -73,7 +73,6 @@ typedef enum {
#define GET_QUEUE_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosQueueCB, readWriteList[OS_QUEUE_WRITE]) #define GET_QUEUE_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosQueueCB, readWriteList[OS_QUEUE_WRITE])
/* Queue information block structure */ /* Queue information block structure */
//队列信息块结构体,包含了队列的各种属性和状态信息
typedef struct { typedef struct {
UINT8 *queueHandle; /* Pointer to a queue handle */ UINT8 *queueHandle; /* Pointer to a queue handle */
UINT8 queueState; /* state */ UINT8 queueState; /* state */
@ -89,16 +88,12 @@ typedef struct {
} LosQueueCB; } LosQueueCB;
/* Queue information control block */ /* Queue information control block */
//全局变量,指向所有队列信息块的起始地址
extern LosQueueCB *g_allQueue; extern LosQueueCB *g_allQueue;
/* alloc a stationary memory for a mail according to queueId */ /* alloc a stationary memory for a mail according to queueId */
//用于在指定的内存池中为邮件分配内存
extern VOID *OsQueueMailAlloc(UINT32 queueId, VOID *mailPool, UINT32 timeout); extern VOID *OsQueueMailAlloc(UINT32 queueId, VOID *mailPool, UINT32 timeout);
/* free a stationary memory for a mail according to queueId. */ /* free a stationary memory for a mail according to queueId. */
//释放邮件占用的内存
extern UINT32 OsQueueMailFree(UINT32 queueId, VOID *mailPool, VOID *mailMem); extern UINT32 OsQueueMailFree(UINT32 queueId, VOID *mailPool, VOID *mailMem);
//列初始化函数,用于初始化队列池
extern UINT32 OsQueueInit(VOID); extern UINT32 OsQueueInit(VOID);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件定义了调度器相关的一些结构体和函数声明
#ifndef __LOS_SCHED_DEBUG_PRI_H #ifndef __LOS_SCHED_DEBUG_PRI_H
#define __LOS_SCHED_DEBUG_PRI_H #define __LOS_SCHED_DEBUG_PRI_H
@ -34,19 +34,19 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//表示单个CPU的运行时间和上下文切换次数
typedef struct { typedef struct {
UINT64 runtime; UINT64 runtime;
UINT32 contexSwitch; UINT32 contexSwitch;
} SchedPercpu; } SchedPercpu;
//表示整个系统的调度统计信息
typedef struct { typedef struct {
UINT64 startRuntime;//开始运行的时间 UINT64 startRuntime;
UINT64 allRuntime;//所有CPU的总共运行时间 UINT64 allRuntime;
UINT32 allContextSwitch;//上下文切换次数 UINT32 allContextSwitch;
SchedPercpu schedPercpu[LOSCFG_KERNEL_CORE_NUM];//每个CPU的具体情况 SchedPercpu schedPercpu[LOSCFG_KERNEL_CORE_NUM];
} SchedStat; } SchedStat;
//用于统计中断处理的时间和次数
extern VOID OsHwiStatistics(size_t intNum); extern VOID OsHwiStatistics(size_t intNum);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件定义了调度器相关的一些结构体和函数声明
#ifndef _LOS_SCHED_PRI_H #ifndef _LOS_SCHED_PRI_H
#define _LOS_SCHED_PRI_H #define _LOS_SCHED_PRI_H
@ -37,22 +37,21 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//表示任务调度标志位每个位代表一个核心用于防止在OSStartToRun之前进行内核调度
extern UINT32 g_taskScheduled; extern UINT32 g_taskScheduled;
/* /*
* Schedule flag, one bit represents one core. * Schedule flag, one bit represents one core.
* This flag is used to prevent kernel scheduling before OSStartToRun. * This flag is used to prevent kernel scheduling before OSStartToRun.
*/ */
//设置对应核心的调度标志位
#define OS_SCHEDULER_SET(cpuid) do { \ #define OS_SCHEDULER_SET(cpuid) do { \
g_taskScheduled |= (1U << (cpuid)); \ g_taskScheduled |= (1U << (cpuid)); \
} while (0); } while (0);
//清除对应核心的调度标志位
#define OS_SCHEDULER_CLR(cpuid) do { \ #define OS_SCHEDULER_CLR(cpuid) do { \
g_taskScheduled &= ~(1U << (cpuid)); \ g_taskScheduled &= ~(1U << (cpuid)); \
} while (0); } while (0);
//判断当前核心的调度标志位是否激活
#define OS_SCHEDULER_ACTIVE (g_taskScheduled & (1U << ArchCurrCpuid())) #define OS_SCHEDULER_ACTIVE (g_taskScheduled & (1U << ArchCurrCpuid()))
typedef enum { typedef enum {
@ -61,7 +60,6 @@ typedef enum {
} SchedFlag; } SchedFlag;
/* Check if preemptable with counter flag */ /* Check if preemptable with counter flag */
//用于判断当前任务是否可以被抢占
STATIC INLINE BOOL OsPreemptable(VOID) STATIC INLINE BOOL OsPreemptable(VOID)
{ {
/* /*
@ -78,7 +76,7 @@ STATIC INLINE BOOL OsPreemptable(VOID)
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
return preemptable; return preemptable;
} }
//用于判断当前任务是否可以在调度过程中被抢占
STATIC INLINE BOOL OsPreemptableInSched(VOID) STATIC INLINE BOOL OsPreemptableInSched(VOID)
{ {
BOOL preemptable = FALSE; BOOL preemptable = FALSE;
@ -106,7 +104,6 @@ STATIC INLINE BOOL OsPreemptableInSched(VOID)
* Current task needs to already be in the right state or the right * Current task needs to already be in the right state or the right
* queues it needs to be in. * queues it needs to be in.
*/ */
//选择下一个任务并切换到它
extern VOID OsSchedResched(VOID); extern VOID OsSchedResched(VOID);
/* /*
@ -114,14 +111,12 @@ extern VOID OsSchedResched(VOID);
* try to do the schedule. However, the schedule won't be definitely * try to do the schedule. However, the schedule won't be definitely
* taken place while there're no other higher priority tasks or locked. * taken place while there're no other higher priority tasks or locked.
*/ */
//将当前任务放回就绪队列,并尝试进行调度
extern VOID OsSchedPreempt(VOID); extern VOID OsSchedPreempt(VOID);
/* /*
* Just like OsSchedPreempt, except this function will do the OS_INT_ACTIVE * Just like OsSchedPreempt, except this function will do the OS_INT_ACTIVE
* check, in case the schedule taken place in the middle of an interrupt. * check, in case the schedule taken place in the middle of an interrupt.
*/ */
//触发调度,如果在中断中则设置调度标志位
STATIC INLINE VOID LOS_Schedule(VOID) STATIC INLINE VOID LOS_Schedule(VOID)
{ {
if (OS_INT_ACTIVE) { if (OS_INT_ACTIVE) {
@ -143,7 +138,6 @@ STATIC INLINE VOID LOS_Schedule(VOID)
* This API is used to check time slices. If the number of Ticks equals to the time for task switch, * This API is used to check time slices. If the number of Ticks equals to the time for task switch,
* tasks are switched. Otherwise, the Tick counting continues. * tasks are switched. Otherwise, the Tick counting continues.
*/ */
//检查时间片,如果满足任务切换的条件则进行切换
extern VOID OsTimesliceCheck(VOID); extern VOID OsTimesliceCheck(VOID);
#endif #endif

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件定义了一些用于调试信号量的接口和函数声明
#ifndef _LOS_SEM_DEBUG_PRI_H #ifndef _LOS_SEM_DEBUG_PRI_H
#define _LOS_SEM_DEBUG_PRI_H #define _LOS_SEM_DEBUG_PRI_H
@ -39,9 +39,7 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* semaphore debug initialization interface */ /* semaphore debug initialization interface */
//信号量调试初始化接口
extern UINT32 OsSemDbgInit(VOID); extern UINT32 OsSemDbgInit(VOID);
//更新信号量最后一次执行的时间
STATIC INLINE UINT32 OsSemDbgInitHook(VOID) STATIC INLINE UINT32 OsSemDbgInitHook(VOID)
{ {
#ifdef LOSCFG_DEBUG_SEMAPHORE #ifdef LOSCFG_DEBUG_SEMAPHORE
@ -51,7 +49,6 @@ STATIC INLINE UINT32 OsSemDbgInitHook(VOID)
#endif #endif
} }
/* Update the last time the semaphore was executed */ /* Update the last time the semaphore was executed */
//更新信号量最后一次执行的时间
extern VOID OsSemDbgTimeUpdate(UINT32 semId); extern VOID OsSemDbgTimeUpdate(UINT32 semId);
STATIC INLINE VOID OsSemDbgTimeUpdateHook(UINT32 semId) STATIC INLINE VOID OsSemDbgTimeUpdateHook(UINT32 semId)
{ {
@ -61,7 +58,6 @@ STATIC INLINE VOID OsSemDbgTimeUpdateHook(UINT32 semId)
return; return;
} }
/* Update the SEM_DEBUG_CB of the semaphore when created or deleted */ /* Update the SEM_DEBUG_CB of the semaphore when created or deleted */
//在创建或删除信号量时更新SEM_DEBUG_CB的信息
extern VOID OsSemDbgUpdate(UINT32 semID, TSK_ENTRY_FUNC creator, UINT16 count); extern VOID OsSemDbgUpdate(UINT32 semID, TSK_ENTRY_FUNC creator, UINT16 count);
STATIC INLINE VOID OsSemDbgUpdateHook(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) STATIC INLINE VOID OsSemDbgUpdateHook(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count)
{ {
@ -71,7 +67,6 @@ STATIC INLINE VOID OsSemDbgUpdateHook(UINT32 semId, TSK_ENTRY_FUNC creator, UINT
return; return;
} }
/* get the full data of SEM_DFX_CB */ /* get the full data of SEM_DFX_CB */
//取SEM_DFX_CB的完整数据
extern UINT32 OsSemInfoGetFullData(VOID); extern UINT32 OsSemInfoGetFullData(VOID);
STATIC INLINE VOID OsSemInfoGetFullDataHook(VOID) STATIC INLINE VOID OsSemInfoGetFullDataHook(VOID)
{ {

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件定义了一些关于信号量的数据结构和函数声明,用于信号量的控制和管理。
#ifndef _LOS_SEM_PRI_H #ifndef _LOS_SEM_PRI_H
#define _LOS_SEM_PRI_H #define _LOS_SEM_PRI_H
@ -38,28 +38,24 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* Semaphore control structure. */ /* Semaphore control structure. */
//信号量控制块的数据结构
typedef struct { typedef struct {
UINT8 semStat;//信号量的状态 /* Semaphore state, enum LosSemState */ UINT8 semStat; /* Semaphore state, enum LosSemState */
UINT8 semType;//信号量的类型 /* Semaphore Type, enum LosSemType */ UINT8 semType; /* Semaphore Type, enum LosSemType */
UINT16 semCount;//信号量可用数量 /* number of available semaphores */ UINT16 semCount; /* number of available semaphores */
UINT32 semId;//信号量ID /* Semaphore control structure ID, COUNT(UINT16)|INDEX(UINT16) */ UINT32 semId; /* Semaphore control structure ID, COUNT(UINT16)|INDEX(UINT16) */
LOS_DL_LIST semList; /* List of tasks that are waiting on a semaphore */ LOS_DL_LIST semList; /* List of tasks that are waiting on a semaphore */
} LosSemCB; } LosSemCB;
/* Semaphore type */ /* Semaphore type */
//信号量类型的枚举值:包括计数信号量和二进制信号量
enum { enum {
OS_SEM_COUNTING, /* The semaphore is a counting semaphore which max count is LOS_SEM_COUNT_MAX */ OS_SEM_COUNTING, /* The semaphore is a counting semaphore which max count is LOS_SEM_COUNT_MAX */
OS_SEM_BINARY, /* The semaphore is a binary semaphore which max count is OS_SEM_BINARY_COUNT_MAX */ OS_SEM_BINARY, /* The semaphore is a binary semaphore which max count is OS_SEM_BINARY_COUNT_MAX */
}; };
/* Max count of binary semaphores */ /* Max count of binary semaphores */
//二进制信号量的最大计数值
#define OS_SEM_BINARY_COUNT_MAX 1 #define OS_SEM_BINARY_COUNT_MAX 1
/* Semaphore information control block */ /* Semaphore information control block */
//信号量信息控制块的全局指针
extern LosSemCB *g_allSem; extern LosSemCB *g_allSem;
#define GET_SEM_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosSemCB, semList) #define GET_SEM_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosSemCB, semList)
@ -79,7 +75,6 @@ extern LosSemCB *g_allSem;
/* This API is used to create a semaphore control structure according to the initial number of available semaphores /* This API is used to create a semaphore control structure according to the initial number of available semaphores
* specified by count and return the ID of this semaphore control structure. */ * specified by count and return the ID of this semaphore control structure. */
extern UINT32 OsSemInit(VOID); extern UINT32 OsSemInit(VOID);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件是操作系统中关于 Slab 内存分配的底层实现和接口声明
/** /**
* @defgroup los_slab Slab * @defgroup los_slab Slab
* @ingroup kernel * @ingroup kernel
@ -53,7 +53,7 @@ extern "C" {
/* max slab block size */ /* max slab block size */
#define SLAB_MEM_MAX_SIZE (SLAB_MEM_CALSS_STEP_SIZE << (SLAB_MEM_COUNT - 1)) #define SLAB_MEM_MAX_SIZE (SLAB_MEM_CALSS_STEP_SIZE << (SLAB_MEM_COUNT - 1))
//描述 Slab 内存分配器状态的结构体
typedef struct tagLosSlabStatus { typedef struct tagLosSlabStatus {
UINT32 totalSize; UINT32 totalSize;
UINT32 usedSize; UINT32 usedSize;
@ -61,13 +61,13 @@ typedef struct tagLosSlabStatus {
UINT32 allocCount; UINT32 allocCount;
UINT32 freeCount; UINT32 freeCount;
} LosSlabStatus; } LosSlabStatus;
//Slab 块的节点结构体
typedef struct tagOsSlabBlockNode { typedef struct tagOsSlabBlockNode {
UINT16 magic; UINT16 magic;
UINT8 blkSz; UINT8 blkSz;
UINT8 recordId; UINT8 recordId;
} OsSlabBlockNode; } OsSlabBlockNode;
//原子位图结构体,用于表示 Slab 内存分配器中的位图
struct AtomicBitset { struct AtomicBitset {
UINT32 numBits; UINT32 numBits;
UINT32 words[0]; UINT32 words[0];
@ -144,25 +144,25 @@ extern UINT32 OsSlabGetMaxFreeBlkSize(const VOID *pool);
extern VOID *OsSlabCtrlHdrGet(const VOID *pool); extern VOID *OsSlabCtrlHdrGet(const VOID *pool);
#else /* !LOSCFG_KERNEL_MEM_SLAB_EXTENTION */ #else /* !LOSCFG_KERNEL_MEM_SLAB_EXTENTION */
//初始化 Slab 内存池
STATIC INLINE VOID OsSlabMemInit(VOID *pool, UINT32 size) STATIC INLINE VOID OsSlabMemInit(VOID *pool, UINT32 size)
{ {
} }
//销毁 Slab 内存池
STATIC INLINE VOID OsSlabMemDeinit(VOID *pool) STATIC INLINE VOID OsSlabMemDeinit(VOID *pool)
{ {
} }
//从 Slab 内存池中分配内存
STATIC INLINE VOID *OsSlabMemAlloc(VOID *pool, UINT32 size) STATIC INLINE VOID *OsSlabMemAlloc(VOID *pool, UINT32 size)
{ {
return NULL; return NULL;
} }
//释放 Slab 内存池中的内存
STATIC INLINE BOOL OsSlabMemFree(VOID *pool, VOID *ptr) STATIC INLINE BOOL OsSlabMemFree(VOID *pool, VOID *ptr)
{ {
return FALSE; return FALSE;
} }
//检查指针是否属于 Slab 内存池
STATIC INLINE UINT32 OsSlabMemCheck(const VOID *pool, const VOID *ptr) STATIC INLINE UINT32 OsSlabMemCheck(const VOID *pool, const VOID *ptr)
{ {
return (UINT32)-1; return (UINT32)-1;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//一个用于操作排序链表SortLink的私有头文件。
#ifndef _LOS_SORTLINK_PRI_H #ifndef _LOS_SORTLINK_PRI_H
#define _LOS_SORTLINK_PRI_H #define _LOS_SORTLINK_PRI_H
@ -118,17 +118,13 @@ typedef struct {
UINT16 cursor; UINT16 cursor;
UINT16 reserved; UINT16 reserved;
} SortLinkAttribute; } SortLinkAttribute;
//初始化排序链表
extern UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader); extern UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader);
//一个节点添加到排序链表中
extern VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList); extern VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList);
//从排序链表中删除一个节点
extern VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList); extern VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList);
//获取下一个到期时间
extern UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader); extern UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader);
//获取目标节点的到期时间
extern UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttribute *sortLinkHeader, extern UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttribute *sortLinkHeader,
//更新到期时间 const SortLinkList *targetSortList); const SortLinkList *targetSortList);
extern VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttribute *sortLinkHeader); extern VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttribute *sortLinkHeader);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//一个用于处理堆栈信息的私有头文件
#ifndef _LOS_STACK_INFO_PRI_H #ifndef _LOS_STACK_INFO_PRI_H
#define _LOS_STACK_INFO_PRI_H #define _LOS_STACK_INFO_PRI_H
@ -37,25 +37,20 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//堆栈信息结构体
typedef struct { typedef struct {
VOID *stackTop;//堆栈的顶部 VOID *stackTop;
UINT32 stackSize;//堆栈的大小 UINT32 stackSize;
CHAR *stackName;//堆栈的名称 CHAR *stackName;
} StackInfo; } StackInfo;
//表示无效的水位线值
#define OS_INVALID_WATERLINE 0xFFFFFFFF #define OS_INVALID_WATERLINE 0xFFFFFFFF
//于检查堆栈顶部的魔术字是否有效的宏定义
#define OS_STACK_MAGIC_CHECK(topstack) (*(UINTPTR *)(topstack) == OS_STACK_MAGIC_WORD) /* 1:magic valid 0:unvalid */ #define OS_STACK_MAGIC_CHECK(topstack) (*(UINTPTR *)(topstack) == OS_STACK_MAGIC_WORD) /* 1:magic valid 0:unvalid */
//用于异常时获取堆栈信息的函数
extern VOID OsExcStackInfo(VOID); extern VOID OsExcStackInfo(VOID);
//用于注册异常时获取的堆栈信息的函数
extern VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum); extern VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum);
//用于初始化堆栈的函数
extern VOID OsStackInit(VOID *stacktop, UINT32 stacksize); extern VOID OsStackInit(VOID *stacktop, UINT32 stacksize);
//用于获取堆栈的水位线和使用峰值的函数
extern UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop, UINT32 *peakUsed); extern UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop, UINT32 *peakUsed);
//用于获取堆栈信息的函数
extern VOID OsGetStackInfo(const StackInfo **stackInfo, UINT32 *stackNum); extern VOID OsGetStackInfo(const StackInfo **stackInfo, UINT32 *stackNum);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//一个用于实现软件定时器的私有头文件。
#ifndef _LOS_SWTMR_PRI_H #ifndef _LOS_SWTMR_PRI_H
#define _LOS_SWTMR_PRI_H #define _LOS_SWTMR_PRI_H
@ -40,7 +40,7 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef LOSCFG_BASE_CORE_SWTMR #ifdef LOSCFG_BASE_CORE_SWTMR
//软件定时器的状态枚举,包括未使用、已创建和计时中
enum SwtmrState { enum SwtmrState {
OS_SWTMR_STATUS_UNUSED, /* The software timer is not used. */ OS_SWTMR_STATUS_UNUSED, /* The software timer is not used. */
OS_SWTMR_STATUS_CREATED, /* The software timer is created. */ OS_SWTMR_STATUS_CREATED, /* The software timer is created. */
@ -48,13 +48,12 @@ enum SwtmrState {
}; };
/* Structure of the callback function that handles software timer timeout */ /* Structure of the callback function that handles software timer timeout */
//处理软件定时器超时回调的回调函数结构体
typedef struct { typedef struct {
SWTMR_PROC_FUNC handler; /* Callback function that handles software timer timeout */ SWTMR_PROC_FUNC handler; /* Callback function that handles software timer timeout */
UINTPTR arg; /* Parameter passed in when the callback function UINTPTR arg; /* Parameter passed in when the callback function
that handles software timer timeout is called */ that handles software timer timeout is called */
} SwtmrHandlerItem; } SwtmrHandlerItem;
//软件定时器控制块结构体
typedef struct { typedef struct {
SortLinkList sortList; SortLinkList sortList;
UINT8 state; /* Software timer state */ UINT8 state; /* Software timer state */
@ -72,28 +71,22 @@ typedef struct {
} LosSwtmrCB; } LosSwtmrCB;
/* Type of the pointer to the structure of the callback function that handles software timer timeout */ /* Type of the pointer to the structure of the callback function that handles software timer timeout */
//指向处理软件定时器超时回调的回调函数结构体的指针类型
typedef SwtmrHandlerItem *SwtmrHandlerItemPtr; typedef SwtmrHandlerItem *SwtmrHandlerItemPtr;
//软件定时器控制块数组
extern LosSwtmrCB *g_swtmrCBArray; extern LosSwtmrCB *g_swtmrCBArray;
/* The software timer count list */ /* The software timer count list */
//软件定时器排序链表
extern SortLinkAttribute g_swtmrSortLink; extern SortLinkAttribute g_swtmrSortLink;
#define OS_SWT_FROM_SWTID(swtmrId) ((LosSwtmrCB *)g_swtmrCBArray + ((swtmrId) % KERNEL_SWTMR_LIMIT)) #define OS_SWT_FROM_SWTID(swtmrId) ((LosSwtmrCB *)g_swtmrCBArray + ((swtmrId) % KERNEL_SWTMR_LIMIT))
/* This API is used to scan a software timer when a Tick interrupt occurs and determine whether /* This API is used to scan a software timer when a Tick interrupt occurs and determine whether
* the software timer expires. */ * the software timer expires. */
//在Tick中断发生时扫描软件定时器判断是否到达超时时间
extern VOID OsSwtmrScan(VOID); extern VOID OsSwtmrScan(VOID);
//初始化软件定时器
extern UINT32 OsSwtmrInit(VOID); extern UINT32 OsSwtmrInit(VOID);
//软件定时器任务,用于处理软件定时器的超时事件
extern VOID OsSwtmrTask(VOID); extern VOID OsSwtmrTask(VOID);
//软件定时器自旋锁
extern SPIN_LOCK_S g_swtmrSpin; extern SPIN_LOCK_S g_swtmrSpin;
#ifdef LOSCFG_EXC_INTERACTION #ifdef LOSCFG_EXC_INTERACTION
//判断当前任务是否为软件定时器任务
extern BOOL IsSwtmrTask(UINT32 taskId); extern BOOL IsSwtmrTask(UINT32 taskId);
#endif #endif
#endif /* LOSCFG_BASE_CORE_SWTMR */ #endif /* LOSCFG_BASE_CORE_SWTMR */

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这是关于LiteOS中任务调度相关的头文件其中定义了任务控制块的数据结构和一些任务管理的接口函数。
*/
#ifndef _LOS_TASK_PRI_H #ifndef _LOS_TASK_PRI_H
#define _LOS_TASK_PRI_H #define _LOS_TASK_PRI_H

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//这个头文件是关于系统时钟中断tick的定义和操作。
#ifndef _LOS_TICK_PRI_H #ifndef _LOS_TICK_PRI_H
#define _LOS_TICK_PRI_H #define _LOS_TICK_PRI_H
@ -40,41 +40,30 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* spinlock for tick */ /* spinlock for tick */
//用于保护tick相关操作的自旋锁
extern SPIN_LOCK_S g_tickSpin; extern SPIN_LOCK_S g_tickSpin;
//获取tick自旋锁并保存状态
#define TICK_LOCK(state) LOS_SpinLockSave(&g_tickSpin, &(state)) #define TICK_LOCK(state) LOS_SpinLockSave(&g_tickSpin, &(state))
//释放tick自旋锁并恢复状态
#define TICK_UNLOCK(state) LOS_SpinUnlockRestore(&g_tickSpin, (state)) #define TICK_UNLOCK(state) LOS_SpinUnlockRestore(&g_tickSpin, (state))
/* Count of Ticks */ /* Count of Ticks */
//全局变量保存系统tick的计数值
extern volatile UINT64 g_tickCount[]; extern volatile UINT64 g_tickCount[];
/* Cycle to nanosecond scale */ /* Cycle to nanosecond scale */
//循环周期到纳秒的转换比例
extern DOUBLE g_cycle2NsScale; extern DOUBLE g_cycle2NsScale;
/* This API is called when the system tick timeout and triggers the interrupt. */ /* This API is called when the system tick timeout and triggers the interrupt. */
//系统tick中断处理函数当系统tick超时触发中断时调用
extern VOID OsTickHandler(VOID); extern VOID OsTickHandler(VOID);
//初始化系统tick相关配置
extern UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond); extern UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond);
//启动系统tick中断
extern VOID OsTickStart(VOID); extern VOID OsTickStart(VOID);
/* Convert from the cycle count to nanosecond. */ /* Convert from the cycle count to nanosecond. */
//将循环周期转换为纳秒
#define CYCLE_TO_NS(cycles) ((cycles) * g_cycle2NsScale) #define CYCLE_TO_NS(cycles) ((cycles) * g_cycle2NsScale)
/** /**
* Current system timer register is 32 bit, therefore TIMER_MAXLOAD define just in order to avoid ambiguity. * Current system timer register is 32 bit, therefore TIMER_MAXLOAD define just in order to avoid ambiguity.
*/ */
//定时器最大加载值,用于避免歧义
#define TIMER_MAXLOAD 0xffffffff #define TIMER_MAXLOAD 0xffffffff
#ifdef LOSCFG_KERNEL_TICKLESS #ifdef LOSCFG_KERNEL_TICKLESS
//tick中断标志在LOSCFG_KERNEL_TICKLESS选项开启时使用
#define LOS_TICK_INT_FLAG 0x80000000 #define LOS_TICK_INT_FLAG 0x80000000
#endif #endif

@ -26,10 +26,6 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这是一个位图bitmap的实现用于对位图进行设置、清除和获取最高/最低位的操作。
使32UINT32
*/
#include "los_bitmap.h" #include "los_bitmap.h"
#include "los_toolchain.h" #include "los_toolchain.h"
@ -40,7 +36,7 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#define OS_BITMAP_MASK 0x1FU #define OS_BITMAP_MASK 0x1FU
//LOS_BitmapSet将指定位置的位设置为1
VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos) VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)
{ {
if (bitmap == NULL) { if (bitmap == NULL) {
@ -49,7 +45,7 @@ VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)
*bitmap |= 1U << (pos & OS_BITMAP_MASK); *bitmap |= 1U << (pos & OS_BITMAP_MASK);
} }
//LOS_BitmapClr将指定位置的位清除为0
VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos) VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
{ {
if (bitmap == NULL) { if (bitmap == NULL) {
@ -58,7 +54,7 @@ VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
*bitmap &= ~(1U << (pos & OS_BITMAP_MASK)); *bitmap &= ~(1U << (pos & OS_BITMAP_MASK));
} }
//LOS_HighBitGet获取位图中最高位值为1的位置的索引
UINT16 LOS_HighBitGet(UINT32 bitmap) UINT16 LOS_HighBitGet(UINT32 bitmap)
{ {
if (bitmap == 0) { if (bitmap == 0) {
@ -67,7 +63,7 @@ UINT16 LOS_HighBitGet(UINT32 bitmap)
return (OS_BITMAP_MASK - CLZ(bitmap)); return (OS_BITMAP_MASK - CLZ(bitmap));
} }
//LOS_LowBitGet获取位图中最低位值为1的位置的索引
UINT16 LOS_LowBitGet(UINT32 bitmap) UINT16 LOS_LowBitGet(UINT32 bitmap)
{ {
if (bitmap == 0) { if (bitmap == 0) {

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这段代码是关于错误处理的相关功能,包括注册错误处理函数和执行错误处理的函数。
*/
#include "los_err.h" #include "los_err.h"
#ifdef __cplusplus #ifdef __cplusplus
@ -36,9 +35,8 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* Hook function for error handling. */ /* Hook function for error handling. */
//g_usrErrFunc全局变量用于保存用户注册的错误处理函数
LITE_OS_SEC_BSS LOS_ERRORHANDLE_FUNC g_usrErrFunc; LITE_OS_SEC_BSS LOS_ERRORHANDLE_FUNC g_usrErrFunc;
//LOS_ErrHandle用于执行错误处理的函数当系统出现错误时会调用该函数来处理错误信息
LITE_OS_SEC_TEXT_INIT UINT32 LOS_ErrHandle(CHAR *fileName, UINT32 lineNo, UINT32 errorNo, LITE_OS_SEC_TEXT_INIT UINT32 LOS_ErrHandle(CHAR *fileName, UINT32 lineNo, UINT32 errorNo,
UINT32 paraLen, VOID *para) UINT32 paraLen, VOID *para)
{ {
@ -48,7 +46,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_ErrHandle(CHAR *fileName, UINT32 lineNo, UINT32
return LOS_OK; return LOS_OK;
} }
//LOS_RegErrHandle用于注册错误处理函数的接口用户可以通过该函数注册自定义的错误处理函数
LITE_OS_SEC_TEXT_INIT VOID LOS_RegErrHandle(LOS_ERRORHANDLE_FUNC func) LITE_OS_SEC_TEXT_INIT VOID LOS_RegErrHandle(LOS_ERRORHANDLE_FUNC func)
{ {
g_usrErrFunc = func; g_usrErrFunc = func;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这段代码是关于事件管理的实现,包括事件的初始化、读取、写入、清除等操作。*/
#include "los_event_pri.h" #include "los_event_pri.h"
#include "los_task_pri.h" #include "los_task_pri.h"
#include "los_spinlock.h" #include "los_spinlock.h"
@ -38,7 +38,7 @@
extern "C" { extern "C" {
#endif #endif
#endif /* __cplusplus */ #endif /* __cplusplus */
//LOS_EventInit()函数用于初始化事件控制块eventCB并将事件ID、事件列表等属性设置为初始值
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB) LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
{ {
UINT32 intSave; UINT32 intSave;
@ -55,7 +55,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
return LOS_OK; return LOS_OK;
} }
//OsEventParamCheck()函数用于检查参数的有效性包括事件掩码eventMask、模式mode
LITE_OS_SEC_TEXT STATIC UINT32 OsEventParamCheck(const VOID *ptr, UINT32 eventMask, UINT32 mode) LITE_OS_SEC_TEXT STATIC UINT32 OsEventParamCheck(const VOID *ptr, UINT32 eventMask, UINT32 mode)
{ {
if (ptr == NULL) { if (ptr == NULL) {
@ -75,17 +75,16 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsEventParamCheck(const VOID *ptr, UINT32 eventMa
!(mode & (LOS_WAITMODE_OR | LOS_WAITMODE_AND))) { !(mode & (LOS_WAITMODE_OR | LOS_WAITMODE_AND))) {
return LOS_ERRNO_EVENT_FLAGS_INVALID; return LOS_ERRNO_EVENT_FLAGS_INVALID;
} }
//指针非空事件掩码非0事件掩码不包含LOS_ERRTYPE_ERROR标志位模式合法
return LOS_OK; return LOS_OK;
} }
//OsEventPoll()函数用于轮询事件,根据指定的事件掩码和模式判断是否满足条件
LITE_OS_SEC_TEXT STATIC UINT32 OsEventPoll(UINT32 *eventId, UINT32 eventMask, UINT32 mode) LITE_OS_SEC_TEXT STATIC UINT32 OsEventPoll(UINT32 *eventId, UINT32 eventMask, UINT32 mode)
{ {
UINT32 ret = 0; UINT32 ret = 0;
LOS_ASSERT(ArchIntLocked()); LOS_ASSERT(ArchIntLocked());
LOS_ASSERT(LOS_SpinHeld(&g_taskSpin)); LOS_ASSERT(LOS_SpinHeld(&g_taskSpin));
if (mode & LOS_WAITMODE_OR) { if (mode & LOS_WAITMODE_OR) {
if ((*eventId & eventMask) != 0) { if ((*eventId & eventMask) != 0) {
ret = *eventId & eventMask; ret = *eventId & eventMask;
@ -102,7 +101,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsEventPoll(UINT32 *eventId, UINT32 eventMask, UI
return ret; return ret;
} }
//OsEventReadCheck()函数用于检查事件读取操作的参数有效性包括事件控制块eventCB、事件掩码eventMask、模式mode
LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadCheck(const PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode) LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadCheck(const PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode)
{ {
UINT32 ret; UINT32 ret;
@ -123,7 +122,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadCheck(const PEVENT_CB_S eventCB, UINT3
} }
return LOS_OK; return LOS_OK;
} }
//OsEventReadImp()函数是事件读取的实现,根据指定的事件掩码和模式进行轮询,并根据超时时间和是否只读取一次进行相应的操作
LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadImp(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadImp(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode,
UINT32 timeout, BOOL once, UINT32 *intSave) UINT32 timeout, BOOL once, UINT32 *intSave)
{ {
@ -166,7 +165,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadImp(PEVENT_CB_S eventCB, UINT32 eventM
} }
return ret; return ret;
} }
//OsEventRead()函数是对外提供的事件读取接口调用OsEventReadCheck()和OsEventReadImp()实现事件的读取操作
LITE_OS_SEC_TEXT STATIC UINT32 OsEventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, LITE_OS_SEC_TEXT STATIC UINT32 OsEventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode,
UINT32 timeout, BOOL once) UINT32 timeout, BOOL once)
{ {
@ -185,7 +184,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsEventRead(PEVENT_CB_S eventCB, UINT32 eventMask
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
} }
//OsEventWrite()函数用于向事件控制块中写入指定的事件
LITE_OS_SEC_TEXT STATIC UINT32 OsEventWrite(PEVENT_CB_S eventCB, UINT32 events, BOOL once) LITE_OS_SEC_TEXT STATIC UINT32 OsEventWrite(PEVENT_CB_S eventCB, UINT32 events, BOOL once)
{ {
LosTaskCB *resumedTask = NULL; LosTaskCB *resumedTask = NULL;
@ -231,7 +230,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsEventWrite(PEVENT_CB_S eventCB, UINT32 events,
} }
return LOS_OK; return LOS_OK;
} }
//LOS_EventPoll()函数是对外提供的事件轮询接口调用OsEventParamCheck()和OsEventPoll()实现事件的轮询操作
LITE_OS_SEC_TEXT UINT32 LOS_EventPoll(UINT32 *eventId, UINT32 eventMask, UINT32 mode) LITE_OS_SEC_TEXT UINT32 LOS_EventPoll(UINT32 *eventId, UINT32 eventMask, UINT32 mode)
{ {
UINT32 ret; UINT32 ret;
@ -247,17 +246,17 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventPoll(UINT32 *eventId, UINT32 eventMask, UINT32
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
} }
//LOS_EventRead()函数是对外提供的事件读取接口调用OsEventRead()实现事件的读取操作
LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout) LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout)
{ {
return OsEventRead(eventCB, eventMask, mode, timeout, FALSE); return OsEventRead(eventCB, eventMask, mode, timeout, FALSE);
} }
//LOS_EventWrite()函数是对外提供的事件写入接口调用OsEventWrite()实现事件的写入操作
LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events) LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
{ {
return OsEventWrite(eventCB, events, FALSE); return OsEventWrite(eventCB, events, FALSE);
} }
//LOS_EventDestroy()函数用于销毁事件控制块将事件ID设置为0
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventDestroy(PEVENT_CB_S eventCB) LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventDestroy(PEVENT_CB_S eventCB)
{ {
UINT32 intSave; UINT32 intSave;
@ -280,7 +279,7 @@ OUT:
LOS_TRACE(EVENT_DELETE, (UINTPTR)eventCB, ret); LOS_TRACE(EVENT_DELETE, (UINTPTR)eventCB, ret);
return ret; return ret;
} }
//LOS_EventClear()函数用于清除指定的事件
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 events) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 events)
{ {
UINT32 intSave; UINT32 intSave;
@ -297,19 +296,18 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 events)
return LOS_OK; return LOS_OK;
} }
//OsEventWriteOnce()函数是事件写入的实现与OsEventWrite()类似,但只写入一次
LITE_OS_SEC_TEXT_MINOR UINT32 OsEventWriteOnce(PEVENT_CB_S eventCB, UINT32 events) LITE_OS_SEC_TEXT_MINOR UINT32 OsEventWriteOnce(PEVENT_CB_S eventCB, UINT32 events)
{ {
return OsEventWrite(eventCB, events, TRUE); return OsEventWrite(eventCB, events, TRUE);
} }
#ifdef LOSCFG_COMPAT_POSIX #ifdef LOSCFG_COMPAT_POSIX
//OsEventReadOnce()函数是事件读取的实现与OsEventRead()类似,但只读取一次
LITE_OS_SEC_TEXT_MINOR UINT32 OsEventReadOnce(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout) LITE_OS_SEC_TEXT_MINOR UINT32 OsEventReadOnce(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout)
{ {
return OsEventRead(eventCB, eventMask, mode, timeout, TRUE); return OsEventRead(eventCB, eventMask, mode, timeout, TRUE);
} }
// /OsEventReadWithCond()函数用于根据条件读取事件,只有当条件满足时才进行事件读取操作
LITE_OS_SEC_TEXT UINT32 OsEventReadWithCond(const EventCond *cond, PEVENT_CB_S eventCB, LITE_OS_SEC_TEXT UINT32 OsEventReadWithCond(const EventCond *cond, PEVENT_CB_S eventCB,
UINT32 eventMask, UINT32 mode, UINT32 timeout) UINT32 eventMask, UINT32 mode, UINT32 timeout)
{ {

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这是关于LiteOS中异常处理的代码其中包括记录异常信息、异常信息保存和读取等功能。
*/
#include "los_exc.h" #include "los_exc.h"
#include "los_printf_pri.h" #include "los_printf_pri.h"
#include "los_task_pri.h" #include "los_task_pri.h"
@ -49,7 +48,7 @@
extern "C" { extern "C" {
#endif #endif
#endif /* __cplusplus */ #endif /* __cplusplus */
//ExcInfoDumpFormat的结构体类型包含了用于存储异常信息的缓冲区指针、偏移量、长度和存储地址等信息
#ifdef LOSCFG_SHELL_EXCINFO_DUMP #ifdef LOSCFG_SHELL_EXCINFO_DUMP
typedef struct { typedef struct {
CHAR *buf; /* pointer to the buffer for storing the exception information */ CHAR *buf; /* pointer to the buffer for storing the exception information */
@ -57,13 +56,11 @@ typedef struct {
UINT32 len; /* the size of storing the exception information */ UINT32 len; /* the size of storing the exception information */
UINTPTR dumpAddr; /* the address of storing the exception information */ UINTPTR dumpAddr; /* the address of storing the exception information */
} ExcInfoDumpFormat; } ExcInfoDumpFormat;
//全局变量g_excInfoPool用于存储异常信息的缓冲区和相关的信息
STATIC ExcInfoDumpFormat g_excInfoPool = {0}; STATIC ExcInfoDumpFormat g_excInfoPool = {0};
/* the hook of read-writing exception information */ /* the hook of read-writing exception information */
STATIC __attribute__((section(".data"))) LogReadWriteFunc g_dumpHook = NULL; STATIC __attribute__((section(".data"))) LogReadWriteFunc g_dumpHook = NULL;
//LOS_ExcInfoRegHook注册异常信息读写钩子函数用于设置异常信息的存储地址、长度以及缓冲区等信息
//"钩子函数"是指在特定事件发生时会被调用的函数
//通过使用钩子函数,可以在异常发生时灵活地执行特定的操作,例如记录异常信息、进行特定的处理或通知其他模块进行相应的操作
VOID LOS_ExcInfoRegHook(UINTPTR startAddr, UINT32 len, CHAR *buf, LogReadWriteFunc hook) VOID LOS_ExcInfoRegHook(UINTPTR startAddr, UINT32 len, CHAR *buf, LogReadWriteFunc hook)
{ {
if ((hook == NULL) || (buf == NULL)) { if ((hook == NULL) || (buf == NULL)) {
@ -81,57 +78,57 @@ VOID LOS_ExcInfoRegHook(UINTPTR startAddr, UINT32 len, CHAR *buf, LogReadWriteFu
g_excInfoPool.buf = buf; g_excInfoPool.buf = buf;
g_dumpHook = hook; g_dumpHook = hook;
} }
//OsSetExcInfoRW设置异常信息读写钩子函数
VOID OsSetExcInfoRW(LogReadWriteFunc func) VOID OsSetExcInfoRW(LogReadWriteFunc func)
{ {
g_dumpHook = func; g_dumpHook = func;
} }
//OsGetExcInfoRW获取异常信息读写钩子函数
LogReadWriteFunc OsGetExcInfoRW(VOID) LogReadWriteFunc OsGetExcInfoRW(VOID)
{ {
return g_dumpHook; return g_dumpHook;
} }
//OsSetExcInfoBuf设置异常信息的缓冲区
VOID OsSetExcInfoBuf(CHAR *buf) VOID OsSetExcInfoBuf(CHAR *buf)
{ {
g_excInfoPool.buf = buf; g_excInfoPool.buf = buf;
} }
//OsGetExcInfoBuf获取异常信息的缓冲区
CHAR *OsGetExcInfoBuf(VOID) CHAR *OsGetExcInfoBuf(VOID)
{ {
return g_excInfoPool.buf; return g_excInfoPool.buf;
} }
//OsSetExcInfoOffset设置异常信息的偏移量
VOID OsSetExcInfoOffset(UINT32 Offset) VOID OsSetExcInfoOffset(UINT32 Offset)
{ {
g_excInfoPool.offset = Offset; g_excInfoPool.offset = Offset;
} }
//OsGetExcInfoOffset获取异常信息的偏移量
UINT32 OsGetExcInfoOffset(VOID) UINT32 OsGetExcInfoOffset(VOID)
{ {
return g_excInfoPool.offset; return g_excInfoPool.offset;
} }
//OsSetExcInfoDumpAddr设置异常信息的存储地址
VOID OsSetExcInfoDumpAddr(UINTPTR addr) VOID OsSetExcInfoDumpAddr(UINTPTR addr)
{ {
g_excInfoPool.dumpAddr = addr; g_excInfoPool.dumpAddr = addr;
} }
//OsGetExcInfoDumpAddr获取异常信息的存储地址
UINTPTR OsGetExcInfoDumpAddr(VOID) UINTPTR OsGetExcInfoDumpAddr(VOID)
{ {
return g_excInfoPool.dumpAddr; return g_excInfoPool.dumpAddr;
} }
//OsSetExcInfoLen设置异常信息的长度
VOID OsSetExcInfoLen(UINT32 len) VOID OsSetExcInfoLen(UINT32 len)
{ {
g_excInfoPool.len = len; g_excInfoPool.len = len;
} }
//OsGetExcInfoLen获取异常信息的长度
UINT32 OsGetExcInfoLen(VOID) UINT32 OsGetExcInfoLen(VOID)
{ {
return g_excInfoPool.len; return g_excInfoPool.len;
} }
//WriteExcBufVa将格式化的字符串写入异常信息缓冲区
VOID WriteExcBufVa(const CHAR *format, va_list arglist) VOID WriteExcBufVa(const CHAR *format, va_list arglist)
{ {
errno_t ret; errno_t ret;
@ -146,7 +143,7 @@ VOID WriteExcBufVa(const CHAR *format, va_list arglist)
g_excInfoPool.offset += ret; g_excInfoPool.offset += ret;
} }
} }
//WriteExcInfoToBuf将格式化的字符串写入异常信息缓冲区
VOID WriteExcInfoToBuf(const CHAR *format, ...) VOID WriteExcInfoToBuf(const CHAR *format, ...)
{ {
va_list arglist; va_list arglist;
@ -155,7 +152,7 @@ VOID WriteExcInfoToBuf(const CHAR *format, ...)
WriteExcBufVa(format, arglist); WriteExcBufVa(format, arglist);
va_end(arglist); va_end(arglist);
} }
//OsRecordExcInfoTime记录异常信息的时间
VOID OsRecordExcInfoTime(VOID) VOID OsRecordExcInfoTime(VOID)
{ {
#define NOW_TIME_LENGTH 24 #define NOW_TIME_LENGTH 24
@ -172,7 +169,7 @@ VOID OsRecordExcInfoTime(VOID)
#undef NOW_TIME_LENGTH #undef NOW_TIME_LENGTH
PrintExcInfo("%s \n", nowTime); PrintExcInfo("%s \n", nowTime);
} }
//OsShellCmdReadExcInfo读取并打印异常信息的Shell命令
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
INT32 OsShellCmdReadExcInfo(INT32 argc, const CHAR **argv) INT32 OsShellCmdReadExcInfo(INT32 argc, const CHAR **argv)
{ {
@ -203,9 +200,6 @@ SHELLCMD_ENTRY(readExcInfo_shellcmd, CMD_TYPE_EX, "excInfo", 0, (CmdCallBackFunc
#endif #endif
#ifdef LOSCFG_EXC_INTERACTION #ifdef LOSCFG_EXC_INTERACTION
//OsCheckExcInteractionTask检查任务是否为异常交互任务
//异常交互任务通常指的是用于处理异常情况的特殊任务或线程
//当系统发生严重的错误或异常时,需要立即采取相应的措施来处理异常情况,这就需要使用异常交互任务来处理
UINT32 OsCheckExcInteractionTask(const TSK_INIT_PARAM_S *initParam) UINT32 OsCheckExcInteractionTask(const TSK_INIT_PARAM_S *initParam)
{ {
if ((initParam->pfnTaskEntry == (TSK_ENTRY_FUNC)ShellTask) || if ((initParam->pfnTaskEntry == (TSK_ENTRY_FUNC)ShellTask) ||
@ -215,7 +209,7 @@ UINT32 OsCheckExcInteractionTask(const TSK_INIT_PARAM_S *initParam)
} }
return LOS_NOK; return LOS_NOK;
} }
//OsKeepExcInteractionTask保留异常交互任务删除其他任务
VOID OsKeepExcInteractionTask(VOID) VOID OsKeepExcInteractionTask(VOID)
{ {
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
@ -249,7 +243,7 @@ VOID OsKeepExcInteractionTask(VOID)
} }
#endif #endif
//LOS_Panic打印异常信息并停止CPU执行
VOID LOS_Panic(const CHAR *fmt, ...) VOID LOS_Panic(const CHAR *fmt, ...)
{ {
va_list ap; va_list ap;
@ -258,7 +252,7 @@ VOID LOS_Panic(const CHAR *fmt, ...)
va_end(ap); va_end(ap);
ArchHaltCpu(); ArchHaltCpu();
} }
//LOS_BackTrace打印当前任务的运行信息和回溯堆栈
VOID LOS_BackTrace(VOID) VOID LOS_BackTrace(VOID)
{ {
#ifdef LOSCFG_BACKTRACE #ifdef LOSCFG_BACKTRACE
@ -268,7 +262,7 @@ VOID LOS_BackTrace(VOID)
ArchBackTrace(); ArchBackTrace();
#endif #endif
} }
//LOS_TaskBackTrace打印指定任务的运行信息和回溯堆栈
VOID LOS_TaskBackTrace(UINT32 taskID) VOID LOS_TaskBackTrace(UINT32 taskID)
{ {
#ifdef LOSCFG_BACKTRACE #ifdef LOSCFG_BACKTRACE
@ -295,7 +289,6 @@ VOID LOS_TaskBackTrace(UINT32 taskID)
#ifdef __GNUC__ #ifdef __GNUC__
/* stack protector */ /* stack protector */
//__stack_chk_fail用于栈保护机制当发现栈被破坏时触发异常处理
VOID __stack_chk_fail(VOID) VOID __stack_chk_fail(VOID)
{ {
/* __builtin_return_address is a builtin function, building in gcc */ /* __builtin_return_address is a builtin function, building in gcc */

@ -25,9 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*
LiteOS使
*/
#include "los_hwi_pri.h" #include "los_hwi_pri.h"
#include "los_hwi.h" #include "los_hwi.h"
#include "los_memory.h" #include "los_memory.h"
@ -63,7 +61,7 @@ const HwiControllerOps *g_hwiOps = NULL;
typedef VOID (*HWI_PROC_FUNC0)(VOID); typedef VOID (*HWI_PROC_FUNC0)(VOID);
typedef VOID (*HWI_PROC_FUNC2)(INT32, VOID *); typedef VOID (*HWI_PROC_FUNC2)(INT32, VOID *);
//OsIrqNestingActive用于在处理中断期间激活中断嵌套计数器避免在处理时钟中断时进行抢占
STATIC INLINE VOID OsIrqNestingActive(UINT32 hwiNum) STATIC INLINE VOID OsIrqNestingActive(UINT32 hwiNum)
{ {
#ifdef LOSCFG_ARCH_INTERRUPT_PREEMPTION #ifdef LOSCFG_ARCH_INTERRUPT_PREEMPTION
@ -73,7 +71,7 @@ STATIC INLINE VOID OsIrqNestingActive(UINT32 hwiNum)
} }
#endif #endif
} }
//OsIrqNestingInactive用于在处理中断结束后禁用中断嵌套计数器
STATIC INLINE VOID OsIrqNestingInactive(UINT32 hwiNum) STATIC INLINE VOID OsIrqNestingInactive(UINT32 hwiNum)
{ {
#ifdef LOSCFG_ARCH_INTERRUPT_PREEMPTION #ifdef LOSCFG_ARCH_INTERRUPT_PREEMPTION
@ -82,17 +80,17 @@ STATIC INLINE VOID OsIrqNestingInactive(UINT32 hwiNum)
} }
#endif #endif
} }
//OsIrqNestingCntGet获取当前CPU的中断嵌套计数值
size_t OsIrqNestingCntGet(VOID) size_t OsIrqNestingCntGet(VOID)
{ {
return g_intCount[ArchCurrCpuid()]; return g_intCount[ArchCurrCpuid()];
} }
//OsIrqNestingCntSet设置当前CPU的中断嵌套计数值
VOID OsIrqNestingCntSet(size_t val) VOID OsIrqNestingCntSet(size_t val)
{ {
g_intCount[ArchCurrCpuid()] = val; g_intCount[ArchCurrCpuid()] = val;
} }
//InterruptHandle处理中断的实际函数根据中断号调用对应的中断处理函数
STATIC INLINE VOID InterruptHandle(HwiHandleInfo *hwiForm) STATIC INLINE VOID InterruptHandle(HwiHandleInfo *hwiForm)
{ {
hwiForm->respCount++; hwiForm->respCount++;
@ -116,7 +114,7 @@ STATIC INLINE VOID InterruptHandle(HwiHandleInfo *hwiForm)
} }
#endif #endif
} }
//OsIntHandle中断处理入口函数负责处理中断前的一些准备工作如调用中断处理前的钩子函数等
VOID OsIntHandle(UINT32 hwiNum, HwiHandleInfo *hwiForm) VOID OsIntHandle(UINT32 hwiNum, HwiHandleInfo *hwiForm)
{ {
size_t *intCnt = NULL; size_t *intCnt = NULL;
@ -150,7 +148,7 @@ VOID OsIntHandle(UINT32 hwiNum, HwiHandleInfo *hwiForm)
OsCpupIrqEnd(hwiNum); OsCpupIrqEnd(hwiNum);
#endif #endif
} }
//OsIntEntry中断向量入口函数根据中断号调用对应的中断处理函数
VOID OsIntEntry(VOID) VOID OsIntEntry(VOID)
{ {
if ((g_hwiOps != NULL) && (g_hwiOps->handleIrq != NULL)) { if ((g_hwiOps != NULL) && (g_hwiOps->handleIrq != NULL)) {
@ -158,7 +156,7 @@ VOID OsIntEntry(VOID)
} }
return; return;
} }
//OsHwiCpIrqParam根据传入的中断参数结构体分配内存并将参数信息拷贝到新分配的内存中
STATIC HWI_ARG_T OsHwiCpIrqParam(const HWI_IRQ_PARAM_S *irqParam) STATIC HWI_ARG_T OsHwiCpIrqParam(const HWI_IRQ_PARAM_S *irqParam)
{ {
HWI_IRQ_PARAM_S *paramByAlloc = NULL; HWI_IRQ_PARAM_S *paramByAlloc = NULL;
@ -171,7 +169,6 @@ STATIC HWI_ARG_T OsHwiCpIrqParam(const HWI_IRQ_PARAM_S *irqParam)
return (HWI_ARG_T)paramByAlloc; return (HWI_ARG_T)paramByAlloc;
} }
#ifndef LOSCFG_SHARED_IRQ #ifndef LOSCFG_SHARED_IRQ
//OsHwiDel删除指定的中断处理函数
STATIC UINT32 OsHwiDel(HwiHandleInfo *hwiForm, const HWI_IRQ_PARAM_S *irqParam, UINT32 irqId) STATIC UINT32 OsHwiDel(HwiHandleInfo *hwiForm, const HWI_IRQ_PARAM_S *irqParam, UINT32 irqId)
{ {
UINT32 intSave; UINT32 intSave;
@ -193,7 +190,7 @@ STATIC UINT32 OsHwiDel(HwiHandleInfo *hwiForm, const HWI_IRQ_PARAM_S *irqParam,
HWI_UNLOCK(intSave); HWI_UNLOCK(intSave);
return LOS_OK; return LOS_OK;
} }
//OsHwiCreate创建中断处理函数并将其添加到中断处理链表中
STATIC UINT32 OsHwiCreate(HwiHandleInfo *hwiForm, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, STATIC UINT32 OsHwiCreate(HwiHandleInfo *hwiForm, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler,
const HWI_IRQ_PARAM_S *irqParam) const HWI_IRQ_PARAM_S *irqParam)
{ {
@ -221,7 +218,6 @@ STATIC UINT32 OsHwiCreate(HwiHandleInfo *hwiForm, HWI_MODE_T hwiMode, HWI_PROC_F
return LOS_OK; return LOS_OK;
} }
#else /* LOSCFG_SHARED_IRQ */ #else /* LOSCFG_SHARED_IRQ */
//函数OsFreeHwiNode:用于释放中断处理函数节点,并在需要时禁止该中断
STATIC INLINE UINT32 OsFreeHwiNode(HwiHandleInfo *head, HwiHandleInfo *hwiForm, UINT32 irqId) STATIC INLINE UINT32 OsFreeHwiNode(HwiHandleInfo *head, HwiHandleInfo *hwiForm, UINT32 irqId)
{ {
UINT32 ret = LOS_OK; UINT32 ret = LOS_OK;
@ -244,8 +240,7 @@ STATIC INLINE UINT32 OsFreeHwiNode(HwiHandleInfo *head, HwiHandleInfo *hwiForm,
return ret; return ret;
} }
//OsHwiDel:用于删除硬件中断处理函数,它首先判断中断是否是共享中断
//如果不是,则直接释放该中断的处理函数节点;如果是共享中断则遍历链表找到对应的设备ID然后释放该中断的处理函数节点
STATIC UINT32 OsHwiDel(HwiHandleInfo *head, const HWI_IRQ_PARAM_S *irqParam, UINT32 irqId) STATIC UINT32 OsHwiDel(HwiHandleInfo *head, const HWI_IRQ_PARAM_S *irqParam, UINT32 irqId)
{ {
HwiHandleInfo *hwiFormPrev = NULL; HwiHandleInfo *hwiFormPrev = NULL;
@ -295,8 +290,7 @@ STATIC UINT32 OsHwiDel(HwiHandleInfo *head, const HWI_IRQ_PARAM_S *irqParam, UIN
HWI_UNLOCK(intSave); HWI_UNLOCK(intSave);
return ret; return ret;
} }
//OsHwiCreate:用于创建硬件中断处理函数它首先判断中断是否是共享中断并检查是否已经存在具有相同设备ID的中断处理函数节点如果存在则返回错误
//然后申请内存并初始化新的中断处理函数节点,将其添加到链表中
STATIC UINT32 OsHwiCreate(HwiHandleInfo *head, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, STATIC UINT32 OsHwiCreate(HwiHandleInfo *head, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler,
const HWI_IRQ_PARAM_S *irqParam) const HWI_IRQ_PARAM_S *irqParam)
{ {
@ -365,9 +359,7 @@ size_t IntActive()
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
return intCount; return intCount;
} }
//LOS_HwiCreate 函数:用于创建硬件中断处理函数
//它会注册一个中断处理函数,并将其与指定的硬件中断号相关联
//可以设置中断的优先级、硬件中断模式和处理函数
LITE_OS_SEC_TEXT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum, LITE_OS_SEC_TEXT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum,
HWI_PRIOR_T hwiPrio, HWI_PRIOR_T hwiPrio,
HWI_MODE_T hwiMode, HWI_MODE_T hwiMode,
@ -404,8 +396,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum,
} }
return ret; return ret;
} }
//LOS_HwiDelete 函数:用于删除已经创建的硬件中断处理函数
//通过指定硬件中断号,可以将之前注册的中断处理函数从系统中删除
LITE_OS_SEC_TEXT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HWI_IRQ_PARAM_S *irqParam) LITE_OS_SEC_TEXT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HWI_IRQ_PARAM_S *irqParam)
{ {
UINT32 ret; UINT32 ret;
@ -426,8 +417,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HWI_IRQ_PARAM_S *irqP
return ret; return ret;
} }
//LOS_HwiTrigger 函数:用于手动触发指定的硬件中断
//调用该函数后,会立即触发对应的硬件中断,使得系统执行相应的中断处理函数
LITE_OS_SEC_TEXT UINT32 LOS_HwiTrigger(HWI_HANDLE_T hwiNum) LITE_OS_SEC_TEXT UINT32 LOS_HwiTrigger(HWI_HANDLE_T hwiNum)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->triggerIrq == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->triggerIrq == NULL)) {
@ -437,8 +427,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiTrigger(HWI_HANDLE_T hwiNum)
return g_hwiOps->triggerIrq(hwiNum); return g_hwiOps->triggerIrq(hwiNum);
} }
//LOS_HwiEnable 函数:用于使能指定的硬件中断
//调用该函数后,系统将允许对应的硬件中断产生,并执行相应的中断处理函数
LITE_OS_SEC_TEXT UINT32 LOS_HwiEnable(HWI_HANDLE_T hwiNum) LITE_OS_SEC_TEXT UINT32 LOS_HwiEnable(HWI_HANDLE_T hwiNum)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->enableIrq == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->enableIrq == NULL)) {
@ -448,8 +437,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiEnable(HWI_HANDLE_T hwiNum)
return g_hwiOps->enableIrq(hwiNum); return g_hwiOps->enableIrq(hwiNum);
} }
//LOS_HwiDisable 函数:用于禁止指定的硬件中断
//调用该函数后,系统将阻止对应的硬件中断产生,屏蔽其影响
LITE_OS_SEC_TEXT UINT32 LOS_HwiDisable(HWI_HANDLE_T hwiNum) LITE_OS_SEC_TEXT UINT32 LOS_HwiDisable(HWI_HANDLE_T hwiNum)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->disableIrq == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->disableIrq == NULL)) {
@ -459,8 +447,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiDisable(HWI_HANDLE_T hwiNum)
return g_hwiOps->disableIrq(hwiNum); return g_hwiOps->disableIrq(hwiNum);
} }
//LOS_HwiClear 函数:用于清除指定的硬件中断
//在某些平台上,硬件中断发生后可能需要手动清除中断标志位,以便正确处理后续的中断
LITE_OS_SEC_TEXT UINT32 LOS_HwiClear(HWI_HANDLE_T hwiNum) LITE_OS_SEC_TEXT UINT32 LOS_HwiClear(HWI_HANDLE_T hwiNum)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->clearIrq == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->clearIrq == NULL)) {
@ -470,8 +457,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiClear(HWI_HANDLE_T hwiNum)
return g_hwiOps->clearIrq(hwiNum); return g_hwiOps->clearIrq(hwiNum);
} }
//LOS_HwiSetPriority 函数:用于设置硬件中断的优先级
//通过指定硬件中断号和优先级,可以调整硬件中断的触发顺序
LITE_OS_SEC_TEXT UINT32 LOS_HwiSetPriority(HWI_HANDLE_T hwiNum, HWI_PRIOR_T priority) LITE_OS_SEC_TEXT UINT32 LOS_HwiSetPriority(HWI_HANDLE_T hwiNum, HWI_PRIOR_T priority)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->setIrqPriority == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->setIrqPriority == NULL)) {
@ -482,8 +468,6 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiSetPriority(HWI_HANDLE_T hwiNum, HWI_PRIOR_T prio
return g_hwiOps->setIrqPriority(hwiNum, priority); return g_hwiOps->setIrqPriority(hwiNum, priority);
} }
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
//LOS_HwiSetAffinity函数用于设置硬件中断的处理CPU亲和性
//它首先检查硬件中断操作函数指针是否为空然后调用具体的操作函数来设置中断的处理CPU亲和性
LITE_OS_SEC_TEXT UINT32 LOS_HwiSetAffinity(HWI_HANDLE_T hwiNum, UINT32 cpuMask) LITE_OS_SEC_TEXT UINT32 LOS_HwiSetAffinity(HWI_HANDLE_T hwiNum, UINT32 cpuMask)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->setIrqCpuAffinity == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->setIrqCpuAffinity == NULL)) {
@ -493,8 +477,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiSetAffinity(HWI_HANDLE_T hwiNum, UINT32 cpuMask)
return g_hwiOps->setIrqCpuAffinity(hwiNum, cpuMask); return g_hwiOps->setIrqCpuAffinity(hwiNum, cpuMask);
} }
//LOS_HwiSendIpi函数用于发送硬件中断处理请求给指定的CPU
//它首先检查硬件中断操作函数指针是否为空,然后调用具体的操作函数来发送中断处理请求
LITE_OS_SEC_TEXT UINT32 LOS_HwiSendIpi(HWI_HANDLE_T hwiNum, UINT32 cpuMask) LITE_OS_SEC_TEXT UINT32 LOS_HwiSendIpi(HWI_HANDLE_T hwiNum, UINT32 cpuMask)
{ {
if ((g_hwiOps == NULL) || (g_hwiOps->sendIpi == NULL)) { if ((g_hwiOps == NULL) || (g_hwiOps->sendIpi == NULL)) {
@ -507,8 +490,6 @@ LITE_OS_SEC_TEXT UINT32 LOS_HwiSendIpi(HWI_HANDLE_T hwiNum, UINT32 cpuMask)
#endif #endif
#ifdef LOSCFG_KERNEL_LOWPOWER #ifdef LOSCFG_KERNEL_LOWPOWER
//LOS_IntWakeupHookReg函数用于注册中断唤醒回调函数
//它将传入的回调函数赋值给全局变量g_intWakeupHook以便在中断唤醒时调用该回调函数
LITE_OS_SEC_TEXT_MINOR VOID LOS_IntWakeupHookReg(WAKEUPFROMINTHOOK hook) LITE_OS_SEC_TEXT_MINOR VOID LOS_IntWakeupHookReg(WAKEUPFROMINTHOOK hook)
{ {
g_intWakeupHook = hook; g_intWakeupHook = hook;
@ -516,8 +497,6 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_IntWakeupHookReg(WAKEUPFROMINTHOOK hook)
#endif #endif
/* Initialization of the hardware interrupt */ /* Initialization of the hardware interrupt */
//OsHwiInit函数用于初始化硬件中断
//它会调用具体的平台相关函数来进行硬件中断的初始化操作
LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID) LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID)
{ {
ArchIrqInit(); ArchIrqInit();

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这段代码是关于锁依赖检查的实现。包含了一些头文件和函数的定义,用于在多核系统中检测锁的使用情况*/
#include "los_base.h" #include "los_base.h"
#include "los_spinlock.h" #include "los_spinlock.h"
#include "los_task_pri.h" #include "los_task_pri.h"
@ -47,8 +47,6 @@ extern "C" {
STATIC Atomic g_lockdepAvailable = 1; STATIC Atomic g_lockdepAvailable = 1;
/* atomic insurance for lockdep check */ /* atomic insurance for lockdep check */
//OsLockDepRequire该函数用于获取锁依赖检查的原子操作确保在进行锁依赖检查时不会被中断
//原子操作是指在计算机科学中,不会被中断的操作
STATIC INLINE VOID OsLockDepRequire(UINT32 *intSave) STATIC INLINE VOID OsLockDepRequire(UINT32 *intSave)
{ {
*intSave = LOS_IntLock(); *intSave = LOS_IntLock();
@ -56,13 +54,13 @@ STATIC INLINE VOID OsLockDepRequire(UINT32 *intSave)
/* busy waiting */ /* busy waiting */
} }
} }
//OsLockDepRelease释放锁依赖检查的原子操作用于在完成锁依赖检查后恢复正常的中断状态
STATIC INLINE VOID OsLockDepRelease(UINT32 intSave) STATIC INLINE VOID OsLockDepRelease(UINT32 intSave)
{ {
LOS_AtomicSet(&g_lockdepAvailable, 1); LOS_AtomicSet(&g_lockdepAvailable, 1);
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
} }
//OsLockDepGetCycles获取当前 CPU 的周期计数器的值,用于记录锁请求和释放时的时间戳
STATIC INLINE UINT64 OsLockDepGetCycles(VOID) STATIC INLINE UINT64 OsLockDepGetCycles(VOID)
{ {
UINT32 high, low; UINT32 high, low;
@ -71,7 +69,7 @@ STATIC INLINE UINT64 OsLockDepGetCycles(VOID)
/* combine cycleHi and cycleLo into 8 bytes cycles */ /* combine cycleHi and cycleLo into 8 bytes cycles */
return (((UINT64)high << 32) + low); return (((UINT64)high << 32) + low);
} }
//OsLockDepErrorStringGet根据错误类型返回对应的错误字符串用于打印错误信息
STATIC INLINE CHAR *OsLockDepErrorStringGet(enum LockDepErrType type) STATIC INLINE CHAR *OsLockDepErrorStringGet(enum LockDepErrType type)
{ {
CHAR *errorString = NULL; CHAR *errorString = NULL;
@ -96,7 +94,7 @@ STATIC INLINE CHAR *OsLockDepErrorStringGet(enum LockDepErrType type)
return errorString; return errorString;
} }
//OsLockDepPanic当发生严重错误时触发系统的崩溃通常在检测到死锁等无法修复的情况下调用
WEAK VOID OsLockDepPanic(enum LockDepErrType errType) WEAK VOID OsLockDepPanic(enum LockDepErrType errType)
{ {
/* halt here */ /* halt here */
@ -105,7 +103,7 @@ WEAK VOID OsLockDepPanic(enum LockDepErrType errType)
OsBackTrace(); OsBackTrace();
while (1) {} while (1) {}
} }
//OsLockDepDumpLock输出锁依赖检查失败时的调试信息包括任务名、任务 ID、CPU 号等,并最终触发崩溃
STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock, STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock,
const VOID *requestAddr, enum LockDepErrType errType) const VOID *requestAddr, enum LockDepErrType errType)
{ {
@ -145,7 +143,7 @@ STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock,
OsLockDepPanic(errType); OsLockDepPanic(errType);
} }
//OsLockDepCheckDependancy检查当前任务与锁的所有者之间是否存在依赖关系以避免死锁
STATIC BOOL OsLockDepCheckDependancy(const LosTaskCB *current, const LosTaskCB *lockOwner) STATIC BOOL OsLockDepCheckDependancy(const LosTaskCB *current, const LosTaskCB *lockOwner)
{ {
BOOL checkResult = TRUE; BOOL checkResult = TRUE;
@ -166,7 +164,7 @@ STATIC BOOL OsLockDepCheckDependancy(const LosTaskCB *current, const LosTaskCB *
return checkResult; return checkResult;
} }
//OsLockDepCheckIn在请求锁时进行依赖检查记录锁的请求地址和等待时间如检查失败则触发崩溃
VOID OsLockDepCheckIn(const SPIN_LOCK_S *lock) VOID OsLockDepCheckIn(const SPIN_LOCK_S *lock)
{ {
UINT32 intSave; UINT32 intSave;
@ -219,7 +217,7 @@ OUT:
OsLockDepRelease(intSave); OsLockDepRelease(intSave);
} }
//OsLockDepRecord记录成功获取锁的时间戳和持有者信息并更新锁的所有者和 CPU 号等信息
VOID OsLockDepRecord(SPIN_LOCK_S *lock) VOID OsLockDepRecord(SPIN_LOCK_S *lock)
{ {
UINT32 intSave; UINT32 intSave;
@ -252,7 +250,7 @@ VOID OsLockDepRecord(SPIN_LOCK_S *lock)
OsLockDepRelease(intSave); OsLockDepRelease(intSave);
} }
//OsLockDepCheckOut在释放锁时进行依赖检查记录持有时间并清除相关信息如检查失败则触发崩溃
VOID OsLockDepCheckOut(SPIN_LOCK_S *lock) VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
{ {
UINT32 intSave; UINT32 intSave;
@ -304,8 +302,7 @@ VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
OUT: OUT:
OsLockDepRelease(intSave); OsLockDepRelease(intSave);
} }
//OsLockdepClearSpinlocks清除当前任务持有的所有自旋锁通常在系统处于异常状态下调用以确保解锁
//自旋锁是一种用于多线程同步的机制。在使用自旋锁时,线程会反复检查锁是否被释放,如果锁已经被占用,线程就会一直循环等待,直到锁被释放为止
VOID OsLockdepClearSpinlocks(VOID) VOID OsLockdepClearSpinlocks(VOID)
{ {
LosTaskCB *task = OsCurrTaskGet(); LosTaskCB *task = OsCurrTaskGet();

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//操作系统的基础函数
#include "los_task_pri.h" #include "los_task_pri.h"
#include "los_misc_pri.h" #include "los_misc_pri.h"
#include "los_memory_pri.h" #include "los_memory_pri.h"
@ -48,23 +48,23 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef LOSCFG_LIB_CONFIGURABLE #ifdef LOSCFG_LIB_CONFIGURABLE
LITE_OS_SEC_BSS UINT32 g_osSysClock; //操作系统的系统时钟频率 LITE_OS_SEC_BSS UINT32 g_osSysClock;
LITE_OS_SEC_BSS UINT32 g_semLimit; //信号量的最大数量限制 LITE_OS_SEC_BSS UINT32 g_semLimit;
LITE_OS_SEC_BSS UINT32 g_muxLimit; //互斥锁的最大数量限制 LITE_OS_SEC_BSS UINT32 g_muxLimit;
LITE_OS_SEC_BSS UINT32 g_queueLimit; //队列最大数量限制 LITE_OS_SEC_BSS UINT32 g_queueLimit;
LITE_OS_SEC_BSS UINT32 g_swtmrLimit; //软件定时器的最大数量限制 LITE_OS_SEC_BSS UINT32 g_swtmrLimit;
LITE_OS_SEC_BSS UINT32 g_taskLimit; //任务的最大数量限制 LITE_OS_SEC_BSS UINT32 g_taskLimit;
LITE_OS_SEC_BSS UINT32 g_minusOneTickPerSecond; //每秒减去的滴答数,用于时间戳计算 LITE_OS_SEC_BSS UINT32 g_minusOneTickPerSecond;
LITE_OS_SEC_BSS UINT32 g_taskMinStkSize;//任务的最小堆栈大小 LITE_OS_SEC_BSS UINT32 g_taskMinStkSize;
LITE_OS_SEC_BSS UINT32 g_taskIdleStkSize; //空闲任务的堆栈大小 LITE_OS_SEC_BSS UINT32 g_taskIdleStkSize;
LITE_OS_SEC_BSS UINT32 g_taskSwtmrStkSize; //软件定时器任务的堆栈大小 LITE_OS_SEC_BSS UINT32 g_taskSwtmrStkSize;
LITE_OS_SEC_BSS UINT32 g_taskDfltStkSize; //默认任务的堆栈大小 LITE_OS_SEC_BSS UINT32 g_taskDfltStkSize;
LITE_OS_SEC_BSS UINT32 g_timeSliceTimeOut; //时间片的超时时间 LITE_OS_SEC_BSS UINT32 g_timeSliceTimeOut;
LITE_OS_SEC_DATA BOOL g_nxEnabled = FALSE; //是否启用了内存保护机制 LITE_OS_SEC_DATA BOOL g_nxEnabled = FALSE;
LITE_OS_SEC_BSS UINTPTR g_dlNxHeapBase; //动态加载库的内存堆起始地址 LITE_OS_SEC_BSS UINTPTR g_dlNxHeapBase;
LITE_OS_SEC_BSS UINT32 g_dlNxHeapSize; //动态加载库的内存堆大小 LITE_OS_SEC_BSS UINT32 g_dlNxHeapSize;
#endif #endif
#ifdef LOSCFG_KERNEL_TRACE #ifdef LOSCFG_KERNEL_TRACE
@ -77,12 +77,11 @@ LMS_INIT_HOOK g_lmsMemInitHook = NULL;
LMS_FUNC_HOOK g_lmsMallocHook = NULL; LMS_FUNC_HOOK g_lmsMallocHook = NULL;
LMS_FUNC_HOOK g_lmsFreeHook = NULL; LMS_FUNC_HOOK g_lmsFreeHook = NULL;
#endif #endif
//LOS_Align用于将给定的地址按指定的边界对齐返回对齐后的地址
LITE_OS_SEC_TEXT UINTPTR LOS_Align(UINTPTR addr, UINT32 boundary) LITE_OS_SEC_TEXT UINTPTR LOS_Align(UINTPTR addr, UINT32 boundary)
{ {
return (addr + boundary - 1) & ~((UINTPTR)(boundary - 1)); return (addr + boundary - 1) & ~((UINTPTR)(boundary - 1));
} }
//OsDumpMemByte用于以字节为单位打印内存中的数据
LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 msecs) LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 msecs)
{ {
UINT32 interval; UINT32 interval;
@ -98,7 +97,7 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_Msleep(UINT32 msecs)
(VOID)LOS_TaskDelay(interval); (VOID)LOS_TaskDelay(interval);
} }
//OsDumpMemByte用于以字节为单位打印内存中的数据
VOID OsDumpMemByte(size_t length, UINTPTR addr) VOID OsDumpMemByte(size_t length, UINTPTR addr)
{ {
size_t dataLen; size_t dataLen;
@ -142,7 +141,6 @@ VOID OsDumpMemByte(size_t length, UINTPTR addr)
} }
#if defined(LOSCFG_DEBUG_SEMAPHORE) || defined(LOSCFG_DEBUG_MUTEX) || defined(LOSCFG_DEBUG_QUEUE) #if defined(LOSCFG_DEBUG_SEMAPHORE) || defined(LOSCFG_DEBUG_MUTEX) || defined(LOSCFG_DEBUG_QUEUE)
//OsArraySort快速排序
VOID OsArraySort(UINT32 *sortArray, UINT32 start, UINT32 end, VOID OsArraySort(UINT32 *sortArray, UINT32 start, UINT32 end,
const SortParam *sortParam, OsCompareFunc compareFunc) const SortParam *sortParam, OsCompareFunc compareFunc)
{ {

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*针对多处理器SMP系统的操作系统内核部分的实现
*/
#include "los_mp_pri.h" #include "los_mp_pri.h"
#include "los_task_pri.h" #include "los_task_pri.h"
#include "los_percpu_pri.h" #include "los_percpu_pri.h"
@ -46,7 +45,7 @@ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_mpCallSpin);
#define MP_CALL_LOCK(state) LOS_SpinLockSave(&g_mpCallSpin, &(state)) #define MP_CALL_LOCK(state) LOS_SpinLockSave(&g_mpCallSpin, &(state))
#define MP_CALL_UNLOCK(state) LOS_SpinUnlockRestore(&g_mpCallSpin, (state)) #define MP_CALL_UNLOCK(state) LOS_SpinUnlockRestore(&g_mpCallSpin, (state))
#endif #endif
//LOS_MpSchedule多处理器调度函数用于向指定的处理器发送调度中断
VOID LOS_MpSchedule(UINT32 target) VOID LOS_MpSchedule(UINT32 target)
{ {
UINT32 ret; UINT32 ret;
@ -58,12 +57,12 @@ VOID LOS_MpSchedule(UINT32 target)
} }
return; return;
} }
//OsMpWakeHandler多处理器唤醒处理函数目前为空实现无特定操作
VOID OsMpWakeHandler(VOID) VOID OsMpWakeHandler(VOID)
{ {
/* generic wakeup ipi, do nothing */ /* generic wakeup ipi, do nothing */
} }
//OsMpScheduleHandler多处理器调度处理函数设置调度标志以触发调度器在中断结束时执行调度
VOID OsMpScheduleHandler(VOID) VOID OsMpScheduleHandler(VOID)
{ {
/* /*
@ -72,7 +71,7 @@ VOID OsMpScheduleHandler(VOID)
*/ */
OsPercpuGet()->schedFlag = INT_PEND_RESCH; OsPercpuGet()->schedFlag = INT_PEND_RESCH;
} }
//OsMpHaltHandler多处理器停机处理函数将当前处理器标记为已停机状态并进入死循环
VOID OsMpHaltHandler(VOID) VOID OsMpHaltHandler(VOID)
{ {
(VOID)LOS_IntLock(); (VOID)LOS_IntLock();
@ -80,7 +79,7 @@ VOID OsMpHaltHandler(VOID)
while (1) {} while (1) {}
} }
//OsMpCollectTasks多处理器任务回收函数用于递归检查所有可用任务并删除标记为需要销毁的任务
VOID OsMpCollectTasks(VOID) VOID OsMpCollectTasks(VOID)
{ {
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
@ -110,7 +109,6 @@ VOID OsMpCollectTasks(VOID)
} }
#ifdef LOSCFG_KERNEL_SMP_CALL #ifdef LOSCFG_KERNEL_SMP_CALL
//OsMpFuncCall多处理器函数调用函数用于向指定的处理器发送函数调用请求
VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args) VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args)
{ {
UINT32 index; UINT32 index;
@ -146,7 +144,7 @@ VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args)
} }
return; return;
} }
//OsMpFuncCallHandler多处理器函数调用处理函数从本处理器的函数调用队列中取出并执行函数调用请求
VOID OsMpFuncCallHandler(VOID) VOID OsMpFuncCallHandler(VOID)
{ {
UINT32 intSave; UINT32 intSave;
@ -168,7 +166,7 @@ VOID OsMpFuncCallHandler(VOID)
} }
MP_CALL_UNLOCK(intSave); MP_CALL_UNLOCK(intSave);
} }
//OsMpFuncCallInit多处理器函数调用初始化函数用于初始化每个核心的函数调用队列
VOID OsMpFuncCallInit(VOID) VOID OsMpFuncCallInit(VOID)
{ {
UINT32 index; UINT32 index;
@ -178,7 +176,7 @@ VOID OsMpFuncCallInit(VOID)
} }
} }
#endif /* LOSCFG_KERNEL_SMP_CALL */ #endif /* LOSCFG_KERNEL_SMP_CALL */
//OsMpInit多处理器初始化函数包括创建周期性软件定时器和初始化函数调用队列等
UINT32 OsMpInit(VOID) UINT32 OsMpInit(VOID)
{ {
UINT16 swtmrId; UINT16 swtmrId;

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*代码实现了一个简单的互斥锁Mutex用于保护共享资源的访问
线访访*/
#include "los_mux_pri.h" #include "los_mux_pri.h"
#include "los_mux_debug_pri.h" #include "los_mux_debug_pri.h"
#include "los_bitmap.h" #include "los_bitmap.h"
@ -50,7 +49,6 @@ LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_unusedMuxList;
* Description : Initializes the mutex * Description : Initializes the mutex
* Return : LOS_OK on success, or error code on failure * Return : LOS_OK on success, or error code on failure
*/ */
//OsMuxInitMutex初始化函数用于初始化Mutex数据结构并设置初始状态
LITE_OS_SEC_TEXT UINT32 OsMuxInit(VOID) LITE_OS_SEC_TEXT UINT32 OsMuxInit(VOID)
{ {
LosMuxCB *muxNode = NULL; LosMuxCB *muxNode = NULL;
@ -76,7 +74,7 @@ LITE_OS_SEC_TEXT UINT32 OsMuxInit(VOID)
} }
return LOS_OK; return LOS_OK;
} }
//LOS_MuxCreate创建Mutex函数用于创建一个新的Mutex对象并返回其句柄
LITE_OS_SEC_TEXT UINT32 LOS_MuxCreate(UINT32 *muxHandle) LITE_OS_SEC_TEXT UINT32 LOS_MuxCreate(UINT32 *muxHandle)
{ {
UINT32 intSave; UINT32 intSave;
@ -115,7 +113,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxCreate(UINT32 *muxHandle)
ERR_HANDLER: ERR_HANDLER:
OS_RETURN_ERROR_P2(errLine, errNo); OS_RETURN_ERROR_P2(errLine, errNo);
} }
//LOS_MuxDelete删除Mutex函数用于删除指定的Mutex对象及其相关资源
LITE_OS_SEC_TEXT UINT32 LOS_MuxDelete(UINT32 muxHandle) LITE_OS_SEC_TEXT UINT32 LOS_MuxDelete(UINT32 muxHandle)
{ {
UINT32 intSave; UINT32 intSave;
@ -156,7 +154,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxDelete(UINT32 muxHandle)
ERR_HANDLER: ERR_HANDLER:
OS_RETURN_ERROR_P2(errLine, errNo); OS_RETURN_ERROR_P2(errLine, errNo);
} }
//OsMuxParaCheck 函数主要用于验证互斥量操作的参数是否有效,包括互斥量是否被正确创建和传入的句柄是否有效,以及当前是否处于中断上下文
LITE_OS_SEC_TEXT STATIC UINT32 OsMuxParaCheck(const LosMuxCB *muxCB, UINT32 muxHandle) LITE_OS_SEC_TEXT STATIC UINT32 OsMuxParaCheck(const LosMuxCB *muxCB, UINT32 muxHandle)
{ {
if ((muxCB->muxStat == LOS_UNUSED) || (muxCB->muxId != muxHandle)) { if ((muxCB->muxStat == LOS_UNUSED) || (muxCB->muxId != muxHandle)) {
@ -170,7 +168,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsMuxParaCheck(const LosMuxCB *muxCB, UINT32 muxH
} }
return LOS_OK; return LOS_OK;
} }
//OsMuxBitmapSet 函数用于在互斥量等待队列中设置任务的优先级位图,并根据需要调整任务的优先级,以确保任务在等待互斥量时能够正确反映其优先级关系
LITE_OS_SEC_TEXT STATIC VOID OsMuxBitmapSet(const LosTaskCB *runTask, const MuxBaseCB *muxPended) LITE_OS_SEC_TEXT STATIC VOID OsMuxBitmapSet(const LosTaskCB *runTask, const MuxBaseCB *muxPended)
{ {
if (muxPended->owner->priority > runTask->priority) { if (muxPended->owner->priority > runTask->priority) {
@ -178,7 +176,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsMuxBitmapSet(const LosTaskCB *runTask, const MuxB
OsTaskPriModify(muxPended->owner, runTask->priority); OsTaskPriModify(muxPended->owner, runTask->priority);
} }
} }
//OsMuxBitmapRestore 函数用于恢复任务的优先级位图,并根据需要更新拥有者任务的优先级
LITE_OS_SEC_TEXT STATIC VOID OsMuxBitmapRestore(const LosTaskCB *runTask, LosTaskCB *owner) LITE_OS_SEC_TEXT STATIC VOID OsMuxBitmapRestore(const LosTaskCB *runTask, LosTaskCB *owner)
{ {
UINT16 bitMapPri; UINT16 bitMapPri;
@ -246,8 +244,7 @@ LITE_OS_SEC_TEXT STATIC LOS_DL_LIST *OsMuxPendFindPos(const LosTaskCB *runTask,
return node; return node;
} }
#endif #endif
//总体来说OsMuxPostOp 函数用于处理 Mutex 的释放操作,包括唤醒等待任务、更新 Mutex 状态和持有者等
//确保 Mutex 能够按照预期的方式被正确释放和传递给下一个任务
LITE_OS_SEC_TEXT UINT32 OsMuxPendOp(LosTaskCB *runTask, MuxBaseCB *muxPended, UINT32 timeout, LITE_OS_SEC_TEXT UINT32 OsMuxPendOp(LosTaskCB *runTask, MuxBaseCB *muxPended, UINT32 timeout,
UINT32 *intSave) UINT32 *intSave)
{ {
@ -273,7 +270,7 @@ LITE_OS_SEC_TEXT UINT32 OsMuxPendOp(LosTaskCB *runTask, MuxBaseCB *muxPended, UI
return ret; return ret;
} }
//LOS_MuxPend等待Mutex函数用于尝试获取指定Mutex的访问权限。如果Mutex已被其他任务持有则当前任务会被挂起直到Mutex可用
LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout) LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
{ {
UINT32 ret; UINT32 ret;
@ -335,7 +332,7 @@ OUT_UNLOCK:
} }
return ret; return ret;
} }
//OsMuxPostOpSub:通过比较当前任务和 Mutex 等待队列中的任务的优先级,来调整当前任务的优先级位图,并将 Mutex 持有者的优先级提升
LITE_OS_SEC_TEXT STATIC VOID OsMuxPostOpSub(LosTaskCB *runTask, MuxBaseCB *muxPosted) LITE_OS_SEC_TEXT STATIC VOID OsMuxPostOpSub(LosTaskCB *runTask, MuxBaseCB *muxPosted)
{ {
LosTaskCB *pendedTask = NULL; LosTaskCB *pendedTask = NULL;
@ -353,7 +350,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsMuxPostOpSub(LosTaskCB *runTask, MuxBaseCB *muxPo
LOS_BitmapClr(&runTask->priBitMap, bitMapPri); LOS_BitmapClr(&runTask->priBitMap, bitMapPri);
OsTaskPriModify(muxPosted->owner, bitMapPri); OsTaskPriModify(muxPosted->owner, bitMapPri);
} }
//
LITE_OS_SEC_TEXT UINT32 OsMuxPostOp(LosTaskCB *runTask, MuxBaseCB *muxPosted) LITE_OS_SEC_TEXT UINT32 OsMuxPostOp(LosTaskCB *runTask, MuxBaseCB *muxPosted)
{ {
LosTaskCB *resumedTask = NULL; LosTaskCB *resumedTask = NULL;
@ -389,7 +386,7 @@ LITE_OS_SEC_TEXT UINT32 OsMuxPostOp(LosTaskCB *runTask, MuxBaseCB *muxPosted)
return MUX_SCHEDULE; return MUX_SCHEDULE;
} }
//LOS_MuxPost释放Mutex函数用于释放当前任务对指定Mutex的访问权限以便其他任务可以获取该Mutex
LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle) LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle)
{ {
UINT32 ret; UINT32 ret;

@ -33,7 +33,7 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//定义全局变量数组用于存储每个CPU核心的私有数据
Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM]; Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM];
#ifdef __cplusplus #ifdef __cplusplus

@ -32,7 +32,7 @@
* It should not add OS inner invocation, which is not allowed to be accessed in user space. * It should not add OS inner invocation, which is not allowed to be accessed in user space.
* But it's allowed to invoke syscall interface. * But it's allowed to invoke syscall interface.
*---------------------------------------------------------------------------- */ *---------------------------------------------------------------------------- */
/*这段代码是一个输出控制模块,根据不同的输出类型将字符串输出到不同的设备上*/
#ifdef LOSCFG_LIB_LIBC #ifdef LOSCFG_LIB_LIBC
#include "unistd.h" #include "unistd.h"
#endif #endif
@ -62,13 +62,13 @@ typedef enum {
CONSOLE_OUTPUT = 2, CONSOLE_OUTPUT = 2,
EXC_OUTPUT = 3 EXC_OUTPUT = 3
} OutputType; } OutputType;
//ErrorMsg用于输出错误信息当字符串输出非法或者vsnprintf_s函数失败时调用
STATIC VOID ErrorMsg(VOID) STATIC VOID ErrorMsg(VOID)
{ {
const CHAR *p = "Output illegal string! vsnprintf_s failed!\n"; const CHAR *p = "Output illegal string! vsnprintf_s failed!\n";
UartPuts(p, (UINT32)strlen(p), UART_WITH_LOCK); UartPuts(p, (UINT32)strlen(p), UART_WITH_LOCK);
} }
//UartOutput实际将字符串输出到串口的函数根据配置可能会进行一些额外的处理
STATIC VOID UartOutput(const CHAR *str, UINT32 len, BOOL isLock) STATIC VOID UartOutput(const CHAR *str, UINT32 len, BOOL isLock)
{ {
#ifdef LOSCFG_SHELL_DMESG #ifdef LOSCFG_SHELL_DMESG
@ -82,7 +82,7 @@ STATIC VOID UartOutput(const CHAR *str, UINT32 len, BOOL isLock)
UartPuts(str, len, isLock); UartPuts(str, len, isLock);
#endif #endif
} }
//OutputControl根据输出类型选择相应的输出设备并调用对应的输出函数
STATIC VOID OutputControl(const CHAR *str, UINT32 len, OutputType type) STATIC VOID OutputControl(const CHAR *str, UINT32 len, OutputType type)
{ {
switch (type) { switch (type) {
@ -105,14 +105,14 @@ STATIC VOID OutputControl(const CHAR *str, UINT32 len, OutputType type)
} }
return; return;
} }
//OsVprintfFree释放动态分配的缓冲区内存
STATIC VOID OsVprintfFree(CHAR *buf, UINT32 bufLen) STATIC VOID OsVprintfFree(CHAR *buf, UINT32 bufLen)
{ {
if (bufLen != SIZEBUF) { if (bufLen != SIZEBUF) {
(VOID)LOS_MemFree(m_aucSysMem0, buf); (VOID)LOS_MemFree(m_aucSysMem0, buf);
} }
} }
//OsVprintf核心函数根据给定的格式化字符串和可变参数进行字符串格式化并输出到相应的设备
STATIC VOID OsVprintf(const CHAR *fmt, va_list ap, OutputType type) STATIC VOID OsVprintf(const CHAR *fmt, va_list ap, OutputType type)
{ {
INT32 len; INT32 len;
@ -156,7 +156,7 @@ STATIC VOID OsVprintf(const CHAR *fmt, va_list ap, OutputType type)
OutputControl(bBuf, len, type); OutputControl(bBuf, len, type);
OsVprintfFree(bBuf, bufLen); OsVprintfFree(bBuf, bufLen);
} }
//UartVprintf、ConsoleVprintf、UartPrintf、dprintf、LkDprintf、DmesgPrintf、ExcPrintf、PrintExcInfo这些函数都是对OsVprintf的封装提供了不同的输出接口在不同的场景下调用OsVprintf来完成字符串的格式化和输出
VOID UartVprintf(const CHAR *fmt, va_list ap) VOID UartVprintf(const CHAR *fmt, va_list ap)
{ {
OsVprintf(fmt, ap, UART_OUTPUT); OsVprintf(fmt, ap, UART_OUTPUT);

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//实现了一个基于轻量级操作系统的队列管理模块,提供了队列的创建、读写、删除以及信息获取等功能
#include "los_queue_pri.h" #include "los_queue_pri.h"
#include "los_queue_debug_pri.h" #include "los_queue_debug_pri.h"
#include "los_task_pri.h" #include "los_task_pri.h"
@ -53,7 +53,6 @@ LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_freeQueueList;
* Description : queue initial * Description : queue initial
* Return : LOS_OK on success or error code on failure * Return : LOS_OK on success or error code on failure
*/ */
//初始化队列,返回成功或失败错误码
LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID) LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)
{ {
LosQueueCB *queueNode = NULL; LosQueueCB *queueNode = NULL;
@ -79,7 +78,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)
} }
return LOS_OK; return LOS_OK;
} }
//OsQueueCreateParameterCheck函数用于检查创建队列时传入的参数是否合法
STATIC INLINE UINT32 OsQueueCreateParameterCheck(UINT16 len, const UINT32 *queueId, UINT16 maxMsgSize) STATIC INLINE UINT32 OsQueueCreateParameterCheck(UINT16 len, const UINT32 *queueId, UINT16 maxMsgSize)
{ {
if (queueId == NULL) { if (queueId == NULL) {
@ -95,7 +94,7 @@ STATIC INLINE UINT32 OsQueueCreateParameterCheck(UINT16 len, const UINT32 *queue
} }
return LOS_OK; return LOS_OK;
} }
//OsQueueCreateInternal函数用于创建队列包括在队列控制块中记录队列长度、消息大小等信息
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsQueueCreateInternal(UINT16 len, UINT32 *queueId, UINT16 msgSize, LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsQueueCreateInternal(UINT16 len, UINT32 *queueId, UINT16 msgSize,
UINT8 *queue, UINT8 queueMemType) UINT8 *queue, UINT8 queueMemType)
{ {
@ -166,7 +165,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreateStatic(const CHAR *queueName,
return OsQueueCreateInternal(len, queueId, msgSize, queueMem, OS_QUEUE_ALLOC_STATIC); return OsQueueCreateInternal(len, queueId, msgSize, queueMem, OS_QUEUE_ALLOC_STATIC);
} }
#endif #endif
//创建队列
LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(const CHAR *queueName, UINT16 len, UINT32 *queueId, LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(const CHAR *queueName, UINT16 len, UINT32 *queueId,
UINT32 flags, UINT16 maxMsgSize) UINT32 flags, UINT16 maxMsgSize)
{ {
@ -199,7 +198,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(const CHAR *queueName, UINT16 len,
return LOS_OK; return LOS_OK;
} }
//OsQueueReadParameterCheck和OsQueueWriteParameterCheck分别用于检查读和写操作的参数合法性
LITE_OS_SEC_TEXT STATIC UINT32 OsQueueReadParameterCheck(UINT32 queueId, const VOID *bufferAddr, LITE_OS_SEC_TEXT STATIC UINT32 OsQueueReadParameterCheck(UINT32 queueId, const VOID *bufferAddr,
const UINT32 *bufferSize, UINT32 timeout) const UINT32 *bufferSize, UINT32 timeout)
{ {
@ -249,7 +248,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsQueueWriteParameterCheck(UINT32 queueId, const
} }
return LOS_OK; return LOS_OK;
} }
//实现了队列的读取和写入操作,并对可能出现的错误进行了处理
STATIC UINT32 OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize) STATIC UINT32 OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize)
{ {
UINT8 *queueNode = NULL; UINT8 *queueNode = NULL;
@ -297,7 +296,7 @@ STATIC UINT32 OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID
} }
return LOS_OK; return LOS_OK;
} }
//用于处理队列操作函数 OsQueueBufferOperate 返回的错误码,使得在发生错误时能够打印相应的错误信息
STATIC VOID OsQueueBufferOperateErrProcess(UINT32 errorCode) STATIC VOID OsQueueBufferOperateErrProcess(UINT32 errorCode)
{ {
switch (errorCode) { switch (errorCode) {
@ -337,7 +336,7 @@ STATIC UINT32 OsQueueOperateParamCheck(const LosQueueCB *queueCB, UINT32 queueId
} }
return LOS_OK; return LOS_OK;
} }
//OsQueueOperate:实现了对队列的操作,包括参数检查、任务挂起与唤醒以及错误处理等功能
STATIC UINT32 OsQueueOperate(UINT32 queueId, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeout) STATIC UINT32 OsQueueOperate(UINT32 queueId, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeout)
{ {
LosQueueCB *queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueId); LosQueueCB *queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueId);
@ -401,7 +400,7 @@ QUEUE_END:
OsQueueBufferOperateErrProcess(errorCode); OsQueueBufferOperateErrProcess(errorCode);
return ret; return ret;
} }
//LOS_QueueReadCopy从队列中读取数据通过参数检查后调用OsQueueOperate函数进行实际的读取操作
LITE_OS_SEC_TEXT UINT32 LOS_QueueReadCopy(UINT32 queueId, LITE_OS_SEC_TEXT UINT32 LOS_QueueReadCopy(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 *bufferSize, UINT32 *bufferSize,
@ -418,7 +417,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueReadCopy(UINT32 queueId,
operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_READ, OS_QUEUE_HEAD); operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_READ, OS_QUEUE_HEAD);
return OsQueueOperate(queueId, operateType, bufferAddr, bufferSize, timeout); return OsQueueOperate(queueId, operateType, bufferAddr, bufferSize, timeout);
} }
//LOS_QueueWriteHeadCopy向队列的头部写入数据通过参数检查后调用OsQueueOperate函数进行实际的写入操作
LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHeadCopy(UINT32 queueId, LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHeadCopy(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 bufferSize, UINT32 bufferSize,
@ -435,7 +434,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHeadCopy(UINT32 queueId,
operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_WRITE, OS_QUEUE_HEAD); operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_WRITE, OS_QUEUE_HEAD);
return OsQueueOperate(queueId, operateType, bufferAddr, &bufferSize, timeout); return OsQueueOperate(queueId, operateType, bufferAddr, &bufferSize, timeout);
} }
//LOS_QueueWriteCopy向队列的尾部写入数据通过参数检查后调用OsQueueOperate函数进行实际的写入操作
LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteCopy(UINT32 queueId, LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteCopy(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 bufferSize, UINT32 bufferSize,
@ -452,12 +451,12 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteCopy(UINT32 queueId,
operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_WRITE, OS_QUEUE_TAIL); operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_WRITE, OS_QUEUE_TAIL);
return OsQueueOperate(queueId, operateType, bufferAddr, &bufferSize, timeout); return OsQueueOperate(queueId, operateType, bufferAddr, &bufferSize, timeout);
} }
//LOS_QueueRead从队列中读取数据的简化接口直接调用LOS_QueueReadCopy函数
LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueId, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout) LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueId, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
{ {
return LOS_QueueReadCopy(queueId, bufferAddr, &bufferSize, timeout); return LOS_QueueReadCopy(queueId, bufferAddr, &bufferSize, timeout);
} }
//LOS_QueueWrite向队列中写入数据的简化接口先进行参数检查然后调用LOS_QueueWriteCopy函数
LITE_OS_SEC_TEXT UINT32 LOS_QueueWrite(UINT32 queueId, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout) LITE_OS_SEC_TEXT UINT32 LOS_QueueWrite(UINT32 queueId, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
{ {
if (bufferAddr == NULL) { if (bufferAddr == NULL) {
@ -466,7 +465,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueWrite(UINT32 queueId, VOID *bufferAddr, UINT32
bufferSize = sizeof(CHAR *); bufferSize = sizeof(CHAR *);
return LOS_QueueWriteCopy(queueId, &bufferAddr, bufferSize, timeout); return LOS_QueueWriteCopy(queueId, &bufferAddr, bufferSize, timeout);
} }
//LOS_QueueWriteHead向队列头部写入数据的简化接口先进行参数检查然后调用LOS_QueueWriteHeadCopy函数
LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHead(UINT32 queueId, LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHead(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 bufferSize, UINT32 bufferSize,
@ -478,8 +477,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHead(UINT32 queueId,
bufferSize = sizeof(CHAR *); bufferSize = sizeof(CHAR *);
return LOS_QueueWriteHeadCopy(queueId, &bufferAddr, bufferSize, timeout); return LOS_QueueWriteHeadCopy(queueId, &bufferAddr, bufferSize, timeout);
} }
//LOS_QueueDelete删除队列的函数
//首先检查队列是否存在,如果存在则检查是否有任务正在使用队列或者队列中还有未释放的内存块,如果满足条件则释放队列所占用的资源
LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueDelete(UINT32 queueId) LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueDelete(UINT32 queueId)
{ {
LosQueueCB *queueCB = NULL; LosQueueCB *queueCB = NULL;
@ -539,7 +537,7 @@ QUEUE_END:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
} }
//LOS_QueueInfoGet:获取指定队列的相关信息包括队列ID、队列长度、队列大小、队列头尾指针、等待读取和写入的任务数等
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_QueueInfoGet(UINT32 queueId, QUEUE_INFO_S *queueInfo) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_QueueInfoGet(UINT32 queueId, QUEUE_INFO_S *queueInfo)
{ {
UINT32 intSave; UINT32 intSave;
@ -597,9 +595,6 @@ QUEUE_END:
* : timeout --- Expiry time. The value range is [0,LOS_WAIT_FOREVER] * : timeout --- Expiry time. The value range is [0,LOS_WAIT_FOREVER]
* Return : pointer if success otherwise NULL * Return : pointer if success otherwise NULL
*/ */
//OsQueueMailAlloc函数用来从邮件池中分配一个邮件内存块
//如果没有可用的内存块,则根据超时时间挂起当前任务,并将其加入到等待内存块的任务链表中
//当有内存块可用时,会将任务从任务链表中移除,并返回分配的内存块指针
LITE_OS_SEC_TEXT VOID *OsQueueMailAlloc(UINT32 queueId, VOID *mailPool, UINT32 timeout) LITE_OS_SEC_TEXT VOID *OsQueueMailAlloc(UINT32 queueId, VOID *mailPool, UINT32 timeout)
{ {
VOID *mem = NULL; VOID *mem = NULL;
@ -668,8 +663,6 @@ END:
* : mailMem --- The mail memory block address * : mailMem --- The mail memory block address
* Return : LOS_OK on success or error code on failure * Return : LOS_OK on success or error code on failure
*/ */
//OsQueueMailFree函数用来释放指定的邮件内存块并将其加入到邮件池的空闲链表中
//如果有任务在等待内存块,则会从任务链表中唤醒一个任务,并将其从任务链表中移除
LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueId, VOID *mailPool, VOID *mailMem) LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueId, VOID *mailPool, VOID *mailMem)
{ {
VOID *mem = NULL; VOID *mem = NULL;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*实现环形缓冲区。环形缓冲区是一种循环使用固定大小存储空间的数据结构,常用于解决生产者-消费者问题*/
#include "los_ringbuf.h" #include "los_ringbuf.h"
#ifdef __cplusplus #ifdef __cplusplus
@ -33,7 +33,7 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//LOS_RingbufUsedSize获取环形缓冲区已使用的大小
UINT32 LOS_RingbufUsedSize(Ringbuf *ringbuf) UINT32 LOS_RingbufUsedSize(Ringbuf *ringbuf)
{ {
UINT32 size; UINT32 size;
@ -56,7 +56,6 @@ UINT32 LOS_RingbufUsedSize(Ringbuf *ringbuf)
* | * |
* endIdx * endIdx
*/ */
//OsRingbufWriteLinear线性写入数据到环形缓冲区
STATIC UINT32 OsRingbufWriteLinear(Ringbuf *ringbuf, const CHAR *buf, UINT32 size) STATIC UINT32 OsRingbufWriteLinear(Ringbuf *ringbuf, const CHAR *buf, UINT32 size)
{ {
UINT32 cpSize; UINT32 cpSize;
@ -78,7 +77,7 @@ STATIC UINT32 OsRingbufWriteLinear(Ringbuf *ringbuf, const CHAR *buf, UINT32 siz
return cpSize; return cpSize;
} }
//OsRingbufWriteLoop循环写入数据到环形缓冲区
STATIC UINT32 OsRingbufWriteLoop(Ringbuf *ringbuf, const CHAR *buf, UINT32 size) STATIC UINT32 OsRingbufWriteLoop(Ringbuf *ringbuf, const CHAR *buf, UINT32 size)
{ {
UINT32 right, cpSize; UINT32 right, cpSize;
@ -106,7 +105,7 @@ STATIC UINT32 OsRingbufWriteLoop(Ringbuf *ringbuf, const CHAR *buf, UINT32 size)
return cpSize; return cpSize;
} }
//LOS_RingbufWrite向环形缓冲区写入数据
UINT32 LOS_RingbufWrite(Ringbuf *ringbuf, const CHAR *buf, UINT32 size) UINT32 LOS_RingbufWrite(Ringbuf *ringbuf, const CHAR *buf, UINT32 size)
{ {
UINT32 cpSize = 0; UINT32 cpSize = 0;
@ -131,7 +130,7 @@ EXIT:
LOS_SpinUnlockRestore(&ringbuf->lock, intSave); LOS_SpinUnlockRestore(&ringbuf->lock, intSave);
return cpSize; return cpSize;
} }
//OsRingbufReadLinear线性读取环形缓冲区中的数据
STATIC UINT32 OsRingbufReadLinear(Ringbuf *ringbuf, CHAR *buf, UINT32 size) STATIC UINT32 OsRingbufReadLinear(Ringbuf *ringbuf, CHAR *buf, UINT32 size)
{ {
UINT32 cpSize, remain; UINT32 cpSize, remain;
@ -154,7 +153,7 @@ STATIC UINT32 OsRingbufReadLinear(Ringbuf *ringbuf, CHAR *buf, UINT32 size)
return cpSize; return cpSize;
} }
//OsRingbufReadLoop循环读取环形缓冲区中的数据
STATIC UINT32 OsRingbufReadLoop(Ringbuf *ringbuf, CHAR *buf, UINT32 size) STATIC UINT32 OsRingbufReadLoop(Ringbuf *ringbuf, CHAR *buf, UINT32 size)
{ {
UINT32 right, cpSize; UINT32 right, cpSize;
@ -180,7 +179,7 @@ STATIC UINT32 OsRingbufReadLoop(Ringbuf *ringbuf, CHAR *buf, UINT32 size)
return cpSize; return cpSize;
} }
//LOS_RingbufRead从环形缓冲区读取数据
UINT32 LOS_RingbufRead(Ringbuf *ringbuf, CHAR *buf, UINT32 size) UINT32 LOS_RingbufRead(Ringbuf *ringbuf, CHAR *buf, UINT32 size)
{ {
UINT32 cpSize; UINT32 cpSize;
@ -206,7 +205,7 @@ EXIT:
LOS_SpinUnlockRestore(&ringbuf->lock, intSave); LOS_SpinUnlockRestore(&ringbuf->lock, intSave);
return cpSize; return cpSize;
} }
//LOS_RingbufInit初始化环形缓冲区
UINT32 LOS_RingbufInit(Ringbuf *ringbuf, CHAR *fifo, UINT32 size) UINT32 LOS_RingbufInit(Ringbuf *ringbuf, CHAR *fifo, UINT32 size)
{ {
if ((ringbuf == NULL) || (fifo == NULL) || if ((ringbuf == NULL) || (fifo == NULL) ||
@ -222,7 +221,7 @@ UINT32 LOS_RingbufInit(Ringbuf *ringbuf, CHAR *fifo, UINT32 size)
ringbuf->status = RBUF_INITED; ringbuf->status = RBUF_INITED;
return LOS_OK; return LOS_OK;
} }
//LOS_RingbufReset重置环形缓冲区
VOID LOS_RingbufReset(Ringbuf *ringbuf) VOID LOS_RingbufReset(Ringbuf *ringbuf)
{ {
UINT32 intSave; UINT32 intSave;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*实现信号量的操作系统内核代码主要包括信号量的创建、删除、等待Pend和释放Post等操作*/
#include "los_sem_pri.h" #include "los_sem_pri.h"
#include "los_sem_debug_pri.h" #include "los_sem_debug_pri.h"
#include "los_err_pri.h" #include "los_err_pri.h"
@ -49,7 +49,7 @@ STATIC_INLINE VOID OsSemNodeRecycle(LosSemCB *semNode)
semNode->semStat = LOS_UNUSED; semNode->semStat = LOS_UNUSED;
LOS_ListTailInsert(&g_unusedSemList, &semNode->semList); LOS_ListTailInsert(&g_unusedSemList, &semNode->semList);
} }
//OsSemInit()函数:用于初始化信号量管理模块,包括申请创建信号量所需要的内存空间、将信号量结构体加入到未使用链表中等
LITE_OS_SEC_TEXT_INIT UINT32 OsSemInit(VOID) LITE_OS_SEC_TEXT_INIT UINT32 OsSemInit(VOID)
{ {
LosSemCB *semNode = NULL; LosSemCB *semNode = NULL;
@ -74,8 +74,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSemInit(VOID)
} }
return LOS_OK; return LOS_OK;
} }
//OsSemCreate函数:用于创建一个信号量,并将其加入到已使用信号量列表中
//参数count表示信号量的初始值type表示信号量的类型计数信号量或二进制信号量semHandle用于返回创建的信号量的句柄
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsSemCreate(UINT16 count, UINT8 type, UINT32 *semHandle) LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsSemCreate(UINT16 count, UINT8 type, UINT32 *semHandle)
{ {
UINT32 intSave; UINT32 intSave;
@ -110,7 +109,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsSemCreate(UINT16 count, UINT8 type, UINT32
LOS_TRACE(SEM_CREATE, semCreated->semId, type, count); LOS_TRACE(SEM_CREATE, semCreated->semId, type, count);
return LOS_OK; return LOS_OK;
} }
//LOS_SemCreate:对外部提供的接口函数,用于创建一个计数信号量
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle) LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle)
{ {
if (count > LOS_SEM_COUNT_MAX) { if (count > LOS_SEM_COUNT_MAX) {
@ -118,7 +117,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle)
} }
return OsSemCreate(count, OS_SEM_COUNTING, semHandle); return OsSemCreate(count, OS_SEM_COUNTING, semHandle);
} }
//LOS_BinarySemCreate:对外部提供的接口函数,用于创建一个二进制信号量
LITE_OS_SEC_TEXT_INIT UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle) LITE_OS_SEC_TEXT_INIT UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle)
{ {
if (count > OS_SEM_BINARY_COUNT_MAX) { if (count > OS_SEM_BINARY_COUNT_MAX) {
@ -126,8 +125,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle
} }
return OsSemCreate(count, OS_SEM_BINARY, semHandle); return OsSemCreate(count, OS_SEM_BINARY, semHandle);
} }
//OsSemStateVerify:用于验证信号量的状态是否有效
//参数semId表示要验证的信号量的IDsemNode是指向信号量控制块的指针
STATIC_INLINE UINT32 OsSemStateVerify(UINT32 semId, const LosSemCB *semNode) STATIC_INLINE UINT32 OsSemStateVerify(UINT32 semId, const LosSemCB *semNode)
{ {
#ifndef LOSCFG_RESOURCE_ID_NOT_USE_HIGH_BITS #ifndef LOSCFG_RESOURCE_ID_NOT_USE_HIGH_BITS
@ -139,8 +137,7 @@ STATIC_INLINE UINT32 OsSemStateVerify(UINT32 semId, const LosSemCB *semNode)
} }
return LOS_OK; return LOS_OK;
} }
//OsSemGetCBWithCheck:用于根据信号量句柄获取信号量的控制块
//参数semHandle表示信号量的句柄semCB是一个指向指针的指针用于返回获取到的信号量控制块
STATIC UINT32 OsSemGetCBWithCheck(UINT32 semHandle, LosSemCB **semCB) STATIC UINT32 OsSemGetCBWithCheck(UINT32 semHandle, LosSemCB **semCB)
{ {
if (GET_SEM_INDEX(semHandle) >= (UINT32)KERNEL_SEM_LIMIT) { if (GET_SEM_INDEX(semHandle) >= (UINT32)KERNEL_SEM_LIMIT) {
@ -150,7 +147,7 @@ STATIC UINT32 OsSemGetCBWithCheck(UINT32 semHandle, LosSemCB **semCB)
*semCB = GET_SEM(semHandle); *semCB = GET_SEM(semHandle);
return LOS_OK; return LOS_OK;
} }
//LOS_SemDelete:用于删除指定句柄的信号量,如果有任务正在等待该信号量,则删除失败
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemDelete(UINT32 semHandle) LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemDelete(UINT32 semHandle)
{ {
UINT32 intSave; UINT32 intSave;
@ -187,7 +184,7 @@ OUT:
LOS_TRACE(SEM_DELETE, semHandle, ret); LOS_TRACE(SEM_DELETE, semHandle, ret);
return ret; return ret;
} }
//LOS_SemPend:用于等待Pend一个信号量如果信号量不可用则阻塞当前任务直到信号量可用或超时。timeout表示超时时间
LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout) LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
{ {
UINT32 intSave; UINT32 intSave;
@ -255,7 +252,7 @@ OUT:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
} }
//LOS_SemPost:用于释放Post一个信号量使其变为可用状态并唤醒等待该信号量的任务中的第一个任务
LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 semHandle) LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 semHandle)
{ {
UINT32 intSave; UINT32 intSave;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*嵌入式操作系统中与任务调度相关的排序链表管理代码。包括了对排序链表的初始化、向排序链表中添加节点、从排序链表中删除节点、获取下一个超时时间等操作*/
#include "los_sortlink_pri.h" #include "los_sortlink_pri.h"
#include "los_memory.h" #include "los_memory.h"
#include "los_exc.h" #include "los_exc.h"
@ -39,7 +39,7 @@ extern "C" {
#define OS_INVALID_VALUE 0xFFFFFFFF #define OS_INVALID_VALUE 0xFFFFFFFF
#ifdef LOSCFG_BASE_CORE_USE_MULTI_LIST #ifdef LOSCFG_BASE_CORE_USE_MULTI_LIST
//OsSortLinkInit初始化排序链表为排序链表的头节点分配内存并进行初始化
LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader) LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
{ {
UINT32 size; UINT32 size;
@ -60,7 +60,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
} }
return LOS_OK; return LOS_OK;
} }
//OsAdd2SortLink将一个节点添加到排序链表中根据节点的超时时间计算节点在排序链表中的位置然后插入到相应位置
LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
{ {
SortLinkList *listSorted = NULL; SortLinkList *listSorted = NULL;
@ -106,7 +106,7 @@ LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, So
LOS_ListTailInsert(&listSorted->sortLinkNode, &sortList->sortLinkNode); LOS_ListTailInsert(&listSorted->sortLinkNode, &sortList->sortLinkNode);
} }
} }
//OsCheckSortLink检查排序链表是否合法排除循环引用和无效节点
LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const LOS_DL_LIST *listNode) LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const LOS_DL_LIST *listNode)
{ {
LOS_DL_LIST *tmp = listNode->pstPrev; LOS_DL_LIST *tmp = listNode->pstPrev;
@ -122,7 +122,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const
/* delete invalid sortlink node */ /* delete invalid sortlink node */
OsBackTrace(); OsBackTrace();
} }
//OsDeleteSortLink从排序链表中删除一个节点然后更新相邻节点的超时时间
LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
{ {
LOS_DL_LIST *listObject = NULL; LOS_DL_LIST *listObject = NULL;
@ -141,7 +141,7 @@ LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader,
} }
LOS_ListDelete(&sortList->sortLinkNode); LOS_ListDelete(&sortList->sortLinkNode);
} }
//OsCalcExpierTime根据当前的排序链表游标和节点的位置计算超时时间
LITE_OS_SEC_TEXT STATIC INLINE UINT32 OsCalcExpierTime(UINT32 rollNum, UINT32 sortIndex, UINT16 curSortIndex) LITE_OS_SEC_TEXT STATIC INLINE UINT32 OsCalcExpierTime(UINT32 rollNum, UINT32 sortIndex, UINT16 curSortIndex)
{ {
UINT32 expireTime; UINT32 expireTime;
@ -154,7 +154,7 @@ LITE_OS_SEC_TEXT STATIC INLINE UINT32 OsCalcExpierTime(UINT32 rollNum, UINT32 so
expireTime = ((rollNum - 1) << OS_TSK_SORTLINK_LOGLEN) + sortIndex; expireTime = ((rollNum - 1) << OS_TSK_SORTLINK_LOGLEN) + sortIndex;
return expireTime; return expireTime;
} }
//OsSortLinkGetNextExpireTime获取排序链表中下一个超时时间最小的节点的超时时间
LITE_OS_SEC_TEXT UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader) LITE_OS_SEC_TEXT UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader)
{ {
UINT16 cursor; UINT16 cursor;
@ -184,7 +184,7 @@ LITE_OS_SEC_TEXT UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sor
return expireTime; return expireTime;
} }
//OsSortLinkUpdateExpireTime更新排序链表中所有节点的超时时间并更新游标
LITE_OS_SEC_TEXT VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttribute *sortLinkHeader) LITE_OS_SEC_TEXT VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttribute *sortLinkHeader)
{ {
SortLinkList *sortList = NULL; SortLinkList *sortList = NULL;
@ -215,7 +215,7 @@ LITE_OS_SEC_TEXT VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttr
} }
sortLinkHeader->cursor = (sortLinkHeader->cursor + sleepTicks - 1) % OS_TSK_SORTLINK_LEN; sortLinkHeader->cursor = (sortLinkHeader->cursor + sleepTicks - 1) % OS_TSK_SORTLINK_LEN;
} }
//OsSortLinkGetTargetExpireTime获取目标节点的超时时间
LITE_OS_SEC_TEXT_MINOR UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttribute *sortLinkHeader, LITE_OS_SEC_TEXT_MINOR UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttribute *sortLinkHeader,
const SortLinkList *targetSortList) const SortLinkList *targetSortList)
{ {
@ -235,7 +235,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttrib
} }
#else /* LOSCFG_BASE_CORE_USE_SINGLE_LIST */ #else /* LOSCFG_BASE_CORE_USE_SINGLE_LIST */
//OsSortLinkInit:初始化排序链表头部
LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader) LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
{ {
UINT32 size; UINT32 size;
@ -252,7 +252,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
LOS_ListInit(listObject); LOS_ListInit(listObject);
return LOS_OK; return LOS_OK;
} }
//OsAdd2SortLink:向排序链表中添加元素
LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
{ {
SortLinkList *listSorted = NULL; SortLinkList *listSorted = NULL;
@ -286,7 +286,7 @@ LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, So
LOS_ListTailInsert(&listSorted->sortLinkNode, &sortList->sortLinkNode); LOS_ListTailInsert(&listSorted->sortLinkNode, &sortList->sortLinkNode);
} }
} }
//OsCheckSortLink:检查排序链表的有效性,用于内部调用
LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const LOS_DL_LIST *listNode) LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const LOS_DL_LIST *listNode)
{ {
LOS_DL_LIST *tmp = listNode->pstPrev; LOS_DL_LIST *tmp = listNode->pstPrev;
@ -302,7 +302,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const
/* delete invalid sortlink node */ /* delete invalid sortlink node */
OsBackTrace(); OsBackTrace();
} }
//OsDeleteSortLink:从排序链表中删除指定元素
LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
{ {
LOS_DL_LIST *listObject = NULL; LOS_DL_LIST *listObject = NULL;
@ -319,7 +319,7 @@ LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader,
} }
LOS_ListDelete(&sortList->sortLinkNode); LOS_ListDelete(&sortList->sortLinkNode);
} }
//OsSortLinkGetNextExpireTime:获取排序链表中下一个到期的时间
LITE_OS_SEC_TEXT UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader) LITE_OS_SEC_TEXT UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader)
{ {
UINT32 expireTime = OS_INVALID_VALUE; UINT32 expireTime = OS_INVALID_VALUE;
@ -333,7 +333,7 @@ LITE_OS_SEC_TEXT UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sor
} }
return expireTime; return expireTime;
} }
//OsSortLinkUpdateExpireTime:更新排序链表中到期时间
LITE_OS_SEC_TEXT VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttribute *sortLinkHeader) LITE_OS_SEC_TEXT VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttribute *sortLinkHeader)
{ {
SortLinkList *sortList = NULL; SortLinkList *sortList = NULL;
@ -349,7 +349,7 @@ LITE_OS_SEC_TEXT VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttr
ROLLNUM_SUB(sortList->idxRollNum, sleepTicks - 1); ROLLNUM_SUB(sortList->idxRollNum, sleepTicks - 1);
} }
} }
//OsSortLinkGetTargetExpireTime:获取指定排序链表元素的到期时间
LITE_OS_SEC_TEXT_MINOR UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttribute *sortLinkHeader, LITE_OS_SEC_TEXT_MINOR UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttribute *sortLinkHeader,
const SortLinkList *targetSortList) const SortLinkList *targetSortList)
{ {

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
//栈
#include "securec.h" #include "securec.h"
#include "los_stackinfo_pri.h" #include "los_stackinfo_pri.h"
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
@ -35,7 +35,7 @@
const StackInfo *g_stackInfo = NULL; const StackInfo *g_stackInfo = NULL;
UINT32 g_stackNum; UINT32 g_stackNum;
//OsStackWaterLineGet:获取栈的使用情况
UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop, UINT32 *peakUsed) UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop, UINT32 *peakUsed)
{ {
UINT32 size; UINT32 size;
@ -53,20 +53,20 @@ UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop,
return LOS_NOK; return LOS_NOK;
} }
} }
//OsExcStackInfoReg:注册异常栈信息
VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum) VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum)
{ {
g_stackInfo = stackInfo; g_stackInfo = stackInfo;
g_stackNum = stackNum; g_stackNum = stackNum;
} }
//OsStackInit:初始化任务栈
VOID OsStackInit(VOID *stacktop, UINT32 stacksize) VOID OsStackInit(VOID *stacktop, UINT32 stacksize)
{ {
/* initialize the task stack, write magic num to stack top */ /* initialize the task stack, write magic num to stack top */
(VOID)memset_s(stacktop, stacksize, (INT32)OS_STACK_INIT, stacksize); (VOID)memset_s(stacktop, stacksize, (INT32)OS_STACK_INIT, stacksize);
*((UINTPTR *)stacktop) = OS_STACK_MAGIC_WORD; *((UINTPTR *)stacktop) = OS_STACK_MAGIC_WORD;
} }
//OsGetStackInfo:获取栈信息
VOID OsGetStackInfo(const StackInfo **stackInfo, UINT32 *stackNum) VOID OsGetStackInfo(const StackInfo **stackInfo, UINT32 *stackNum)
{ {
*stackInfo = g_stackInfo; *stackInfo = g_stackInfo;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*软件定时器的实现,涉及软件定时器的创建、启动、停止、删除等操作*/
#include "los_swtmr_pri.h" #include "los_swtmr_pri.h"
#include "los_sortlink_pri.h" #include "los_sortlink_pri.h"
#include "los_queue_pri.h" #include "los_queue_pri.h"
@ -52,7 +52,6 @@ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_swtmrSpin);
* Description: Start Software Timer * Description: Start Software Timer
* Input : swtmr --- Need to start software timer * Input : swtmr --- Need to start software timer
*/ */
//OsSwtmrStart启动软件定时器
LITE_OS_SEC_TEXT VOID OsSwtmrStart(LosSwtmrCB *swtmr) LITE_OS_SEC_TEXT VOID OsSwtmrStart(LosSwtmrCB *swtmr)
{ {
if ((swtmr->overrun == 0) && ((swtmr->mode == LOS_SWTMR_MODE_ONCE) || if ((swtmr->overrun == 0) && ((swtmr->mode == LOS_SWTMR_MODE_ONCE) ||
@ -76,14 +75,13 @@ LITE_OS_SEC_TEXT VOID OsSwtmrStart(LosSwtmrCB *swtmr)
* Description: Delete Software Timer * Description: Delete Software Timer
* Input : swtmr --- Need to delete software timer, When using, Ensure that it can't be NULL. * Input : swtmr --- Need to delete software timer, When using, Ensure that it can't be NULL.
*/ */
//OsSwtmrDelete删除软件定时器
STATIC INLINE VOID OsSwtmrDelete(LosSwtmrCB *swtmr) STATIC INLINE VOID OsSwtmrDelete(LosSwtmrCB *swtmr)
{ {
/* insert to free list */ /* insert to free list */
LOS_ListTailInsert(&g_swtmrFreeList, &swtmr->sortList.sortLinkNode); LOS_ListTailInsert(&g_swtmrFreeList, &swtmr->sortList.sortLinkNode);
swtmr->state = OS_SWTMR_STATUS_UNUSED; swtmr->state = OS_SWTMR_STATUS_UNUSED;
} }
//OsSwtmrUpdate更新软件定时器
STATIC INLINE VOID OsSwtmrUpdate(LosSwtmrCB *swtmr) STATIC INLINE VOID OsSwtmrUpdate(LosSwtmrCB *swtmr)
{ {
if (swtmr->mode == LOS_SWTMR_MODE_ONCE) { if (swtmr->mode == LOS_SWTMR_MODE_ONCE) {
@ -103,7 +101,6 @@ STATIC INLINE VOID OsSwtmrUpdate(LosSwtmrCB *swtmr)
} }
#ifndef LOSCFG_BASE_CORE_SWTMR_IN_ISR #ifndef LOSCFG_BASE_CORE_SWTMR_IN_ISR
//OsSwtmrTask软件定时器任务处理函数用于处理定时器超时事件
LITE_OS_SEC_TEXT VOID OsSwtmrTask(VOID) LITE_OS_SEC_TEXT VOID OsSwtmrTask(VOID)
{ {
UINT32 ret, swtmrHandlerQueue; UINT32 ret, swtmrHandlerQueue;
@ -139,7 +136,7 @@ BOOL IsSwtmrTask(UINT32 taskId)
return FALSE; return FALSE;
} }
#endif #endif
//OsSwtmrTaskCreate创建软件定时器任务
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID) LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID)
{ {
UINT32 ret, swtmrTaskId; UINT32 ret, swtmrTaskId;
@ -164,7 +161,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID)
return ret; return ret;
} }
#endif #endif
//OsSwtmrInit软件定时器初始化
LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID) LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
{ {
UINT32 size; UINT32 size;
@ -212,7 +209,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
* Description: Tick interrupt interface module of software timer * Description: Tick interrupt interface module of software timer
* Return : LOS_OK on success or error code on failure * Return : LOS_OK on success or error code on failure
*/ */
//OsSwtmrScan扫描软件定时器
LITE_OS_SEC_TEXT VOID OsSwtmrScan(VOID) LITE_OS_SEC_TEXT VOID OsSwtmrScan(VOID)
{ {
SortLinkList *sortList = NULL; SortLinkList *sortList = NULL;
@ -281,7 +277,6 @@ LITE_OS_SEC_TEXT VOID OsSwtmrScan(VOID)
* Description: Get next timeout * Description: Get next timeout
* Return : Count of the Timer list * Return : Count of the Timer list
*/ */
//OsSwtmrGetNextTimeout获取下一个超时时间
LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID) LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
{ {
return OsSortLinkGetNextExpireTime(&OsPercpuGet()->swtmrSortLink); return OsSortLinkGetNextExpireTime(&OsPercpuGet()->swtmrSortLink);
@ -291,7 +286,6 @@ LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
* Description: Stop of Software Timer interface * Description: Stop of Software Timer interface
* Input : swtmr --- the software timer control handler * Input : swtmr --- the software timer control handler
*/ */
//OsSwtmrStop停止软件定时器
LITE_OS_SEC_TEXT STATIC VOID OsSwtmrStop(LosSwtmrCB *swtmr) LITE_OS_SEC_TEXT STATIC VOID OsSwtmrStop(LosSwtmrCB *swtmr)
{ {
SortLinkAttribute *sortLinkHeader = NULL; SortLinkAttribute *sortLinkHeader = NULL;
@ -315,7 +309,6 @@ LITE_OS_SEC_TEXT STATIC VOID OsSwtmrStop(LosSwtmrCB *swtmr)
* Description: Get next software timer expiretime * Description: Get next software timer expiretime
* Input : swtmr --- the software timer control handler * Input : swtmr --- the software timer control handler
*/ */
//获取指定软件定时器的剩余时间
LITE_OS_SEC_TEXT STATIC UINT32 OsSwtmrTimeGet(const LosSwtmrCB *swtmr) LITE_OS_SEC_TEXT STATIC UINT32 OsSwtmrTimeGet(const LosSwtmrCB *swtmr)
{ {
SortLinkAttribute *sortLinkHeader = NULL; SortLinkAttribute *sortLinkHeader = NULL;
@ -332,7 +325,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsSwtmrTimeGet(const LosSwtmrCB *swtmr)
return OsSortLinkGetTargetExpireTime(sortLinkHeader, &swtmr->sortList); return OsSortLinkGetTargetExpireTime(sortLinkHeader, &swtmr->sortList);
} }
//创建一个软件定时器
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval, LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
UINT8 mode, UINT8 mode,
SWTMR_PROC_FUNC handler, SWTMR_PROC_FUNC handler,
@ -384,7 +377,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
return LOS_OK; return LOS_OK;
} }
//启动一个软件定时器
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrId) LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrId)
{ {
LosSwtmrCB *swtmr = NULL; LosSwtmrCB *swtmr = NULL;
@ -428,7 +421,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrId)
LOS_TRACE(SWTMR_START, swtmr->timerId, swtmr->mode, swtmr->overrun, swtmr->interval, swtmr->expiry); LOS_TRACE(SWTMR_START, swtmr->timerId, swtmr->mode, swtmr->overrun, swtmr->interval, swtmr->expiry);
return ret; return ret;
} }
//停止一个软件定时器
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrId) LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrId)
{ {
LosSwtmrCB *swtmr = NULL; LosSwtmrCB *swtmr = NULL;
@ -468,7 +461,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrId)
LOS_TRACE(SWTMR_STOP, swtmr->timerId); LOS_TRACE(SWTMR_STOP, swtmr->timerId);
return ret; return ret;
} }
//获取一个软件定时器的剩余时间
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet(UINT16 swtmrId, UINT32 *tick) LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet(UINT16 swtmrId, UINT32 *tick)
{ {
LosSwtmrCB *swtmr = NULL; LosSwtmrCB *swtmr = NULL;
@ -509,7 +502,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrTimeGet(UINT16 swtmrId, UINT32 *tick)
SWTMR_UNLOCK(intSave); SWTMR_UNLOCK(intSave);
return ret; return ret;
} }
//删除一个软件定时器
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrId) LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrId)
{ {
LosSwtmrCB *swtmr = NULL; LosSwtmrCB *swtmr = NULL;

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*关于LiteOS中任务管理模块的部分实现包括任务控制块的初始化、任务创建、任务删除等功能*/
#include "los_task_pri.h" #include "los_task_pri.h"
#include "los_priqueue_pri.h" #include "los_priqueue_pri.h"
#include "los_sem_pri.h" #include "los_sem_pri.h"
@ -282,7 +282,7 @@ LITE_OS_SEC_TEXT VOID OsTaskScan(VOID)
LOS_Schedule(); LOS_Schedule();
} }
} }
//OsTaskInit用于初始化任务管理模块包括任务控制块数组、空闲任务列表、任务回收列表等数据结构的初始化
LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID) LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID)
{ {
UINT32 index; UINT32 index;
@ -335,7 +335,7 @@ UINT32 OsGetIdleTaskId(VOID)
Percpu *perCpu = OsPercpuGet(); Percpu *perCpu = OsPercpuGet();
return perCpu->idleTaskId; return perCpu->idleTaskId;
} }
//创建空闲任务Idle Task
LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID) LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
{ {
UINT32 ret; UINT32 ret;
@ -363,7 +363,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
* Description : get id of current running task. * Description : get id of current running task.
* Return : task id * Return : task id
*/ */
//读取任务ID
LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID) LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
{ {
LosTaskCB *runTask = OsCurrTaskGet(); LosTaskCB *runTask = OsCurrTaskGet();
@ -373,7 +372,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
} }
return runTask->taskId; return runTask->taskId;
} }
//获取当前正在运行的任务的任务名称
LITE_OS_SEC_TEXT CHAR *OsCurTaskNameGet(VOID) LITE_OS_SEC_TEXT CHAR *OsCurTaskNameGet(VOID)
{ {
LosTaskCB *runTask = OsCurrTaskGet(); LosTaskCB *runTask = OsCurrTaskGet();
@ -429,12 +428,12 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_LowpowerHookReg(LOWPOWERIDLEHOOK hook)
g_lowPowerHook = hook; g_lowPowerHook = hook;
} }
#endif #endif
//注册空闲任务钩子函数,即在系统空闲时执行的函数
LITE_OS_SEC_TEXT_MINOR VOID LOS_IdleHandlerHookReg(IDLEHANDLERHOOK hook) LITE_OS_SEC_TEXT_MINOR VOID LOS_IdleHandlerHookReg(IDLEHANDLERHOOK hook)
{ {
g_idleHandlerHook = hook; g_idleHandlerHook = hook;
} }
//检查任务是否分离detached
STATIC BOOL OsTaskDeleteCheckDetached(const LosTaskCB *taskCB) STATIC BOOL OsTaskDeleteCheckDetached(const LosTaskCB *taskCB)
{ {
#if LOSCFG_COMPAT_POSIX #if LOSCFG_COMPAT_POSIX
@ -443,7 +442,7 @@ STATIC BOOL OsTaskDeleteCheckDetached(const LosTaskCB *taskCB)
return TRUE; return TRUE;
#endif #endif
} }
//删除已分离的任务
STATIC VOID OsTaskDeleteDetached(const LosTaskCB *taskCB) STATIC VOID OsTaskDeleteDetached(const LosTaskCB *taskCB)
{ {
UINT32 intSave; UINT32 intSave;
@ -452,7 +451,7 @@ STATIC VOID OsTaskDeleteDetached(const LosTaskCB *taskCB)
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
(VOID)LOS_TaskDelete(taskCB->taskId); (VOID)LOS_TaskDelete(taskCB->taskId);
} }
//删除已加入的任务
STATIC VOID OsTaskDeleteJoined(LosTaskCB *taskCB, VOID *ret) STATIC VOID OsTaskDeleteJoined(LosTaskCB *taskCB, VOID *ret)
{ {
#ifdef LOSCFG_COMPAT_POSIX #ifdef LOSCFG_COMPAT_POSIX
@ -482,8 +481,6 @@ STATIC VOID OsTaskDeleteJoined(LosTaskCB *taskCB, VOID *ret)
* Description : All task entry * Description : All task entry
* Input : taskId --- The ID of the task to be run * Input : taskId --- The ID of the task to be run
*/ */
//执行任务的实际代码,并根据任务的属性判断是否需要删除任务
//如果任务是分离的,则直接删除任务;如果任务是加入的,则将任务加入的其他任务唤醒,并重新调度任务
LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskId) LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskId)
{ {
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
@ -514,7 +511,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskId)
OsTaskDeleteJoined(taskCB, ret); OsTaskDeleteJoined(taskCB, ret);
} }
} }
//对任务初始化参数进行检查,确保任务参数的合法性
STATIC UINT32 OsTaskInitParamCheck(const TSK_INIT_PARAM_S *initParam) STATIC UINT32 OsTaskInitParamCheck(const TSK_INIT_PARAM_S *initParam)
{ {
if (initParam == NULL) { if (initParam == NULL) {
@ -569,7 +566,7 @@ STATIC UINT32 OsTaskCreateParamCheckStatic(const UINT32 *taskId,
return LOS_OK; return LOS_OK;
} }
#endif #endif
//对任务创建参数进行检查,确保参数的合法性。如果参数不合法,则返回相应的错误码;否则返回成功
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskId, LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskId,
TSK_INIT_PARAM_S *initParam, VOID **pool) TSK_INIT_PARAM_S *initParam, VOID **pool)
{ {
@ -779,7 +776,6 @@ LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskDelAction(LosTaskCB *taskCB, BOOL useUsr
* 3. Do the deletion in hard-irq * 3. Do the deletion in hard-irq
* then LOS_TaskDelete will directly return with 'ret' value. * then LOS_TaskDelete will directly return with 'ret' value.
*/ */
//OsTaskDeleteCheckOnRun函数用来检查是否需要在任务运行时进行删除操作
LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret)
{ {
/* init default out return value */ /* init default out return value */
@ -817,7 +813,7 @@ LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskDeleteCheckOnRun(LosTaskCB *taskCB, UINT
return TRUE; return TRUE;
} }
//OsTaskCBInit函数用于初始化任务控制块设置任务的各种属性和状态
LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam, LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam,
VOID *stackPtr, const VOID *topStack, BOOL useUsrStack) VOID *stackPtr, const VOID *topStack, BOOL useUsrStack)
{ {
@ -873,7 +869,7 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT
(VOID)memset_s(&taskCB->schedStat, sizeof(SchedStat), 0, sizeof(SchedStat)); (VOID)memset_s(&taskCB->schedStat, sizeof(SchedStat), 0, sizeof(SchedStat));
#endif #endif
} }
//OsTaskGetFreeTaskCB函数用于获取一个空闲的任务控制块
STATIC UINT32 OsTaskGetFreeTaskCB(LosTaskCB **taskCB) STATIC UINT32 OsTaskGetFreeTaskCB(LosTaskCB **taskCB)
{ {
if (LOS_ListEmpty(&g_losFreeTask)) { if (LOS_ListEmpty(&g_losFreeTask)) {
@ -887,7 +883,7 @@ STATIC UINT32 OsTaskGetFreeTaskCB(LosTaskCB **taskCB)
LOS_ListDelete(LOS_DL_LIST_FIRST(&g_losFreeTask)); LOS_ListDelete(LOS_DL_LIST_FIRST(&g_losFreeTask));
return LOS_OK; return LOS_OK;
} }
//OsTaskCreateOnly函数用于创建一个新的任务其中会对参数进行合法性检查
STATIC UINT32 OsTaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack, BOOL useUsrStack) STATIC UINT32 OsTaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack, BOOL useUsrStack)
{ {
UINT32 intSave, errRet; UINT32 intSave, errRet;
@ -951,7 +947,7 @@ LOS_ERREND:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return errRet; return errRet;
} }
//OsTaskResume函数用于恢复一个被挂起的任务
STATIC VOID OsTaskResume(const UINT32 *taskId) STATIC VOID OsTaskResume(const UINT32 *taskId)
{ {
UINT32 intSave; UINT32 intSave;
@ -1002,8 +998,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S
{ {
return OsTaskCreateOnly(taskId, initParam, NULL, FALSE); return OsTaskCreateOnly(taskId, initParam, NULL, FALSE);
} }
//LOS_TaskCreate该函数用于创建一个新的任务包括任务的名称、优先级、栈大小等参数的设置
//在创建任务时,需要进行一些参数的合法性检查,例如是否超出最大任务数量、是否有足够的堆栈空间等
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam) LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam)
{ {
UINT32 ret; UINT32 ret;
@ -1017,8 +1012,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *in
return LOS_OK; return LOS_OK;
} }
//LOS_TaskDelete用于删除一个已经存在的任务
//在删除任务时,需要对任务的状态进行判断。如果任务正在运行,则将其标记为删除状态并放入回收列表;否则直接释放任务占用的资源
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskId) LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskId)
{ {
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
@ -1078,7 +1072,7 @@ LOS_RETURN:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return errRet; return errRet;
} }
//LOS_TaskResume函数用于恢复一个挂起的任务
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskId) LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskId)
{ {
UINT32 intSave; UINT32 intSave;
@ -1142,7 +1136,6 @@ LOS_ERREND:
* 3. Do the suspension in hard-irq * 3. Do the suspension in hard-irq
* then LOS_TaskSuspend will directly return with 'ret' value. * then LOS_TaskSuspend will directly return with 'ret' value.
*/ */
//OsTaskSuspendCheckOnRun检查当前任务是否需要挂起的函数根据条件判断是否需要进行任务挂起操作
LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UINT32 *ret)
{ {
/* init default out return value */ /* init default out return value */
@ -1171,8 +1164,7 @@ LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UIN
return TRUE; return TRUE;
} }
//LOS_TaskSuspend挂起指定任务的函数
//如果任务已经处于挂起状态或者正在运行,并且不满足挂起条件,则直接返回错误码;否则执行挂起操作
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskId) LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskId)
{ {
UINT32 intSave; UINT32 intSave;
@ -1226,7 +1218,7 @@ LOS_RETURN:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return errRet; return errRet;
} }
//LOS_TaskDelay该函数用于让任务进入延时状态在指定的时间后重新被调度执行
LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick) LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
{ {
UINT32 intSave; UINT32 intSave;
@ -1258,7 +1250,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
return LOS_OK; return LOS_OK;
} }
//LOS_TaskDelay将任务进入延时状态在指定的时间后重新被调度执行如果当前在中断中或者不可抢占则返回相应的错误码
LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskId) LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskId)
{ {
UINT32 intSave; UINT32 intSave;
@ -1281,7 +1273,7 @@ LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskId)
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return priority; return priority;
} }
//LOS_TaskPriGet获取指定任务的优先级
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio)
{ {
BOOL isReady = FALSE; BOOL isReady = FALSE;
@ -1333,7 +1325,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio)
} }
return LOS_OK; return LOS_OK;
} }
//LOS_TaskPriSet设置指定任务的优先级根据任务当前状态选择不同的处理方式
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CurTaskPriSet(UINT16 taskPrio) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CurTaskPriSet(UINT16 taskPrio)
{ {
return LOS_TaskPriSet(OsCurrTaskGet()->taskId, taskPrio); return LOS_TaskPriSet(OsCurrTaskGet()->taskId, taskPrio);
@ -1345,7 +1337,6 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CurTaskPriSet(UINT16 taskPrio)
* taskStatus --- task status * taskStatus --- task status
* timeOut --- Expiry time * timeOut --- Expiry time
* Return : LOS_OK on success or LOS_NOK on failure * Return : LOS_OK on success or LOS_NOK on failure
* OsTaskWaitOsTaskWake
*/ */
VOID OsTaskWait(LOS_DL_LIST *list, UINT16 taskStatus, UINT32 timeout) VOID OsTaskWait(LOS_DL_LIST *list, UINT16 taskStatus, UINT32 timeout)
{ {
@ -1382,7 +1373,7 @@ VOID OsTaskWake(LosTaskCB *resumedTask, UINT16 taskStatus)
OsPriQueueEnqueue(&resumedTask->pendList, resumedTask->priority); OsPriQueueEnqueue(&resumedTask->pendList, resumedTask->priority);
} }
} }
//LOS_TaskYield用于使当前任务主动放弃 CPU 控制权,让出 CPU 给其他高优先级任务执行
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID)
{ {
UINT32 tskCount; UINT32 tskCount;
@ -1421,8 +1412,6 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID)
return LOS_OK; return LOS_OK;
} }
//LOS_TaskLock和LOS_TaskUnlock任务锁定和解锁函数用于保护临界区
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock(VOID) LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock(VOID)
{ {
UINT32 intSave; UINT32 intSave;
@ -1457,7 +1446,7 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
} }
//LOS_TaskInfoGet获取指定任务的信息包括任务名、栈大小、堆栈使用情况等
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo)
{ {
UINT32 intSave; UINT32 intSave;
@ -1514,7 +1503,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInf
return LOS_OK; return LOS_OK;
} }
//LOS_TaskCpuAffiSet和LOS_TaskCpuAffiGet设置和获取任务的 CPU 亲和性,仅在支持多核的情况下有效
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 cpuAffiMask) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 cpuAffiMask)
{ {
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
@ -1591,7 +1580,6 @@ LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskCpuAffiGet(UINT32 taskId)
/* /*
* Description : Process pending signals tagged by others cores * Description : Process pending signals tagged by others cores
*OsTaskProcSignal
*/ */
LITE_OS_SEC_TEXT_MINOR UINT32 OsTaskProcSignal(VOID) LITE_OS_SEC_TEXT_MINOR UINT32 OsTaskProcSignal(VOID)
{ {

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*时钟模块:主要包括系统时钟的初始化、时钟中断处理函数、获取系统tick数等功能*/
#include "los_tick_pri.h" #include "los_tick_pri.h"
#include "los_swtmr_pri.h" #include "los_swtmr_pri.h"
#include "los_task_pri.h" #include "los_task_pri.h"
@ -52,7 +52,6 @@ STATIC WAKEUPFROMINTHOOK g_tickWakeupHook = NULL;
/* /*
* Description : Tick interruption handler * Description : Tick interruption handler
*/ */
//OsTickHandler函数时钟中断处理函数用于处理时钟中断事件。
LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
{ {
UINT32 intSave; UINT32 intSave;
@ -77,7 +76,7 @@ LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
OsSwtmrScan(); OsSwtmrScan();
#endif #endif
} }
//OsTickInit初始化系统时钟
LITE_OS_SEC_TEXT_INIT UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond) LITE_OS_SEC_TEXT_INIT UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond)
{ {
if ((systemClock == 0) || if ((systemClock == 0) ||
@ -89,12 +88,12 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond
return LOS_OK; return LOS_OK;
} }
//启动系统时钟
LITE_OS_SEC_TEXT_INIT VOID OsTickStart(VOID) LITE_OS_SEC_TEXT_INIT VOID OsTickStart(VOID)
{ {
HalClockStart(); HalClockStart();
} }
//LOS_TickCountGet函数获取系统tick数
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
{ {
UINT32 intSave; UINT32 intSave;
@ -110,12 +109,12 @@ LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
return tick; return tick;
} }
//LOS_CyclePerTickGet函数获取每个tick所对应的CPU周期数
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID)
{ {
return g_sysClock / KERNEL_TICK_PER_SECOND; return g_sysClock / KERNEL_TICK_PER_SECOND;
} }
//LOS_GetCpuCycle函数获取CPU周期数
LITE_OS_SEC_TEXT_MINOR VOID LOS_GetCpuCycle(UINT32 *highCnt, UINT32 *lowCnt) LITE_OS_SEC_TEXT_MINOR VOID LOS_GetCpuCycle(UINT32 *highCnt, UINT32 *lowCnt)
{ {
UINT64 cycle; UINT64 cycle;
@ -130,7 +129,7 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_GetCpuCycle(UINT32 *highCnt, UINT32 *lowCnt)
/* get the low 32 bits */ /* get the low 32 bits */
*lowCnt = (UINT32)(cycle & 0xFFFFFFFFULL); *lowCnt = (UINT32)(cycle & 0xFFFFFFFFULL);
} }
//LOS_CurrNanosec函数获取当前的纳秒数
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_CurrNanosec(VOID) LITE_OS_SEC_TEXT_MINOR UINT64 LOS_CurrNanosec(VOID)
{ {
UINT64 nanos; UINT64 nanos;
@ -138,7 +137,7 @@ LITE_OS_SEC_TEXT_MINOR UINT64 LOS_CurrNanosec(VOID)
nanos = HalClockGetCycles() * (OS_SYS_NS_PER_SECOND / OS_SYS_NS_PER_MS) / (g_sysClock / OS_SYS_NS_PER_MS); nanos = HalClockGetCycles() * (OS_SYS_NS_PER_SECOND / OS_SYS_NS_PER_MS) / (g_sysClock / OS_SYS_NS_PER_MS);
return nanos; return nanos;
} }
//LOS_MS2Tick函数将毫秒转换为tick数
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec)
{ {
UINT64 delaySec; UINT64 delaySec;
@ -150,17 +149,17 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec)
delaySec = (UINT64)millisec * KERNEL_TICK_PER_SECOND; delaySec = (UINT64)millisec * KERNEL_TICK_PER_SECOND;
return (UINT32)((delaySec + OS_SYS_MS_PER_SECOND - 1) / OS_SYS_MS_PER_SECOND); return (UINT32)((delaySec + OS_SYS_MS_PER_SECOND - 1) / OS_SYS_MS_PER_SECOND);
} }
//LOS_Tick2MS函数将tick数转换为毫秒数
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick)
{ {
return (UINT32)(((UINT64)tick * OS_SYS_MS_PER_SECOND) / KERNEL_TICK_PER_SECOND); return (UINT32)(((UINT64)tick * OS_SYS_MS_PER_SECOND) / KERNEL_TICK_PER_SECOND);
} }
//LOS_Udelay函数微秒级延迟函数
LITE_OS_SEC_TEXT_MINOR VOID LOS_Udelay(UINT32 usecs) LITE_OS_SEC_TEXT_MINOR VOID LOS_Udelay(UINT32 usecs)
{ {
HalDelayUs(usecs); HalDelayUs(usecs);
} }
//LOS_Mdelay函数毫秒级延迟函数
LITE_OS_SEC_TEXT_MINOR VOID LOS_Mdelay(UINT32 msecs) LITE_OS_SEC_TEXT_MINOR VOID LOS_Mdelay(UINT32 msecs)
{ {
UINT32 delayUs = (UINT32_MAX / OS_SYS_US_PER_MS) * OS_SYS_US_PER_MS; UINT32 delayUs = (UINT32_MAX / OS_SYS_US_PER_MS) * OS_SYS_US_PER_MS;

@ -62,13 +62,8 @@ extern "C" {
return; \ return; \
} \ } \
} while (0) } while (0)
//这个宏的作用是确保在参数为NULL时能够快速地进行错误处理
//避免在每个需要检查空指针的地方都重复编写相似的代码。
//这样可以提高代码的可读性和可维护性。
/* spinlock for mem module, only available on SMP mode */
/*对内存模块的自旋锁进行定义的注释。它表明这个自旋锁只在SMP对称多处理模式下可用。 */
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_memSpin); LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_memSpin);
UINT8 *m_aucSysMem0 = NULL; UINT8 *m_aucSysMem0 = NULL;
@ -95,18 +90,7 @@ STATIC VOID OsMemNodeSave(LosMemDynNode *node);
#endif #endif
STATIC VOID *OsMemAllocWithCheck(LosMemPoolInfo *pool, UINT32 size); STATIC VOID *OsMemAllocWithCheck(LosMemPoolInfo *pool, UINT32 size);
/*
LITE_OS_SEC_BSS g_memSpin BSS
SPIN_LOCK_INIT(g_memSpin) g_memSpin
m_aucSysMem0 m_aucSysMem1 UINT8 NULL
g_MALLOC_HOOK
g_sys_mem_addr_end UINTPTR
g_excInteractMemSize UINTPTR LOSCFG_EXC_INTERACTION
g_memCheckLevel UINT8 LOSCFG_BASE_MEM_NODE_SIZE_CHECK
g_moduleMemUsedSize UINT32 LOSCFG_MEM_MUL_MODULE 使
OsMemNodeSave
OsMemAllocWithCheck
*/
STATIC INLINE VOID OS_MEM_TASKID_SET(LosMemDynNode *node, UINT32 taskId) STATIC INLINE VOID OS_MEM_TASKID_SET(LosMemDynNode *node, UINT32 taskId)
{ {
node->selfNode.taskId = taskId; node->selfNode.taskId = taskId;
@ -138,12 +122,7 @@ STATIC INLINE UINT32 OS_MEM_MODID_GET(const LosMemDynNode *node)
} }
#endif #endif
/*OS_MEM_TASKID_SET 函数用于将给定的任务IDtask ID设置到指定的内存节点 node 中。
OS_MEM_TASKID_GET node IDtask ID
LOSCFG_MEM_MUL_MODULE
OS_MEM_MODID_SET IDmodule ID node
OS_MEM_MODID_GET node IDmodule ID
IDID LOSCFG_MEM_HEAD_BACKUP OsMemNodeSave */
/* /*
* Description : set magic & taskid * Description : set magic & taskid
* Input : node -- the node which will be set magic & taskid * Input : node -- the node which will be set magic & taskid
@ -160,8 +139,6 @@ STATIC INLINE VOID OsMemSetMagicNumAndTaskID(LosMemDynNode *node)
* or in interrupt, make the value of taskid of node to (TASK_NUM - 1) which is * or in interrupt, make the value of taskid of node to (TASK_NUM - 1) which is
* the id of the extra task. We can record those memory use with that. * the id of the extra task. We can record those memory use with that.
*/ */
//这段注释是在说明一种情况,即如果在任务初始化之前(即任务的 runTask 还没有被赋值)或在中断中进行操作,将节点的 taskid 值设置为 (TASK_NUM - 1)
//其中 TASK_NUM 是额外任务的 ID。这样可以记录那些在任务初始化之前或在中断中使用的内存。
if ((runTask != NULL) && OS_INT_INACTIVE) { if ((runTask != NULL) && OS_INT_INACTIVE) {
OS_MEM_TASKID_SET(node, runTask->taskId); OS_MEM_TASKID_SET(node, runTask->taskId);
} else { } else {
@ -170,10 +147,7 @@ STATIC INLINE VOID OsMemSetMagicNumAndTaskID(LosMemDynNode *node)
} }
#endif #endif
} }
//如果宏 LOSCFG_MEM_HEAD_BACKUP 被定义,那么会定义一个名为 CHECKSUM_MAGICNUM 的常量,
//用于计算内存控制节点的校验和。
OS_MEM_NODE_CHECKSUM_CALCULATE
OsMemDispCtlNode
#ifdef LOSCFG_BASE_MEM_NODE_SIZE_CHECK #ifdef LOSCFG_BASE_MEM_NODE_SIZE_CHECK
const VOID *OsMemFindNodeCtrl(const VOID *pool, const VOID *ptr); const VOID *OsMemFindNodeCtrl(const VOID *pool, const VOID *ptr);
#endif #endif
@ -206,8 +180,6 @@ STATIC INLINE VOID OsMemDispCtlNode(const LosMemCtlNode *ctlNode)
} }
STATIC INLINE VOID OsMemDispMoreDetails(const LosMemDynNode *node) STATIC INLINE VOID OsMemDispMoreDetails(const LosMemDynNode *node)
//用于打印关于动态内存节点的更多详细信息。它接受一个 LosMemDynNode 结构体指针作为参数,
//并根据节点的状态打印不同的信息,例如节点是否被使用、分配该节点的任务信息等。
{ {
UINT32 taskId; UINT32 taskId;
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
@ -251,7 +223,6 @@ STATIC INLINE VOID OsMemDispMoreDetails(const LosMemDynNode *node)
STATIC INLINE VOID OsMemDispWildPointerMsg(const LosMemDynNode *node, const VOID *ptr) STATIC INLINE VOID OsMemDispWildPointerMsg(const LosMemDynNode *node, const VOID *ptr)
{ {
//用于在发现野指针时打印相关信息。它接受一个 LosMemDynNode 结构体指针和一个野指针作为参数,并打印出野指针的详细信息,以及可能的原因。
PRINT_ERR("*****************************************************\n"); PRINT_ERR("*****************************************************\n");
PRINT_ERR("find an control block at: %p, gap size: 0x%x, sizeof(LosMemDynNode): 0x%x\n", node, PRINT_ERR("find an control block at: %p, gap size: 0x%x, sizeof(LosMemDynNode): 0x%x\n", node,
node->selfNode.gapSize, sizeof(LosMemDynNode)); node->selfNode.gapSize, sizeof(LosMemDynNode));
@ -263,17 +234,17 @@ STATIC INLINE VOID OsMemDispWildPointerMsg(const LosMemDynNode *node, const VOID
PRINT_ERR("*****************************************************\n\n"); PRINT_ERR("*****************************************************\n\n");
} }
STATIC INLINE VOID OsMemChecksumSet(LosMemCtlNode *ctlNode)//用于为控制节点计算并设置校验和。 STATIC INLINE VOID OsMemChecksumSet(LosMemCtlNode *ctlNode)
{ {
ctlNode->checksum = OS_MEM_NODE_CHECKSUM_CALCULATE(ctlNode); ctlNode->checksum = OS_MEM_NODE_CHECKSUM_CALCULATE(ctlNode);
} }
STATIC INLINE BOOL OsMemChecksumVerify(const LosMemCtlNode *ctlNode)//验证控制节点的校验和是否正确。 STATIC INLINE BOOL OsMemChecksumVerify(const LosMemCtlNode *ctlNode)
{ {
return ctlNode->checksum == OS_MEM_NODE_CHECKSUM_CALCULATE(ctlNode); return ctlNode->checksum == OS_MEM_NODE_CHECKSUM_CALCULATE(ctlNode);
} }
STATIC INLINE VOID OsMemBackupSetup(const LosMemDynNode *node)//为当前节点的前一个节点设置备份信息 STATIC INLINE VOID OsMemBackupSetup(const LosMemDynNode *node)
{ {
LosMemDynNode *nodePre = node->selfNode.preNode; LosMemDynNode *nodePre = node->selfNode.preNode;
if (nodePre != NULL) { if (nodePre != NULL) {
@ -286,7 +257,7 @@ STATIC INLINE VOID OsMemBackupSetup(const LosMemDynNode *node)//为当前节点
} }
} }
LosMemDynNode *OsMemNodeNextGet(const VOID *pool, const LosMemDynNode *node)//获取指定节点的下一个节点 LosMemDynNode *OsMemNodeNextGet(const VOID *pool, const LosMemDynNode *node)
{ {
const LosMemPoolInfo *poolInfo = (const LosMemPoolInfo *)pool; const LosMemPoolInfo *poolInfo = (const LosMemPoolInfo *)pool;
@ -298,7 +269,6 @@ LosMemDynNode *OsMemNodeNextGet(const VOID *pool, const LosMemDynNode *node)//
} }
STATIC INLINE UINT32 OsMemBackupSetup4Next(const VOID *pool, LosMemDynNode *node) STATIC INLINE UINT32 OsMemBackupSetup4Next(const VOID *pool, LosMemDynNode *node)
//为下一个节点设置备份信息,并检查下一个节点的校验和是否正确。
{ {
LosMemDynNode *nodeNext = OsMemNodeNextGet(pool, node); LosMemDynNode *nodeNext = OsMemNodeNextGet(pool, node);
@ -324,8 +294,6 @@ STATIC INLINE UINT32 OsMemBackupSetup4Next(const VOID *pool, LosMemDynNode *node
UINT32 OsMemBackupDoRestore(VOID *pool, const LosMemDynNode *nodePre, LosMemDynNode *node) UINT32 OsMemBackupDoRestore(VOID *pool, const LosMemDynNode *nodePre, LosMemDynNode *node)
{ {
//从备份中恢复节点。它首先打印出备份信息和原节点信息,然后将备份信息中记录的值恢复到节点中,
//并调用 OsMemBackupSetup4Next 重新设置下一个节点的备份信息。
if (node == NULL) { if (node == NULL) {
PRINT_ERR("the node is NULL.\n"); PRINT_ERR("the node is NULL.\n");
return LOS_NOK; return LOS_NOK;
@ -347,7 +315,6 @@ UINT32 OsMemBackupDoRestore(VOID *pool, const LosMemDynNode *nodePre, LosMemDynN
} }
STATIC LosMemDynNode *OsMemFirstNodePrevGet(const LosMemPoolInfo *poolInfo) STATIC LosMemDynNode *OsMemFirstNodePrevGet(const LosMemPoolInfo *poolInfo)
//获取内存池中第一个节点的前一个节点。
{ {
LosMemDynNode *nodePre = NULL; LosMemDynNode *nodePre = NULL;
@ -368,7 +335,6 @@ STATIC LosMemDynNode *OsMemFirstNodePrevGet(const LosMemPoolInfo *poolInfo)
} }
LosMemDynNode *OsMemNodePrevGet(VOID *pool, const LosMemDynNode *node) LosMemDynNode *OsMemNodePrevGet(VOID *pool, const LosMemDynNode *node)
//在内存池中查找给定节点的前一个节点。
{ {
LosMemDynNode *nodeCur = NULL; LosMemDynNode *nodeCur = NULL;
LosMemDynNode *nodePre = NULL; LosMemDynNode *nodePre = NULL;
@ -427,7 +393,7 @@ LosMemDynNode *OsMemNodePrevGet(VOID *pool, const LosMemDynNode *node)
} }
LosMemDynNode *OsMemNodePrevTryGet(VOID *pool, LosMemDynNode **node, const VOID *ptr) LosMemDynNode *OsMemNodePrevTryGet(VOID *pool, LosMemDynNode **node, const VOID *ptr)
{//在内存池中尝试获取指向给定地址的节点的前一个节点。 {
UINTPTR nodeShouldBe; UINTPTR nodeShouldBe;
LosMemDynNode *nodeCur = NULL; LosMemDynNode *nodeCur = NULL;
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
@ -481,7 +447,7 @@ LosMemDynNode *OsMemNodePrevTryGet(VOID *pool, LosMemDynNode **node, const VOID
} }
STATIC INLINE UINT32 OsMemBackupTryRestore(VOID *pool, LosMemDynNode **node, const VOID *ptr) STATIC INLINE UINT32 OsMemBackupTryRestore(VOID *pool, LosMemDynNode **node, const VOID *ptr)
{//尝试恢复节点的备份状态。 {
LosMemDynNode *nodeHead = NULL; LosMemDynNode *nodeHead = NULL;
LosMemDynNode *nodePre = OsMemNodePrevTryGet(pool, &nodeHead, ptr); LosMemDynNode *nodePre = OsMemNodePrevTryGet(pool, &nodeHead, ptr);
if (nodePre == NULL) { if (nodePre == NULL) {
@ -493,7 +459,7 @@ STATIC INLINE UINT32 OsMemBackupTryRestore(VOID *pool, LosMemDynNode **node, con
} }
STATIC INLINE UINT32 OsMemBackupRestore(VOID *pool, LosMemDynNode *node) STATIC INLINE UINT32 OsMemBackupRestore(VOID *pool, LosMemDynNode *node)
{//恢复节点的备份状态 {
LosMemDynNode *nodePre = OsMemNodePrevGet(pool, node); LosMemDynNode *nodePre = OsMemNodePrevGet(pool, node);
if (nodePre == NULL) { if (nodePre == NULL) {
return LOS_NOK; return LOS_NOK;
@ -503,7 +469,7 @@ STATIC INLINE UINT32 OsMemBackupRestore(VOID *pool, LosMemDynNode *node)
} }
STATIC INLINE UINT32 OsMemBackupCheckAndRetore(VOID *pool, const VOID *ptr, LosMemDynNode *node) STATIC INLINE UINT32 OsMemBackupCheckAndRetore(VOID *pool, const VOID *ptr, LosMemDynNode *node)
{//检查并恢复节点的备份状态。 {
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
LosMemDynNode *startNode = OS_MEM_FIRST_NODE(pool); LosMemDynNode *startNode = OS_MEM_FIRST_NODE(pool);
LosMemDynNode *endNode = OS_MEM_END_NODE(pool, poolInfo->poolSize); LosMemDynNode *endNode = OS_MEM_END_NODE(pool, poolInfo->poolSize);
@ -519,26 +485,26 @@ STATIC INLINE UINT32 OsMemBackupCheckAndRetore(VOID *pool, const VOID *ptr, LosM
} }
STATIC INLINE VOID OsMemSetGapSize(LosMemCtlNode *ctlNode, UINT32 gapSize) STATIC INLINE VOID OsMemSetGapSize(LosMemCtlNode *ctlNode, UINT32 gapSize)
{//设置节点的间隙大小。 {
ctlNode->gapSize = gapSize; ctlNode->gapSize = gapSize;
} }
STATIC VOID OsMemNodeSave(LosMemDynNode *node) STATIC VOID OsMemNodeSave(LosMemDynNode *node)
{//保存节点的状态信息 {
OsMemSetGapSize(&(node->selfNode), 0); OsMemSetGapSize(&(node->selfNode), 0);
OsMemChecksumSet(&(node->selfNode)); OsMemChecksumSet(&(node->selfNode));
OsMemBackupSetup(node); OsMemBackupSetup(node);
} }
STATIC VOID OsMemNodeSaveWithGapSize(LosMemDynNode *node, UINT32 gapSize) STATIC VOID OsMemNodeSaveWithGapSize(LosMemDynNode *node, UINT32 gapSize)
{//保存节点的状态信息,并设置间隙大小。 {
OsMemSetGapSize(&(node->selfNode), gapSize); OsMemSetGapSize(&(node->selfNode), gapSize);
OsMemChecksumSet(&(node->selfNode)); OsMemChecksumSet(&(node->selfNode));
OsMemBackupSetup(node); OsMemBackupSetup(node);
} }
STATIC VOID OsMemListDelete(LOS_DL_LIST *node, const VOID *firstNode) STATIC VOID OsMemListDelete(LOS_DL_LIST *node, const VOID *firstNode)
{//从链表中删除节点 {
LosMemDynNode *dynNode = NULL; LosMemDynNode *dynNode = NULL;
node->pstNext->pstPrev = node->pstPrev; node->pstNext->pstPrev = node->pstPrev;
@ -562,7 +528,7 @@ STATIC VOID OsMemListDelete(LOS_DL_LIST *node, const VOID *firstNode)
} }
STATIC VOID OsMemListAdd(LOS_DL_LIST *listNode, LOS_DL_LIST *node, const VOID *firstNode) STATIC VOID OsMemListAdd(LOS_DL_LIST *listNode, LOS_DL_LIST *node, const VOID *firstNode)
{//将节点添加到链表中 {
LosMemDynNode *dynNode = NULL; LosMemDynNode *dynNode = NULL;
node->pstNext = listNode->pstNext; node->pstNext = listNode->pstNext;
@ -581,7 +547,6 @@ STATIC VOID OsMemListAdd(LOS_DL_LIST *listNode, LOS_DL_LIST *node, const VOID *f
} }
VOID LOS_MemBadNodeShow(VOID *pool) VOID LOS_MemBadNodeShow(VOID *pool)
//遍历给定内存池中的内存动态节点,检查节点的校验和,然后打印出错的节点以及其前一个节点的信息。
{ {
LosMemDynNode *nodePre = NULL; LosMemDynNode *nodePre = NULL;
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
@ -619,7 +584,7 @@ VOID LOS_MemBadNodeShow(VOID *pool)
#else /* without LOSCFG_MEM_HEAD_BACKUP */ #else /* without LOSCFG_MEM_HEAD_BACKUP */
STATIC VOID OsMemListDelete(LOS_DL_LIST *node, const VOID *firstNode) STATIC VOID OsMemListDelete(LOS_DL_LIST *node, const VOID *firstNode)
{//从双向链表中删除指定的节点 {
(VOID)firstNode; (VOID)firstNode;
node->pstNext->pstPrev = node->pstPrev; node->pstNext->pstPrev = node->pstPrev;
node->pstPrev->pstNext = node->pstNext; node->pstPrev->pstNext = node->pstNext;
@ -628,7 +593,7 @@ STATIC VOID OsMemListDelete(LOS_DL_LIST *node, const VOID *firstNode)
} }
STATIC VOID OsMemListAdd(LOS_DL_LIST *listNode, LOS_DL_LIST *node, const VOID *firstNode) STATIC VOID OsMemListAdd(LOS_DL_LIST *listNode, LOS_DL_LIST *node, const VOID *firstNode)
{//将节点添加到双向链表中 {
(VOID)firstNode; (VOID)firstNode;
node->pstNext = listNode->pstNext; node->pstNext = listNode->pstNext;
node->pstPrev = listNode; node->pstPrev = listNode;
@ -639,9 +604,6 @@ STATIC VOID OsMemListAdd(LOS_DL_LIST *listNode, LOS_DL_LIST *node, const VOID *f
#endif #endif
#ifdef LOSCFG_MEM_LEAKCHECK #ifdef LOSCFG_MEM_LEAKCHECK
//用于注册内存动态节点并记录它的链路寄存器信息。具体来说,
//该函数会将当前节点的 linkReg 数组清零,并调用 ArchGetFp 函数获取当前栈帧指针,
//然后调用 ArchBackTraceGet 函数获取从当前栈帧开始的函数调用链信息并保存在 linkReg 数组中。
__attribute__((always_inline)) inline VOID OsMemLinkRegisterRecord(LosMemDynNode *node) __attribute__((always_inline)) inline VOID OsMemLinkRegisterRecord(LosMemDynNode *node)
{ {
UINTPTR framePtr; UINTPTR framePtr;
@ -654,9 +616,6 @@ __attribute__((always_inline)) inline VOID OsMemLinkRegisterRecord(LosMemDynNode
} }
#ifdef LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK #ifdef LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK
//只有在开启了内存节点完整性检查、并且发现了内存节点错误时才会被调用。
//该函数用于打印出错节点和前一个节点的链路寄存器信息,以帮助进行故障排查和修复。
//如果定义了 LOSCFG_SHELL_EXCINFO_DUMP 宏,则还会将信息输出到异常信息缓冲区中。
STATIC VOID OsMemNodeBacktraceInfo(const LosMemDynNode *tmpNode, const LosMemDynNode *preNode) STATIC VOID OsMemNodeBacktraceInfo(const LosMemDynNode *tmpNode, const LosMemDynNode *preNode)
{ {
INT32 i; INT32 i;
@ -683,8 +642,6 @@ STATIC VOID OsMemNodeBacktraceInfo(const LosMemDynNode *tmpNode, const LosMemDyn
#endif #endif
LITE_OS_SEC_TEXT_MINOR VOID OsMemUsedNodeShow(VOID *pool) LITE_OS_SEC_TEXT_MINOR VOID OsMemUsedNodeShow(VOID *pool)
//打印出使用的内存节点和相关的链接寄存器。
//它接受一个指向内存池的指针作为参数,并遍历内存池中的节点来打印信息。
{ {
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
@ -740,7 +697,6 @@ LITE_OS_SEC_TEXT_MINOR VOID OsMemUsedNodeShow(VOID *pool)
#ifdef LOSCFG_KERNEL_MEM_SLAB_EXTENTION #ifdef LOSCFG_KERNEL_MEM_SLAB_EXTENTION
STATIC VOID *OsMemReallocSlab(VOID *pool, VOID *ptr, BOOL *isSlabMem, UINT32 size) STATIC VOID *OsMemReallocSlab(VOID *pool, VOID *ptr, BOOL *isSlabMem, UINT32 size)
{ {
//在扩展内核内存时重新分配用于内存池的内存块。它接受一个指向内存池的指针、一个指向原始内存块的指针以及一个布尔值的指针作为参数,返回重新分配后的内存块指针。
errno_t rc; errno_t rc;
UINT32 blkSz; UINT32 blkSz;
VOID *newPtr = NULL; VOID *newPtr = NULL;
@ -780,15 +736,12 @@ STATIC VOID *OsMemReallocSlab(VOID *pool, VOID *ptr, BOOL *isSlabMem, UINT32 siz
} }
VOID *OsMemAlloc(VOID *pool, UINT32 size) VOID *OsMemAlloc(VOID *pool, UINT32 size)
//分配指定大小的内存块。它接受一个指向内存池的指针和一个大小参数,并返回分配的内存块指针。
{ {
return OsMemAllocWithCheck(pool, size); return OsMemAllocWithCheck(pool, size);
} }
#else #else
//与上述函数相同,但只在支持内存泄漏检测的情况下启用。(条件编译)
STATIC VOID *OsMemReallocSlab(VOID *pool, const VOID *ptr, BOOL *isSlabMem, UINT32 size) STATIC VOID *OsMemReallocSlab(VOID *pool, const VOID *ptr, BOOL *isSlabMem, UINT32 size)
{ {
*isSlabMem = FALSE; *isSlabMem = FALSE;
@ -799,7 +752,6 @@ STATIC VOID *OsMemReallocSlab(VOID *pool, const VOID *ptr, BOOL *isSlabMem, UINT
#ifdef LOSCFG_EXC_INTERACTION #ifdef LOSCFG_EXC_INTERACTION
LITE_OS_SEC_TEXT_INIT UINT32 OsMemExcInteractionInit(UINTPTR memStart) LITE_OS_SEC_TEXT_INIT UINT32 OsMemExcInteractionInit(UINTPTR memStart)
//初始化用于异常交互的内存。它接受一个起始内存地址参数,并返回初始化结果。
{ {
UINT32 ret; UINT32 ret;
m_aucSysMem0 = (UINT8 *)memStart; m_aucSysMem0 = (UINT8 *)memStart;
@ -811,7 +763,6 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsMemExcInteractionInit(UINTPTR memStart)
#endif #endif
LITE_OS_SEC_TEXT_INIT UINT32 OsMemSystemInit(UINTPTR memStart) LITE_OS_SEC_TEXT_INIT UINT32 OsMemSystemInit(UINTPTR memStart)
//初始化系统堆内存。它接受一个起始内存地址参数,并返回初始化结果。
{ {
UINT32 ret; UINT32 ret;
UINT32 poolSize; UINT32 poolSize;
@ -834,7 +785,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsMemSystemInit(UINTPTR memStart)
* tmpNode --- pointer a suitable free block * tmpNode --- pointer a suitable free block
*/ */
STATIC INLINE LosMemDynNode *OsMemFindSuitableFreeBlock(VOID *pool, UINT32 allocSize) STATIC INLINE LosMemDynNode *OsMemFindSuitableFreeBlock(VOID *pool, UINT32 allocSize)
{//在内存池中查找合适的空闲块以供分配使用的功能 {
LOS_DL_LIST *listNodeHead = NULL; LOS_DL_LIST *listNodeHead = NULL;
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
@ -874,17 +825,20 @@ STATIC INLINE LosMemDynNode *OsMemFindSuitableFreeBlock(VOID *pool, UINT32 alloc
return NULL; return NULL;
} }
/*
STATIC INLINE VOID OsMemClearNode(LosMemDynNode *node)//将 LosMemDynNode 结构体清零。 * Description : clear a mem node, set every member to NULL
* Input : node --- Pointer to the mem node which will be cleared up
*/
STATIC INLINE VOID OsMemClearNode(LosMemDynNode *node)
{ {
(VOID)memset_s((VOID *)node, sizeof(LosMemDynNode), 0, sizeof(LosMemDynNode)); (VOID)memset_s((VOID *)node, sizeof(LosMemDynNode), 0, sizeof(LosMemDynNode));
} }
/*
STATIC INLINE VOID OsMemMergeNode(LosMemDynNode *node)//合并两个相邻的空闲节点。具体实现是将当前节点和后继节点合并成一个大的空闲节点,然后将当前节点清零。 * Description : merge this node and pre node, then clear this node info
LosMemDynNode *newFreeNode = NULL; * Input : node --- Pointer to node which will be merged
*/
STATIC INLINE VOID OsMemMergeNode(LosMemDynNode *node)
{ {
LosMemDynNode *nextNode = NULL; LosMemDynNode *nextNode = NULL;
@ -898,13 +852,18 @@ STATIC INLINE VOID OsMemMergeNode(LosMemDynNode *node)//合并两个相邻的空
OsMemClearNode(node); OsMemClearNode(node);
} }
/*
* Description : split new node from allocNode, and merge remainder mem if necessary
* Input : pool -- Pointer to memory pool
* allocNode -- the source node which the new node will split from it.
* After pick up it's node info, change to point to the new node
* allocSize -- the size of new node
* Output : allocNode -- save new node addr
*/
STATIC INLINE VOID OsMemSplitNode(VOID *pool, STATIC INLINE VOID OsMemSplitNode(VOID *pool,
LosMemDynNode *allocNode, UINT32 allocSize) LosMemDynNode *allocNode, UINT32 allocSize)
{//将一个空闲节点分割成两个,并将其中一个分配给需要的内存块。 {
//具体实现是在当前空闲节点上创建一个新的空闲节点,并将原有空闲节点的部分内存分配给新节点, LosMemDynNode *newFreeNode = NULL;
//再将新节点添加到对应链表中。
LosMemDynNode *nextNode = NULL; LosMemDynNode *nextNode = NULL;
LOS_DL_LIST *listNodeHead = NULL; LOS_DL_LIST *listNodeHead = NULL;
const VOID *firstNode = (const VOID *)((UINT8 *)OS_MEM_HEAD_ADDR(pool) + OS_DLNK_HEAD_SIZE); const VOID *firstNode = (const VOID *)((UINT8 *)OS_MEM_HEAD_ADDR(pool) + OS_DLNK_HEAD_SIZE);
@ -940,7 +899,7 @@ STATIC INLINE VOID OsMemSplitNode(VOID *pool,
* pool -- Pointer to memory pool * pool -- Pointer to memory pool
*/ */
STATIC INLINE VOID OsMemFreeNode(LosMemDynNode *node, LosMemPoolInfo *pool) STATIC INLINE VOID OsMemFreeNode(LosMemDynNode *node, LosMemPoolInfo *pool)
{//释放内存节点的,它包括了一些内存合并和链表操作 {
LosMemDynNode *nextNode = NULL; LosMemDynNode *nextNode = NULL;
LOS_DL_LIST *listNodeHead = NULL; LOS_DL_LIST *listNodeHead = NULL;
const VOID *firstNode = (const VOID *)((UINT8 *)OS_MEM_HEAD_ADDR(pool) + OS_DLNK_HEAD_SIZE); const VOID *firstNode = (const VOID *)((UINT8 *)OS_MEM_HEAD_ADDR(pool) + OS_DLNK_HEAD_SIZE);
@ -983,7 +942,12 @@ STATIC INLINE VOID OsMemFreeNode(LosMemDynNode *node, LosMemPoolInfo *pool)
} }
#ifdef LOSCFG_MEM_DEBUG #ifdef LOSCFG_MEM_DEBUG
//OsMemIsNodeValid 和 OsMemCheckUsedNode 则是用来检查内存节点的有效性的函数 /*
* Description : check the result if pointer memory node belongs to pointer memory pool
* Input : pool -- Pointer to memory pool
* node -- the node which need be checked
* Return : LOS_OK or LOS_NOK
*/
STATIC INLINE BOOL OsMemIsNodeValid(const LosMemDynNode *node, const LosMemDynNode *startNode, STATIC INLINE BOOL OsMemIsNodeValid(const LosMemDynNode *node, const LosMemDynNode *startNode,
const LosMemDynNode *endNode, const LosMemDynNode *endNode,
const UINT8 *startPool, const UINT8 *endPool) const UINT8 *startPool, const UINT8 *endPool)
@ -1039,7 +1003,7 @@ STATIC INLINE VOID OsMemCheckUsedNode(const VOID *pool, const LosMemDynNode *nod
#ifdef LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK #ifdef LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK
LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsMemPoolDlinkcheck(const LosMemPoolInfo *pool, LOS_DL_LIST listHead) LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsMemPoolDlinkcheck(const LosMemPoolInfo *pool, LOS_DL_LIST listHead)
{//OsMemPoolDlinkcheck 则是用来检查内存池的双向链表的函数 {
if (((UINTPTR)listHead.pstPrev < (UINTPTR)(pool + 1)) || if (((UINTPTR)listHead.pstPrev < (UINTPTR)(pool + 1)) ||
((UINTPTR)listHead.pstPrev >= ((UINTPTR)pool + pool->poolSize)) || ((UINTPTR)listHead.pstPrev >= ((UINTPTR)pool + pool->poolSize)) ||
((UINTPTR)listHead.pstNext < (UINTPTR)(pool + 1)) || ((UINTPTR)listHead.pstNext < (UINTPTR)(pool + 1)) ||
@ -1057,7 +1021,7 @@ LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsMemPoolDlinkcheck(const LosMemPool
* Input : pool --Pointer to memory pool * Input : pool --Pointer to memory pool
*/ */
LITE_OS_SEC_TEXT_MINOR VOID OsMemPoolHeadInfoPrint(const VOID *pool) LITE_OS_SEC_TEXT_MINOR VOID OsMemPoolHeadInfoPrint(const VOID *pool)
{//打印内存池头部信息poolAddr, poolSize等以及检查内存池的双向链表是否异常如果异常则打印链表头的前后指针 {
const LosMemPoolInfo *poolInfo = (const LosMemPoolInfo *)pool; const LosMemPoolInfo *poolInfo = (const LosMemPoolInfo *)pool;
UINT32 dlinkNum; UINT32 dlinkNum;
UINT32 flag = 0; UINT32 flag = 0;
@ -1101,7 +1065,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsMemPoolHeadInfoPrint(const VOID *pool)
} }
STATIC UINT32 OsMemIntegrityCheck(const VOID *pool, LosMemDynNode **tmpNode, LosMemDynNode **preNode) STATIC UINT32 OsMemIntegrityCheck(const VOID *pool, LosMemDynNode **tmpNode, LosMemDynNode **preNode)
{//检查整个内存池的完整性,并输出相关信息。具体实现是从第一个节点开始遍历,逐一检查节点的合法性。如果检测到错误,会触发系统崩溃 {
const LosMemPoolInfo *poolInfo = (const LosMemPoolInfo *)pool; const LosMemPoolInfo *poolInfo = (const LosMemPoolInfo *)pool;
const UINT8 *endPool = (const UINT8 *)pool + poolInfo->poolSize; const UINT8 *endPool = (const UINT8 *)pool + poolInfo->poolSize;
@ -1154,7 +1118,7 @@ STATIC UINT32 OsMemIntegrityCheck(const VOID *pool, LosMemDynNode **tmpNode, Los
STATIC VOID OsMemNodeInfo(const LosMemDynNode *tmpNode, STATIC VOID OsMemNodeInfo(const LosMemDynNode *tmpNode,
const LosMemDynNode *preNode) const LosMemDynNode *preNode)
{//这个函数的作用是输出节点信息,包括节点前后指针、节点大小、堆栈信息等。同时还会输出相关的内存数据,方便调试。 {
if (tmpNode == preNode) { if (tmpNode == preNode) {
PRINTK("\n the broken node is the first node\n"); PRINTK("\n the broken node is the first node\n");
#ifdef LOSCFG_SHELL_EXCINFO_DUMP #ifdef LOSCFG_SHELL_EXCINFO_DUMP
@ -1194,8 +1158,7 @@ STATIC VOID OsMemNodeInfo(const LosMemDynNode *tmpNode,
STATIC VOID OsMemIntegrityCheckError(const LosMemDynNode *tmpNode, STATIC VOID OsMemIntegrityCheckError(const LosMemDynNode *tmpNode,
const LosMemDynNode *preNode) const LosMemDynNode *preNode)
{//当检测到内存池的完整性出现问题时,输出相关信息,并触发系统崩溃。 {
//同时,该函数会输出当前节点和前一个节点的信息,以及前一个节点的所属任务的相关信息。
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
UINT32 taskId; UINT32 taskId;
@ -1234,9 +1197,7 @@ STATIC VOID OsMemIntegrityCheckError(const LosMemDynNode *tmpNode,
* Return : LOS_OK --memory pool integrate or LOS_NOK--memory pool impaired * Return : LOS_OK --memory pool integrate or LOS_NOK--memory pool impaired
*/ */
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemIntegrityCheck(VOID *pool) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemIntegrityCheck(VOID *pool)
{//用于检查指定内存池的完整性。它首先对传入的参数进行空指针判断, {
//然后获取互斥锁调用OsMemIntegrityCheck函数来检查内存池的完整性。
//如果检查失败则调用OsMemIntegrityCheckError函数进行错误处理并释放互斥锁
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
LosMemDynNode *preNode = NULL; LosMemDynNode *preNode = NULL;
UINT32 intSave; UINT32 intSave;
@ -1258,7 +1219,7 @@ ERROR_OUT:
return LOS_NOK; return LOS_NOK;
} }
VOID OsMemIntegrityMultiCheck(VOID)//进行多个内存池的完整性检查 VOID OsMemIntegrityMultiCheck(VOID)
{ {
if (LOS_MemIntegrityCheck(m_aucSysMem1) == LOS_OK) { if (LOS_MemIntegrityCheck(m_aucSysMem1) == LOS_OK) {
PRINTK("system memcheck over, all passed!\n"); PRINTK("system memcheck over, all passed!\n");
@ -1276,7 +1237,6 @@ VOID OsMemIntegrityMultiCheck(VOID)//进行多个内存池的完整性检查
#endif #endif
} }
#else #else
//如果定义了宏LOSCFG_EXC_INTERACTION则调用LOS_MemIntegrityCheck函数来检查异常交互内存池m_aucSysMem0的完整性并输出检查结果。
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemIntegrityCheck(VOID *pool) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemIntegrityCheck(VOID *pool)
{ {
return LOS_OK; return LOS_OK;
@ -1288,7 +1248,7 @@ VOID OsMemIntegrityMultiCheck(VOID)
#endif #endif
STATIC INLINE VOID OsMemNodeDebugOperate(VOID *pool, LosMemDynNode *allocNode, UINT32 size) STATIC INLINE VOID OsMemNodeDebugOperate(VOID *pool, LosMemDynNode *allocNode, UINT32 size)
{//用于内存节点的调试操作 {
#ifdef LOSCFG_MEM_HEAD_BACKUP #ifdef LOSCFG_MEM_HEAD_BACKUP
OsMemNodeSave(allocNode); OsMemNodeSave(allocNode);
#endif #endif
@ -1299,8 +1259,7 @@ STATIC INLINE VOID OsMemNodeDebugOperate(VOID *pool, LosMemDynNode *allocNode, U
} }
STATIC UINT32 OsMemInfoGet(const VOID *pool, LOS_MEM_POOL_STATUS *poolStatus) STATIC UINT32 OsMemInfoGet(const VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)
{//获取指定内存池的信息。它首先对传入的参数进行类型转换和有效性检查, {
//然后遍历内存池中的节点,统计已使用和空闲节点的数量、总大小等信息。
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
UINT32 totalUsedSize = 0; UINT32 totalUsedSize = 0;
@ -1343,7 +1302,7 @@ STATIC UINT32 OsMemInfoGet(const VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)
} }
VOID OsMemInfoPrint(const VOID *pool) VOID OsMemInfoPrint(const VOID *pool)
{//打印内存池的信息 {
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
LOS_MEM_POOL_STATUS status = {0}; LOS_MEM_POOL_STATUS status = {0};
@ -1392,8 +1351,7 @@ STATIC INLINE VOID OsMemInfoAlert(const VOID *pool, UINT32 allocSize)
* Return : Pointer to allocated memory * Return : Pointer to allocated memory
*/ */
STATIC VOID *OsMemAllocWithCheck(LosMemPoolInfo *pool, UINT32 size) STATIC VOID *OsMemAllocWithCheck(LosMemPoolInfo *pool, UINT32 size)
{//分配内存的函数,它首先对要分配的内存大小进行一些处理,然后查找合适大小的空闲块, {
//如果找到则进行分割和设置标记等操作,最后返回分配的内存块。
LosMemDynNode *allocNode = NULL; LosMemDynNode *allocNode = NULL;
UINT32 allocSize; UINT32 allocSize;
@ -1434,9 +1392,16 @@ STATIC VOID *OsMemAllocWithCheck(LosMemPoolInfo *pool, UINT32 size)
return (allocNode + 1); return (allocNode + 1);
} }
/*
* Description : reAlloc a smaller memory node
* Input : pool --- Pointer to memory pool
* allocSize --- the size of new node which will be alloced
* node --- the node which will be realloced
* nodeSize --- the size of old node
* Output : node --- pointer to the new node after realloc
*/
STATIC INLINE VOID OsMemReAllocSmaller(LosMemPoolInfo *pool, UINT32 allocSize, LosMemDynNode *node, UINT32 nodeSize) STATIC INLINE VOID OsMemReAllocSmaller(LosMemPoolInfo *pool, UINT32 allocSize, LosMemDynNode *node, UINT32 nodeSize)
{//重新分配较小内存块的函数,它会判断是否可以将原有内存块进行分割,如果可以则进行相应的操作。 {
if ((allocSize + OS_MEM_NODE_HEAD_SIZE + OS_MEM_ALIGN_SIZE) <= nodeSize) { if ((allocSize + OS_MEM_NODE_HEAD_SIZE + OS_MEM_ALIGN_SIZE) <= nodeSize) {
node->selfNode.sizeAndFlag = nodeSize; node->selfNode.sizeAndFlag = nodeSize;
OsMemSplitNode(pool, node, allocSize); OsMemSplitNode(pool, node, allocSize);
@ -1452,10 +1417,18 @@ STATIC INLINE VOID OsMemReAllocSmaller(LosMemPoolInfo *pool, UINT32 allocSize, L
#endif #endif
} }
/*
* Description : reAlloc a Bigger memory node after merge node and nextNode
* Input : pool --- Pointer to memory pool
* allocSize --- the size of new node which will be alloced
* node --- the node which will be realloced
* nodeSize --- the size of old node
* nextNode --- pointer next node which will be merged
* Output : node --- pointer to the new node after realloc
*/
STATIC INLINE VOID OsMemMergeNodeForReAllocBigger(LosMemPoolInfo *pool, UINT32 allocSize, LosMemDynNode *node, STATIC INLINE VOID OsMemMergeNodeForReAllocBigger(LosMemPoolInfo *pool, UINT32 allocSize, LosMemDynNode *node,
UINT32 nodeSize, LosMemDynNode *nextNode) UINT32 nodeSize, LosMemDynNode *nextNode)
{//重新分配较大内存块的函数,它会判断是否需要合并相邻的内存块,并进行相应的操作。 {
const VOID *firstNode = (const VOID *)((UINT8 *)OS_MEM_HEAD_ADDR(pool) + OS_DLNK_HEAD_SIZE); const VOID *firstNode = (const VOID *)((UINT8 *)OS_MEM_HEAD_ADDR(pool) + OS_DLNK_HEAD_SIZE);
node->selfNode.sizeAndFlag = nodeSize; node->selfNode.sizeAndFlag = nodeSize;
@ -1477,7 +1450,7 @@ STATIC INLINE VOID OsMemMergeNodeForReAllocBigger(LosMemPoolInfo *pool, UINT32 a
} }
STATIC UINT32 OsMemInit(VOID *pool, UINT32 size) STATIC UINT32 OsMemInit(VOID *pool, UINT32 size)
{//初始化内存池的函数,它会对内存池进行一些必要的初始化工作,包括设置头结点、尾结点,以及初始化统计信息等。 {
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
LosMemDynNode *newNode = NULL; LosMemDynNode *newNode = NULL;
LosMemDynNode *endNode = NULL; LosMemDynNode *endNode = NULL;
@ -1527,7 +1500,7 @@ STATIC UINT32 OsMemInit(VOID *pool, UINT32 size)
} }
LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemInit(VOID *pool, UINT32 size) LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemInit(VOID *pool, UINT32 size)
{//初始化内存池,其中包括对内存池的大小、对齐等进行检查,并调用相应的内部函数进行内存池的初始化工作。 {
UINT32 intSave; UINT32 intSave;
if ((pool == NULL) || (size < OS_MEM_MIN_POOL_SIZE)) { if ((pool == NULL) || (size < OS_MEM_MIN_POOL_SIZE)) {
@ -1560,8 +1533,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemInit(VOID *pool, UINT32 size)
} }
LITE_OS_SEC_TEXT VOID *LOS_MemAlloc(VOID *pool, UINT32 size) LITE_OS_SEC_TEXT VOID *LOS_MemAlloc(VOID *pool, UINT32 size)
{//从内存池中分配指定大小的内存块, {
//其中包括调用 OsSlabMemAlloc 和 OsMemAllocWithCheck 等函数来实现内存的分配。
VOID *ptr = NULL; VOID *ptr = NULL;
UINT32 intSave; UINT32 intSave;
@ -1592,7 +1564,7 @@ LITE_OS_SEC_TEXT VOID *LOS_MemAlloc(VOID *pool, UINT32 size)
} }
LITE_OS_SEC_TEXT VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary) LITE_OS_SEC_TEXT VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary)
{//按照指定的对齐边界来分配内存,其中包括对边界对齐和内存分配的相关处理。 {
UINT32 useSize; UINT32 useSize;
UINT32 gapSize; UINT32 gapSize;
VOID *ptr = NULL; VOID *ptr = NULL;
@ -1650,7 +1622,7 @@ LITE_OS_SEC_TEXT VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundar
} }
LITE_OS_SEC_TEXT STATIC INLINE VOID OsDoMemFree(VOID *pool, const VOID *ptr, LosMemDynNode *node) LITE_OS_SEC_TEXT STATIC INLINE VOID OsDoMemFree(VOID *pool, const VOID *ptr, LosMemDynNode *node)
{//释放内存,其中包括内存检查和内存释放等操作。 {
OsMemCheckUsedNode(pool, node); OsMemCheckUsedNode(pool, node);
OsMemFreeNode(node, pool); OsMemFreeNode(node, pool);
@ -1662,7 +1634,7 @@ LITE_OS_SEC_TEXT STATIC INLINE VOID OsDoMemFree(VOID *pool, const VOID *ptr, Los
} }
UINT32 OsMemFree(VOID *pool, const VOID *ptr) UINT32 OsMemFree(VOID *pool, const VOID *ptr)
{//释放内存,其中包括内存检查和内存释放等操作。 {
UINT32 ret = LOS_OK; UINT32 ret = LOS_OK;
UINT32 gapSize; UINT32 gapSize;
LosMemDynNode *node = NULL; LosMemDynNode *node = NULL;
@ -1701,7 +1673,7 @@ OUT:
} }
LITE_OS_SEC_TEXT UINT32 LOS_MemFree(VOID *pool, VOID *ptr) LITE_OS_SEC_TEXT UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
{//判断了传入参数的有效性然后调用OsSlabMemFree和OsMemFree进行内存的释放操作并最终返回相应的状态码 {
UINT32 ret; UINT32 ret;
UINT32 intSave; UINT32 intSave;
@ -1726,8 +1698,7 @@ OUT:
} }
STATIC VOID *OsGetRealPtr(const VOID *pool, VOID *ptr) STATIC VOID *OsGetRealPtr(const VOID *pool, VOID *ptr)
{//根据传入的指针获取真正的内存地址,这个地址是动态内存块的起始地址。在获取真实地址之前, {
//需要判断相邻内存块的标志位和大小是否正确,以保证获取到的内存地址是正确的。
VOID *realPtr = ptr; VOID *realPtr = ptr;
UINT32 gapSize = *((UINT32 *)((UINTPTR)ptr - sizeof(UINT32))); UINT32 gapSize = *((UINT32 *)((UINTPTR)ptr - sizeof(UINT32)));
@ -1748,10 +1719,7 @@ STATIC VOID *OsGetRealPtr(const VOID *pool, VOID *ptr)
} }
STATIC VOID *OsMemRealloc(VOID *pool, VOID *ptr, UINT32 size) STATIC VOID *OsMemRealloc(VOID *pool, VOID *ptr, UINT32 size)
{//实现内存重新分配的功能。首先,它会根据传入的指针获取真正的内存地址, {
//并对节点信息进行一系列的检查。如果需要重新分配的内存大小小于原有内存块的大小
//则直接将原有内存块作为新的内存块返回。
//否则,需要进行内存的合并或者申请新的内存块等操作。
LosMemDynNode *node = NULL; LosMemDynNode *node = NULL;
LosMemDynNode *nextNode = NULL; LosMemDynNode *nextNode = NULL;
VOID *tmpPtr = NULL; VOID *tmpPtr = NULL;
@ -1793,8 +1761,7 @@ STATIC VOID *OsMemRealloc(VOID *pool, VOID *ptr, UINT32 size)
} }
LITE_OS_SEC_TEXT_MINOR VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size) LITE_OS_SEC_TEXT_MINOR VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size)
{//对OsMemRealloc和OsMemReallocSlab函数的封装。如果传入的内存池是Slab内存池 {
//则调用OsMemReallocSlab函数进行处理否则则调用OsMemRealloc函数进行处理。
UINT32 intSave; UINT32 intSave;
VOID *newPtr = NULL; VOID *newPtr = NULL;
BOOL isSlabMem = FALSE; BOOL isSlabMem = FALSE;
@ -1831,10 +1798,7 @@ OUT:
} }
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTotalUsedGet(VOID *pool) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTotalUsedGet(VOID *pool)
{//获取指定内存池已使用的总字节数。它通过遍历内存池中的动态内存节点,判断节点是否被使用, {
//并累计已使用的字节数。
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
UINT32 memUsed = 0; UINT32 memUsed = 0;
@ -1859,8 +1823,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTotalUsedGet(VOID *pool)
} }
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemUsedBlksGet(VOID *pool) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemUsedBlksGet(VOID *pool)
{//获取指定内存池已使用的内存块数量。 {
//它通过遍历内存池中的动态内存节点,判断节点是否被使用,并累计已使用的内存块数量。
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
UINT32 blkNums = 0; UINT32 blkNums = 0;
@ -1885,8 +1848,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemUsedBlksGet(VOID *pool)
} }
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTaskIdGet(const VOID *ptr) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTaskIdGet(const VOID *ptr)
{//根据指针获取其所在的任务ID。它首先判断指针是否在系统内存范围内 {
//然后遍历内存池中的动态内存节点找到指针所在的内存块再获取该内存块所属的任务ID。
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)(VOID *)m_aucSysMem1; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)(VOID *)m_aucSysMem1;
UINT32 intSave; UINT32 intSave;
@ -1925,8 +1887,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTaskIdGet(const VOID *ptr)
} }
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemFreeBlksGet(VOID *pool) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemFreeBlksGet(VOID *pool)
{//获取指定内存池中空闲的内存块数量。 {
//它通过遍历内存池中的动态内存节点,判断节点是否空闲,并累计空闲的内存块数量。
LosMemDynNode *tmpNode = NULL; LosMemDynNode *tmpNode = NULL;
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
UINT32 blkNums = 0; UINT32 blkNums = 0;
@ -1951,7 +1912,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemFreeBlksGet(VOID *pool)
} }
LITE_OS_SEC_TEXT_MINOR UINTPTR LOS_MemLastUsedGet(VOID *pool) LITE_OS_SEC_TEXT_MINOR UINTPTR LOS_MemLastUsedGet(VOID *pool)
{//获取指定内存池最后一个使用的内存块的地址 {
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
LosMemDynNode *node = NULL; LosMemDynNode *node = NULL;
@ -1975,8 +1936,7 @@ LITE_OS_SEC_TEXT_MINOR UINTPTR LOS_MemLastUsedGet(VOID *pool)
* Return : the number of free node * Return : the number of free node
*/ */
LITE_OS_SEC_TEXT_MINOR VOID OsMemResetEndNode(VOID *pool, UINTPTR preAddr) LITE_OS_SEC_TEXT_MINOR VOID OsMemResetEndNode(VOID *pool, UINTPTR preAddr)
{//重置内存池的末尾节点。它将末尾节点的大小和标志设置为头节点的大小,并根据 preAddr 的值设置前一个节点的指针。 {
//然后它将该节点标记为已使用并设置魔术数和任务ID。
LosMemDynNode *endNode = (LosMemDynNode *)OS_MEM_END_NODE(pool, ((LosMemPoolInfo *)pool)->poolSize); LosMemDynNode *endNode = (LosMemDynNode *)OS_MEM_END_NODE(pool, ((LosMemPoolInfo *)pool)->poolSize);
endNode->selfNode.sizeAndFlag = OS_MEM_NODE_HEAD_SIZE; endNode->selfNode.sizeAndFlag = OS_MEM_NODE_HEAD_SIZE;
if (preAddr != 0) { if (preAddr != 0) {
@ -1990,7 +1950,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsMemResetEndNode(VOID *pool, UINTPTR preAddr)
#endif #endif
} }
UINT32 LOS_MemPoolSizeGet(const VOID *pool)//获取内存池的大小。如果传入的内存池为空,则返回错误。 UINT32 LOS_MemPoolSizeGet(const VOID *pool)
{ {
if (pool == NULL) { if (pool == NULL) {
return LOS_NOK; return LOS_NOK;
@ -1999,9 +1959,7 @@ UINT32 LOS_MemPoolSizeGet(const VOID *pool)//获取内存池的大小。如果
} }
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)
{//获取内存池的信息。它接受一个内存池指针和一个指向内存池状态结构体的指针作为参数。 {
//首先,它检查传入的指针是否为空,如果为空则返回错误。
//然后,它获取内存池的信息,并在获取完成后释放内存池的锁。
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
UINT32 ret; UINT32 ret;
UINT32 intSave; UINT32 intSave;
@ -2024,7 +1982,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *po
} }
STATIC INLINE VOID OsShowFreeNode(UINT32 index, UINT32 length, const UINT32 *countNum) STATIC INLINE VOID OsShowFreeNode(UINT32 index, UINT32 length, const UINT32 *countNum)
{//显示空闲节点的信息。它打印出每个块大小对应的节点数量。 {
UINT32 count = 0; UINT32 count = 0;
PRINTK("\n block size: "); PRINTK("\n block size: ");
while (count < length) { while (count < length) {
@ -2040,8 +1998,7 @@ STATIC INLINE VOID OsShowFreeNode(UINT32 index, UINT32 length, const UINT32 *cou
} }
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemFreeNodeShow(VOID *pool) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemFreeNodeShow(VOID *pool)
{//显示剩余的空闲节点数量。它遍历多重双向链表, {
//统计每个链表头节点后面的节点数量,并调用 OsShowFreeNode 函数打印出结果。
LOS_DL_LIST *listNodeHead = NULL; LOS_DL_LIST *listNodeHead = NULL;
LosMultipleDlinkHead *headAddr = (LosMultipleDlinkHead *)((UINTPTR)pool + sizeof(LosMemPoolInfo)); LosMultipleDlinkHead *headAddr = (LosMultipleDlinkHead *)((UINTPTR)pool + sizeof(LosMemPoolInfo));
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
@ -2086,7 +2043,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemFreeNodeShow(VOID *pool)
#ifdef LOSCFG_BASE_MEM_NODE_SIZE_CHECK #ifdef LOSCFG_BASE_MEM_NODE_SIZE_CHECK
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemNodeSizeCheck(VOID *pool, VOID *ptr, UINT32 *totalSize, UINT32 *availSize) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemNodeSizeCheck(VOID *pool, VOID *ptr, UINT32 *totalSize, UINT32 *availSize)
{//进行内存节点大小检查的函数 {
const VOID *head = NULL; const VOID *head = NULL;
LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool; LosMemPoolInfo *poolInfo = (LosMemPoolInfo *)pool;
UINT8 *endPool = NULL; UINT8 *endPool = NULL;
@ -2139,7 +2096,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemNodeSizeCheck(VOID *pool, VOID *ptr, UINT32
* attention : this func couldn't ensure the return memCtrl belongs to ptr it just find forward the most nearly one * attention : this func couldn't ensure the return memCtrl belongs to ptr it just find forward the most nearly one
*/ */
LITE_OS_SEC_TEXT_MINOR const VOID *OsMemFindNodeCtrl(const VOID *pool, const VOID *ptr) LITE_OS_SEC_TEXT_MINOR const VOID *OsMemFindNodeCtrl(const VOID *pool, const VOID *ptr)
{//查找内存池中指针所指的动态内存节点控制块,并返回其地址 {
const VOID *head = ptr; const VOID *head = ptr;
if (ptr == NULL) { if (ptr == NULL) {
@ -2157,7 +2114,7 @@ LITE_OS_SEC_TEXT_MINOR const VOID *OsMemFindNodeCtrl(const VOID *pool, const VOI
} }
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemCheckLevelSet(UINT8 checkLevel) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemCheckLevelSet(UINT8 checkLevel)
{//用于设置内存检查级别,接受一个参数 checkLevel可以是 LOS_MEM_CHECK_LEVEL_LOW、LOS_MEM_CHECK_LEVEL_HIGH 或 LOS_MEM_CHECK_LEVEL_DISABLE {
if (checkLevel == LOS_MEM_CHECK_LEVEL_LOW) { if (checkLevel == LOS_MEM_CHECK_LEVEL_LOW) {
PRINTK("%s: LOS_MEM_CHECK_LEVEL_LOW \n", __FUNCTION__); PRINTK("%s: LOS_MEM_CHECK_LEVEL_LOW \n", __FUNCTION__);
} else if (checkLevel == LOS_MEM_CHECK_LEVEL_HIGH) { } else if (checkLevel == LOS_MEM_CHECK_LEVEL_HIGH) {
@ -2173,13 +2130,13 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemCheckLevelSet(UINT8 checkLevel)
} }
LITE_OS_SEC_TEXT_MINOR UINT8 LOS_MemCheckLevelGet(VOID) LITE_OS_SEC_TEXT_MINOR UINT8 LOS_MemCheckLevelGet(VOID)
{//获取当前的内存检查级别,直接返回全局变量 g_memCheckLevel 的值。 {
return g_memCheckLevel; return g_memCheckLevel;
} }
UINT32 OsMemSysNodeCheck(VOID *dstAddr, VOID *srcAddr, UINT32 nodeLength, UINT8 pos) UINT32 OsMemSysNodeCheck(VOID *dstAddr, VOID *srcAddr, UINT32 nodeLength, UINT8 pos)
{//检查动态节点控制块的可用大小是否足够,以保证进行 memcpy 或 memset 操作时不会越界 {
UINT32 ret; UINT32 ret;
UINT32 totalSize = 0; UINT32 totalSize = 0;
UINT32 availSize = 0; UINT32 availSize = 0;
@ -2223,7 +2180,7 @@ UINT32 OsMemSysNodeCheck(VOID *dstAddr, VOID *srcAddr, UINT32 nodeLength, UINT8
#ifdef LOSCFG_MEM_MUL_MODULE #ifdef LOSCFG_MEM_MUL_MODULE
STATIC INLINE UINT32 OsMemModCheck(UINT32 moduleId) STATIC INLINE UINT32 OsMemModCheck(UINT32 moduleId)
{//检查输入的模块 ID 是否有效 {
if (moduleId > MEM_MODULE_MAX) { if (moduleId > MEM_MODULE_MAX) {
PRINT_ERR("error module ID input!\n"); PRINT_ERR("error module ID input!\n");
return LOS_NOK; return LOS_NOK;
@ -2232,7 +2189,7 @@ STATIC INLINE UINT32 OsMemModCheck(UINT32 moduleId)
} }
STATIC INLINE VOID *OsMemPtrToNode(VOID *ptr) STATIC INLINE VOID *OsMemPtrToNode(VOID *ptr)
{//将指针转换为动态节点控制块的地址 {
UINT32 gapSize; UINT32 gapSize;
if ((UINTPTR)ptr & (OS_MEM_ALIGN_SIZE - 1)) { if ((UINTPTR)ptr & (OS_MEM_ALIGN_SIZE - 1)) {
@ -2259,7 +2216,7 @@ STATIC INLINE VOID *OsMemPtrToNode(VOID *ptr)
} }
STATIC INLINE UINT32 OsMemNodeSizeGet(VOID *ptr) STATIC INLINE UINT32 OsMemNodeSizeGet(VOID *ptr)
{//获取动态节点控制块中记录的节点大小 {
LosMemDynNode *node = (LosMemDynNode *)OsMemPtrToNode(ptr); LosMemDynNode *node = (LosMemDynNode *)OsMemPtrToNode(ptr);
if (node == NULL) { if (node == NULL) {
return 0; return 0;
@ -2269,7 +2226,7 @@ STATIC INLINE UINT32 OsMemNodeSizeGet(VOID *ptr)
} }
VOID *LOS_MemMalloc(VOID *pool, UINT32 size, UINT32 moduleId) VOID *LOS_MemMalloc(VOID *pool, UINT32 size, UINT32 moduleId)
{//在内存池中分配指定大小的内存,并进行模块 ID 的标记 {
UINT32 intSave; UINT32 intSave;
VOID *ptr = NULL; VOID *ptr = NULL;
VOID *node = NULL; VOID *node = NULL;
@ -2290,8 +2247,7 @@ VOID *LOS_MemMalloc(VOID *pool, UINT32 size, UINT32 moduleId)
} }
VOID *LOS_MemMallocAlign(VOID *pool, UINT32 size, UINT32 boundary, UINT32 moduleId) VOID *LOS_MemMallocAlign(VOID *pool, UINT32 size, UINT32 boundary, UINT32 moduleId)
{//与 LOS_MemMalloc 函数类似,区别在于它支持按照指定对齐边界分配内存。 {
//调用 LOS_MemAllocAlign 分配对齐内存,并执行与 LOS_MemMalloc 相同的操作
UINT32 intSave; UINT32 intSave;
VOID *ptr = NULL; VOID *ptr = NULL;
VOID *node = NULL; VOID *node = NULL;
@ -2312,7 +2268,7 @@ VOID *LOS_MemMallocAlign(VOID *pool, UINT32 size, UINT32 boundary, UINT32 module
} }
UINT32 LOS_MemMfree(VOID *pool, VOID *ptr, UINT32 moduleId) UINT32 LOS_MemMfree(VOID *pool, VOID *ptr, UINT32 moduleId)
{//用于释放指定的内存块 {
UINT32 intSave; UINT32 intSave;
UINT32 ret; UINT32 ret;
UINT32 size; UINT32 size;
@ -2345,15 +2301,7 @@ UINT32 LOS_MemMfree(VOID *pool, VOID *ptr, UINT32 moduleId)
} }
VOID *LOS_MemMrealloc(VOID *pool, VOID *ptr, UINT32 size, UINT32 moduleId) VOID *LOS_MemMrealloc(VOID *pool, VOID *ptr, UINT32 size, UINT32 moduleId)
{//重新分配指定大小的内存块 {
//首先检查模块 ID 和内存池是否有效,如果无效则返回空指针。
//然后判断传入的指针是否为空,如果为空则调用 LOS_MemMalloc 分配新的内存块。
//接着将指针转换为动态节点控制块的地址,并判断节点的模块 ID 是否与传入的模块 ID 匹配,
//如果不匹配则打印错误信息并使用节点中记录的模块 ID 进行重新分配操作。如果新的大小为 0
//则调用 LOS_MemMfree 释放原来的内存块并返回空指针。
//最后调用 LOS_MemRealloc 进行内存块的重新分配,并更新模块使用的内存大小。
VOID *newPtr = NULL; VOID *newPtr = NULL;
UINT32 oldNodeSize; UINT32 oldNodeSize;
UINT32 intSave; UINT32 intSave;
@ -2398,7 +2346,7 @@ VOID *LOS_MemMrealloc(VOID *pool, VOID *ptr, UINT32 size, UINT32 moduleId)
} }
UINT32 LOS_MemMusedGet(UINT32 moduleId) UINT32 LOS_MemMusedGet(UINT32 moduleId)
{//获取指定模块使用的内存大小 {
if (OsMemModCheck(moduleId) == LOS_NOK) { if (OsMemModCheck(moduleId) == LOS_NOK) {
return OS_NULL_INT; return OS_NULL_INT;
} }

@ -58,7 +58,7 @@ typedef struct {
LOS_DL_LIST queues[NPQS]; /* one for each priority */ LOS_DL_LIST queues[NPQS]; /* one for each priority */
SPIN_LOCK_S lock; /* private spinlock */ SPIN_LOCK_S lock; /* private spinlock */
} PriQueue; } PriQueue;
/*用于实现一个具有多个优先级的队列结构,并提供了相关的数据结构和锁来支持队列操作的线程安全性*/
/* priority queue per-cpu */ /* priority queue per-cpu */
STATIC PriQueue g_priqueue[LOSCFG_KERNEL_CORE_NUM]; STATIC PriQueue g_priqueue[LOSCFG_KERNEL_CORE_NUM];
@ -68,20 +68,17 @@ STATIC INLINE UINT32 OsMpIdleMask(VOID)
{ {
return ((~g_activeCpu) & LOSCFG_KERNEL_CPU_MASK); return ((~g_activeCpu) & LOSCFG_KERNEL_CPU_MASK);
} }
/*这个函数可能用来计算当前处于空闲状态的 CPU 核心的掩码。STATIC 关键字表示该函数是静态的,只在当前文件内可见,
INLINE */
STATIC INLINE VOID OsMpSetIdle(UINT32 cpu) STATIC INLINE VOID OsMpSetIdle(UINT32 cpu)
{ {
g_activeCpu &= ~CPUID_TO_AFFI_MASK(cpu); g_activeCpu &= ~CPUID_TO_AFFI_MASK(cpu);
} }
/*这个函数可能用于将指定的 CPU 核心设置为待机状态。
g_activeCpu */
STATIC INLINE VOID OsMpSetActive(UINT32 cpu) STATIC INLINE VOID OsMpSetActive(UINT32 cpu)
{ {
g_activeCpu |= CPUID_TO_AFFI_MASK(cpu); g_activeCpu |= CPUID_TO_AFFI_MASK(cpu);
} }
/*这个函数可能用于将指定的 CPU 核心设置为活动状态。
g_activeCpu */
VOID OsPriQueueInit(VOID) VOID OsPriQueueInit(VOID)
{ {
LOS_DL_LIST *priQueues = NULL; LOS_DL_LIST *priQueues = NULL;
@ -100,7 +97,7 @@ VOID OsPriQueueInit(VOID)
} }
} }
} }
/*这段代码的作用是初始化多核系统中每个核心的优先级队列,确保每个队列都处于初始状态*/
UINT32 OsPriQueueSize(UINT32 priority) UINT32 OsPriQueueSize(UINT32 priority)
{ {
UINT32 itemCnt = 0; UINT32 itemCnt = 0;
@ -115,7 +112,7 @@ UINT32 OsPriQueueSize(UINT32 priority)
return itemCnt; return itemCnt;
} }
/*这段代码的作用是获取多核系统中某个核心指定优先级的队列中的任务数量*/
UINT32 OsPriQueueTotalSize(VOID) UINT32 OsPriQueueTotalSize(VOID)
{ {
UINT32 priority; UINT32 priority;
@ -128,7 +125,7 @@ UINT32 OsPriQueueTotalSize(VOID)
return totalSize; return totalSize;
} }
/*这段代码的作用是计算多核系统中所有优先级队列的总任务数量,以便进行系统性能监控和优化*/
UINT32 OsSchedPickCpu(LosTaskCB* task) UINT32 OsSchedPickCpu(LosTaskCB* task)
{ {
UINT32 cpuid, lastMask, cpuidMask, affinity; UINT32 cpuid, lastMask, cpuidMask, affinity;
@ -161,7 +158,7 @@ UINT32 OsSchedPickCpu(LosTaskCB* task)
return cpuid; return cpuid;
} }
/*这段代码的作用是根据任务的亲和性、空闲核心和任务上次运行的核心等信息,选择一个适合调度任务的 CPU 核心。*/
VOID OsPriQueueAdd(PriQueue *priQueue, LosTaskCB* task, QueueOps flag) VOID OsPriQueueAdd(PriQueue *priQueue, LosTaskCB* task, QueueOps flag)
{ {
LOS_DL_LIST *priQueues = NULL; LOS_DL_LIST *priQueues = NULL;
@ -182,7 +179,7 @@ VOID OsPriQueueAdd(PriQueue *priQueue, LosTaskCB* task, QueueOps flag)
LOS_ListTailInsert(&priQueues[priority], &task->pendList); LOS_ListTailInsert(&priQueues[priority], &task->pendList);
} }
} }
/*这段代码的作用是根据任务的优先级,将任务插入到对应优先级的队列中,并更新相应的位图信息。*/
/* /*
* Insert a task to the head of priority queue, only available * Insert a task to the head of priority queue, only available
* when putting running task back to the ready queue. * when putting running task back to the ready queue.
@ -192,14 +189,14 @@ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *queueNode, UINT32 priority)
LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList); LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList);
OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_HEAD); OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_HEAD);
} }
/*这段代码的作用是将指定任务插入到指定优先级队列的队头,用于在将当前任务从运行态切换到就绪态时,将当前任务重新插入到相应优先级队列的队头*/
VOID OsPriQueueEnqueueTail(LOS_DL_LIST *queueNode, UINT32 priority) VOID OsPriQueueEnqueueTail(LOS_DL_LIST *queueNode, UINT32 priority)
{ {
LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList); LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList);
OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_TAIL); OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_TAIL);
} }
/*这段代码的作用是将指定任务插入到指定优先级队列的队尾,用于在将一个新的任务从就绪态加入到相应优先级队列时,将任务插入到队尾*/
/* /*
* Insert a task to the tail of priority queue. The pri-queue might be * Insert a task to the tail of priority queue. The pri-queue might be
* this or another core's. * this or another core's.
@ -218,7 +215,7 @@ VOID OsPriQueueEnqueue(LOS_DL_LIST *queueNode, UINT32 priority)
/* add the task to the cpu per-core pri-queue */ /* add the task to the cpu per-core pri-queue */
OsPriQueueAdd(&g_priqueue[cpuid], task, QUEUE_TAIL); OsPriQueueAdd(&g_priqueue[cpuid], task, QUEUE_TAIL);
} }
/*这段代码的作用是将指定任务加入到相应的优先级队列中,并根据任务的调度要求选择适当的 CPU*/
VOID OsPriQueueDequeue(LOS_DL_LIST *queueNode) VOID OsPriQueueDequeue(LOS_DL_LIST *queueNode)
{ {
LosTaskCB *task = NULL; LosTaskCB *task = NULL;
@ -237,7 +234,7 @@ VOID OsPriQueueDequeue(LOS_DL_LIST *queueNode)
(*bitmap) &= ~(PRI0_BIT >> task->priority); (*bitmap) &= ~(PRI0_BIT >> task->priority);
} }
} }
/*这段代码的作用是从优先级队列中删除指定的任务节点,并在必要时更新位图以反映每个优先级队列的状态*/
LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID)
{ {
LosTaskCB *newTask = NULL; LosTaskCB *newTask = NULL;
@ -265,7 +262,7 @@ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID)
out: out:
return newTask; return newTask;
} }
/*这段代码的作用是从当前 CPU 的优先级队列中获取具有最高优先级的任务,并将其从队列中删除。*/
VOID OsSchedResched(VOID) VOID OsSchedResched(VOID)
{ {
LosTaskCB *runTask = NULL; LosTaskCB *runTask = NULL;
@ -329,7 +326,7 @@ VOID OsSchedResched(VOID)
/* do the task context switch */ /* do the task context switch */
OsTaskSchedule(newTask, runTask); OsTaskSchedule(newTask, runTask);
} }
/*这段代码实现了两个任务之间的上下文切换,包括状态更新、占用时间计算、任务监控等一系列处理,并最终调用 OsTaskSchedule 函数切换到新的任务执行。*/
VOID OsSchedPreempt(VOID) VOID OsSchedPreempt(VOID)
{ {
LosTaskCB *runTask = NULL; LosTaskCB *runTask = NULL;
@ -360,7 +357,7 @@ VOID OsSchedPreempt(VOID)
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
/*这段代码实现了抢占式调度的功能,能够在高优先级任务到来时立即暂停正在运行的低优先级任务,提高系统的响应速度和稳定性*/
#ifdef LOSCFG_BASE_CORE_TIMESLICE #ifdef LOSCFG_BASE_CORE_TIMESLICE
LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID)
{ {
@ -373,7 +370,7 @@ LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID)
} }
} }
#endif #endif
/*这段代码实现了基于时间片的轮转调度算法,通过限制每个任务的执行时间,实现了任务之间的公平调度*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -60,7 +60,7 @@ UINT32 OsPriQueueInit(VOID)
return LOS_OK; return LOS_OK;
} }
/*这段代码是用于初始化优先级队列的函数 OsPriQueueInit*/
VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority) VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority)
{ {
/* /*
@ -76,7 +76,7 @@ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority)
LOS_ListHeadInsert(&g_priQueueList[priority], priqueueItem); LOS_ListHeadInsert(&g_priQueueList[priority], priqueueItem);
} }
/*这段代码是用于将一个节点插入到优先级队列头部的函数*/
VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority) VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority)
{ {
/* /*
@ -92,7 +92,7 @@ VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority)
LOS_ListTailInsert(&g_priQueueList[priority], priqueueItem); LOS_ListTailInsert(&g_priQueueList[priority], priqueueItem);
} }
/*这段代码是用于将一个节点插入到优先级队列尾部的函数*/
VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem) VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem)
{ {
LosTaskCB *runTask = NULL; LosTaskCB *runTask = NULL;
@ -103,7 +103,7 @@ VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem)
g_priQueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runTask->priority); g_priQueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runTask->priority);
} }
} }
/*这个函数的作用是取出优先级队列中的队首节点,并更新相应的状态信息。*/
LOS_DL_LIST *OsPriQueueTop(VOID) LOS_DL_LIST *OsPriQueueTop(VOID)
{ {
UINT32 priority; UINT32 priority;
@ -115,7 +115,7 @@ LOS_DL_LIST *OsPriQueueTop(VOID)
return NULL; return NULL;
} }
/*这个函数的作用是获取当前优先级队列中的队首节点,并返回该节点的指针,以供后续操作使用*/
UINT32 OsPriQueueSize(UINT32 priority) UINT32 OsPriQueueSize(UINT32 priority)
{ {
UINT32 itemCnt = 0; UINT32 itemCnt = 0;
@ -140,7 +140,7 @@ UINT32 OsPriQueueSize(UINT32 priority)
return itemCnt; return itemCnt;
} }
/*这个函数的作用是计算指定优先级队列中节点的数量,可以用于监控任务在不同优先级队列中的排队情况*/
LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID)
{ {
UINT32 priority; UINT32 priority;
@ -170,7 +170,7 @@ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID)
OUT: OUT:
return newTask; return newTask;
} }
/*这个函数的作用是获取优先级最高的任务控制块,并将其从相应的优先级队列中移除,以便进行调度执行*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -103,7 +103,7 @@ VOID OsSchedResched(VOID)
/* do the task context switch */ /* do the task context switch */
OsTaskSchedule(newTask, runTask); OsTaskSchedule(newTask, runTask);
} }
/*这段代码实现了操作系统的任务调度功能,根据任务的优先级和状态来选择合适的任务进行切换,并更新任务状态及相关信息,最终实现任务的切换和调度*/
VOID OsSchedPreempt(VOID) VOID OsSchedPreempt(VOID)
{ {
LosTaskCB *runTask = NULL; LosTaskCB *runTask = NULL;
@ -134,7 +134,7 @@ VOID OsSchedPreempt(VOID)
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
/*这段代码实现了在需要进行任务抢占时,将当前任务标记为就绪状态并重新加入就绪队列,然后触发任务重新调度,以实现任务的抢占和切换。*/
#ifdef LOSCFG_BASE_CORE_TIMESLICE #ifdef LOSCFG_BASE_CORE_TIMESLICE
LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID)
{ {
@ -147,7 +147,7 @@ LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID)
} }
} }
#endif #endif
/*这段代码实现了时间片轮转调度算法中的时间片检查和调度触发功能,当任务时间片用尽时,会自动触发调度,让其他可运行任务有机会获得 CPU 时间片并进行执行。*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -25,11 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*
LiteOSShell
CPU
CPU101
*/
#include "los_config.h" #include "los_config.h"
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
#ifdef LOSCFG_CPUP_INCLUDE_IRQ #ifdef LOSCFG_CPUP_INCLUDE_IRQ
@ -43,7 +39,7 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
//这个函数实现了打印硬件中断信息的表头
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdHwiInfoTitle(VOID) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdHwiInfoTitle(VOID)
{ {
#ifdef LOSCFG_CPUP_INCLUDE_IRQ #ifdef LOSCFG_CPUP_INCLUDE_IRQ
@ -57,7 +53,7 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdHwiInfoTitle(VOID)
PRINTK("----------- ----- ------------- --------- --------\n"); PRINTK("----------- ----- ------------- --------- --------\n");
#endif #endif
} }
//这个函数会根据传入的硬件中断句柄信息,获取该中断是否为共享模式
STATIC BOOL GetHwiShare(const HwiHandleInfo *hwiForm) STATIC BOOL GetHwiShare(const HwiHandleInfo *hwiForm)
{ {
#ifndef LOSCFG_SHARED_IRQ #ifndef LOSCFG_SHARED_IRQ
@ -68,10 +64,9 @@ STATIC BOOL GetHwiShare(const HwiHandleInfo *hwiForm)
} }
#ifdef LOSCFG_CPUP_INCLUDE_IRQ #ifdef LOSCFG_CPUP_INCLUDE_IRQ
STATIC CPUP_INFO_S g_hwiCpupAll[LOSCFG_PLATFORM_HWI_LIMIT];//所有时间段CPU利用率的统计信息 STATIC CPUP_INFO_S g_hwiCpupAll[LOSCFG_PLATFORM_HWI_LIMIT];
STATIC CPUP_INFO_S g_hwiCpup10s[LOSCFG_PLATFORM_HWI_LIMIT];//最近10sCPU利用率的统计信息 STATIC CPUP_INFO_S g_hwiCpup10s[LOSCFG_PLATFORM_HWI_LIMIT];
STATIC CPUP_INFO_S g_hwiCpup1s[LOSCFG_PLATFORM_HWI_LIMIT];//最近1sCPU利用率的统计信息 STATIC CPUP_INFO_S g_hwiCpup1s[LOSCFG_PLATFORM_HWI_LIMIT];
//这个函数实现了硬件中断信息的查询根据参数argc和argv判断是否有误并调用其他函数获取硬件中断的各项信息最终打印输出硬件中断的详细信息。
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
{ {
UINT32 i, intSave; UINT32 i, intSave;
@ -80,24 +75,22 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
HwiHandleInfo *hwiForm = NULL; HwiHandleInfo *hwiForm = NULL;
(VOID)argv; (VOID)argv;
//打印错误信息
if (argc > 0) { if (argc > 0) {
PRINTK("\nUsage: hwi\n"); PRINTK("\nUsage: hwi\n");
return OS_ERROR; return OS_ERROR;
} }
(VOID)memset_s(g_hwiCpupAll, size, 0, size);//置零 (VOID)memset_s(g_hwiCpupAll, size, 0, size);
(VOID)memset_s(g_hwiCpup10s, size, 0, size);//置零 (VOID)memset_s(g_hwiCpup10s, size, 0, size);
(VOID)memset_s(g_hwiCpup1s, size, 0, size);//置零 (VOID)memset_s(g_hwiCpup1s, size, 0, size);
intSave = LOS_IntLock(); intSave = LOS_IntLock();
(VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpupAll, CPUP_ALL_TIME, 0); (VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpupAll, CPUP_ALL_TIME, 0);
(VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpup10s, CPUP_LAST_TEN_SECONDS, 0); (VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpup10s, CPUP_LAST_TEN_SECONDS, 0);
(VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpup1s, CPUP_LAST_ONE_SECONDS, 0); (VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpup1s, CPUP_LAST_ONE_SECONDS, 0);
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
//打印硬件中断信息的表头
OsShellCmdHwiInfoTitle(); OsShellCmdHwiInfoTitle();
//打印CPU硬件中断的利用率
for (i = 0; i < LOSCFG_PLATFORM_HWI_LIMIT; i++) { for (i = 0; i < LOSCFG_PLATFORM_HWI_LIMIT; i++) {
if (!HWI_IS_REGISTED(i)) { if (!HWI_IS_REGISTED(i)) {
continue; continue;
@ -108,7 +101,6 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
} }
/* Different cores has different hwi form implementation */ /* Different cores has different hwi form implementation */
//打印各个时间内的硬件中断利用率
hwiForm = OsGetHwiForm(i); hwiForm = OsGetHwiForm(i);
PRINTK("%-8u\t %-s\t %-10u\t %-10llu %2u.%-7u %2u.%-7u %2u.%-6u", PRINTK("%-8u\t %-s\t %-10u\t %-10llu %2u.%-7u %2u.%-7u %2u.%-6u",
i, GetHwiShare(hwiForm) ? "Y" : "N", OsGetHwiFormCnt(i), cycles, i, GetHwiShare(hwiForm) ? "Y" : "N", OsGetHwiFormCnt(i), cycles,
@ -118,7 +110,6 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
#ifdef LOSCFG_SHARED_IRQ #ifdef LOSCFG_SHARED_IRQ
hwiForm = hwiForm->next; hwiForm = hwiForm->next;
#endif #endif
//打印中断设备ID和信息
if ((hwiForm->registerInfo != 0) && ((HWI_IRQ_PARAM_S *)hwiForm->registerInfo)->pName != NULL) { if ((hwiForm->registerInfo != 0) && ((HWI_IRQ_PARAM_S *)hwiForm->registerInfo)->pName != NULL) {
PRINTK("\t %-16s 0x%-.8x\n", PRINTK("\t %-16s 0x%-.8x\n",
((HWI_IRQ_PARAM_S *)hwiForm->registerInfo)->pName, ((HWI_IRQ_PARAM_S *)hwiForm->registerInfo)->pName,
@ -137,28 +128,24 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
return 0; return 0;
} }
#else #else
//这个函数主要实现对hwi命令的解释功能输出硬件中断信息
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
{ {
UINT32 i; UINT32 i;
HwiHandleInfo *hwiForm = NULL; HwiHandleInfo *hwiForm = NULL;
//参数错误,打印错误信息
(VOID)argv; (VOID)argv;
if (argc > 0) { if (argc > 0) {
PRINTK("\nUsage: hwi\n"); PRINTK("\nUsage: hwi\n");
return OS_ERROR; return OS_ERROR;
} }
//打印硬件中断信息的表头
OsShellCmdHwiInfoTitle(); OsShellCmdHwiInfoTitle();
//遍历所有硬件中断寄存器
for (i = 0; i < LOSCFG_PLATFORM_HWI_LIMIT; i++) { for (i = 0; i < LOSCFG_PLATFORM_HWI_LIMIT; i++) {
if (!HWI_IS_REGISTED(i)) { if (!HWI_IS_REGISTED(i)) {
continue; continue;
} }
/* Different cores has different hwi form implementation */ /* Different cores has different hwi form implementation */
//输出信息
hwiForm = OsGetHwiForm(i); hwiForm = OsGetHwiForm(i);
PRINTK("%-8u\t %-s\t %-10u", i, GetHwiShare(hwiForm) ? "Y" : "N", OsGetHwiFormCnt(i)); PRINTK("%-8u\t %-s\t %-10u", i, GetHwiShare(hwiForm) ? "Y" : "N", OsGetHwiFormCnt(i));
#ifdef LOSCFG_SHARED_IRQ #ifdef LOSCFG_SHARED_IRQ
@ -183,7 +170,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
return 0; return 0;
} }
#endif #endif
//该函数实现了OsShellCmdHwi的函数调用用户可以输入hwi命令来调用该函数从而查询和展示硬件中断信息
SHELLCMD_ENTRY(hwi_shellcmd, CMD_TYPE_EX, "hwi", 0, (CmdCallBackFunc)OsShellCmdHwi); SHELLCMD_ENTRY(hwi_shellcmd, CMD_TYPE_EX, "hwi", 0, (CmdCallBackFunc)OsShellCmdHwi);
#ifdef __cplusplus #ifdef __cplusplus

@ -25,10 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*
LiteOSShell
使
*/
#include "stdlib.h" #include "stdlib.h"
#include "stdio.h" #include "stdio.h"
#include "los_memory_pri.h" #include "los_memory_pri.h"
@ -48,60 +45,54 @@ extern "C" {
#define MEM_SIZE_1K 0x400 #define MEM_SIZE_1K 0x400
#define MEM_SIZE_1M 0x100000 #define MEM_SIZE_1M 0x100000
//这个函数用于检查内存完整性
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemCheck(INT32 argc, const CHAR *argv[]) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemCheck(INT32 argc, const CHAR *argv[])
{ {
//打印错误信息
if (argc > 0) { if (argc > 0) {
PRINTK("\nUsage: memcheck\n"); PRINTK("\nUsage: memcheck\n");
return OS_ERROR; return OS_ERROR;
} }
//调用OsMemIntegrityMultiCheck函数完成内存完整性检查
OsMemIntegrityMultiCheck(); OsMemIntegrityMultiCheck();
return 0; return 0;
} }
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
//这个函数可以读取内存中指定位置指定长度的数据调用OsDumpMemByte函数完成内存读取并打印数据
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemRead(INT32 argc, const CHAR *argv[]) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemRead(INT32 argc, const CHAR *argv[])
{ {
size_t tempAddr; size_t tempAddr;
size_t length; size_t length;
CHAR *ptrlen = NULL; CHAR *ptrlen = NULL;
CHAR *ptrAddr = NULL; CHAR *ptrAddr = NULL;
//读取错误,打印错误信息
if ((argc == 0) || (argc > 2)) { /* argc is num of parameters */ if ((argc == 0) || (argc > 2)) { /* argc is num of parameters */
PRINTK("\nUsage: readreg [ADDRESS] [LENGTH]\n"); PRINTK("\nUsage: readreg [ADDRESS] [LENGTH]\n");
return OS_ERROR; return OS_ERROR;
} }
//读取正确
if (argc == 1) { if (argc == 1) {
length = 0; length = 0;
} else { } else {
//读取长度为负数,打印错误信息
length = strtoul(argv[1], &ptrlen, 0); length = strtoul(argv[1], &ptrlen, 0);
if ((ptrlen == NULL) || (*ptrlen != 0)) { if ((ptrlen == NULL) || (*ptrlen != 0)) {
PRINTK("readreg invalid length %s\n", argv[1]); PRINTK("readreg invalid length %s\n", argv[1]);
return OS_ERROR; return OS_ERROR;
} }
} }
//保存ptrAddr的地址
tempAddr = strtoul(argv[0], &ptrAddr, 0); tempAddr = strtoul(argv[0], &ptrAddr, 0);
//地址错误,打印错误信息
if ((ptrAddr == NULL) || (*ptrAddr != 0) || (tempAddr > g_sys_mem_addr_end) || if ((ptrAddr == NULL) || (*ptrAddr != 0) || (tempAddr > g_sys_mem_addr_end) ||
((tempAddr + length) > g_sys_mem_addr_end) || (tempAddr > (OS_NULL_INT - length))) { ((tempAddr + length) > g_sys_mem_addr_end) || (tempAddr > (OS_NULL_INT - length))) {
PRINTK("readreg invalid address %s\n", argv[0]); PRINTK("readreg invalid address %s\n", argv[0]);
return OS_ERROR; return OS_ERROR;
} }
//调用OsDumpMemByte函数打印指定内存位置读取的信息。
OsDumpMemByte(length, tempAddr); OsDumpMemByte(length, tempAddr);
return 0; return 0;
} }
//这个函数用于输出代码段、数据段、只读数据段和BSS段的大小信息。
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR *argv[]) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR *argv[])
{ {
//计算各部分长度
size_t textLen = &__text_end - &__text_start; size_t textLen = &__text_end - &__text_start;
size_t dataLen = &__ram_data_end - &__ram_data_start; size_t dataLen = &__ram_data_end - &__ram_data_start;
size_t rodataLen = &__rodata_end - &__rodata_start; size_t rodataLen = &__rodata_end - &__rodata_start;
@ -112,7 +103,7 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR
dataLen += &__fast_data_end - &__fast_data_start; dataLen += &__fast_data_end - &__fast_data_start;
rodataLen += &__fast_rodata_end - &__fast_rodata_start; rodataLen += &__fast_rodata_end - &__fast_rodata_start;
#endif #endif
//打印代码段、数据段、只读数据段、BSS段的大小信息
PRINTK("\r\n text data rodata bss\n"); PRINTK("\r\n text data rodata bss\n");
if ((argc == 1) && (strcmp(argv[0], "-k") == 0)) { if ((argc == 1) && (strcmp(argv[0], "-k") == 0)) {
PRINTK("Mem: %-9lu %-10lu %-10lu %-10lu\n", textLen / MEM_SIZE_1K, dataLen / MEM_SIZE_1K, PRINTK("Mem: %-9lu %-10lu %-10lu %-10lu\n", textLen / MEM_SIZE_1K, dataLen / MEM_SIZE_1K,
@ -124,24 +115,19 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR
PRINTK("Mem: %-9lu %-10lu %-10lu %-10lu\n", textLen, dataLen, rodataLen, bssLen); PRINTK("Mem: %-9lu %-10lu %-10lu %-10lu\n", textLen, dataLen, rodataLen, bssLen);
} }
} }
//这个函数用于输出系统可用的内存总量、已经使用的内存量和剩余内存量的大小
LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OsShellCmdFreeInfo(INT32 argc, const CHAR *argv[]) LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OsShellCmdFreeInfo(INT32 argc, const CHAR *argv[])
{ {
#ifdef LOSCFG_EXC_INTERACTION #ifdef LOSCFG_EXC_INTERACTION
//调用LOS_MemTotaUsedGet函数得到已经使用的内存量
UINT32 memUsed0 = LOS_MemTotalUsedGet(m_aucSysMem0); UINT32 memUsed0 = LOS_MemTotalUsedGet(m_aucSysMem0);
//调用LOS_MemPoolSizeGet函数得到系统可用的内存总量
UINT32 totalMem0 = LOS_MemPoolSizeGet(m_aucSysMem0); UINT32 totalMem0 = LOS_MemPoolSizeGet(m_aucSysMem0);
//计算得到系统剩余的内存量
UINT32 freeMem0 = totalMem0 - memUsed0; UINT32 freeMem0 = totalMem0 - memUsed0;
#endif #endif
//调用LOS_MemTotaUsedGet函数得到已经使用的内存量
UINT32 memUsed = LOS_MemTotalUsedGet(m_aucSysMem1); UINT32 memUsed = LOS_MemTotalUsedGet(m_aucSysMem1);
//调用LOS_MemPoolSizeGet函数得到系统可用的内存总量
UINT32 totalMem = LOS_MemPoolSizeGet(m_aucSysMem1); UINT32 totalMem = LOS_MemPoolSizeGet(m_aucSysMem1);
/
UINT32 freeMem = totalMem - memUsed; UINT32 freeMem = totalMem - memUsed;
//打印统可用的内存总量、已经使用的内存量和剩余内存量的大小
if ((argc == 0) || if ((argc == 0) ||
((argc == 1) && (strcmp(argv[0], "-k") == 0)) || ((argc == 1) && (strcmp(argv[0], "-k") == 0)) ||
((argc == 1) && (strcmp(argv[0], "-m") == 0))) { ((argc == 1) && (strcmp(argv[0], "-m") == 0))) {
@ -171,57 +157,47 @@ LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OsShellCmdFreeInfo(INT32 argc, const CHAR *
PRINTK("Mem1: %-9u %-10u %-10u\n", totalMem0, memUsed0, freeMem0); PRINTK("Mem1: %-9u %-10u %-10u\n", totalMem0, memUsed0, freeMem0);
#endif #endif
} else { } else {
//打印错误信息
PRINTK("\nUsage: free or free [-k/-m]\n"); PRINTK("\nUsage: free or free [-k/-m]\n");
return OS_ERROR; return OS_ERROR;
} }
return 0; return 0;
} }
//这个函数用于显示系统内存的使用情况调用了OsShellCmdFreeInfo和OsShellCmdSectionInfo函数完成内存使用情况和内存分配情况的打印输出。
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdFree(INT32 argc, const CHAR *argv[]) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdFree(INT32 argc, const CHAR *argv[])
{ {
//打印错误信息
if (argc > 1) { if (argc > 1) {
PRINTK("\nUsage: free or free [-k/-m]\n"); PRINTK("\nUsage: free or free [-k/-m]\n");
return OS_ERROR; return OS_ERROR;
} }
//打印错误信息
if (OsShellCmdFreeInfo(argc, argv) != 0) { if (OsShellCmdFreeInfo(argc, argv) != 0) {
return OS_ERROR; return OS_ERROR;
} }
//调用OsShellCmdSectionInfo函数输出存使用情况和内存分配情况
OsShellCmdSectionInfo(argc, argv); OsShellCmdSectionInfo(argc, argv);
return 0; return 0;
} }
//这个函数根据参数选择输出不同的系统信息,在控制台上输出相应的信息。
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdUname(INT32 argc, const CHAR *argv[]) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdUname(INT32 argc, const CHAR *argv[])
{ {
//如果参数为0在控制台上打印Huawei LiteOS
if (argc == 0) { if (argc == 0) {
PRINTK("Huawei LiteOS\n"); PRINTK("Huawei LiteOS\n");
return 0; return 0;
} }
if (argc == 1) { if (argc == 1) {
//系统参数为-a时打印LiteOS所有的信息
if (strcmp(argv[0], "-a") == 0) { if (strcmp(argv[0], "-a") == 0) {
PRINTK("%s %s %s %s %s\n", HW_LITEOS_VER, HW_LITEOS_SYSNAME, HW_LITEOS_KERNEL_VERSION_STRING, PRINTK("%s %s %s %s %s\n", HW_LITEOS_VER, HW_LITEOS_SYSNAME, HW_LITEOS_KERNEL_VERSION_STRING,
__DATE__, __TIME__); __DATE__, __TIME__);
return 0; return 0;
//系统参数为-s时打印Huawei LiteOS
} else if (strcmp(argv[0], "-s") == 0) { } else if (strcmp(argv[0], "-s") == 0) {
PRINTK("Huawei LiteOS\n"); PRINTK("Huawei LiteOS\n");
return 0; return 0;
//系统参数为-t时打印系统创建的时间信息
} else if (strcmp(argv[0], "-t") == 0) { } else if (strcmp(argv[0], "-t") == 0) {
PRINTK("build date : %s %s", __DATE__, __TIME__); PRINTK("build date : %s %s", __DATE__, __TIME__);
return 0; return 0;
//系统参数为-v时打印LiteOS的版本信息和时间信息
} else if (strcmp(argv[0], "-v") == 0) { } else if (strcmp(argv[0], "-v") == 0) {
PRINTK("%s %s %s %s\n", HW_LITEOS_SYSNAME, HW_LITEOS_KERNEL_VERSION_STRING, PRINTK("%s %s %s %s\n", HW_LITEOS_SYSNAME, HW_LITEOS_KERNEL_VERSION_STRING,
__DATE__, __TIME__); __DATE__, __TIME__);
return 0; return 0;
//系统参数为--help时打印各参数的含义
} else if (strcmp(argv[0], "--help") == 0) { } else if (strcmp(argv[0], "--help") == 0) {
PRINTK("-a, print all information\n" PRINTK("-a, print all information\n"
"-s, print the kernel name\n" "-s, print the kernel name\n"
@ -230,22 +206,20 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdUname(INT32 argc, const CHAR *argv[])
return 0; return 0;
} }
} }
//如果都不是,打印错误信息,提示用户输入--help来查看信息
PRINTK("uname: invalid option %s\n" PRINTK("uname: invalid option %s\n"
"Try 'uname --help' for more information.\n", "Try 'uname --help' for more information.\n",
argv[0]); argv[0]);
return OS_ERROR; return OS_ERROR;
} }
#ifdef LOSCFG_MEM_LEAKCHECK #ifdef LOSCFG_MEM_LEAKCHECK
//这个函数打印了系统已使用的内存信息
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemUsed(INT32 argc, const CHAR *argv[]) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemUsed(INT32 argc, const CHAR *argv[])
{ {
//打印错误信息
if (argc > 0) { if (argc > 0) {
PRINTK("\nUsage: memused\n"); PRINTK("\nUsage: memused\n");
return OS_ERROR; return OS_ERROR;
} }
//调用OsMemUsedNodeShow函数输出已使用的节点信息
OsMemUsedNodeShow(m_aucSysMem1); OsMemUsedNodeShow(m_aucSysMem1);
#ifdef LOSCFG_EXC_INTERACTION #ifdef LOSCFG_EXC_INTERACTION
@ -256,14 +230,6 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemUsed(INT32 argc, const CHAR *argv[])
} }
#endif #endif
/*
memcheckOsMemIntegrityMultiCheck
memread [ADDRESS] [LENGTH]OsDumpMemByte
free使OsShellCmdFreeInfoOsShellCmdSectionInfo使
uname [-a/-s/-t/-v]PRINTK
*/
#ifdef LOSCFG_MEM_LEAKCHECK #ifdef LOSCFG_MEM_LEAKCHECK
SHELLCMD_ENTRY(memused_shellcmd, CMD_TYPE_EX, "memused", 0, (CmdCallBackFunc)OsShellCmdMemUsed); SHELLCMD_ENTRY(memused_shellcmd, CMD_TYPE_EX, "memused", 0, (CmdCallBackFunc)OsShellCmdMemUsed);
#endif #endif

@ -25,10 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*
LiteOSShell
*/
#include "securec.h" #include "securec.h"
#include "los_config.h" #include "los_config.h"
#include "los_stackinfo_pri.h" #include "los_stackinfo_pri.h"
@ -37,7 +34,7 @@
#include "shcmd.h" #include "shcmd.h"
#include "shell.h" #include "shell.h"
#endif #endif
//这个函数用于检查堆栈是否溢出
VOID OsExcStackCheck(VOID) VOID OsExcStackCheck(VOID)
{ {
UINT32 index; UINT32 index;
@ -45,17 +42,15 @@ VOID OsExcStackCheck(VOID)
UINTPTR *stackTop = NULL; UINTPTR *stackTop = NULL;
const StackInfo *stackInfo = NULL; const StackInfo *stackInfo = NULL;
UINT32 stackNum; UINT32 stackNum;
//获取堆栈信息,如果堆栈信息错误,直接返回
OsGetStackInfo(&stackInfo, &stackNum); OsGetStackInfo(&stackInfo, &stackNum);
if ((stackInfo == NULL) || (stackNum == 0)) { if ((stackInfo == NULL) || (stackNum == 0)) {
return; return;
} }
//从头开始,遍历所有的堆栈
for (index = 0; index < stackNum; index++) { for (index = 0; index < stackNum; index++) {
for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) { for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) {
//堆栈的栈顶
stackTop = (UINTPTR *)((UINTPTR)stackInfo[index].stackTop + cpuid * stackInfo[index].stackSize); stackTop = (UINTPTR *)((UINTPTR)stackInfo[index].stackTop + cpuid * stackInfo[index].stackSize);
//检查栈顶信息是否被篡改,如果被篡改输出该堆栈溢出的信息
if (*stackTop != OS_STACK_MAGIC_WORD) { if (*stackTop != OS_STACK_MAGIC_WORD) {
PRINT_ERR("cpu:%u %s overflow , magic word changed to 0x%x\n", PRINT_ERR("cpu:%u %s overflow , magic word changed to 0x%x\n",
LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, stackInfo[index].stackName, *stackTop); LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, stackInfo[index].stackName, *stackTop);
@ -63,7 +58,7 @@ VOID OsExcStackCheck(VOID)
} }
} }
} }
//这个函数用于获取并打印所有的堆栈信息
VOID OsExcStackInfo(VOID) VOID OsExcStackInfo(VOID)
{ {
UINT32 index; UINT32 index;
@ -73,31 +68,29 @@ VOID OsExcStackInfo(VOID)
UINTPTR *stack = NULL; UINTPTR *stack = NULL;
const StackInfo *stackInfo = NULL; const StackInfo *stackInfo = NULL;
UINT32 stackNum; UINT32 stackNum;
//获取堆栈信息,如果堆栈信息错误,直接返回
OsGetStackInfo(&stackInfo, &stackNum); OsGetStackInfo(&stackInfo, &stackNum);
if ((stackInfo == NULL) || (stackNum == 0)) { if ((stackInfo == NULL) || (stackNum == 0)) {
return; return;
} }
//输出堆栈名、CPU ID、堆栈的地址、堆栈的总大小堆栈已使用的大小
PrintExcInfo("\n stack name cpu id stack addr total size used size\n" PrintExcInfo("\n stack name cpu id stack addr total size used size\n"
" ---------- ------ --------- -------- --------\n"); " ---------- ------ --------- -------- --------\n");
//从头开始,遍历所有的堆栈
for (index = 0; index < stackNum; index++) { for (index = 0; index < stackNum; index++) {
for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) { for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) {
//获取堆栈的栈顶
stackTop = (UINTPTR *)((UINTPTR)stackInfo[index].stackTop + cpuid * stackInfo[index].stackSize); stackTop = (UINTPTR *)((UINTPTR)stackInfo[index].stackTop + cpuid * stackInfo[index].stackSize);
stack = (UINTPTR *)((UINTPTR)stackTop + stackInfo[index].stackSize); stack = (UINTPTR *)((UINTPTR)stackTop + stackInfo[index].stackSize);
//调用OsStackWaterLineGet函数计算堆栈已使用的大小
(VOID)OsStackWaterLineGet(stack, stackTop, &size); (VOID)OsStackWaterLineGet(stack, stackTop, &size);
//输出各类信息
PrintExcInfo("%11s %-5d %-10p 0x%-8x 0x%-4x\n", stackInfo[index].stackName, PrintExcInfo("%11s %-5d %-10p 0x%-8x 0x%-4x\n", stackInfo[index].stackName,
LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, stackTop, stackInfo[index].stackSize, size); LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, stackTop, stackInfo[index].stackSize, size);
} }
} }
//进行堆栈溢出检查
OsExcStackCheck(); OsExcStackCheck();
} }
//注册Shell命令stack调用OsExcStackInfo函数获取并打印所有堆栈信息至控制台。
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(stack_shellcmd, CMD_TYPE_EX, "stack", 1, (CmdCallBackFunc)OsExcStackInfo); SHELLCMD_ENTRY(stack_shellcmd, CMD_TYPE_EX, "stack", 1, (CmdCallBackFunc)OsExcStackInfo);
#endif #endif

@ -25,10 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*
LiteOS
ID
*/
#include "los_config.h" #include "los_config.h"
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
#include "stdlib.h" #include "stdlib.h"
@ -45,20 +42,20 @@ extern "C" {
#define SWTMR_STRLEN 12 #define SWTMR_STRLEN 12
#ifdef LOSCFG_BASE_CORE_SWTMR #ifdef LOSCFG_BASE_CORE_SWTMR
//展示g_shellSwtmrMode的数据
LITE_OS_SEC_DATA_MINOR STATIC CHAR g_shellSwtmrMode[][SWTMR_STRLEN] = { LITE_OS_SEC_DATA_MINOR STATIC CHAR g_shellSwtmrMode[][SWTMR_STRLEN] = {
"Once", "Once",
"Period", "Period",
"NSD", "NSD",
"OPP", "OPP",
}; };
//展示g_shellSwtmrStatus的数据
LITE_OS_SEC_DATA_MINOR STATIC CHAR g_shellSwtmrStatus[][SWTMR_STRLEN] = { LITE_OS_SEC_DATA_MINOR STATIC CHAR g_shellSwtmrStatus[][SWTMR_STRLEN] = {
"UnUsed", "UnUsed",
"Created", "Created",
"Ticking", "Ticking",
}; };
//这个函数用于打印软件定时器的信息包括定时器ID、状态、模式、间隔、参数和处理函数地址等。
STATIC VOID OsPrintSwtmrMsg(const LosSwtmrCB *swtmr) STATIC VOID OsPrintSwtmrMsg(const LosSwtmrCB *swtmr)
{ {
PRINTK("0x%08x " PRINTK("0x%08x "
@ -67,20 +64,20 @@ STATIC VOID OsPrintSwtmrMsg(const LosSwtmrCB *swtmr)
"%-6u " "%-6u "
"0x%08x " "0x%08x "
"%p\n", "%p\n",
swtmr->timerId % LOSCFG_BASE_CORE_SWTMR_LIMIT,//打印定时器ID swtmr->timerId % LOSCFG_BASE_CORE_SWTMR_LIMIT,
g_shellSwtmrStatus[swtmr->state],//打印定时器的状态 g_shellSwtmrStatus[swtmr->state],
g_shellSwtmrMode[swtmr->mode],//打印定时器的模式 g_shellSwtmrMode[swtmr->mode],
swtmr->interval,//打印定时器的间隔 swtmr->interval,
swtmr->arg,//打印定时器的参数 swtmr->arg,
swtmr->handler);//打印定时器的处理函数地址 swtmr->handler);
} }
//这个函数用于打印软件定时器信息的表头
STATIC INLINE VOID OsPrintSwtmrMsgHead(VOID) STATIC INLINE VOID OsPrintSwtmrMsgHead(VOID)
{ {
PRINTK("\r\nSwTmrID State Mode Interval Arg handlerAddr\n"); PRINTK("\r\nSwTmrID State Mode Interval Arg handlerAddr\n");
PRINTK("---------- ------- ------- --------- ---------- --------\n"); PRINTK("---------- ------- ------- --------- ---------- --------\n");
} }
//这个函数用于获取软件定时器的信息。
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **argv) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **argv)
{ {
#define OS_ALL_SWTMR_MASK 0xffffffff #define OS_ALL_SWTMR_MASK 0xffffffff
@ -90,36 +87,34 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **a
size_t timerId; size_t timerId;
UINT16 num = 0; UINT16 num = 0;
CHAR *endPtr = NULL; CHAR *endPtr = NULL;
//打印错误信息
if (argc > 1) { if (argc > 1) {
PRINTK("\nUsage: swtmr [ID]\n"); PRINTK("\nUsage: swtmr [ID]\n");
return OS_ERROR; return OS_ERROR;
} }
//获取计时器ID
if (argc == 0) { if (argc == 0) {
timerId = OS_ALL_SWTMR_MASK; timerId = OS_ALL_SWTMR_MASK;
} else { } else {
//没有这个ID打印错误信息
timerId = strtoul((CHAR *)argv[0], &endPtr, 0); timerId = strtoul((CHAR *)argv[0], &endPtr, 0);
if ((endPtr == NULL) || (*endPtr != 0) || (timerId > LOSCFG_BASE_CORE_SWTMR_LIMIT)) { if ((endPtr == NULL) || (*endPtr != 0) || (timerId > LOSCFG_BASE_CORE_SWTMR_LIMIT)) {
PRINTK("\nswtmr ID can't access %s.\n", argv[0]); PRINTK("\nswtmr ID can't access %s.\n", argv[0]);
return OS_ERROR; return OS_ERROR;
} }
} }
//遍历所有计时器让计时器的状态加1
for (index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr1++) { for (index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr1++) {
if (swtmr1->state == 0) { if (swtmr1->state == 0) {
num = num + 1; num = num + 1;
} }
} }
//达到时间限制,输出错误信息
if (num == LOSCFG_BASE_CORE_SWTMR_LIMIT) { if (num == LOSCFG_BASE_CORE_SWTMR_LIMIT) {
PRINTK("\r\nThere is no swtmr was created!\n"); PRINTK("\r\nThere is no swtmr was created!\n");
return OS_ERROR; return OS_ERROR;
} }
//打印软件定时器信息的表头
OsPrintSwtmrMsgHead(); OsPrintSwtmrMsgHead();
//打印软件定时器的各类信息
if (timerId == OS_ALL_SWTMR_MASK) { if (timerId == OS_ALL_SWTMR_MASK) {
for (index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr++) { for (index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr++) {
if (swtmr->state != 0) { if (swtmr->state != 0) {
@ -137,7 +132,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **a
} }
return LOS_OK; return LOS_OK;
} }
//注册Shell命令swtmr调用OsShellCmdSwtmrInfoGet函数获取软件定时器的信息。根据输入的参数获取特定或者所有软件定时器的状态信息并打印出来。
SHELLCMD_ENTRY(swtmr_shellcmd, CMD_TYPE_EX, "swtmr", 1, (CmdCallBackFunc)OsShellCmdSwtmrInfoGet); SHELLCMD_ENTRY(swtmr_shellcmd, CMD_TYPE_EX, "swtmr", 1, (CmdCallBackFunc)OsShellCmdSwtmrInfoGet);
#endif #endif

@ -25,10 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*
LiteOSShell
*/
#include "los_config.h" #include "los_config.h"
#include "los_swtmr.h" #include "los_swtmr.h"
#include "los_sem_pri.h" #include "los_sem_pri.h"
@ -46,173 +43,141 @@
extern "C" { extern "C" {
#endif #endif
#endif /* __cplusplus */ #endif /* __cplusplus */
//这个函数用于获取当系统的进程数量
UINT32 OsShellCmdTaskCntGet(VOID) UINT32 OsShellCmdTaskCntGet(VOID)
{ {
UINT32 loop; UINT32 loop;
UINT32 taskCnt = 0; UINT32 taskCnt = 0;
UINT32 intSave; UINT32 intSave;
LosTaskCB *taskCB = NULL; LosTaskCB *taskCB = NULL;
//加上锁,用于防止中断
intSave = LOS_IntLock(); intSave = LOS_IntLock();
//遍历所有进程,并统计进程数量
for (loop = 0; loop < g_taskMaxNum; loop++) { for (loop = 0; loop < g_taskMaxNum; loop++) {
taskCB = (LosTaskCB *)g_taskCBArray + loop; taskCB = (LosTaskCB *)g_taskCBArray + loop;
//若该进程未使用,则直接跳过
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
continue; continue;
} }
taskCnt++; taskCnt++;
} }
//为进程解锁
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
//返回系统的进程数量
return taskCnt; return taskCnt;
} }
#ifdef LOSCFG_BASE_IPC_SEM #ifdef LOSCFG_BASE_IPC_SEM
//这个函数用于获取当前系统信号量的数量
UINT32 OsShellCmdSemCntGet(VOID) UINT32 OsShellCmdSemCntGet(VOID)
{ {
UINT32 loop; UINT32 loop;
UINT32 semCnt = 0; UINT32 semCnt = 0;
UINT32 intSave; UINT32 intSave;
LosSemCB *semNode = NULL; LosSemCB *semNode = NULL;
//加上锁,用于防止中断
intSave = LOS_IntLock(); intSave = LOS_IntLock();
//遍历所有信号量
for (loop = 0; loop < LOSCFG_BASE_IPC_SEM_LIMIT; loop++) { for (loop = 0; loop < LOSCFG_BASE_IPC_SEM_LIMIT; loop++) {
semNode = GET_SEM(loop); semNode = GET_SEM(loop);
//如果该信号量被使用了数量加1
if (semNode->semStat == LOS_USED) { if (semNode->semStat == LOS_USED) {
semCnt++; semCnt++;
} }
} }
//为进程解锁
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
//返回系统信号量的数量
return semCnt; return semCnt;
} }
#endif #endif
#ifdef LOSCFG_BASE_IPC_MUX #ifdef LOSCFG_BASE_IPC_MUX
//这个函数用于获取当前系统互斥锁的数量
UINT32 OsShellCmdMuxCntGet(VOID) UINT32 OsShellCmdMuxCntGet(VOID)
{ {
UINT32 loop; UINT32 loop;
UINT32 muxCnt = 0; UINT32 muxCnt = 0;
UINT32 intSave; UINT32 intSave;
LosMuxCB *muxNode = NULL; LosMuxCB *muxNode = NULL;
//加上锁,用于防止中断
intSave = LOS_IntLock(); intSave = LOS_IntLock();
//遍历所有互斥锁
for (loop = 0; loop < LOSCFG_BASE_IPC_MUX_LIMIT; loop++) { for (loop = 0; loop < LOSCFG_BASE_IPC_MUX_LIMIT; loop++) {
muxNode = GET_MUX(loop); muxNode = GET_MUX(loop);
//如果互斥锁的状态被使用了数量加1
if (muxNode->muxStat == LOS_USED) { if (muxNode->muxStat == LOS_USED) {
muxCnt++; muxCnt++;
} }
} }
//为进程解锁
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
//返回系统互斥锁的数量
return muxCnt; return muxCnt;
} }
#endif #endif
#ifdef LOSCFG_BASE_IPC_QUEUE #ifdef LOSCFG_BASE_IPC_QUEUE
//这个函数用于获取系统消息队列的数量
UINT32 OsShellCmdQueueCntGet(VOID) UINT32 OsShellCmdQueueCntGet(VOID)
{ {
UINT32 loop; UINT32 loop;
UINT32 queueCnt = 0; UINT32 queueCnt = 0;
UINT32 intSave; UINT32 intSave;
LosQueueCB *queueCB = NULL; LosQueueCB *queueCB = NULL;
//加上锁,用于防止中断
intSave = LOS_IntLock(); intSave = LOS_IntLock();
queueCB = g_allQueue; queueCB = g_allQueue;
//遍历所有消息队列
for (loop = 0; loop < LOSCFG_BASE_IPC_QUEUE_LIMIT; loop++, queueCB++) { for (loop = 0; loop < LOSCFG_BASE_IPC_QUEUE_LIMIT; loop++, queueCB++) {
//如果消息队列的状态为使用数量加1
if (queueCB->queueState == LOS_USED) { if (queueCB->queueState == LOS_USED) {
queueCnt++; queueCnt++;
} }
} }
//为进程解锁
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
//返回系统获取消息队列的数量
return queueCnt; return queueCnt;
} }
#endif #endif
#ifdef LOSCFG_BASE_CORE_SWTMR #ifdef LOSCFG_BASE_CORE_SWTMR
//这个函数用于获取系统软件定时器的数量
UINT32 OsShellCmdSwtmrCntGet(VOID) UINT32 OsShellCmdSwtmrCntGet(VOID)
{ {
UINT32 loop; UINT32 loop;
UINT32 swtmrCnt = 0; UINT32 swtmrCnt = 0;
UINT32 intSave; UINT32 intSave;
LosSwtmrCB *swtmrCB = NULL; LosSwtmrCB *swtmrCB = NULL;
//加上锁,用于防止中断
intSave = LOS_IntLock(); intSave = LOS_IntLock();
swtmrCB = g_swtmrCBArray; swtmrCB = g_swtmrCBArray;
//遍历所有软件定时器
for (loop = 0; loop < LOSCFG_BASE_CORE_SWTMR_LIMIT; loop++, swtmrCB++) { for (loop = 0; loop < LOSCFG_BASE_CORE_SWTMR_LIMIT; loop++, swtmrCB++) {
//如果软件定时器的状态不是没有使用数量加1
if (swtmrCB->state != OS_SWTMR_STATUS_UNUSED) { if (swtmrCB->state != OS_SWTMR_STATUS_UNUSED) {
swtmrCnt++; swtmrCnt++;
} }
} }
//为进程解锁
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
//返回系统软件定时器的数量
return swtmrCnt; return swtmrCnt;
} }
#endif #endif
//这个函数用于打印系统信息,包括进程数量、信号量数量、互斥锁数量、消息队列数量和软件定时器数量。
LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdSystemInfoGet(VOID) LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdSystemInfoGet(VOID)
{ {
//打印表头
PRINTK("\n Module Used Total\n"); PRINTK("\n Module Used Total\n");
PRINTK("--------------------------------\n"); PRINTK("--------------------------------\n");
//打印进程数量
PRINTK(" Task %-10u%-10d\n", PRINTK(" Task %-10u%-10d\n",
OsShellCmdTaskCntGet(), OsShellCmdTaskCntGet(),
LOSCFG_BASE_CORE_TSK_LIMIT); LOSCFG_BASE_CORE_TSK_LIMIT);
#ifdef LOSCFG_BASE_IPC_SEM #ifdef LOSCFG_BASE_IPC_SEM
//打印信号量数量
PRINTK(" Sem %-10u%-10d\n", PRINTK(" Sem %-10u%-10d\n",
OsShellCmdSemCntGet(), OsShellCmdSemCntGet(),
LOSCFG_BASE_IPC_SEM_LIMIT); LOSCFG_BASE_IPC_SEM_LIMIT);
#endif #endif
#ifdef LOSCFG_BASE_IPC_MUX #ifdef LOSCFG_BASE_IPC_MUX
//打印互斥锁数量
PRINTK(" Mutex %-10u%-10d\n", PRINTK(" Mutex %-10u%-10d\n",
OsShellCmdMuxCntGet(), OsShellCmdMuxCntGet(),
LOSCFG_BASE_IPC_MUX_LIMIT); LOSCFG_BASE_IPC_MUX_LIMIT);
#endif #endif
#ifdef LOSCFG_BASE_IPC_QUEUE #ifdef LOSCFG_BASE_IPC_QUEUE
//打印消息队列数量
PRINTK(" Queue %-10u%-10d\n", PRINTK(" Queue %-10u%-10d\n",
OsShellCmdQueueCntGet(), OsShellCmdQueueCntGet(),
LOSCFG_BASE_IPC_QUEUE_LIMIT); LOSCFG_BASE_IPC_QUEUE_LIMIT);
#endif #endif
#ifdef LOSCFG_BASE_CORE_SWTMR #ifdef LOSCFG_BASE_CORE_SWTMR
//打印软件定时器数量
PRINTK(" SwTmr %-10u%-10d\n", PRINTK(" SwTmr %-10u%-10d\n",
OsShellCmdSwtmrCntGet(), OsShellCmdSwtmrCntGet(),
LOSCFG_BASE_CORE_SWTMR_LIMIT); LOSCFG_BASE_CORE_SWTMR_LIMIT);
#endif #endif
} }
//这个函数用于处理shell的systeminfo命令根据相应的参数做出相应的处理
INT32 OsShellCmdSystemInfo(INT32 argc, const CHAR **argv) INT32 OsShellCmdSystemInfo(INT32 argc, const CHAR **argv)
{ {
//如果参数数量为0调用OsShellCmdSystemInfoGet函数打印所有的系统信息。
if (argc == 0) { if (argc == 0) {
OsShellCmdSystemInfoGet(); OsShellCmdSystemInfoGet();
return 0; return 0;
} }
//参数数量不正确,打印错误信息
PRINTK("systeminfo: invalid option %s\n" PRINTK("systeminfo: invalid option %s\n"
"Systeminfo has NO ARGS.\n", "Systeminfo has NO ARGS.\n",
argv[0]); argv[0]);
@ -220,7 +185,6 @@ INT32 OsShellCmdSystemInfo(INT32 argc, const CHAR **argv)
} }
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
//注册Shell命令systeminfo调用OsShellCmdSystemInfo根据参数输出当前系统的进程数量、信号量数量、互斥锁数量、消息队列数量和软件定时器数量。。
SHELLCMD_ENTRY(systeminfo_shellcmd, CMD_TYPE_EX, "systeminfo", 1, (CmdCallBackFunc)OsShellCmdSystemInfo); SHELLCMD_ENTRY(systeminfo_shellcmd, CMD_TYPE_EX, "systeminfo", 1, (CmdCallBackFunc)OsShellCmdSystemInfo);
#endif /* LOSCFG_SHELL */ #endif /* LOSCFG_SHELL */

@ -25,10 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*
LiteOSShell
*/
#include "stdio.h" #include "stdio.h"
#include "stdlib.h" #include "stdlib.h"
#include "los_config.h" #include "los_config.h"
@ -56,65 +53,55 @@ extern "C" {
#define OS_INVALID_SEM_ID 0xFFFFFFFF #define OS_INVALID_SEM_ID 0xFFFFFFFF
#ifdef LOSCFG_KERNEL_CPUP #ifdef LOSCFG_KERNEL_CPUP
LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpupAll[LOSCFG_BASE_CORE_TSK_LIMIT];//所有时间段CPU利用率的统计信息 LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpupAll[LOSCFG_BASE_CORE_TSK_LIMIT];
LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup10s[LOSCFG_BASE_CORE_TSK_LIMIT];//最近10sCPU利用率的统计信息 LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup10s[LOSCFG_BASE_CORE_TSK_LIMIT];
LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup1s[LOSCFG_BASE_CORE_TSK_LIMIT];//最近1sCPU利用率的统计信息 LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup1s[LOSCFG_BASE_CORE_TSK_LIMIT];
#endif #endif
LITE_OS_SEC_BSS STATIC UINT32 g_taskWaterLine[LOSCFG_BASE_CORE_TSK_LIMIT];//记录各个堆栈最低的水位 LITE_OS_SEC_BSS STATIC UINT32 g_taskWaterLine[LOSCFG_BASE_CORE_TSK_LIMIT];
//这个函数通过进程状态位来判断进程的状态,并返回相应的字符串表示进程状态。
LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellCmdConvertTskStatus(UINT16 taskStatus) LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellCmdConvertTskStatus(UINT16 taskStatus)
{ {
//进程处于运行状态返回Running
if (taskStatus & OS_TASK_STATUS_RUNNING) { if (taskStatus & OS_TASK_STATUS_RUNNING) {
return (UINT8 *)"Running"; return (UINT8 *)"Running";
//进程处于就绪状态返回Ready
} else if (taskStatus & OS_TASK_STATUS_READY) { } else if (taskStatus & OS_TASK_STATUS_READY) {
return (UINT8 *)"Ready"; return (UINT8 *)"Ready";
//其他的进程状态
} else { } else {
//进程处于延迟状态返回Delay
if (taskStatus & OS_TASK_STATUS_DELAY) { if (taskStatus & OS_TASK_STATUS_DELAY) {
return (UINT8 *)"Delay"; return (UINT8 *)"Delay";
} else if (taskStatus & OS_TASK_STATUS_PEND_TIME) { } else if (taskStatus & OS_TASK_STATUS_PEND_TIME) {
//进程处于定时挂起状态返回SuspendTime
if (taskStatus & OS_TASK_STATUS_SUSPEND) { if (taskStatus & OS_TASK_STATUS_SUSPEND) {
return (UINT8 *)"SuspendTime"; return (UINT8 *)"SuspendTime";
//进程处于定时等待状态返回PendTime
} else if (taskStatus & OS_TASK_STATUS_PEND) { } else if (taskStatus & OS_TASK_STATUS_PEND) {
return (UINT8 *)"PendTime"; return (UINT8 *)"PendTime";
} }
//进程处于等待状态返回Pend
} else if (taskStatus & OS_TASK_STATUS_PEND) { } else if (taskStatus & OS_TASK_STATUS_PEND) {
return (UINT8 *)"Pend"; return (UINT8 *)"Pend";
//进程处于挂起状态返回SusPend
} else if (taskStatus & OS_TASK_STATUS_SUSPEND) { } else if (taskStatus & OS_TASK_STATUS_SUSPEND) {
return (UINT8 *)"Suspend"; return (UINT8 *)"Suspend";
} }
} }
//进程状态不合法返回Invalid
return (UINT8 *)"Invalid"; return (UINT8 *)"Invalid";
} }
//这个函数用于获取所有堆栈的栈水位(堆栈的使用情况)
STATIC VOID OsShellCmdTaskWaterLineGet(const LosTaskCB *allTaskArray) STATIC VOID OsShellCmdTaskWaterLineGet(const LosTaskCB *allTaskArray)
{ {
const LosTaskCB *taskCB = NULL; const LosTaskCB *taskCB = NULL;
UINT32 loop; UINT32 loop;
//遍历所有堆栈
for (loop = 0; loop < g_taskMaxNum; ++loop) { for (loop = 0; loop < g_taskMaxNum; ++loop) {
taskCB = allTaskArray + loop; taskCB = allTaskArray + loop;
//如果该堆栈未使用,直接跳过
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
continue; continue;
} }
//调用OsStackWaterLineGet输出堆栈的栈水位信息
(VOID)OsStackWaterLineGet((const UINTPTR *)((UINTPTR)taskCB->topOfStack + taskCB->stackSize), (VOID)OsStackWaterLineGet((const UINTPTR *)((UINTPTR)taskCB->topOfStack + taskCB->stackSize),
(const UINTPTR *)taskCB->topOfStack, &g_taskWaterLine[taskCB->taskId]); (const UINTPTR *)taskCB->topOfStack, &g_taskWaterLine[taskCB->taskId]);
} }
} }
#ifdef LOSCFG_SHELL_EXCINFO_DUMP #ifdef LOSCFG_SHELL_EXCINFO_DUMP
//这个函数用于在异常信息输出缓冲区中打印任务信息的标题。
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitleExc(VOID) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitleExc(VOID)
{ {
WriteExcInfoToBuf("\r\nName TaskEntryAddr TID "); WriteExcInfoToBuf("\r\nName TaskEntryAddr TID ");
@ -146,7 +133,7 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitleExc(VOID)
WriteExcInfoToBuf("\n"); WriteExcInfoToBuf("\n");
} }
#endif #endif
//这个函数用于在控制台打印任务信息的标题。
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID)
{ {
PRINTK("\r\nName TaskEntryAddr TID "); PRINTK("\r\nName TaskEntryAddr TID ");
@ -178,15 +165,14 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID)
PRINTK("\n"); PRINTK("\n");
#ifdef LOSCFG_SHELL_EXCINFO_DUMP #ifdef LOSCFG_SHELL_EXCINFO_DUMP
//在异常信息输出缓冲区中打印任务信息的标题。
OsShellCmdTskInfoTitleExc(); OsShellCmdTskInfoTitleExc();
#endif #endif
} }
//这个函数通过TCB进程控制块获取进程所持有的信号量的ID。
LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsGetSemID(const LosTaskCB *taskCB) LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsGetSemID(const LosTaskCB *taskCB)
{ {
UINT32 semId = OS_INVALID_SEM_ID; UINT32 semId = OS_INVALID_SEM_ID;
//返回该进程的信号量ID
if (taskCB->taskSem != NULL) { if (taskCB->taskSem != NULL) {
semId = ((LosSemCB *)taskCB->taskSem)->semId; semId = ((LosSemCB *)taskCB->taskSem)->semId;
} }
@ -195,13 +181,12 @@ LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsGetSemID(const LosTaskCB *taskCB)
} }
#ifdef LOSCFG_SHELL_EXCINFO_DUMP #ifdef LOSCFG_SHELL_EXCINFO_DUMP
//这个函数用于将TCB进程控制块中的进程信息输出到异常信息输出缓冲区。
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoDataExc(const LosTaskCB *allTaskArray) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoDataExc(const LosTaskCB *allTaskArray)
{ {
const LosTaskCB *taskCB = NULL; const LosTaskCB *taskCB = NULL;
UINT32 loop; UINT32 loop;
UINT32 semId; UINT32 semId;
//遍历所有的堆栈
for (loop = 0; loop < g_taskMaxNum; ++loop) { for (loop = 0; loop < g_taskMaxNum; ++loop) {
taskCB = allTaskArray + loop; taskCB = allTaskArray + loop;
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
@ -209,25 +194,21 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoDataExc(const LosTaskCB *all
} }
semId = OsGetSemID(taskCB); semId = OsGetSemID(taskCB);
//调用WriteExcInfoToBuf函数将TCB进程控制块的信息写入缓冲区
WriteExcInfoToBuf("%-23s0x%-18.8x0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskId); WriteExcInfoToBuf("%-23s0x%-18.8x0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskId);
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
//调用WriteExcInfoToBuf函数将TCB进程控制块的信息写入缓冲区
WriteExcInfoToBuf("0x%04x %4d ", taskCB->cpuAffiMask, (INT16)(taskCB->currCpu)); WriteExcInfoToBuf("0x%04x %4d ", taskCB->cpuAffiMask, (INT16)(taskCB->currCpu));
#endif #endif
//调用WriteExcInfoToBuf函数将TCB进程控制块的信息写入缓冲区
WriteExcInfoToBuf("%-11u%-13s0x%-11x0x%-11x 0x%-.8x 0x%-.8x 0x%-11x", taskCB->priority, WriteExcInfoToBuf("%-11u%-13s0x%-11x0x%-11x 0x%-.8x 0x%-.8x 0x%-11x", taskCB->priority,
OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize, OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize,
g_taskWaterLine[taskCB->taskId], g_taskWaterLine[taskCB->taskId],
taskCB->stackPointer, taskCB->topOfStack, semId); taskCB->stackPointer, taskCB->topOfStack, semId);
#ifdef LOSCFG_BASE_IPC_EVENT #ifdef LOSCFG_BASE_IPC_EVENT
//调用WriteExcInfoToBuf函数将TCB进程控制块的信息写入缓冲区
WriteExcInfoToBuf("0x%-6x", taskCB->eventMask); WriteExcInfoToBuf("0x%-6x", taskCB->eventMask);
#endif #endif
#ifdef LOSCFG_KERNEL_CPUP #ifdef LOSCFG_KERNEL_CPUP
//调用WriteExcInfoToBuf函数将TCB进程控制块的信息写入缓冲区
WriteExcInfoToBuf(" %4u.%1u%9u.%1u%8u.%1u ", WriteExcInfoToBuf(" %4u.%1u%9u.%1u%8u.%1u ",
g_taskCpupAll[taskCB->taskId].uwUsage / LOS_CPUP_PRECISION_MULT, g_taskCpupAll[taskCB->taskId].uwUsage / LOS_CPUP_PRECISION_MULT,
g_taskCpupAll[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT, g_taskCpupAll[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT,
@ -237,47 +218,41 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoDataExc(const LosTaskCB *all
g_taskCpup1s[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT); g_taskCpup1s[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT);
#endif /* LOSCFG_KERNEL_CPUP */ #endif /* LOSCFG_KERNEL_CPUP */
#ifdef LOSCFG_MEM_TASK_STAT #ifdef LOSCFG_MEM_TASK_STAT
//调用WriteExcInfoToBuf函数将TCB进程控制块的信息写入缓冲区
WriteExcInfoToBuf(" %-11u", OsMemTaskUsage(taskCB->taskId)); WriteExcInfoToBuf(" %-11u", OsMemTaskUsage(taskCB->taskId));
#endif #endif
//调用WriteExcInfoToBuf函数将TCB进程控制块的信息写入缓冲区
WriteExcInfoToBuf("\n"); WriteExcInfoToBuf("\n");
} }
} }
#endif #endif
//这个函数可以将TCB(进程控制块)中的信息输出到控制台。
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTaskArray) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTaskArray)
{ {
const LosTaskCB *taskCB = NULL; const LosTaskCB *taskCB = NULL;
UINT32 loop; UINT32 loop;
UINT32 semId; UINT32 semId;
//遍历所有的堆栈
for (loop = 0; loop < g_taskMaxNum; ++loop) { for (loop = 0; loop < g_taskMaxNum; ++loop) {
taskCB = allTaskArray + loop; taskCB = allTaskArray + loop;
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
continue; continue;
} }
//调用OsGetSemID获取该进程的信号量ID
semId = OsGetSemID(taskCB); semId = OsGetSemID(taskCB);
//输出进程信息到控制台
PRINTK("%-23s0x%-18.8x0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskId); PRINTK("%-23s0x%-18.8x0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskId);
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
//输出进程信息到控制台
PRINTK("0x%04x %4d ", taskCB->cpuAffiMask, (INT16)(taskCB->currCpu)); PRINTK("0x%04x %4d ", taskCB->cpuAffiMask, (INT16)(taskCB->currCpu));
#endif #endif
//输出进程信息到控制台
PRINTK("%-11u%-13s0x%-11x0x%-11x 0x%-.8x 0x%-.8x 0x%-11x", taskCB->priority, PRINTK("%-11u%-13s0x%-11x0x%-11x 0x%-.8x 0x%-.8x 0x%-11x", taskCB->priority,
OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize, OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize,
g_taskWaterLine[taskCB->taskId], g_taskWaterLine[taskCB->taskId],
taskCB->stackPointer, taskCB->topOfStack, semId); taskCB->stackPointer, taskCB->topOfStack, semId);
#ifdef LOSCFG_BASE_IPC_EVENT #ifdef LOSCFG_BASE_IPC_EVENT
//输出进程信息到控制台
PRINTK("0x%-6x", taskCB->eventMask); PRINTK("0x%-6x", taskCB->eventMask);
#endif #endif
#ifdef LOSCFG_KERNEL_CPUP #ifdef LOSCFG_KERNEL_CPUP
//输出进程信息到控制台
PRINTK(" %4u.%1u%9u.%1u%8u.%1u ", PRINTK(" %4u.%1u%9u.%1u%8u.%1u ",
g_taskCpupAll[taskCB->taskId].uwUsage / LOS_CPUP_PRECISION_MULT, g_taskCpupAll[taskCB->taskId].uwUsage / LOS_CPUP_PRECISION_MULT,
g_taskCpupAll[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT, g_taskCpupAll[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT,
@ -287,19 +262,16 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTas
g_taskCpup1s[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT); g_taskCpup1s[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT);
#endif /* LOSCFG_KERNEL_CPUP */ #endif /* LOSCFG_KERNEL_CPUP */
#ifdef LOSCFG_MEM_TASK_STAT #ifdef LOSCFG_MEM_TASK_STAT
//输出进程信息到控制台
PRINTK(" %-11u", OsMemTaskUsage(taskCB->taskId)); PRINTK(" %-11u", OsMemTaskUsage(taskCB->taskId));
#endif #endif
//输出进程信息到控制台
PRINTK("\n"); PRINTK("\n");
} }
#ifdef LOSCFG_SHELL_EXCINFO_DUMP #ifdef LOSCFG_SHELL_EXCINFO_DUMP
//将进程信息输出到异常信息输出缓冲区。
OsShellCmdTskInfoDataExc(allTaskArray); OsShellCmdTskInfoDataExc(allTaskArray);
#endif #endif
} }
//这个函数可以通过进程号获取进程的信息
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId)
{ {
BOOL backupFlag = TRUE; BOOL backupFlag = TRUE;
@ -307,57 +279,50 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId)
UINT32 size, intSave; UINT32 size, intSave;
LosTaskCB *tcbArray = NULL; LosTaskCB *tcbArray = NULL;
INT32 ret; INT32 ret;
//如果是目标进程
if (taskId == OS_ALL_TASK_MASK) { if (taskId == OS_ALL_TASK_MASK) {
size = g_taskMaxNum * sizeof(LosTaskCB); size = g_taskMaxNum * sizeof(LosTaskCB);
tcbArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem1, size); tcbArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem1, size);
//如果目标进程信息为空输出错误信息将backup设置为Fasle不备份该进程信息
if (tcbArray == NULL) { if (tcbArray == NULL) {
PRINTK("Memory is not enough to save task info!\n"); PRINTK("Memory is not enough to save task info!\n");
tcbArray = g_taskCBArray; tcbArray = g_taskCBArray;
backupFlag = FALSE; backupFlag = FALSE;
} }
#ifdef LOSCFG_KERNEL_CPUP #ifdef LOSCFG_KERNEL_CPUP
(VOID)memset_s((VOID *)g_taskCpupAll, sizeof(g_taskCpupAll), 0, sizeof(g_taskCpupAll));//置零 (VOID)memset_s((VOID *)g_taskCpupAll, sizeof(g_taskCpupAll), 0, sizeof(g_taskCpupAll));
(VOID)memset_s((VOID *)g_taskCpup10s, sizeof(g_taskCpup10s), 0, sizeof(g_taskCpup10s));//置零 (VOID)memset_s((VOID *)g_taskCpup10s, sizeof(g_taskCpup10s), 0, sizeof(g_taskCpup10s));
(VOID)memset_s((VOID *)g_taskCpup1s, sizeof(g_taskCpup1s), 0, sizeof(g_taskCpup1s));//置零 (VOID)memset_s((VOID *)g_taskCpup1s, sizeof(g_taskCpup1s), 0, sizeof(g_taskCpup1s));
#endif #endif
(VOID)memset_s((VOID *)g_taskWaterLine, sizeof(g_taskWaterLine), 0, sizeof(g_taskWaterLine));//置零 (VOID)memset_s((VOID *)g_taskWaterLine, sizeof(g_taskWaterLine), 0, sizeof(g_taskWaterLine));
//如果没有调度器自旋锁,为该进程添加调度器自旋锁
if (LOS_SpinHeld(&g_taskSpin) == FALSE) { if (LOS_SpinHeld(&g_taskSpin) == FALSE) {
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
lockFlag = TRUE; lockFlag = TRUE;
} }
//如果需要将进程信息备份
if (backupFlag == TRUE) { if (backupFlag == TRUE) {
//将进程信息备份到tcbArray
ret = memcpy_s(tcbArray, size, g_taskCBArray, size); ret = memcpy_s(tcbArray, size, g_taskCBArray, size);
//如果没有备份成果返回错误
if (ret != EOK) { if (ret != EOK) {
return LOS_NOK; return LOS_NOK;
} }
} }
#ifdef LOSCFG_KERNEL_CPUP #ifdef LOSCFG_KERNEL_CPUP
(VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpupAll, CPUP_ALL_TIME, 1);//显示CPU所有时段的使用率信息 (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpupAll, CPUP_ALL_TIME, 1);
(VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup10s, CPUP_LAST_TEN_SECONDS, 1);//显示CPU最近10s的使用率信息 (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup10s, CPUP_LAST_TEN_SECONDS, 1);
(VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup1s, CPUP_LAST_ONE_SECONDS, 1);//显示CPU最近1s的使用率信息 (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup1s, CPUP_LAST_ONE_SECONDS, 1);
#endif #endif
//获取进程的栈水位信息
OsShellCmdTaskWaterLineGet(tcbArray); OsShellCmdTaskWaterLineGet(tcbArray);
//如果进程有调度器自旋锁,将该进程解锁
if (lockFlag == TRUE) { if (lockFlag == TRUE) {
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
//打印进程信息标题
OsShellCmdTskInfoTitle(); OsShellCmdTskInfoTitle();
//打印进程信息的数据
OsShellCmdTskInfoData(tcbArray); OsShellCmdTskInfoData(tcbArray);
//如果进程信息数据备份成果释放tcbArrayd的内存空间
if (backupFlag == TRUE) { if (backupFlag == TRUE) {
(VOID)LOS_MemFree(m_aucSysMem1, tcbArray); (VOID)LOS_MemFree(m_aucSysMem1, tcbArray);
} }
} else { } else {
//调用 OsTaskBackTrace函数来获取该任务的回溯信息。
OsTaskBackTrace(taskId); OsTaskBackTrace(taskId);
} }
@ -365,34 +330,29 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId)
} }
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
//这个函数用于处理task命令通过各种参数输出结果
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv) LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv)
{ {
size_t taskId; size_t taskId;
CHAR *endPtr = NULL; CHAR *endPtr = NULL;
//当参数数量合法时
if (argc < 2) { /* 2:Just as number of parameters */ if (argc < 2) { /* 2:Just as number of parameters */
//如果没有参数,进程号是所有进程
if (argc == 0) { if (argc == 0) {
taskId = OS_ALL_TASK_MASK; taskId = OS_ALL_TASK_MASK;
//存在一个参数为进程号
} else { } else {
taskId = strtoul(argv[0], &endPtr, 0); taskId = strtoul(argv[0], &endPtr, 0);
//如果进程号不合法,打印错误信息
if ((*endPtr != 0) || (taskId >= g_taskMaxNum)) { if ((*endPtr != 0) || (taskId >= g_taskMaxNum)) {
PRINTK("\ntask ID can't access %s.\n", argv[0]); PRINTK("\ntask ID can't access %s.\n", argv[0]);
return OS_ERROR; return OS_ERROR;
} }
} }
//调用OsShellCmdTskInfoGet函数输出该进程的进程信息
return OsShellCmdTskInfoGet((UINT32)taskId); return OsShellCmdTskInfoGet((UINT32)taskId);
} else { } else {
//参数不合法,打印错误信息
PRINTK("\nUsage: task or task ID\n"); PRINTK("\nUsage: task or task ID\n");
return OS_ERROR; return OS_ERROR;
} }
} }
//注册Shell命令task调用OsShellCmdDumpTask根据参数进程号或者没有参数获取进程信息并输出。
SHELLCMD_ENTRY(task_shellcmd, CMD_TYPE_EX, "task", 1, (CmdCallBackFunc)OsShellCmdDumpTask); SHELLCMD_ENTRY(task_shellcmd, CMD_TYPE_EX, "task", 1, (CmdCallBackFunc)OsShellCmdDumpTask);
#endif #endif

@ -54,7 +54,7 @@ enum LOAD_STRATEGY {
ZIP, ZIP,
NOZIP NOZIP
}; };
/*这是一个枚举类型的定义名称为LOAD_STRATEGY。它包含两个成员ZIP和NOZIP。*/
/** /**
* @ingroup los_dynload * @ingroup los_dynload
* Define the structure of the parameters used for dynamic. * Define the structure of the parameters used for dynamic.
@ -64,9 +64,7 @@ enum LOAD_STRATEGY {
typedef struct tagDynloadParam { typedef struct tagDynloadParam {
enum LOAD_STRATEGY enLoadStrategy; enum LOAD_STRATEGY enLoadStrategy;
} DYNLOAD_PARAM_S; } DYNLOAD_PARAM_S;
/*这个结构体可以用来存储动态加载的参数信息,
enLoadStrategyZIPNOZIP使
*/
/** /**
* @ingroup los_dynload * @ingroup los_dynload
* @brief Register the dynamic parameters. * @brief Register the dynamic parameters.
@ -86,8 +84,7 @@ typedef struct tagDynloadParam {
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_DynParamReg(DYNLOAD_PARAM_S *dynloadParam); extern VOID LOS_DynParamReg(DYNLOAD_PARAM_S *dynloadParam);
/*通过调用LOS_DynParamReg函数并传递一个指向DYNLOAD_PARAM_S类型对象的指针
*/
/** /**
* @ingroup los_dynload * @ingroup los_dynload
* @brief Load a shared object file. * @brief Load a shared object file.
@ -139,7 +136,7 @@ extern VOID *LOS_MemLoad(const CHAR *elfFileName, UINT32 fileNameLen,
const CHAR *elfFileBuf, UINT32 bufLen); const CHAR *elfFileBuf, UINT32 bufLen);
#endif /* LOSCFG_DYNLOAD_DYN_FROM_MEM */ #endif /* LOSCFG_DYNLOAD_DYN_FROM_MEM */
#endif /* LOSCFG_KERNEL_DYNLOAD_DYN */ #endif /* LOSCFG_KERNEL_DYNLOAD_DYN */
/*这段代码中使用了条件编译指令#ifdef和#endif用于在不同的编译环境下选择是否启用动态加载功能。*/
#ifdef LOSCFG_KERNEL_DYNLOAD_REL #ifdef LOSCFG_KERNEL_DYNLOAD_REL
/** /**
* @ingroup los_dynload * @ingroup los_dynload
@ -163,9 +160,7 @@ extern VOID *LOS_MemLoad(const CHAR *elfFileName, UINT32 fileNameLen,
*/ */
extern VOID *LOS_ObjLoad(CHAR *elfFileName); extern VOID *LOS_ObjLoad(CHAR *elfFileName);
#endif /* LOSCFG_KERNEL_DYNLOAD_REL */ #endif /* LOSCFG_KERNEL_DYNLOAD_REL */
/*如果宏定义LOSCFG_KERNEL_DYNLOAD_REL被定义
LOS_ObjLoad
CHARVOID*/
/** /**
* @ingroup los_dynload * @ingroup los_dynload
* @brief Unload a module. * @brief Unload a module.
@ -187,8 +182,7 @@ extern VOID *LOS_ObjLoad(CHAR *elfFileName);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern INT32 LOS_ModuleUnload(VOID *handle); extern INT32 LOS_ModuleUnload(VOID *handle);
/*通过调用LOS_ModuleUnload函数并传递一个动态库的句柄
*/
/** /**
* @ingroup los_dynload * @ingroup los_dynload
* @brief Destroy a dynamic loader. * @brief Destroy a dynamic loader.
@ -209,9 +203,7 @@ extern INT32 LOS_ModuleUnload(VOID *handle);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_LdDestroy(VOID); extern VOID LOS_LdDestroy(VOID);
/*这段代码声明了一个外部函数LOS_LdDestroy该函数没有参数和返回值。
LOS_LdDestroyLoader*/
/** /**
* @ingroup los_dynload * @ingroup los_dynload
* @brief Search for a symbol address. * @brief Search for a symbol address.
@ -258,8 +250,7 @@ extern VOID *LOS_FindSymByName(VOID *handle, CHAR *name);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern INT32 LOS_PathAdd(CHAR *path); extern INT32 LOS_PathAdd(CHAR *path);
/*通过调用LOS_PathAdd函数并传递一个路径可以将该路径添加到动态库搜索路径中。
*/
/** /**
* @ingroup los_dynload * @ingroup los_dynload
* @brief Set the memory pool address used by dynload * @brief Set the memory pool address used by dynload
@ -282,9 +273,7 @@ extern INT32 LOS_PathAdd(CHAR *path);
* @since Huawei LiteOS V200R002C00 * @since Huawei LiteOS V200R002C00
*/ */
extern BOOL LOS_DynMemPoolSet(VOID *memPool); extern BOOL LOS_DynMemPoolSet(VOID *memPool);
/*通过调用LOS_DynMemPoolSet函数并传递一个内存池指针
*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -50,10 +50,6 @@ typedef struct LOS_DL_LIST {
struct LOS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node */ struct LOS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node */
struct LOS_DL_LIST *pstNext; /**< Current node's pointer to the next node */ struct LOS_DL_LIST *pstNext; /**< Current node's pointer to the next node */
} LOS_DL_LIST; } LOS_DL_LIST;
/*这种结构体通常用于实现双向链表数据结构。
LOS_DL_LIST
*/
/** /**
* @ingroup los_list * @ingroup los_list
@ -78,11 +74,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
list->pstNext = list; list->pstNext = list;
list->pstPrev = list; list->pstPrev = list;
} }
/*这段代码定义了一个静态内联函数LOS_ListInit
LOS_DL_LISTlist
pstNextpstPrev
*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Point to the next node of the current node. * @brief Point to the next node of the current node.
@ -101,12 +93,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
#define LOS_DL_LIST_FIRST(object) ((object)->pstNext) #define LOS_DL_LIST_FIRST(object) ((object)->pstNext)
/*这段代码定义了一个宏LOS_DL_LIST_FIRST(object)
LOS_DL_LISTobject
object
便
访*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Point to the previous node of the current node. * @brief Point to the previous node of the current node.
@ -125,10 +112,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
#define LOS_DL_LIST_LAST(object) ((object)->pstPrev) #define LOS_DL_LIST_LAST(object) ((object)->pstPrev)
/*这段代码是一个宏定义,用于获取双向链表中指定节点的前一个节点。
object
pstPrev
*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Insert a new node to a doubly linked list. * @brief Insert a new node to a doubly linked list.
@ -154,13 +138,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListAdd(LOS_DL_LIST *list, LOS_DL_
list->pstNext->pstPrev = node; list->pstNext->pstPrev = node;
list->pstNext = node; list->pstNext = node;
} }
/*该函数将新节点插入到链表头部,具体步骤如下:
next
prev
prev
next
*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Insert a node to a doubly linked list. * @brief Insert a node to a doubly linked list.
@ -183,10 +161,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListTailInsert(LOS_DL_LIST *list,
{ {
LOS_ListAdd(list->pstPrev, node); LOS_ListAdd(list->pstPrev, node);
} }
/*在该函数中,使用了宏定义 LOS_DL_LIST 来表示链表节点,
使 STATIC INLINE
LOS_ListAdd
*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Insert a node to a doubly linked list. * @brief Insert a node to a doubly linked list.
@ -235,12 +210,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
node->pstNext = NULL; node->pstNext = NULL;
node->pstPrev = NULL; node->pstPrev = NULL;
} }
/*该函数的实现非常简单,具体步骤如下:
next prev prev
prev next next
next prev
*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Identify whether a specified doubly linked list is empty or not. * @brief Identify whether a specified doubly linked list is empty or not.
@ -263,12 +233,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
{ {
return (BOOL)(list->pstNext == list); return (BOOL)(list->pstNext == list);
} }
/*具体步骤如下:
pstNext
TRUE
FALSE
*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Obtain the offset of a structure member relative to the structure start address. * @brief Obtain the offset of a structure member relative to the structure start address.
@ -291,10 +256,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
/* Obsolete API, please use LOS_OFF_SET_OF instead */ /* Obsolete API, please use LOS_OFF_SET_OF instead */
#define OFFSET_OF_FIELD(type, field) LOS_OFF_SET_OF(type, field) #define OFFSET_OF_FIELD(type, field) LOS_OFF_SET_OF(type, field)
/*这些宏的作用是帮助程序员在编写代码时可以方便地获取结构体成员的偏移量。
*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Obtain the pointer to a structure that contains a doubly linked list. * @brief Obtain the pointer to a structure that contains a doubly linked list.
@ -347,12 +309,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member); \ for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member); \
&(item)->member != (list); \ &(item)->member != (list); \
item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member)) item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member))
/*宏的实现通过 for 循环来实现链表的遍历,具体步骤如下:
使 LOS_DL_LIST_ENTRY item
&(item)->member != (list)
使 LOS_DL_LIST_ENTRY
便*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Traverse a doubly linked list which is included in a given type structure. And * @brief Traverse a doubly linked list which is included in a given type structure. And
@ -386,13 +343,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member); \ next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member); \
&(item)->member != (list); \ &(item)->member != (list); \
item = next, next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member)) item = next, next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member))
/*该宏的功能是按顺序遍历链表中的每个节点,并对每个节点执行指定的操作。其参数包括:
item
next
list
type
member*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Iterate over a doubly linked list of given type, and call hook for any extra procedures every time. * @brief Iterate over a doubly linked list of given type, and call hook for any extra procedures every time.
@ -419,13 +370,7 @@ member
for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member), hook; \ for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member), hook; \
&(item)->member != (list); \ &(item)->member != (list); \
item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member), hook) item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member), hook)
/*该宏的功能是按顺序遍历链表中的每个节点,并在每个节点遍历之前执行指定的钩子函数。其参数包括:
item
list
type
member
hook*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Delete a specified node from a doubly linked list and reinitialize the node. * @brief Delete a specified node from a doubly linked list and reinitialize the node.
@ -451,7 +396,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelInit(LOS_DL_LIST *list)
list->pstPrev->pstNext = list->pstNext; list->pstPrev->pstNext = list->pstNext;
LOS_ListInit(list); LOS_ListInit(list);
} }
/**/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Traverse a doubly linked list. * @brief Traverse a doubly linked list.
@ -478,12 +423,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelInit(LOS_DL_LIST *list)
for (item = (list)->pstNext; \ for (item = (list)->pstNext; \
(item) != (list); \ (item) != (list); \
item = (item)->pstNext) item = (item)->pstNext)
/*宏的实现通过 for 循环来实现链表的遍历,具体步骤如下:
item (list)->pstNext
(item) != (list) item
item (item)->pstNext
便*/
/** /**
* @ingroup los_list * @ingroup los_list
* @brief Traverse a doubly linked list safe against removal of list entry. * @brief Traverse a doubly linked list safe against removal of list entry.
@ -535,7 +475,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelInit(LOS_DL_LIST *list)
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
#define LOS_DL_LIST_HEAD(list) LOS_DL_LIST list = { &(list), &(list) } #define LOS_DL_LIST_HEAD(list) LOS_DL_LIST list = { &(list), &(list) }
/*通过这个宏,可以方便地定义和初始化一个双向链表的头部节点,为链表的后续操作提供了便利。*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -51,30 +51,18 @@ extern "C" {
#define memmove_s KasanMemmoveSec #define memmove_s KasanMemmoveSec
#define strcat_s KasanStrcatSec #define strcat_s KasanStrcatSec
#define strcpy_s KasanStrcpySec #define strcpy_s KasanStrcpySec
/*使用#define预处理指令来重新定义标准库函数的名称。这种技术通常用于调试或测试目的或者提供这些函数的自定义实现。
memcpymemmovestrcatstrcpyKasanMemcpy
KasanMemmoveKasanStrcatKasanStrcpymemcpy_smemmove_sstrcat_sstrcpy_s
KasanMemcpySecKasanMemmoveSecKasanStrcatSecKasanStrcpySec*/
// End: Kernel Address Sanitizer(KASAN) for LiteOS // End: Kernel Address Sanitizer(KASAN) for LiteOS
VOID *KasanMemcpy(VOID *__restrict dest, const VOID *__restrict src, size_t copyAmount); VOID *KasanMemcpy(VOID *__restrict dest, const VOID *__restrict src, size_t copyAmount);
VOID *KasanMemmove(VOID *dest, const VOID *src, size_t len); VOID *KasanMemmove(VOID *dest, const VOID *src, size_t len);
CHAR *KasanStrcat(CHAR *s, const CHAR *append); CHAR *KasanStrcat(CHAR *s, const CHAR *append);
CHAR *KasanStrcpy(CHAR *dest, const CHAR *src); CHAR *KasanStrcpy(CHAR *dest, const CHAR *src);
/*KasanMemcpy类似于标准库中的memcpy用于在内存中复制一定数量的数据。可能会包含额外的内存访问检查。
KasanMemmovememmove访
KasanStrcatstrcat访
KasanStrcpystrcpy访*/
errno_t KasanMemcpySec(VOID *dest, size_t destMax, const VOID *src, size_t copyAmount); errno_t KasanMemcpySec(VOID *dest, size_t destMax, const VOID *src, size_t copyAmount);
errno_t KasanMemmoveSec(VOID *dest, size_t destMax, const VOID *src, size_t len); errno_t KasanMemmoveSec(VOID *dest, size_t destMax, const VOID *src, size_t len);
errno_t KasanStrcatSec(CHAR *s, size_t destMax, const CHAR *append); errno_t KasanStrcatSec(CHAR *s, size_t destMax, const CHAR *append);
errno_t KasanStrcpySec(CHAR *dest, size_t destMax, const CHAR *src); errno_t KasanStrcpySec(CHAR *dest, size_t destMax, const CHAR *src);
/*主要是用于处理字符串和内存拷贝操作。这里的 destMax 参数通常表示目标缓冲区的最大长度,以防止缓冲区溢出等安全问题。
KasanMemcpySecmemcpy
KasanMemmoveSecmemmove
KasanStrcatSecstrcat
KasanStrcpySecstrcpy*/
#endif /* LOSCFG_KERNEL_LMS */ #endif /* LOSCFG_KERNEL_LMS */
#ifdef __cplusplus #ifdef __cplusplus

@ -55,33 +55,20 @@ enum LockDepErrType {
/* overflow, needs expand */ /* overflow, needs expand */
LOCKDEP_ERR_OVERFLOW, LOCKDEP_ERR_OVERFLOW,
}; };
/*这是一个枚举类型 LockDepErrType用于表示在锁依赖性检查中可能发生的不同错误类型。下面是该枚举类型定义的各个取值及其含义
LOCKDEP_SUCCESS
LOCKDEP_ERR_DOUBLE_LOCK线
LOCKDEP_ERR_DEAD_LOCK线
LOCKDEP_ERR_UNLOCK_WITHOUT_LOCK线线
LOCKDEP_ERR_OVERFLOW*/
typedef struct { typedef struct {
VOID *lockPtr; VOID *lockPtr;
VOID *lockAddr; VOID *lockAddr;
UINT64 waitTime; UINT64 waitTime;
UINT64 holdTime; UINT64 holdTime;
} HeldLocks; } HeldLocks;
/*这个结构体主要用于在锁依赖性分析和调试过程中记录当前线程持有的锁的相关信息。通过记录这些信息,
使便
lockPtr VOID*
lockAddr VOID*
waitTime UINT64 线
holdTime UINT64 线*/
typedef struct { typedef struct {
VOID *waitLock; VOID *waitLock;
INT32 lockDepth; INT32 lockDepth;
HeldLocks heldLocks[MAX_LOCK_DEPTH]; HeldLocks heldLocks[MAX_LOCK_DEPTH];
} LockDep; } LockDep;
/*这个结构体主要用于在锁依赖性分析和调试过程中记录当前线程的锁依赖关系。
线
使便*/
/** /**
* @ingroup los_lockdep * @ingroup los_lockdep
* *
@ -101,8 +88,7 @@ typedef struct {
* @since Huawei LiteOS V200R003C00 * @since Huawei LiteOS V200R003C00
*/ */
extern VOID OsLockDepCheckIn(const SPIN_LOCK_S *lock); extern VOID OsLockDepCheckIn(const SPIN_LOCK_S *lock);
/*函数名称为 OsLockDepCheckIn参数类型为 const SPIN_LOCK_S* lock返回类型为 VOID。该函数的作用是将指定
lock */
/** /**
* @ingroup los_lockdep * @ingroup los_lockdep
* *
@ -142,8 +128,7 @@ extern VOID OsLockDepRecord(SPIN_LOCK_S *lock);
* @since Huawei LiteOS V200R003C00 * @since Huawei LiteOS V200R003C00
*/ */
extern VOID OsLockDepCheckOut(SPIN_LOCK_S *lock); extern VOID OsLockDepCheckOut(SPIN_LOCK_S *lock);
/*函数名称为 OsLockDepCheckOut参数类型为 SPIN_LOCK_S* lock返回类型为 VOID。该函数的作用
lock*/
/** /**
* @ingroup los_lockdep * @ingroup los_lockdep
* *

@ -57,14 +57,7 @@ typedef enum LOS_INTERMIT_MODE {
LOS_INTERMIT_SHUTDOWN, /**< Shutdown mode */ LOS_INTERMIT_SHUTDOWN, /**< Shutdown mode */
LOS_INTERMIT_MAX, LOS_INTERMIT_MAX,
} LosIntermitMode; } LosIntermitMode;
/*这是一个枚举类型 LOS_INTERMIT_MODE 的定义,包含了几个枚举常量:
LOS_INTERMIT_NONE
LOS_INTERMIT_LIGHT_SLEEP
LOS_INTERMIT_DEEP_SLEEP
LOS_INTERMIT_STANDBY
LOS_INTERMIT_SHUTDOWN
LOS_INTERMIT_MAX*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* *
@ -77,13 +70,7 @@ typedef enum LOS_FREQ_MODE {
LOS_SYS_FREQ_LOW, /**< Low freq */ LOS_SYS_FREQ_LOW, /**< Low freq */
LOS_SYS_FREQ_MAX, LOS_SYS_FREQ_MAX,
} LosFreqMode; } LosFreqMode;
/*这是另一个枚举类型 LOS_FREQ_MODE 的定义,包含了几个枚举常量:
LOS_SYS_FREQ_SUPER
LOS_SYS_FREQ_HIGH
LOS_SYS_FREQ_NORMAL
LOS_SYS_FREQ_LOW
LOS_SYS_FREQ_MAX*/
typedef UINT32 (*LowpowerExternalVoterHandle)(VOID); typedef UINT32 (*LowpowerExternalVoterHandle)(VOID);
STATIC INLINE BOOL FreqHigher(LosFreqMode freq1, LosFreqMode freq2) STATIC INLINE BOOL FreqHigher(LosFreqMode freq1, LosFreqMode freq2)
@ -109,19 +96,7 @@ typedef struct {
UINT32 (*getSleepMode)(VOID); /**< Get sleep mode interface, the retval type is LosIntermitMode */ UINT32 (*getSleepMode)(VOID); /**< Get sleep mode interface, the retval type is LosIntermitMode */
VOID (*setSleepMode)(UINT32 mode); /**< Set sleep mode interface, the param type is LosIntermitMode */ VOID (*setSleepMode)(UINT32 mode); /**< Set sleep mode interface, the param type is LosIntermitMode */
} PowerMgrOps; } PowerMgrOps;
/*这是一个结构体类型 PowerMgrOps 的定义,包含了多个函数指针成员:
process
wakeupFromReset
resumeFromInterrupt
changeFreq LosFreqMode
deepSleepVoteBegin
deepSleepVoteEnd
deepSleepVoteDelay
registerExternalVoter UINT32
getDeepSleepVoteCount UINT32
getSleepMode LosIntermitMode
setSleepMode UINT32 LosIntermitMode*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief System main frequency tuning. * @brief System main frequency tuning.
@ -140,9 +115,7 @@ setSleepMode
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_PowerMgrChangeFreq(LosFreqMode freq); extern VOID LOS_PowerMgrChangeFreq(LosFreqMode freq);
/*这是一个外部声明extern的函数 LOS_PowerMgrChangeFreq
LosFreqMode freq
*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Vote to enter deep sleep. * @brief Vote to enter deep sleep.
@ -180,8 +153,7 @@ extern VOID LOS_PowerMgrDeepSleepVoteBegin(VOID);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_PowerMgrDeepSleepVoteEnd(VOID); extern VOID LOS_PowerMgrDeepSleepVoteEnd(VOID);
/*这是一个外部声明extern的函数 LOS_PowerMgrDeepSleepVoteEnd它没有任何参数返回类型为 VOID。根据函数名来看
*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Sleep delay vote. * @brief Sleep delay vote.
@ -200,8 +172,7 @@ extern VOID LOS_PowerMgrDeepSleepVoteEnd(VOID);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_PowerMgrSleepDelay(UINT32 tick); extern VOID LOS_PowerMgrSleepDelay(UINT32 tick);
/*这是一个外部声明extern的函数 LOS_PowerMgrSleepDelay它接受一个 UINT32 类型的参数 tick
*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Register the external voter. * @brief Register the external voter.
@ -220,9 +191,7 @@ extern VOID LOS_PowerMgrSleepDelay(UINT32 tick);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_PowerMgrRegisterExtVoter(UINT32 (*)(VOID)); extern VOID LOS_PowerMgrRegisterExtVoter(UINT32 (*)(VOID));
/*这是一个外部声明extern的函数 LOS_PowerMgrRegisterExtVoter
UINT32
*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Get the sleep mode. * @brief Get the sleep mode.
@ -281,9 +250,7 @@ extern UINT32 LOS_PowerMgrGetDeepSleepVoteCount(VOID);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_LowpowerInit(const PowerMgrOps *pmOps); extern VOID LOS_LowpowerInit(const PowerMgrOps *pmOps);
/*这是一个外部声明extern的函数 LOS_LowpowerInit
const PowerMgrOps * pmOps
便*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Define the lowpower framework process function type. * @brief Define the lowpower framework process function type.
@ -302,10 +269,7 @@ extern VOID LOS_LowpowerInit(const PowerMgrOps *pmOps);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
typedef VOID (*LowPowerHookFn)(VOID); typedef VOID (*LowPowerHookFn)(VOID);
/*这是一个类型定义语句,定义了一个名为 LowPowerHookFn 的函数指针类型。
VOID
便退*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Register a hook to enter lowpower framework process. * @brief Register a hook to enter lowpower framework process.
@ -324,10 +288,7 @@ typedef VOID (*LowPowerHookFn)(VOID);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_LowpowerHookReg(LowPowerHookFn hook); extern VOID LOS_LowpowerHookReg(LowPowerHookFn hook);
/*这是一个外部声明extern的函数 LOS_LowpowerHookReg
LowPowerHookFn hook
便退*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Define the lowpower framework wakup function type. * @brief Define the lowpower framework wakup function type.
@ -346,10 +307,7 @@ extern VOID LOS_LowpowerHookReg(LowPowerHookFn hook);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
typedef VOID (*IntWakeupHookFn)(HWI_HANDLE_T hwiNum); typedef VOID (*IntWakeupHookFn)(HWI_HANDLE_T hwiNum);
/*这是一个类型定义语句,定义了一个名为 IntWakeupHookFn 的函数指针类型。
HWI_HANDLE_T VOID
便
*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Register a hook to wakeup from interrupt. * @brief Register a hook to wakeup from interrupt.
@ -368,11 +326,7 @@ typedef VOID (*IntWakeupHookFn)(HWI_HANDLE_T hwiNum);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_IntWakeupHookReg(IntWakeupHookFn hook); extern VOID LOS_IntWakeupHookReg(IntWakeupHookFn hook);
/*这是一个外部声明extern的函数 LOS_IntWakeupHookReg
IntWakeupHookFn hook
便
*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -59,22 +59,7 @@ typedef struct {
UINT32 (*getSleepMode)(VOID); /**< Get sleep mode */ UINT32 (*getSleepMode)(VOID); /**< Get sleep mode */
VOID (*setSleepMode)(UINT32 mode); /**< Set sleep mode */ VOID (*setSleepMode)(UINT32 mode); /**< Set sleep mode */
} PowerMgrRunOps; } PowerMgrRunOps;
/*具体来说,该结构体包含以下函数指针成员:
changeFreq
enterLightSleeplight sleep
enterDeepSleepdeep sleep
setWakeUpTimer
withdrawWakeUpTimer
getSleepTime
selectSleepMode
preConfig
postConfig
contextSave
contextRestore
getDeepSleepVoteCount
getSleepMode
setSleepMode*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* *
@ -85,11 +70,7 @@ typedef struct {
UINT32 minDeepSleepTicks; /**< Min deep sleep ticks */ UINT32 minDeepSleepTicks; /**< Min deep sleep ticks */
UINT32 maxDeepSleepTicks; /**< Max deep sleep ticks */ UINT32 maxDeepSleepTicks; /**< Max deep sleep ticks */
} PowerMgrConfig; } PowerMgrConfig;
/*minLightSleepTicks最小轻度睡眠light sleep时钟周期数。
minDeepSleepTicksdeep sleep
maxDeepSleepTicksdeep sleep
使*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* *
@ -107,16 +88,7 @@ typedef struct {
VOID (*otherCoreResume)(VOID); /**< Other core Resume for multi-core scenes */ VOID (*otherCoreResume)(VOID); /**< Other core Resume for multi-core scenes */
VOID (*resumeFromReset)(VOID); /**< Resume from image */ VOID (*resumeFromReset)(VOID); /**< Resume from image */
} PowerMgrDeepSleepOps; } PowerMgrDeepSleepOps;
/*couldDeepSleep检查系统是否可以进入深度睡眠状态。
systemWakeup
suspendPreConfig
suspendDevice
rollback
resumeDevice
resumePostConfig
resumeCallBack
otherCoreResume
resumeFromReset*/
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* *
@ -127,10 +99,7 @@ typedef struct {
PowerMgrDeepSleepOps deepSleepOps; /**< power manager deep sleep operations */ PowerMgrDeepSleepOps deepSleepOps; /**< power manager deep sleep operations */
PowerMgrConfig config; /**< power manager config */ PowerMgrConfig config; /**< power manager config */
} PowerMgrParameter; } PowerMgrParameter;
/*runOps类型为 PowerMgrRunOps 的结构体变量,用于描述系统运行状态下的功耗管理操作集合。
deepSleepOps PowerMgrDeepSleepOps
config PowerMgrConfig
PowerMgrParameter */
/** /**
* @ingroup los_lowpower * @ingroup los_lowpower
* @brief Init the power manager framework. * @brief Init the power manager framework.

@ -75,17 +75,7 @@ extern "C" {
* Head size of each node in staic memory pool * Head size of each node in staic memory pool
*/ */
#define OS_MEMBOX_NODE_HEAD_SIZE sizeof(LOS_MEMBOX_NODE) #define OS_MEMBOX_NODE_HEAD_SIZE sizeof(LOS_MEMBOX_NODE)
/*LOS_MEMBOX_ALLIGNED(memAddr) 宏用于对内存地址进行对齐操作。
memAddr UINTPTR sizeof(UINTPTR) -
1 ~(sizeof(UINTPTR) - 1)
sizeof(UINTPTR)
OS_MEMBOX_NEXT(addr, blkSize)
addr UINT8* blkSize
OS_MEMBOX_NODE_HEAD_SIZE LOS_MEMBOX_NODE
*/
/** /**
* @ingroup los_membox * @ingroup los_membox
* @brief Obtain the size of the static memory pool. * @brief Obtain the size of the static memory pool.
@ -108,10 +98,7 @@ OS_MEMBOX_NODE_HEAD_SIZE
*/ */
#define LOS_MEMBOX_SIZE(blkSize, blkNum) \ #define LOS_MEMBOX_SIZE(blkSize, blkNum) \
(sizeof(LOS_MEMBOX_INFO) + (LOS_MEMBOX_ALLIGNED((blkSize) + OS_MEMBOX_NODE_HEAD_SIZE) * (blkNum))) (sizeof(LOS_MEMBOX_INFO) + (LOS_MEMBOX_ALLIGNED((blkSize) + OS_MEMBOX_NODE_HEAD_SIZE) * (blkNum)))
/*该宏首先使用 LOS_MEMBOX_ALLIGNED 宏对 (blkSize) + OS_MEMBOX_NODE_HEAD_SIZE 进行对齐操作,确保每个内存块都按照节点大小对齐。然后将对齐后的大小乘以 blkNum并加上 sizeof(LOS_MEMBOX_INFO),得到静态内存池的总大小。
sizeof(LOS_MEMBOX_INFO)
*/
/** /**
* @ingroup los_membox * @ingroup los_membox
* Structure of a free node in a static memory pool * Structure of a free node in a static memory pool
@ -137,11 +124,7 @@ typedef struct {
} LOS_MEMBOX_INFO; } LOS_MEMBOX_INFO;
typedef LOS_MEMBOX_INFO OS_MEMBOX_S; typedef LOS_MEMBOX_INFO OS_MEMBOX_S;
/*LOS_MEMBOX_INFO静态内存池的元信息结构体。包含了静态内存池的起始地址、
uwBlkCnt
stFreeList LOSCFG_KERNEL_MEMBOX_STATIC
OS_MEMBOX_S LOS_MEMBOX_INFO */
/** /**
* @ingroup los_membox * @ingroup los_membox
* @brief Initialize a static memory pool. * @brief Initialize a static memory pool.
@ -170,8 +153,7 @@ OS_MEMBOX_S
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MemboxInit(VOID *pool, UINT32 poolSize, UINT32 blkSize); extern UINT32 LOS_MemboxInit(VOID *pool, UINT32 poolSize, UINT32 blkSize);
/*该函数会使用提供的内存池起始地址和大小来初始化静态内存池,并指定每个内存块的大小。
*/
/** /**
* @ingroup los_membox * @ingroup los_membox
* @brief Request a static memory block. * @brief Request a static memory block.
@ -220,7 +202,7 @@ extern VOID *LOS_MemboxAlloc(VOID *pool);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MemboxFree(VOID *pool, VOID *box); extern UINT32 LOS_MemboxFree(VOID *pool, VOID *box);
/*调用该函数将会释放 box 所指向的内存块,并将其重新加入到内存池的空闲内存块链表中,以便下次分配使用。*/
/** /**
* @ingroup los_membox * @ingroup los_membox
* @brief Clear a static memory block. * @brief Clear a static memory block.
@ -244,8 +226,7 @@ extern UINT32 LOS_MemboxFree(VOID *pool, VOID *box);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_MemboxClr(VOID *pool, VOID *box); extern VOID LOS_MemboxClr(VOID *pool, VOID *box);
/*调用该函数将会将 box 所指向的内存块的数据内容清零,使其变为初始状态。
使*/
/** /**
* @ingroup los_membox * @ingroup los_membox
* @brief show static memory pool information. * @brief show static memory pool information.
@ -296,9 +277,7 @@ extern VOID LOS_ShowBox(VOID *pool);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MemboxStatisticsGet(const VOID *boxMem, UINT32 *maxBlk, UINT32 *blkCnt, UINT32 *blkSize); extern UINT32 LOS_MemboxStatisticsGet(const VOID *boxMem, UINT32 *maxBlk, UINT32 *blkCnt, UINT32 *blkSize);
/*调用该函数将会获取静态内存池的统计信息,包括最大可分配内存块数量、
使*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -155,12 +155,7 @@ extern UINTPTR g_excInteractMemSize;
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID *LOS_MemMalloc(VOID *pool, UINT32 size, UINT32 moduleId); extern VOID *LOS_MemMalloc(VOID *pool, UINT32 size, UINT32 moduleId);
/*pool指向内存池起始地址的指针。
size
moduleId ID
size
NULL
ID moduleId 使*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Allocate aligned memory. * @brief Allocate aligned memory.
@ -190,10 +185,7 @@ moduleId
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID *LOS_MemMallocAlign(VOID *pool, UINT32 size, UINT32 boundary, UINT32 moduleId); extern VOID *LOS_MemMallocAlign(VOID *pool, UINT32 size, UINT32 boundary, UINT32 moduleId);
/*调用该函数将会在指定的内存池中按照指定的对齐边界boundary分配大小为 size 的内存块,并将其地址返回给调用者。
boundary
NULL
ID moduleId 使*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Free dynamic memory. * @brief Free dynamic memory.
@ -220,9 +212,7 @@ extern VOID *LOS_MemMallocAlign(VOID *pool, UINT32 size, UINT32 boundary, UINT32
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MemMfree(VOID *pool, VOID *ptr, UINT32 moduleId); extern UINT32 LOS_MemMfree(VOID *pool, VOID *ptr, UINT32 moduleId);
/*调用该函数将会释放由 ptr 指向的内存块,并将其归还给指定的内存池。同时,通过 moduleId 参数指定要释放的内存块所属的模块 ID以便进行相关的内存管理操作。
LOS_MemMalloc LOS_MemMallocAlign */
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Re-allocate a memory block. * @brief Re-allocate a memory block.
@ -334,14 +324,7 @@ typedef struct {
UINT32 uwUsageWaterLine; /**< this structure member is defined only when LOSCFG_MEM_TASK_STAT is defined. */ UINT32 uwUsageWaterLine; /**< this structure member is defined only when LOSCFG_MEM_TASK_STAT is defined. */
#endif #endif
} LOS_MEM_POOL_STATUS; } LOS_MEM_POOL_STATUS;
/*uwTotalUsedSize内存池中已使用的总大小单位字节
uwTotalFreeSize使
uwMaxFreeNodeSize
uwUsedNodeNum使
uwFreeNodeNum使
uwUsageWaterLine LOSCFG_MEM_TASK_STAT 使线使
使使使
LOSCFG_MEM_TASK_STAT使线*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Initialize dynamic memory. * @brief Initialize dynamic memory.
@ -370,8 +353,7 @@ uwUsageWaterLine
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MemInit(VOID *pool, UINT32 size); extern UINT32 LOS_MemInit(VOID *pool, UINT32 size);
/*调用该函数将会对指定的内存池进行初始化操作,使其具备可用于分配和管理内存块的能力。
*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Allocate dynamic memory. * @brief Allocate dynamic memory.
@ -398,8 +380,7 @@ extern UINT32 LOS_MemInit(VOID *pool, UINT32 size);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID *LOS_MemAlloc(VOID *pool, UINT32 size); extern VOID *LOS_MemAlloc(VOID *pool, UINT32 size);
/*通过该函数可以动态地从内存池中获取一块指定大小的内存块,以满足程序运行时的内存需求。分配的内存块可以根据实际需要进行读写操作
*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Free dynamic memory. * @brief Free dynamic memory.
@ -463,7 +444,7 @@ extern UINT32 LOS_MemFree(VOID *pool, VOID *ptr);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size); extern VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size);
//通过该函数可以动态地调整已分配内存块的大小,以满足程序运行时动态变化的内存需求。
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Allocate aligned memory. * @brief Allocate aligned memory.
@ -491,9 +472,7 @@ extern VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary); extern VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary);
/*通过该函数可以动态地从内存池中获取一块指定大小并满足对齐要求的内存块,
*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Get the size of memory pool's size. * @brief Get the size of memory pool's size.
@ -634,9 +613,7 @@ extern UINTPTR LOS_MemLastUsedGet(VOID *pool);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus); extern UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus);
/*调用该函数将会获取指定内存池的状态信息,并将其保存到指定的 LOS_MEM_POOL_STATUS 结构体中。如果获取成功,返回 LOS_OK否则返回错误码。
使便*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Get the number of free node in every size. * @brief Get the number of free node in every size.
@ -681,10 +658,6 @@ extern UINT32 LOS_MemFreeNodeShow(VOID *pool);
extern UINT32 LOS_MemIntegrityCheck(VOID *pool); extern UINT32 LOS_MemIntegrityCheck(VOID *pool);
#ifdef LOSCFG_BASE_MEM_NODE_SIZE_CHECK #ifdef LOSCFG_BASE_MEM_NODE_SIZE_CHECK
/*调用该函数将会对指定的内存池进行完整性检查,以确保内存池中分配的内存块没有损坏或越界等问题。如果检查通过,返回 LOS_OK否则返回错误码。
#ifdef LOSCFG_BASE_MEM_NODE_SIZE_CHECK
*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Check the size of the specified memory node. * @brief Check the size of the specified memory node.
@ -717,9 +690,7 @@ extern UINT32 LOS_MemIntegrityCheck(VOID *pool);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MemNodeSizeCheck(VOID *pool, VOID *ptr, UINT32 *totalSize, UINT32 *availSize); extern UINT32 LOS_MemNodeSizeCheck(VOID *pool, VOID *ptr, UINT32 *totalSize, UINT32 *availSize);
/*调用该函数将会检查指定内存池中给定内存节点的大小,并将总大小和可用大小分别保存到指定的变量中。如果检查成功,返回 LOS_OK否则返回错误码。
使使*/
/** /**
* @ingroup los_memory * @ingroup los_memory
* @brief Set the memory check level. * @brief Set the memory check level.

@ -54,10 +54,7 @@ extern "C" {
* Solution: Decrease the number of mutexes defined by LOSCFG_BASE_IPC_MUX_LIMIT. * Solution: Decrease the number of mutexes defined by LOSCFG_BASE_IPC_MUX_LIMIT.
*/ */
#define LOS_ERRNO_MUX_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x00) #define LOS_ERRNO_MUX_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x00)
/*这段代码定义了一个名为 LOS_ERRNO_MUX_NO_MEMORY 的宏,用于表示互斥锁分配内存失败的错误码。
LOS_ERRNO_OS_ERROR LOS_MOD_MUX
0x00 */
/** /**
* @ingroup los_mux * @ingroup los_mux
* Mutex error code: The mutex is not usable. * Mutex error code: The mutex is not usable.
@ -67,7 +64,7 @@ LOS_ERRNO_OS_ERROR
* Solution: Check whether the mutex ID and the mutex state are applicable for the current operation. * Solution: Check whether the mutex ID and the mutex state are applicable for the current operation.
*/ */
#define LOS_ERRNO_MUX_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x01) #define LOS_ERRNO_MUX_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x01)
//LOS_ERRNO_OS_ERROR 是一个宏用于生成具有模块和错误码的错误码值。在这里LOS_MOD_MUX 表示错误所属的模块是互斥锁模块0x01 是该错误码在该模块中的具体数值。
/** /**
* @ingroup los_mux * @ingroup los_mux
* Mutex error code: Null pointer. * Mutex error code: Null pointer.
@ -77,8 +74,7 @@ LOS_ERRNO_OS_ERROR
* Solution: Check whether the input parameter is usable. * Solution: Check whether the input parameter is usable.
*/ */
#define LOS_ERRNO_MUX_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x02) #define LOS_ERRNO_MUX_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x02)
//这段代码定义了一个名为 LOS_ERRNO_MUX_PTR_NULL 的宏,用于表示互斥锁指针为空的错误码。
//LOS_ERRNO_OS_ERROR 是一个宏用于生成具有模块和错误码的错误码值。在这里LOS_MOD_MUX 表示错误所属的模块是互斥锁模块0x02 是该错误码在该模块中的具体数值。
/** /**
* @ingroup los_mux * @ingroup los_mux
* Mutex error code: No mutex is available and the mutex request fails. * Mutex error code: No mutex is available and the mutex request fails.
@ -88,9 +84,7 @@ LOS_ERRNO_OS_ERROR
* Solution: Increase the number of mutexes defined by LOSCFG_BASE_IPC_MUX_LIMIT. * Solution: Increase the number of mutexes defined by LOSCFG_BASE_IPC_MUX_LIMIT.
*/ */
#define LOS_ERRNO_MUX_ALL_BUSY LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x03) #define LOS_ERRNO_MUX_ALL_BUSY LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x03)
/*这段代码定义了一个名为 LOS_ERRNO_MUX_ALL_BUSY 的宏,用于表示互斥锁已全部被占用的错误码。
LOS_ERRNO_OS_ERROR LOS_MOD_MUX 0x03 */
/** /**
* @ingroup los_mux * @ingroup los_mux
* Mutex error code: The mutex fails to be locked in non-blocking mode because it is locked by another thread. * Mutex error code: The mutex fails to be locked in non-blocking mode because it is locked by another thread.
@ -100,9 +94,7 @@ LOS_ERRNO_OS_ERROR
* Solution: Lock the mutex after it is unlocked by the thread that owns it, or set a waiting time. * Solution: Lock the mutex after it is unlocked by the thread that owns it, or set a waiting time.
*/ */
#define LOS_ERRNO_MUX_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x04) #define LOS_ERRNO_MUX_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x04)
/*这段代码定义了一个名为 LOS_ERRNO_MUX_UNAVAILABLE 的宏,用于表示互斥锁不可用的错误码。
LOS_ERRNO_OS_ERROR LOS_MOD_MUX 0x04 */
/** /**
* @ingroup los_mux * @ingroup los_mux
* Mutex error code: The mutex is being locked during an interrupt. * Mutex error code: The mutex is being locked during an interrupt.
@ -112,9 +104,7 @@ LOS_ERRNO_OS_ERROR
* Solution: Check whether the mutex is being locked during an interrupt. * Solution: Check whether the mutex is being locked during an interrupt.
*/ */
#define LOS_ERRNO_MUX_PEND_INTERR LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x05) #define LOS_ERRNO_MUX_PEND_INTERR LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x05)
/*这段代码定义了一个名为 LOS_ERRNO_MUX_PEND_INTERR 的宏,用于表示互斥锁等待被阻塞时发生中断错误的错误码。
LOS_ERRNO_OS_ERROR LOS_MOD_MUX 0x05 */
/** /**
* @ingroup los_mux * @ingroup los_mux
* Mutex error code: A thread locks a mutex after waiting for the mutex to be unlocked by another thread * Mutex error code: A thread locks a mutex after waiting for the mutex to be unlocked by another thread
@ -126,9 +116,7 @@ LOS_ERRNO_OS_ERROR
* thread will not wait for the mutex to become available. * thread will not wait for the mutex to become available.
*/ */
#define LOS_ERRNO_MUX_PEND_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x06) #define LOS_ERRNO_MUX_PEND_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x06)
/*这段代码定义了一个名为 LOS_ERRNO_MUX_PEND_IN_LOCK 的宏,用于表示在互斥锁上等待时发生死锁错误的错误码。
LOS_ERRNO_OS_ERROR LOS_MOD_MUX 0x06 */
/** /**
* @ingroup los_mux * @ingroup los_mux
* Mutex error code: The mutex locking times out. * Mutex error code: The mutex locking times out.
@ -138,7 +126,7 @@ LOS_ERRNO_OS_ERROR
* Solution: Increase the waiting time or set the waiting time to LOS_WAIT_FOREVER (forever-blocking mode). * Solution: Increase the waiting time or set the waiting time to LOS_WAIT_FOREVER (forever-blocking mode).
*/ */
#define LOS_ERRNO_MUX_TIMEOUT LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x07) #define LOS_ERRNO_MUX_TIMEOUT LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x07)
//LOS_ERRNO_OS_ERROR 是一个宏用于生成具有模块和错误码的错误码值。在这里LOS_MOD_MUX 表示错误所属的模块是互斥锁模块0x07 是该错误码在该模块中的具体数值。
/** /**
* @ingroup los_mux * @ingroup los_mux
* The error code is not in use temporarily. * The error code is not in use temporarily.
@ -187,9 +175,7 @@ LOS_ERRNO_OS_ERROR
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_MUX_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x0C) #define LOS_ERRNO_MUX_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x0C)
/*其中 LOS_ERRNO_OS_ERROR 是一个宏函数,用于生成错误码。该宏函数接受两个参数:模块号和错误码。在这里,模块号为 LOS_MOD_MUX错误码为 0x0C。
便使*/
/** /**
* @ingroup los_mux * @ingroup los_mux
* @brief Create a mutex. * @brief Create a mutex.
@ -275,14 +261,7 @@ extern UINT32 LOS_MuxDelete(UINT32 muxHandle);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout); extern UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout);
/*参数说明:
muxHandle
timeout0
LOS_OK
*/
/** /**
* @ingroup los_mux * @ingroup los_mux
* @brief Release a mutex. * @brief Release a mutex.

@ -75,12 +75,7 @@ enum PerfStatus {
PERF_STARTED, /**< perf is started */ PERF_STARTED, /**< perf is started */
PERF_STOPED, /**< perf is stopped */ PERF_STOPED, /**< perf is stopped */
}; };
/*枚举类型 PerfStatus 包含了三个枚举常量:
PERF_UNINIT
PERF_STARTED
PERF_STOPED
使便*/
/** /**
* @ingroup los_perf * @ingroup los_perf
* Define the type of the perf sample data buffer water mark hook function. * Define the type of the perf sample data buffer water mark hook function.
@ -187,13 +182,7 @@ enum PerfEventType {
PERF_EVENT_TYPE_MAX PERF_EVENT_TYPE_MAX
}; };
/*枚举类型 PerfEventType 包含了四个枚举常量:
PERF_EVENT_TYPE_HW
PERF_EVENT_TYPE_TIMED
PERF_EVENT_TYPE_SW
PERF_EVENT_TYPE_RAW PmuEventType
使便便*/
/** /**
* @ingroup los_perf * @ingroup los_perf
* Common hardware pmu events * Common hardware pmu events
@ -210,17 +199,7 @@ enum PmuHwId {
PERF_COUNT_HW_MAX, PERF_COUNT_HW_MAX,
}; };
/*枚举类型 PmuHwId 包含了多个枚举常量,每个常量代表一个具体的硬件事件:
PERF_COUNT_HW_CPU_CYCLES CPU
PERF_COUNT_HW_INSTRUCTIONS
PERF_COUNT_HW_DCACHE_REFERENCES访
PERF_COUNT_HW_DCACHE_MISSES
PERF_COUNT_HW_ICACHE_REFERENCES访
PERF_COUNT_HW_ICACHE_MISSES
PERF_COUNT_HW_BRANCH_INSTRUCTIONS
PERF_COUNT_HW_BRANCH_MISSES
使便*/
/** /**
* @ingroup los_perf * @ingroup los_perf
* Common hrtimer timed events * Common hrtimer timed events
@ -241,13 +220,7 @@ enum PmuSwId {
PERF_COUNT_SW_MAX, PERF_COUNT_SW_MAX,
}; };
/*枚举类型 PmuSwId 包含了多个枚举常量,每个常量代表一个具体的软件事件:
PERF_COUNT_SW_TASK_SWITCH
PERF_COUNT_SW_IRQ_RESPONSE
PERF_COUNT_SW_MEM_ALLOC
PERF_COUNT_SW_MUX_PEND
使便*/
/** /**
* @ingroup los_perf * @ingroup los_perf
* perf sample data types * perf sample data types
@ -262,16 +235,7 @@ enum PerfSampleType {
PERF_RECORD_IP = 1U << 5, /**< record instruction pointer */ PERF_RECORD_IP = 1U << 5, /**< record instruction pointer */
PERF_RECORD_CALLCHAIN = 1U << 6, /**< record backtrace */ PERF_RECORD_CALLCHAIN = 1U << 6, /**< record backtrace */
}; };
/*枚举类型 PerfSampleType 包含了多个枚举常量,每个常量代表一个具体的采样数据类型:
PERF_RECORD_CPU CPU ID
PERF_RECORD_TID ID
PERF_RECORD_TYPE
PERF_RECORD_PERIOD
PERF_RECORD_TIMESTAMP
PERF_RECORD_IP
PERF_RECORD_CALLCHAIN
使便便*/
/** /**
* @ingroup los_perf * @ingroup los_perf
* perf configuration sub event information * perf configuration sub event information
@ -289,12 +253,7 @@ typedef struct {
BOOL predivided; /**< whether to prescaler (once every 64 counts), BOOL predivided; /**< whether to prescaler (once every 64 counts),
which only take effect on cpu cycle hardware event */ which only take effect on cpu cycle hardware event */
} PerfEventConfig; } PerfEventConfig;
/*type表示性能事件类型是一个 UINT32 类型的值,对应于 PerfEventType 枚举。
events
eventId UINT32
period UINT32
eventsNr UINT32
predivided64CPU BOOL */
/** /**
* @ingroup los_perf * @ingroup los_perf
* perf configuration main information * perf configuration main information
@ -320,17 +279,7 @@ extern VOID OsPerfHook(UINT32 event);
#else #else
#define LOS_PERF(EVENT) #define LOS_PERF(EVENT)
#endif #endif
/*PerfConfigAttr 结构体包含以下成员变量:
eventsCfg PerfEventConfig
taskIds ID UINT32 PERF_MAX_FILTER_TSKS ID
taskIdsNr ID UINT32
sampleType UINT32 PerfSampleType
needSample BOOL
taskFilterEnable BOOL
OsPerfHook UINT32 event
LOS_PERF LOSCFG_KERNEL_PERF LOSCFG_PERF_SW_PMU OsPerfHook */
/** /**
* @ingroup los_perf * @ingroup los_perf
* @brief Init perf. * @brief Init perf.

@ -46,14 +46,7 @@ extern "C" {
#ifdef LOSCFG_SHELL_LK #ifdef LOSCFG_SHELL_LK
extern void LOS_LkPrint(int level, const char *func, int line, const char *fmt, ...); extern void LOS_LkPrint(int level, const char *func, int line, const char *fmt, ...);
#endif #endif
/*LOS_LkPrint 函数接受以下参数:
level
func
line
fmt
...
*/
/** /**
* @ingroup los_printf * @ingroup los_printf
* log print level definition, LOS_EMG_LEVEL is set to 0, it means the log is emergency. * log print level definition, LOS_EMG_LEVEL is set to 0, it means the log is emergency.
@ -104,14 +97,7 @@ fmt
#endif #endif
typedef VOID (*pf_OUTPUT)(const CHAR *fmt, ...); typedef VOID (*pf_OUTPUT)(const CHAR *fmt, ...);
/*这段代码定义了一个名为 PRINT_LEVEL 的宏以及一个名为 pf_OUTPUT 的函数指针类型。
PRINT_LEVEL LOS_DEBUG_LEVEL LOS_ERR_LEVEL
LOSCFG_SHELL_LK PRINT_LEVEL LOS_DEBUG_LEVEL
PRINT_LEVEL LOS_ERR_LEVEL
pf_OUTPUT VOID
fmt ...使*/
/** /**
* @ingroup los_printf * @ingroup los_printf
* @brief Format and print data. * @brief Format and print data.
@ -167,15 +153,7 @@ extern void dprintf(const char *fmt, ...);
#endif #endif
#endif #endif
#endif #endif
/*当宏 PRINT_DEBUG 未被定义时,通过条件编译判断 PRINT_LEVEL 是否小于 LOS_DEBUG_LEVEL。如果是则将 PRINT_DEBUG 宏定义为空操作;否则,进入下一层条件编译。
LOSCFG_SHELL_LK PRINT_DEBUG LOS_LkPrint
[DEBUG] LOS_DEBUG_LEVEL
__FUNCTION__ __LINE__
fmt ...
PRINT_DEBUG [DEBUG] */
/** /**
* @ingroup los_printf * @ingroup los_printf
* @brief Format and print information log. * @brief Format and print information log.
@ -209,15 +187,7 @@ extern void dprintf(const char *fmt, ...);
#endif #endif
#endif #endif
#endif #endif
/*当宏 PRINT_INFO 未被定义时,通过条件编译判断 PRINT_LEVEL 是否小于 LOS_INFO_LEVEL。
PRINT_INFO
LOSCFG_SHELL_LK PRINT_INFO LOS_LkPrint
[INFO] LOS_INFO_LEVEL
__FUNCTION__ __LINE__
fmt ...
PRINT_INFO [INFO] */
/** /**
* @ingroup los_printf * @ingroup los_printf
* @brief Format and print warning log. * @brief Format and print warning log.
@ -251,14 +221,7 @@ extern void dprintf(const char *fmt, ...);
#endif #endif
#endif #endif
#endif #endif
/*当宏 PRINT_WARN 未被定义时,通过条件编译判断 PRINT_LEVEL 是否小于 LOS_WARN_LEVEL。如果是则将 PRINT_WARN 宏定义为空操作;否则,进入下一层条件编译。
LOSCFG_SHELL_LK PRINT_WARN LOS_LkPrint
[WARN] LOS_WARN_LEVEL
__FUNCTION__ __LINE__
fmt ...
PRINT_WARN [WARN] */
/** /**
* @ingroup los_printf * @ingroup los_printf
* @brief Format and print error log. * @brief Format and print error log.
@ -292,14 +255,7 @@ extern void dprintf(const char *fmt, ...);
#endif #endif
#endif #endif
#endif #endif
/*当宏 PRINT_ERR 未被定义时,通过条件编译判断 PRINT_LEVEL 是否小于 LOS_ERR_LEVEL。如果是则将 PRINT_ERR 宏定义为空操作;否则,进入下一层条件编译。
LOSCFG_SHELL_LK PRINT_ERR LOS_LkPrint
[ERR] LOS_ERR_LEVEL
__FUNCTION__ __LINE__
fmt ...
PRINT_ERR [ERR] */
/** /**
* @ingroup los_printf * @ingroup los_printf
* @brief Format and print common log. * @brief Format and print common log.
@ -331,16 +287,7 @@ extern void dprintf(const char *fmt, ...);
#endif #endif
#endif #endif
#endif #endif
/*这段代码定义了一个名为 PRINTK 的宏。
PRINTK PRINT_LEVEL LOS_COMMOM_LEVEL PRINTK
LOSCFG_SHELL_LK PRINTK LOS_LkPrint
[COMM] LOS_COMMOM_LEVEL
__FUNCTION__ __LINE__
fmt ...
PRINTK */
/** /**
* @ingroup los_printf * @ingroup los_printf
* @brief Format and print emergency log. * @brief Format and print emergency log.
@ -370,11 +317,7 @@ extern void dprintf(const char *fmt, ...);
} while (0) } while (0)
#endif #endif
#endif #endif
/*这段代码定义了一个名为 PRINT_EMG 的宏。
PRINT_EMG PRINT_LEVEL LOS_EMG_LEVEL PRINT_EMG
PRINT_LEVEL LOS_EMG_LEVEL PRINT_EMG [EMG] */
/** /**
* @ingroup los_printf * @ingroup los_printf
* @brief Format and print log. * @brief Format and print log.

@ -55,9 +55,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_QUEUE_MAXNUM_ZERO LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x00) #define LOS_ERRNO_QUEUE_MAXNUM_ZERO LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x00)
/*宏的定义使用了 LOS_ERRNO_OS_ERROR 宏,并指定了参数 LOS_MOD_QUE 和 0x00。根据上下文推测LOS_MOD_QUE 可能是表示与队列相关的模块。
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* Queue error code: The queue block memory fails to be initialized. * Queue error code: The queue block memory fails to be initialized.
@ -68,11 +66,7 @@ extern "C" {
* number of queue resources. * number of queue resources.
*/ */
#define LOS_ERRNO_QUEUE_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x01) #define LOS_ERRNO_QUEUE_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x01)
/*这段代码定义了一个名为 LOS_ERRNO_QUEUE_NO_MEMORY 的宏,用于表示队列分配内存失败时的错误码。
使 LOS_ERRNO_OS_ERROR LOS_MOD_QUE 0x01LOS_MOD_QUE
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* Queue error code: The memory for queue creation fails to be requested. * Queue error code: The memory for queue creation fails to be requested.
@ -83,11 +77,7 @@ extern "C" {
* the number of nodes in the queue to be created. * the number of nodes in the queue to be created.
*/ */
#define LOS_ERRNO_QUEUE_CREATE_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x02) #define LOS_ERRNO_QUEUE_CREATE_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x02)
/*这段代码定义了一个名为 LOS_ERRNO_QUEUE_CREATE_NO_MEMORY 的宏,用于表示创建队列时内存分配失败的错误码。
使 LOS_ERRNO_OS_ERROR LOS_MOD_QUE 0x02LOS_MOD_QUE
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* Queue error code: The size of the biggest message in the created queue is too big. * Queue error code: The size of the biggest message in the created queue is too big.
@ -97,9 +87,6 @@ extern "C" {
* Solution: Change the size of the biggest message in the created queue. * Solution: Change the size of the biggest message in the created queue.
*/ */
#define LOS_ERRNO_QUEUE_SIZE_TOO_BIG LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x03) #define LOS_ERRNO_QUEUE_SIZE_TOO_BIG LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x03)
/*宏的定义使用了 LOS_ERRNO_OS_ERROR 宏,并指定了参数 LOS_MOD_QUE 和 0x00。根据上下文推测LOS_MOD_QUE 可能是表示与队列相关的模块。
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
@ -110,11 +97,6 @@ extern "C" {
* Solution: Increase the configured number of resources for queues. * Solution: Increase the configured number of resources for queues.
*/ */
#define LOS_ERRNO_QUEUE_CB_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x04) #define LOS_ERRNO_QUEUE_CB_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_QUE, 0x04)
/*这段代码定义了一个名为 LOS_ERRNO_QUEUE_NO_MEMORY 的宏,用于表示队列分配内存失败时的错误码。
使 LOS_ERRNO_OS_ERROR LOS_MOD_QUE 0x01LOS_MOD_QUE
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
@ -374,21 +356,6 @@ typedef struct tagQueueInfo {
} QUEUE_INFO_S; } QUEUE_INFO_S;
#ifdef LOSCFG_QUEUE_STATIC_ALLOCATION #ifdef LOSCFG_QUEUE_STATIC_ALLOCATION
/*这段代码定义了一个结构体 QUEUE_INFO_S用于描述队列Queue的信息。
uwQueueID ID
usQueueLen
usQueueSize
usQueueHead
usQueueTail
usWritableCnt
usReadableCnt
uwWaitReadTask 64 ID 64 ID 63
uwWaitWriteTask uwWaitReadTask
uwWaitMemTask uwWaitReadTask
LOSCFG_QUEUE_STATIC_ALLOCATION */
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Create a message queue. * @brief Create a message queue.
@ -430,16 +397,7 @@ extern UINT32 LOS_QueueCreateStatic(const CHAR *queueName,
VOID *queueMem, VOID *queueMem,
UINT16 memSize); UINT16 memSize);
#endif #endif
/*该函数用于静态创建一个队列Queue具体参数如下
queueName const CHAR*
len UINT16
queueId UINT32 ID
flags UINT32
maxMsgSize UINT16
queueMem VOID*
memSize UINT16
ID*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Create a message queue. * @brief Create a message queue.
@ -473,14 +431,7 @@ extern UINT32 LOS_QueueCreate(const CHAR *queueName,
UINT32 *queueId, UINT32 *queueId,
UINT32 flags, UINT32 flags,
UINT16 maxMsgSize); UINT16 maxMsgSize);
/*该函数用于动态创建一个队列Queue具体参数如下
queueName const CHAR*
len UINT16
queueId UINT32 ID
flags UINT32
maxMsgSize UINT16
ID*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Read a queue. * @brief Read a queue.
@ -530,7 +481,7 @@ extern UINT32 LOS_QueueReadCopy(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 *bufferSize, UINT32 *bufferSize,
UINT32 timeout); UINT32 timeout);
/*该函数的作用是从队列中读取数据,并将数据复制到指定的缓冲区中。如果队列中没有数据可读,则根据超时时间等待数据可读,如果在超时时间内仍然没有数据可读,则返回错误码。*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Write data into a queue. * @brief Write data into a queue.
@ -578,13 +529,7 @@ extern UINT32 LOS_QueueWriteCopy(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 bufferSize, UINT32 bufferSize,
UINT32 timeout); UINT32 timeout);
/*该函数用于向指定的队列中写入数据,具体参数如下:
queueId ID UINT32
bufferAddr VOID*
bufferSize UINT32
timeout Tick 0 LOS_WAIT_FOREVER UINT32
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Read a queue. * @brief Read a queue.
@ -636,13 +581,7 @@ extern UINT32 LOS_QueueRead(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 bufferSize, UINT32 bufferSize,
UINT32 timeout); UINT32 timeout);
/*该函数用于从指定的队列中读取数据,具体参数如下:
queueId ID UINT32
bufferAddr VOID*
bufferSize UINT32
timeout Tick 0 LOS_WAIT_FOREVER UINT32
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Write data into a queue. * @brief Write data into a queue.
@ -691,13 +630,7 @@ extern UINT32 LOS_QueueWrite(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 bufferSize, UINT32 bufferSize,
UINT32 timeout); UINT32 timeout);
/*该函数用于向指定的队列中写入数据,具体参数如下:
queueId ID UINT32
bufferAddr VOID*
bufferSize UINT32
timeout Tick 0 LOS_WAIT_FOREVER UINT32
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Write data into a queue header. * @brief Write data into a queue header.
@ -746,13 +679,7 @@ extern UINT32 LOS_QueueWriteHead(UINT32 queueId,
VOID *bufferAddr, VOID *bufferAddr,
UINT32 bufferSize, UINT32 bufferSize,
UINT32 timeout); UINT32 timeout);
/*该函数用于向指定队列的队首写入数据,具体参数如下:
queueId ID UINT32
bufferAddr VOID*
bufferSize UINT32
timeout Tick 0 LOS_WAIT_FOREVER UINT32
*/
/** /**
* @ingroup los_queue * @ingroup los_queue
* @brief Write data into a queue header. * @brief Write data into a queue header.

@ -51,14 +51,7 @@ typedef enum {
RBUF_UNINIT, /**< Ringbuf is not inited. */ RBUF_UNINIT, /**< Ringbuf is not inited. */
RBUF_INITED /**< Ringbuf is inited. */ RBUF_INITED /**< Ringbuf is inited. */
} RingbufStatus; } RingbufStatus;
/*这段代码定义了一个名为 RingbufStatus 的枚举类型,表示环形缓冲区的状态。
RBUF_UNINIT
RBUF_INITED
使便
使*/
/** /**
* @ingroup los_ringbuf * @ingroup los_ringbuf
* Ringbuf information structure. * Ringbuf information structure.
@ -73,18 +66,7 @@ typedef struct {
RingbufStatus status; /**< Ringbuf status */ RingbufStatus status; /**< Ringbuf status */
CHAR *fifo; /**< Buf to store data */ CHAR *fifo; /**< Buf to store data */
} Ringbuf; } Ringbuf;
/*这段代码定义了一个名为 Ringbuf 的结构体,用于表示环形缓冲区的属性和状态。
startIdx
endIdx
size
remain
lock
status RingbufStatus
fifo
便*/
/** /**
* @ingroup los_ringbuf * @ingroup los_ringbuf
* @brief Init a ringbuf. * @brief Init a ringbuf.
@ -107,8 +89,7 @@ fifo
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern UINT32 LOS_RingbufInit(Ringbuf *ringbuf, CHAR *fifo, UINT32 size); extern UINT32 LOS_RingbufInit(Ringbuf *ringbuf, CHAR *fifo, UINT32 size);
/*该函数的作用是根据给定的参数初始化环形缓冲区对象,并分配必要的资源。通过调用这个函数,可以将一个已经定义的 Ringbuf
*/
/** /**
* @ingroup los_ringbuf * @ingroup los_ringbuf
* @brief Reset a ringbuf. * @brief Reset a ringbuf.
@ -150,9 +131,7 @@ extern VOID LOS_RingbufReset(Ringbuf *ringbuf);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern UINT32 LOS_RingbufWrite(Ringbuf *ringbuf, const CHAR *buf, UINT32 size); extern UINT32 LOS_RingbufWrite(Ringbuf *ringbuf, const CHAR *buf, UINT32 size);
/*该函数的作用是将指定大小的数据从源缓冲区写入到目标环形缓冲区中。写入操作会更新环形缓冲区的写入索引,并根据需要循环覆盖已有数据。如果环形缓冲区的空间不足以容纳全部数据,只会写入部分数据。
便*/
/** /**
* @ingroup los_ringbuf * @ingroup los_ringbuf
* @brief Read data from ringbuf. * @brief Read data from ringbuf.
@ -174,9 +153,7 @@ extern UINT32 LOS_RingbufWrite(Ringbuf *ringbuf, const CHAR *buf, UINT32 size);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern UINT32 LOS_RingbufRead(Ringbuf *ringbuf, CHAR *buf, UINT32 size); extern UINT32 LOS_RingbufRead(Ringbuf *ringbuf, CHAR *buf, UINT32 size);
/*该函数的作用是从指定大小的数据中读取数据,并将其存储到目标缓冲区。读取操作会更新环形缓冲区的读取索引,并根据需要循环读取已有数据。如果环形缓冲区中的数据不足以满足全部读取请求,只会读取部分数据。
便*/
/** /**
* @ingroup los_ringbuf * @ingroup los_ringbuf
* @brief Get a ringbuf's used size. * @brief Get a ringbuf's used size.

@ -25,16 +25,16 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*该函数定义提供了运行停止功能所需的接口和参数类型,为嵌入式系统中的运行停止操作提供了基本的支持
/** /**
* @defgroup los_runstop Wakeup * @defgroup los_runstop Wakeup
* @ingroup kernel * @ingroup kernel
*/ */
#ifndef _LOS_RUNSTOP_H 组的定义:该组包含了一些与运行停止有关的函数和宏定义。 #ifndef _LOS_RUNSTOP_H
#define _LOS_RUNSTOP_H #define _LOS_RUNSTOP_H
#include "los_typedef.h"包含了 LOS Kernel 所需的基本类型定义。 #include "los_typedef.h"
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
@ -43,7 +43,7 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/** /**
* @ingroup los_runstop ## * @ingroup los_runstop
* @brief Define the type of a runstop callback function. * @brief Define the type of a runstop callback function.
* *
* @par Description: * @par Description:
@ -63,7 +63,7 @@ extern "C" {
* @see None. * @see None.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
typedef VOID (*RUNSTOP_CALLBACK_FUNC)(VOID);/*函数指针类型RUNSTOP_CALLBACK_FUNC用于定义运行停止时的回调函数没有参数和返回值 typedef VOID (*RUNSTOP_CALLBACK_FUNC)(VOID);
/** /**
* @ingroup los_runstop * @ingroup los_runstop
@ -88,10 +88,7 @@ typedef VOID (*RUNSTOP_CALLBACK_FUNC)(VOID);/*函数指针类型RUNSTOP_CALLBACK
* @see None. * @see None.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
typedef INT32 (*FLASH_READ_FUNC)(VOID *memAddr, size_t start, size_t size);/*定义了一个名为FLASH_READ_FUNC的函数指针类型用于定义一个从Flash中读取数据的函数 typedef INT32 (*FLASH_READ_FUNC)(VOID *memAddr, size_t start, size_t size);
memAddrFlash
startFlash
sizeFlash
/** /**
* @ingroup los_runstop * @ingroup los_runstop
@ -116,10 +113,7 @@ size从Flash中读取的数据大小。
* @see None. * @see None.
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
typedef INT32 (*FLASH_WRITE_FUNC)(VOID *memAddr, size_t start, size_t size);/*定义一个用于写入flash数据的函数类 typedef INT32 (*FLASH_WRITE_FUNC)(VOID *memAddr, size_t start, size_t size);
memAddrflash
startflash
sizeflash
/** /**
* @ingroup los_runstop * @ingroup los_runstop
@ -128,17 +122,20 @@ size要写入到某个flash的数据的大小
* Information of specified parameters passed in during runstop. * Information of specified parameters passed in during runstop.
*/ */
typedef struct tagRunstopParam { typedef struct tagRunstopParam {
RUNSTOP_CALLBACK_FUNC pfIdleWakeupCallback; /*< 空闲任务中的唤醒回调函数 */ RUNSTOP_CALLBACK_FUNC pfIdleWakeupCallback; /* < Wake up callback function, called in idle task */
RUNSTOP_CALLBACK_FUNC pfWakeupCallback; /*< 唤醒回调函数 */ RUNSTOP_CALLBACK_FUNC pfWakeupCallback; /* < Wake up callback function */
RUNSTOP_CALLBACK_FUNC pfImageDoneCallback; /*< 内存存储完成后的回调函数 */ RUNSTOP_CALLBACK_FUNC pfImageDoneCallback; /* < Image done callback function, called just after memory is stored */
FLASH_READ_FUNC pfFlashReadFunc; /*< 从某个闪存中读取数据的抽象函数 */ FLASH_READ_FUNC pfFlashReadFunc; /* < An abstract function for reading data from a certain flash */
FLASH_WRITE_FUNC pfFlashWriteFunc; /*< 向某个闪存中写入数据的抽象函数 */ FLASH_WRITE_FUNC pfFlashWriteFunc; /* < An abstract function for writing data to a certain flash */
size_t uwFlashReadAlignSize; /*< 从某个闪存中读取数据时的块对齐大小 */ size_t uwFlashReadAlignSize; /* < Block align size when reading data from a certain flash */
size_t uwFlashEraseAlignSize; /*< 擦除某个闪存中数据时的块对齐大小 */ size_t uwFlashEraseAlignSize; /* < Block align size when erasing data in a certain flash */
size_t uwFlashWriteAlignSize; /*< 向某个闪存中写入数据时的块对齐大小 */ size_t uwFlashWriteAlignSize; /* < Block align size when writing data to a certain flash */
UINTPTR uwWowFlashAddr; /* < 存储内存的闪存起始地址,地址应与闪存写入对齐长度对齐 */ UINTPTR uwWowFlashAddr; /* < The flash starting address to which the memory is to be
UINTPTR uwImageFlashAddr; /* < 整个应用程序镜像烧录到的闪存起始地址 */ stored, the address should be flash write-alignment length
} RUNSTOP_PARAM_S;/*是用于传递和配置运行停止功能所需的参数信息 aligned */
UINTPTR uwImageFlashAddr; /* < The flash starting address where the whole application image
is burned */
} RUNSTOP_PARAM_S;
/** /**
* @ingroup los_runstop * @ingroup los_runstop
@ -162,8 +159,8 @@ typedef struct tagRunstopParam {
* @see * @see
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_MakeImage(const RUNSTOP_PARAM_S *runstopParam);/*定义了一个名为LOS_MakeImage的函数用于将内存映像存储到flash中。 extern VOID LOS_MakeImage(const RUNSTOP_PARAM_S *runstopParam);
runstopParamrunstop使flash
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这段代码实现了对信号量操作的基本功能,包括创建、删除、请求和释放信号量,并对可能出现的错误情况进行了定义和说明。*/
/** /**
* @defgroup los_sem Semaphore * @defgroup los_sem Semaphore
* @ingroup kernel * @ingroup kernel
@ -49,17 +49,17 @@ extern "C" {
* @ingroup los_sem * @ingroup los_sem
* Max count of counting semaphores * Max count of counting semaphores
*/ */
#define LOS_SEM_COUNT_MAX 0xFFFE/*计数信号量的最大值*/ #define LOS_SEM_COUNT_MAX 0xFFFE
/** /**
* @ingroup los_sem * @ingroup los_sem
* Semaphore error code: The memory is insufficient. * Semaphore error code: The memory is insufficient.
* *
* Value: 0x02000700. * Value: 0x02000700.
* *
* Solution: Allocate more memory. * Solution: Allocate more memory.
*/ */
#define LOS_ERRNO_SEM_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x00)/*定义一个信号量Semaphore的错误码表示内存不足 #define LOS_ERRNO_SEM_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x00)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -72,15 +72,14 @@ extern "C" {
#define LOS_ERRNO_SEM_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x01) #define LOS_ERRNO_SEM_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x01)
/** /**
* @ingroup los_sem * @ingroup los_sem
* Semaphore error code: Null pointer. * Semaphore error code: Null pointer.
* *
* Value: 0x02000702. * Value: 0x02000702.
* *
* Solution: Change the passed-in null pointer to a valid non-null pointer. * Solution: Change the passed-in null pointer to a valid non-null pointer.
*/ */
#define LOS_ERRNO_SEM_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x02)/*这段代码定义了一个信号量模块的错误码,表示参数无效 #define LOS_ERRNO_SEM_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x02)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -88,9 +87,9 @@ extern "C" {
* *
* Value: 0x02000703. * Value: 0x02000703.
* *
* Solution: Perform corresponding operations based on the requirements in the code context. * Solution: Perform corresponding operations based on the requirements in the code context.
*/ */
#define LOS_ERRNO_SEM_ALL_BUSY LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x03)/*定义了一个信号量模块的错误码,表示没有可用的信号量控制结构*/ #define LOS_ERRNO_SEM_ALL_BUSY LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x03)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -98,9 +97,9 @@ extern "C" {
* *
* Value: 0x02000704. * Value: 0x02000704.
* *
* Solution: Change the passed-in parameter value to a valid nonzero value. * Solution: Change the passed-in parameter value to a valid nonzero value.
*/ */
#define LOS_ERRNO_SEM_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x04)/*定义了一个信号量模块的错误码,表示指定的超时时间参数无效*/ #define LOS_ERRNO_SEM_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x04)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -108,9 +107,9 @@ extern "C" {
* *
* Value: 0x02000705. * Value: 0x02000705.
* *
* Solution: Do not call the API during an interrupt.a:API * Solution: Do not call the API during an interrupt.
*/ */
#define LOS_ERRNO_SEM_PEND_INTERR LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x05)/*定义了一个信号量模块的错误码表示在中断期间调用了该API这是被禁止的*/ #define LOS_ERRNO_SEM_PEND_INTERR LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x05)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -118,9 +117,9 @@ extern "C" {
* *
* Value: 0x02000706. * Value: 0x02000706.
* *
* Solution: Do not call LOS_SemPend when task scheduling is locked.LOS_SemPend * Solution: Do not call LOS_SemPend when task scheduling is locked.
*/ */
#define LOS_ERRNO_SEM_PEND_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x06)/*定义了一个信号量模块的错误码,表示由于任务调度被锁定,任务无法请求信号量*/ #define LOS_ERRNO_SEM_PEND_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x06)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -128,9 +127,9 @@ extern "C" {
* *
* Value: 0x02000707. * Value: 0x02000707.
* *
* Solution: Change the passed-in parameter value to the value within the valid range. * Solution: Change the passed-in parameter value to the value within the valid range.
*/ */
#define LOS_ERRNO_SEM_TIMEOUT LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x07)/*定义了一个信号量模块的错误码,表示请求信号量超时*/ #define LOS_ERRNO_SEM_TIMEOUT LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x07)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -138,9 +137,9 @@ extern "C" {
* *
* Value: 0x02000708. * Value: 0x02000708.
* *
* Solution: Perform corresponding operations based on the requirements in the code context. * Solution: Perform corresponding operations based on the requirements in the code context.
*/ */
#define LOS_ERRNO_SEM_OVERFLOW LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x08)/*定义了一个信号量模块的错误码,表示信号量释放的次数超过了允许的最大次数 #define LOS_ERRNO_SEM_OVERFLOW LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x08)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -149,9 +148,9 @@ extern "C" {
* *
* Value: 0x02000709. * Value: 0x02000709.
* *
* Solution: Delete the semaphore after awaking all tasks that are waiting on the semaphore. * Solution: Delete the semaphore after awaking all tasks that are waiting on the semaphore.
*/ */
#define LOS_ERRNO_SEM_PENDED LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x09)/*定义了一个信号量模块的错误码,表示等待信号量的任务队列不为空*/ #define LOS_ERRNO_SEM_PENDED LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x09)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -160,10 +159,10 @@ extern "C" {
* *
* Value: 0x0200070A. * Value: 0x0200070A.
* *
* Solution: Do not call the API in the system-level callback.API * Solution: Do not call the API in the system-level callback.
* @deprecated This error code is obsolete since LiteOS 5.0.0.LiteOS 5.0.0 * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_SEM_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x0A)/*定义了一个信号量模块的错误码表示在系统级回调中调用了该API这是被禁止的*/ #define LOS_ERRNO_SEM_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x0A)
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -188,8 +187,7 @@ extern "C" {
* @see LOS_SemDelete | LOS_BinarySemCreate * @see LOS_SemDelete | LOS_BinarySemCreate
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle);/*这段代码声明了一个函数LOS_SemCreate用于创建信号量。该函数根据传入的初始可用信号量数量 extern UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle);
ID*/
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -214,7 +212,7 @@ extern UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle);/*这段代码声
* @see LOS_SemCreate | LOS_SemDelete * @see LOS_SemCreate | LOS_SemDelete
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle);/*声明了一个函数原型 LOS_BinarySemCreate用于创建一个二进制信号量。*/ extern UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle);
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -237,7 +235,7 @@ extern UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle);/*声明了
* @see LOS_SemCreate | LOS_BinarySemCreate * @see LOS_SemCreate | LOS_BinarySemCreate
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SemDelete(UINT32 semHandle);/*这段代码定义了一个函数LOS_SemDelete用于删除一个信号量的控制结构*/ extern UINT32 LOS_SemDelete(UINT32 semHandle);
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -274,19 +272,7 @@ extern UINT32 LOS_SemDelete(UINT32 semHandle);/*这段代码定义了一个函
* @see LOS_SemPost | LOS_SemCreate | LOS_BinarySemCreate * @see LOS_SemPost | LOS_SemCreate | LOS_BinarySemCreate
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout);/*该函数用于请求一个信号量 extern UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout);
semHandleIDID
timeouttimeout0timeout0xFFFFFFFFTick
LOS_ERRNO_SEM_INVALIDsemHandle
LOS_ERRNO_SEM_UNAVAILABLE
LOS_ERRNO_SEM_PEND_INTERR [Something went wrong, please try again later.]
*/
/** /**
* @ingroup los_sem * @ingroup los_sem
@ -308,12 +294,7 @@ timeout参数指定等待信号量的超时时间如果timeout值为0
* @see LOS_SemPend | LOS_SemCreate | LOS_BinarySemCreate * @see LOS_SemPend | LOS_SemCreate | LOS_BinarySemCreate
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SemPost(UINT32 semHandle);/*这段代码定义了一个函数LOS_SemPost用于释放一个信号量*/ extern UINT32 LOS_SemPost(UINT32 semHandle);
/*LOS_SemPost用于释放由semHandle指定的信号量控制结构。
LOS_ERRNO_SEM_INVALID
LOS_ERRNO_SEM_OVERFLOW
LOS_OK
LOS_SemPendLOS_SemCreateLOS_BinarySemCreate*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*以上代码是关于内存管理中的slab功能的实现。Slab是一种分配固定大小的内存块的机制用于提高内存分配和释放的效率。以上代码提供了对slab内存分配器的配置和定义*/
/** /**
* @defgroup los_slab Slab * @defgroup los_slab Slab
* @ingroup kernel * @ingroup kernel
@ -46,9 +46,9 @@ extern "C" {
* @ingroup los_slab * @ingroup los_slab
* total size of each slab class. * total size of each slab class.
*/ */
#define SLAB_MEM_ALLOCATOR_SIZE 512U /*宏定义SLAB_MEM_ALLOCATOR_SIZE表示每个slab class一种内存分配方式所需要的总大小为512字节*/ #define SLAB_MEM_ALLOCATOR_SIZE 512U
#define SLAB_BASIC_NEED_SIZE 0x1000 /*宏定义SLAB_BASIC_NEED_SIZE表示内存分配时最小需要的空间为0x1000字节即4KB。*/ #define SLAB_BASIC_NEED_SIZE 0x1000
/** /**
* @ingroup los_slab * @ingroup los_slab
@ -63,14 +63,7 @@ enum SlabBucketSizeType {
#define SLAB_MEM_BUCKET_SIZE_TYPE SLAB_BUCKET_SIZE_HALF_OF_HEAP #define SLAB_MEM_BUCKET_SIZE_TYPE SLAB_BUCKET_SIZE_HALF_OF_HEAP
#endif #endif
/*这段代码主要是用于配置和定义slab内存分配器中内存块大小的相关选项。*/
/*这段代码定义了一个枚举类型SlabBucketSizeType用于表示slab bucket内存块的大小类型
LOSCFG_KERNEL_MEM_SLAB_AUTO_EXPANSION_MODESlabBucketSizeType
SlabBucketSizeType
SLAB_BUCKET_SIZE_HALF_OF_HEAPslab使
SLAB_BUCKET_SIZE_QUARTER_OF_HEAPslab使
SLAB_BUCKET_SIZE_TYPE_MAX
SLAB_MEM_BUCKET_SIZE_TYPESLAB_BUCKET_SIZE_HALF_OF_HEAPslab*/
/** /**
* @ingroup los_slab * @ingroup los_slab
* @brief configure slab size. * @brief configure slab size.
@ -93,11 +86,8 @@ SLAB_BUCKET_SIZE_TYPE_MAX表示枚举类型的最大取值。
* </ul> * </ul>
* @since Huawei LiteOS V200R003C00 * @since Huawei LiteOS V200R003C00
*/ */
extern VOID LOS_SlabSizeCfg(UINT32 *cfg, UINT32 cnt);/*段代码是关于操作系统内存管理中的slab功能的配置函数。Slab是一种分配固定大小的内存块的机制 extern VOID LOS_SlabSizeCfg(UINT32 *cfg, UINT32 cnt);
*/
/*该函数LOS_SlabSizeCfg用于配置slab的大小。它接受两个参数
cfgslabslab
cntslab*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
/*以上代码实现了自旋锁的基本操作,并根据多处理器系统和非多处理器系统分别进行了处理*/
/** /**
* @defgroup los_spinlock Spinlock * @defgroup los_spinlock Spinlock
* @ingroup kernel * @ingroup kernel
@ -55,19 +55,13 @@ extern "C" {
#define LOCKDEP_CHECK_OUT(lock) OsLockDepCheckOut(lock) #define LOCKDEP_CHECK_OUT(lock) OsLockDepCheckOut(lock)
#define LOCKDEP_CLEAR_LOCKS() OsLockdepClearSpinlocks() #define LOCKDEP_CLEAR_LOCKS() OsLockdepClearSpinlocks()
#define SPIN_LOCK_INITIALIZER(lockName) \/*这段代码看起来是定义了一个自旋锁的初始化器。不同的编译选项将定义不同的初始化器*/ #define SPIN_LOCK_INITIALIZER(lockName) \
{ \ { \
.rawLock = 0U, \ .rawLock = 0U, \
.cpuid = (UINT32)(-1), \ .cpuid = (UINT32)(-1), \
.owner = SPINLOCK_OWNER_INIT, \ .owner = SPINLOCK_OWNER_INIT, \
.name = #lockName, \ .name = #lockName, \
} }
/*当预定义宏为真时SPIN_LOCK_INITIALIZER宏会被展开为一个结构体初始化器其中包含了一些成员变量的初始化包括
.rawLock0;
.cpuidCPU-1;
.ownerSPINLOCK_OWNER_INIT
.name
SPIN_LOCK_INITIALIZER*/
#else #else
#define LOCKDEP_CHECK_IN(lock) #define LOCKDEP_CHECK_IN(lock)
#define LOCKDEP_RECORD(lock) #define LOCKDEP_RECORD(lock)
@ -78,8 +72,7 @@ extern "C" {
.rawLock = 0U, \ .rawLock = 0U, \
} }
#endif #endif
/*
LOCKDEP_CHECK_INLOCKDEP_RECORDLOCKDEP_CHECK_OUTLOCKDEP_CLEAR_LOCKS*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
* <ul> * <ul>
@ -94,8 +87,8 @@ extern "C" {
* obtained. For time-consuming operation, the mutex lock can be used instead of spinlock.</li> * obtained. For time-consuming operation, the mutex lock can be used instead of spinlock.</li>
* </ul> * </ul>
*/ */
#define SPIN_LOCK_INIT(lock) SPIN_LOCK_S lock = SPIN_LOCK_INITIALIZER(lock)/*这段代码定义了一个宏SPIN_LOCK_INIT用于将输入参数lock定义为自旋锁并静态地初始化自旋锁*/ #define SPIN_LOCK_INIT(lock) SPIN_LOCK_S lock = SPIN_LOCK_INITIALIZER(lock)
/*该宏主要用于定义和初始化自旋锁,用于保护对共享资源的短时间访问。在使用自旋锁时,需要注意避免使用在耗时较长的操作上,以免影响整体系统性能*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
* Define the structure of spinlock. * Define the structure of spinlock.
@ -111,13 +104,8 @@ struct Spinlock {
const CHAR *name; /**< the lock owner's task name. It is defined only when const CHAR *name; /**< the lock owner's task name. It is defined only when
LOSCFG_KERNEL_SMP_LOCKDEP is defined. */ LOSCFG_KERNEL_SMP_LOCKDEP is defined. */
#endif #endif
};/*这段代码定义了一个名为Spinlock的结构体用于表示自旋锁的结构*/ };
/*结构体Spinlock包括以下成员变量
rawLocksize_t
cpuidCPUUINT32LOSCFG_KERNEL_SMP_LOCKDEP
ownerVOID*LOSCFG_KERNEL_SMP_LOCKDEP
nameconst CHAR*LOSCFG_KERNEL_SMP_LOCKDEP*/
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
@ -158,14 +146,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinLock(SPIN_LOCK_S *lock)
LOCKDEP_CHECK_IN(lock); LOCKDEP_CHECK_IN(lock);
ArchSpinLock(&lock->rawLock); ArchSpinLock(&lock->rawLock);
LOCKDEP_RECORD(lock); LOCKDEP_RECORD(lock);
}/*这段代码实现了自旋锁的加锁操作函数名称为LOS_SpinLock。它接收一个类型为SPIN_LOCK_S*的指针参数lock表示要加锁的自旋锁。*/ }
/*在函数内部首先调用LOS_TaskLock函数禁用调度器以确保当前任务不会被切换出去。然后调用LOCKDEP_CHECK_IN宏和LOCKDEP_RECORD宏用于记录锁依赖关系
ArchSpinLock
LOSCFG_KERNEL_SMP_LOCKDEPLOS_SpinLockLOS_LockdepCpuTryInit
使
线线线
SMP*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
@ -204,11 +185,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE INT32 LOS_SpinTrylock(SPIN_LOCK_S *lock)
} }
return ret; return ret;
}/*这段代码实现了自旋锁的尝试加锁操作函数名称为LOS_SpinTrylock。它接收一个类型为SPIN_LOCK_S*的指针参数lock表示要尝试加锁的自旋锁*/ }
/*首先调用LOS_TaskLock函数禁用调度器以确保当前任务不会被切换出去。然后调用LOCKDEP_CHECK_IN宏用于记录锁依赖关系并最终调用ArchSpinTrylock函数尝试对自旋
ArchSpinTrylockLOS_OKLOCKDEP_RECORDLOS_OK线
ArchSpinTrylockLOS_NOK*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
@ -238,10 +215,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlock(SPIN_LOCK_S *lock)
/* restore the scheduler flag */ /* restore the scheduler flag */
LOS_TaskUnlock(); LOS_TaskUnlock();
}/*这段代码实现了自旋锁的解锁操作函数名称为LOS_SpinUnlock。它接收一个类型为SPIN_LOCK_S*的指针参数lock表示要解锁的自旋锁。*/ }
/*在函数内部首先调用LOCKDEP_CHECK_OUT宏用于检查并记录锁依赖关系并最终调用ArchSpinUnlock函数对自旋锁进行解锁操作。
LOS_TaskUnlock*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
@ -275,11 +249,8 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UI
{ {
*intSave = LOS_IntLock(); *intSave = LOS_IntLock();
LOS_SpinLock(lock); LOS_SpinLock(lock);
}/*这段代码实现了自旋锁的带保存中断状态的加锁操作函数名称为LOS_SpinLockSave。它接收一个类型为SPIN_LOCK_S*的指针参数lock }
UINT32*intSave*/
/*在函数内部首先调用LOS_IntLock函数禁用所有中断并将禁用前的中断状态保存到intSave指向的地址中。然后调用LOS_SpinLock函数对自旋锁进行加锁操作。
*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
* @brief Unlock the spinlock and restore the interrupt flag. * @brief Unlock the spinlock and restore the interrupt flag.
@ -308,11 +279,8 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *loc
{ {
LOS_SpinUnlock(lock); LOS_SpinUnlock(lock);
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
}/*这段代码实现了自旋锁的解锁操作并恢复中断状态。函数名称为LOS_SpinUnlockRestore。它接收一个类型为SPIN_LOCK_S*的指针参数lock表示要解锁的自旋锁 }
UINT32intSave*/
/*在函数内部首先调用LOS_SpinUnlock函数对自旋锁进行解锁操作然后调用LOS_IntRestore函数恢复中断状态参数为之前保存的中断状态intSave。
LOS_SpinLockSaveintSaveLOS_SpinLockSave*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
* @brief Check if holding the spinlock. * @brief Check if holding the spinlock.
@ -337,9 +305,8 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *loc
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_SpinHeld(const SPIN_LOCK_S *lock) LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_SpinHeld(const SPIN_LOCK_S *lock)
{ {
return (lock->rawLock != 0); return (lock->rawLock != 0);
}/*这段代码实现了检查自旋锁是否被持有的功能。函数名称为LOS_SpinHeld。它接收一个类型为SPIN_LOCK_S*的指针参数lock表示要检查的自旋锁*/ }
/*在函数内部通过判断自旋锁的rawLock成员变量是否为0来确定自旋锁是否被持有。如果rawLock不为0则表示自旋锁被持有返回TRUE否则表示自旋锁未被持有返回FALSE*/
/** /**
* @ingroup los_spinlock * @ingroup los_spinlock
* @brief Spinlock dynamic initialization. * @brief Spinlock dynamic initialization.
@ -372,13 +339,8 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinInit(SPIN_LOCK_S *lock)
lock->owner = SPINLOCK_OWNER_INIT; lock->owner = SPINLOCK_OWNER_INIT;
lock->name = "spinlock"; lock->name = "spinlock";
#endif #endif
}/*这段代码是用于动态初始化自旋锁的函数LOS_SpinInit。*/ }
/*函数接受一个类型为SPIN_LOCK_S*的指针参数lock表示需要初始化的自旋锁。
rawLock0LOSCFG_KERNEL_SMP_LOCKDEP
LOSCFG_KERNEL_SMP_LOCKDEPcpuid-1CPUowner
SPINLOCK_OWNER_INITname"spinlock"
LOSCFG_KERNEL_SMP_LOCKDEP*/
#else #else
/* /*
@ -423,15 +385,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinInit(SPIN_LOCK_S *lock)
{ {
(VOID)lock; (VOID)lock;
} }
/*上述代码中,是对于非多处理器系统的处理。这些函数并不实际处理自旋锁,而是为了统一代码的编写,以方便驱动程序、供应商等进行开发。
LOS_SpinLock
LOS_SpinTrylockLOS_OK
LOS_SpinUnlock
LOS_SpinLockSaveintSave
LOS_SpinUnlockRestore使intSave
LOS_SpinHeldTRUE
LOS_SpinInit*/
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这段代码是关于软件定时器的管理接口,主要包括软件定时器的创建、启动、停止、删除等操作。这段代码提供了一套完整的软件定时器管理接口,方便开发人员在嵌入式系统中实现基于时间的任务调度和处理。*/
/** /**
* @defgroup los_swtmr Software timer * @defgroup los_swtmr Software timer
* @ingroup kernel * @ingroup kernel
@ -51,15 +51,15 @@ extern "C" {
* *
* Solution: Define the timeout handling function. * Solution: Define the timeout handling function.
*/ */
#define LOS_ERRNO_SWTMR_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x00)/**/ #define LOS_ERRNO_SWTMR_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x00)
/*错误代码LOS_ERRNO_SWTMR_PTR_NULL表示软件定时器的超时处理函数为空。这意味着当定时器到期时没有要执行的函数*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The expiration time is 0. * Software timer error code: The expiration time is 0.
* *
* Value: 0x02000301. * Value: 0x02000301.
* *
* Solution: Re-define the expiration time./*要解决此错误,您需要为软件定时器定义一个超时处理函数。该函数将在定时器到期时被调用,并执行所需的操作。 * Solution: Re-define the expiration time.
*/ */
#define LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x01) #define LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x01)
@ -69,17 +69,17 @@ extern "C" {
* *
* Value: 0x02000302. * Value: 0x02000302.
* *
* Solution: Check the mode value. The value range is [0,3]./*要解决此错误您需要重新定义定时器的到期时间。确保到期时间大于0并且与您的需求相符。 * Solution: Check the mode value. The value range is [0,3].
*/ */
#define LOS_ERRNO_SWTMR_MODE_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x02) #define LOS_ERRNO_SWTMR_MODE_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x02)
/*错误代码LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITED表示定时器的到期时间为0。这意味着定时器的到期时间设置不合适*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The passed-in software timer ID is NULL. * Software timer error code: The passed-in software timer ID is NULL.
* *
* Value: 0x02000303. * Value: 0x02000303.
* *
* Solution: Define the software timer ID before passing it in.IDID使ID * Solution: Define the software timer ID before passing it in.
*/ */
#define LOS_ERRNO_SWTMR_RET_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x03) #define LOS_ERRNO_SWTMR_RET_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x03)
@ -90,20 +90,20 @@ extern "C" {
* Value: 0x02000304. * Value: 0x02000304.
* *
* Solution: Re-configure the permitted maximum number of software timers, or wait for a software timer to become * Solution: Re-configure the permitted maximum number of software timers, or wait for a software timer to become
* available. * available.
*/ */
#define LOS_ERRNO_SWTMR_MAXSIZE LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x04)/ #define LOS_ERRNO_SWTMR_MAXSIZE LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x04)
/*错误代码LOS_ERRNO_SWTMR_MAXSIZE表示软件定时器的数量超过了配置的允许最大数量。*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: Invalid software timer ID. * Software timer error code: Invalid software timer ID.
* *
* Value: 0x02000305. * Value: 0x02000305.
* *
* Solution: Pass in a valid software timer ID.ID * Solution: Pass in a valid software timer ID.
*/ */
#define LOS_ERRNO_SWTMR_ID_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x05) #define LOS_ERRNO_SWTMR_ID_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x05)
/*错误代码LOS_ERRNO_SWTMR_ID_INVALID表示软件计时器ID无效。*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The software timer is not created. * Software timer error code: The software timer is not created.
@ -113,7 +113,7 @@ extern "C" {
* Solution: Create a software timer. * Solution: Create a software timer.
*/ */
#define LOS_ERRNO_SWTMR_NOT_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x06) #define LOS_ERRNO_SWTMR_NOT_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x06)
/*错误代码LOS_ERRNO_SWTMR_NOT_CREATED表示软件计时器未创建*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: Insufficient memory for software timer linked list creation. * Software timer error code: Insufficient memory for software timer linked list creation.
@ -121,21 +121,20 @@ extern "C" {
* Value: 0x02000307. * Value: 0x02000307.
* *
* Solution: Allocate bigger memory partition to software timer linked list creation. * Solution: Allocate bigger memory partition to software timer linked list creation.
*
*/ */
#define LOS_ERRNO_SWTMR_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x07) #define LOS_ERRNO_SWTMR_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x07)
/*错误代码LOS_ERRNO_SWTMR_NO_MEMORY内存不足无法创建软件计时器链表*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: Invalid configured number of software timers. * Software timer error code: Invalid configured number of software timers.
* *
* Value: 0x02000308. * Value: 0x02000308.
* *
* Solution: Re-configure the number of software timers. * Solution: Re-configure the number of software timers.
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_SWTMR_MAXSIZE_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x08) #define LOS_ERRNO_SWTMR_MAXSIZE_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x08)
/*软件计时器错误代码:配置的软件计时器数量无效*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The software timer is being used during an interrupt. * Software timer error code: The software timer is being used during an interrupt.
@ -143,61 +142,60 @@ extern "C" {
* Value: 0x02000309. * Value: 0x02000309.
* *
* Solution: Change the source code and do not use the software timer during an interrupt. * Solution: Change the source code and do not use the software timer during an interrupt.
* 使
*/ */
#define LOS_ERRNO_SWTMR_HWI_ACTIVE LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x09) #define LOS_ERRNO_SWTMR_HWI_ACTIVE LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x09)
/*软件计时器错误代码:软件计时器在中断期间使用*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: Insufficient memory allocated by membox. * Software timer error code: Insufficient memory allocated by membox.
* *
* Value: 0x0200030a. * Value: 0x0200030a.
* *
* Solution: Expand the memory allocated by membox.membox * Solution: Expand the memory allocated by membox.
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_SWTMR_HANDLER_POOL_NO_MEM LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0a) #define LOS_ERRNO_SWTMR_HANDLER_POOL_NO_MEM LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0a)
/*软件计时器错误代码membox分配的内存不足*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The software timer queue fails to be created. * Software timer error code: The software timer queue fails to be created.
* *
* Value: 0x0200030b. * Value: 0x0200030b.
* *
* Solution: Check whether more memory can be allocated to the queue to be created. * Solution: Check whether more memory can be allocated to the queue to be created.
*/ */
#define LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0b) #define LOS_ERRNO_SWTMR_QUEUE_CREATE_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0b)
/*软件计时器错误代码:无法创建软件计时器队列。*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The software timer task fails to be created. * Software timer error code: The software timer task fails to be created.
* *
* Value: 0x0200030c. * Value: 0x0200030c.
* *
* Solution: Check whether the memory is sufficient and re-create the task. * Solution: Check whether the memory is sufficient and re-create the task.
*/ */
#define LOS_ERRNO_SWTMR_TASK_CREATE_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0c) #define LOS_ERRNO_SWTMR_TASK_CREATE_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0c)
/*软件计时器错误代码:无法创建软件计时器任务。*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The software timer is not started. * Software timer error code: The software timer is not started.
* *
* Value: 0x0200030d. * Value: 0x0200030d.
* *
* Solution: Start the software timer. * Solution: Start the software timer.
*/ */
#define LOS_ERRNO_SWTMR_NOT_STARTED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0d) #define LOS_ERRNO_SWTMR_NOT_STARTED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0d)
/*软件计时器错误代码:软件计时器未启动*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: Invalid software timer state. * Software timer error code: Invalid software timer state.
* *
* Value: 0x0200030e. * Value: 0x0200030e.
* *
* Solution: Check the software timer state. * Solution: Check the software timer state.
*/ */
#define LOS_ERRNO_SWTMR_STATUS_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0e) #define LOS_ERRNO_SWTMR_STATUS_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0e)
/*软件计时器错误代码:软件计时器状态无效*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: This error code is not in use temporarily. * Software timer error code: This error code is not in use temporarily.
@ -206,7 +204,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_SWTMR_SORTLIST_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0f) #define LOS_ERRNO_SWTMR_SORTLIST_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x0f)
/*软件计时器错误代码:此错误代码暂时未使用*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The passed-in number of remaining Ticks configured on the software timer is NULL. * Software timer error code: The passed-in number of remaining Ticks configured on the software timer is NULL.
@ -216,7 +214,7 @@ extern "C" {
* Solution: Define a variable of the number of remaining Ticks before passing in the number of remaining Ticks. * Solution: Define a variable of the number of remaining Ticks before passing in the number of remaining Ticks.
*/ */
#define LOS_ERRNO_SWTMR_TICK_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x10) #define LOS_ERRNO_SWTMR_TICK_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x10)
/*软件计时器错误代码软件计时器上配置的传入的剩余Tick数为NULL*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer error code: The software sortlink fails to be created. * Software timer error code: The software sortlink fails to be created.
@ -226,7 +224,7 @@ extern "C" {
* Solution: Check whether the memory is sufficient and re-create the sortlink. * Solution: Check whether the memory is sufficient and re-create the sortlink.
*/ */
#define LOS_ERRNO_SWTMR_SORTLINK_CREATE_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x11) #define LOS_ERRNO_SWTMR_SORTLINK_CREATE_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x11)
/*软件计时器错误代码:无法创建软件排序链接。*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* Software timer mode * Software timer mode
@ -239,11 +237,7 @@ enum enSwTmrType {
periodic software timer is enabled. The value periodic software timer is enabled. The value
is 3. This mode is not supported temporarily. */ is 3. This mode is not supported temporarily. */
}; };
/*这段代码定义了软件定时器的模式使用了一个枚举类型enSwTmrType来表示。其中包含以下几种模式
LOS_SWTMR_MODE_ONCE0
LOS_SWTMR_MODE_PERIOD1
LOS_SWTMR_MODE_NO_SELFDELETE2
LOS_SWTMR_MODE_OPP3*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* @brief Define the type of a callback function that handles software timer timeout. * @brief Define the type of a callback function that handles software timer timeout.
@ -263,7 +257,7 @@ LOS_SWTMR_MODE_OPP在一次性定时器完成定时后启用周期性软
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg); typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg);
/*这段代码定义了一个回调函数类型SWTMR_PROC_FUNC用于处理软件定时器超时事件。该回调函数在软件定时器超时时被调用*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* @brief Start a software timer. * @brief Start a software timer.
@ -286,12 +280,6 @@ typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SwtmrStart(UINT16 swtmrId); extern UINT32 LOS_SwtmrStart(UINT16 swtmrId);
/*这段代码是一个软件定时器模块中的函数LOS_SwtmrStart的声明。它用于启动一个指定ID的软件定时器。
LOS_ERRNO_SWTMR_ID_INVALIDID
LOS_ERRNO_SWTMR_NOT_CREATED
LOS_ERRNO_SWTMR_STATUS_INVALID
LOS_OK*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
@ -316,13 +304,7 @@ LOS_OK成功启动软件定时器。*/
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SwtmrStop(UINT16 swtmrId); extern UINT32 LOS_SwtmrStop(UINT16 swtmrId);
/*这段代码是一个软件定时器模块中的函数LOS_SwtmrStop的声明。它用于停止一个指定ID的软件定时器
LOS_ERRNO_SWTMR_ID_INVALIDID
LOS_ERRNO_SWTMR_NOT_CREATED
LOS_ERRNO_SWTMR_NOT_STARTED
LOS_ERRNO_SWTMR_STATUS_INVALID
LOS_OK*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* @brief Obtain the number of remaining Ticks configured on a software timer. * @brief Obtain the number of remaining Ticks configured on a software timer.
@ -349,14 +331,7 @@ LOS_OK成功停止软件定时器。*/
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SwtmrTimeGet(UINT16 swtmrId, UINT32 *tick); extern UINT32 LOS_SwtmrTimeGet(UINT16 swtmrId, UINT32 *tick);
/*这段代码是一个软件定时器模块中的函数LOS_SwtmrTimeGet的声明。它用于获取指定ID的软件定时器配置的剩余Ticks数
LOS_ERRNO_SWTMR_ID_INVALIDID
LOS_ERRNO_SWTMR_TICK_PTR_NULLtickNULL
LOS_ERRNO_SWTMR_NOT_CREATED
LOS_ERRNO_SWTMR_NOT_STARTED
LOS_ERRNO_SWTMR_STATUS_INVALID
LOS_OKTicks*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* @brief Create a software timer. * @brief Create a software timer.
@ -392,14 +367,7 @@ LOS_OK成功获取剩余Ticks数。*/
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrId, UINTPTR arg); extern UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrId, UINTPTR arg);
/*这段代码是一个软件定时器模块中的函数LOS_SwtmrCreate的声明。它用于创建一个具有指定定时时长、超时处理函数和触发模式的软件定时器并返回一个引用该软件定时器的句柄
LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITED0
LOS_ERRNO_SWTMR_MODE_INVALID
LOS_ERRNO_SWTMR_PTR_NULLNULL
LOS_ERRNO_SWTMR_RET_PTR_NULLIDNULL
LOS_ERRNO_SWTMR_MAXSIZE
LOS_OK*/
/** /**
* @ingroup los_swtmr * @ingroup los_swtmr
* @brief Delete a software timer. * @brief Delete a software timer.
@ -422,12 +390,7 @@ LOS_OK成功创建软件定时器。*/
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_SwtmrDelete(UINT16 swtmrId); extern UINT32 LOS_SwtmrDelete(UINT16 swtmrId);
/*这段代码是一个软件定时器模块中的函数LOS_SwtmrDelete的声明。它用于删除一个软件定时器。
LOS_ERRNO_SWTMR_ID_INVALIDID
LOS_ERRNO_SWTMR_NOT_CREATED
LOS_ERRNO_SWTMR_STATUS_INVALID
LOS_OK*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这个头文件提供了系统时间模块的接口和基本定义,为系统时间的管理提供了必要的支持*/
/** /**
* @defgroup los_sys System time * @defgroup los_sys System time
* @ingroup kernel * @ingroup kernel

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*以上代码是LiteOS系统中定义表格的头文件其中定义了一些宏用于在汇编代码中生成指定名称和标签的全局符号用于在LiteOS系统中实现一些底层硬件操作。
section*/
#ifndef _LOS_TABLES_H #ifndef _LOS_TABLES_H
#define _LOS_TABLES_H #define _LOS_TABLES_H
@ -48,7 +47,7 @@ extern "C" {
".previous\n" \ ".previous\n" \
) )
#endif #endif
/*这段代码定义了一个宏LOS_HAL_TABLE_WOW_BEGIN用于在汇编代码中声明一个LiteOS的表格开始位置。该宏使用了一些特定的汇编指令和标签定义*/
#ifndef LOS_HAL_TABLE_WOW_END #ifndef LOS_HAL_TABLE_WOW_END
#define LOS_HAL_TABLE_WOW_END(label, name) \ #define LOS_HAL_TABLE_WOW_END(label, name) \
__asm__(".section \".liteos.table." X_STRING(name) ".wow.finish\",\"aw\"\n" \ __asm__(".section \".liteos.table." X_STRING(name) ".wow.finish\",\"aw\"\n" \
@ -59,7 +58,7 @@ extern "C" {
".previous\n" \ ".previous\n" \
) )
#endif #endif
/*。该代码定义了一个名为LOS_HAL_TABLE_WOW_END的宏该宏的作用是在汇编代码中生成一个指定名称和标签的全局符号用于在LiteOS系统中实现一些底层硬件操作。*/
#ifndef LOS_HAL_TABLE_SCATTER_BEGIN #ifndef LOS_HAL_TABLE_SCATTER_BEGIN
#define LOS_HAL_TABLE_SCATTER_BEGIN(label, name) \ #define LOS_HAL_TABLE_SCATTER_BEGIN(label, name) \
__asm__(".section \".liteos.table." X_STRING(name) ".scatter.begin\",\"aw\"\n" \ __asm__(".section \".liteos.table." X_STRING(name) ".scatter.begin\",\"aw\"\n" \
@ -70,7 +69,7 @@ extern "C" {
".previous\n" \ ".previous\n" \
) )
#endif #endif
/*这是另一段C预处理器宏定义代码。该代码定义了一个名为LOS_HAL_TABLE_SCATTER_BEGIN的宏该宏的作用是在汇编代码中生成一个指定名称和标签的全局符号用于在LiteOS系统中实现一些底层硬件操作。*/
#ifndef LOS_HAL_TABLE_SCATTER_END #ifndef LOS_HAL_TABLE_SCATTER_END
#define LOS_HAL_TABLE_SCATTER_END(label, name) \ #define LOS_HAL_TABLE_SCATTER_END(label, name) \
__asm__(".section \".liteos.table." X_STRING(name) ".scatter.finish\",\"aw\"\n" \ __asm__(".section \".liteos.table." X_STRING(name) ".scatter.finish\",\"aw\"\n" \
@ -81,7 +80,7 @@ extern "C" {
".previous\n" \ ".previous\n" \
) )
#endif #endif
/*该代码定义了一个名为LOS_HAL_TABLE_SCATTER_END的宏用于在LiteOS系统中生成汇编代码中的全局符号*/
#ifndef LOS_HAL_TABLE_BEGIN #ifndef LOS_HAL_TABLE_BEGIN
#define LOS_HAL_TABLE_BEGIN(label, name) \ #define LOS_HAL_TABLE_BEGIN(label, name) \
__asm__(".section \".liteos.table." X_STRING(name) ".begin\",\"aw\"\n" \ __asm__(".section \".liteos.table." X_STRING(name) ".begin\",\"aw\"\n" \
@ -92,7 +91,7 @@ extern "C" {
".previous\n" \ ".previous\n" \
) )
#endif #endif
/*该代码定义了一个名为LOS_HAL_TABLE_BEGIN的宏该宏的作用是在汇编代码中生成一个指定名称和标签的全局符号用于在LiteOS系统中实现一些底层硬件操作。*/
#ifndef LOS_HAL_TABLE_END #ifndef LOS_HAL_TABLE_END
#define LOS_HAL_TABLE_END(label, name) \ #define LOS_HAL_TABLE_END(label, name) \
__asm__(".section \".liteos.table." X_STRING(name) ".finish\",\"aw\"\n" \ __asm__(".section \".liteos.table." X_STRING(name) ".finish\",\"aw\"\n" \
@ -103,41 +102,41 @@ extern "C" {
".previous\n" \ ".previous\n" \
) )
#endif #endif
/*该代码定义了一个名为LOS_HAL_TABLE_END的宏用于在LiteOS系统中生成汇编代码中的全局符号*/
/* This macro must be applied to any types whose objects are to be placed in tables */ /* This macro must be applied to any types whose objects are to be placed in tables */
#ifndef LOS_HAL_TABLE_TYPE #ifndef LOS_HAL_TABLE_TYPE
#define LOS_HAL_TABLE_TYPE LOSBLD_ATTRIB_ALIGN(LOSARC_ALIGNMENT) #define LOS_HAL_TABLE_TYPE LOSBLD_ATTRIB_ALIGN(LOSARC_ALIGNMENT)
#endif #endif
/*通过这个宏的定义,可以在代码中统一设置表的类型或属性,使得系统中使用的表在对齐等方面具有统一的特性*/
#ifndef LOS_HAL_TABLE_EXTRA #ifndef LOS_HAL_TABLE_EXTRA
#define LOS_HAL_TABLE_EXTRA(name) \ #define LOS_HAL_TABLE_EXTRA(name) \
LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".extra") LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".extra")
#endif #endif
/*该代码定义了一个名为LOS_HAL_TABLE_EXTRA的宏用于在LiteOS系统中生成汇编代码中的节section名称*/
#ifndef LOS_HAL_TABLE_WOW_ENTRY #ifndef LOS_HAL_TABLE_WOW_ENTRY
#define LOS_HAL_TABLE_WOW_ENTRY(name) \ #define LOS_HAL_TABLE_WOW_ENTRY(name) \
LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".wow.data") \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".wow.data") \
LOSBLD_ATTRIB_USED LOSBLD_ATTRIB_USED
#endif #endif
/*这段代码定义了一个名为LOS_HAL_TABLE_WOW_ENTRY的宏用于在LiteOS系统中生成汇编代码中的节section名称并将该符号标记为被使用。*/
#ifndef LOS_HAL_TABLE_SCATTER_ENTRY #ifndef LOS_HAL_TABLE_SCATTER_ENTRY
#define LOS_HAL_TABLE_SCATTER_ENTRY(name) \ #define LOS_HAL_TABLE_SCATTER_ENTRY(name) \
LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".scatter.data") \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".scatter.data") \
LOSBLD_ATTRIB_USED LOSBLD_ATTRIB_USED
#endif #endif
/*这段代码定义了一个名为LOS_HAL_TABLE_SCATTER_ENTRY的宏用于在LiteOS系统中生成汇编代码中的节section名称并将该符号标记为被使用*/
#ifndef LOS_HAL_TABLE_ENTRY #ifndef LOS_HAL_TABLE_ENTRY
#define LOS_HAL_TABLE_ENTRY(name) \ #define LOS_HAL_TABLE_ENTRY(name) \
LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data") \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data") \
LOSBLD_ATTRIB_USED LOSBLD_ATTRIB_USED
#endif #endif
/*该宏的作用是定义一个通用的节section用于存储数据并确保相关符号被正确使用和链接到系统的可执行文件中*/
#ifndef LOS_HAL_TABLE_QUALIFIED_ENTRY #ifndef LOS_HAL_TABLE_QUALIFIED_ENTRY
#define LOS_HAL_TABLE_QUALIFIED_ENTRY(name, _qual) \ #define LOS_HAL_TABLE_QUALIFIED_ENTRY(name, _qual) \
LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data." X_STRING(_qual)) \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data." X_STRING(_qual)) \
LOSBLD_ATTRIB_USED LOSBLD_ATTRIB_USED
#endif #endif
/*该宏的作用是定义一个用于存储特定类型数据的节section并将相关符号标记为被使用以确保可执行文件中包含该数据*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*该函数定义了一些任务错误情况以及一些关于任务处理的函数*/
/** /**
* @defgroup los_task Task * @defgroup los_task Task
* @ingroup kernel * @ingroup kernel
@ -58,7 +58,7 @@ extern "C" {
* automatically after the task is done. * automatically after the task is done.
*/ */
#define LOS_TASK_STATUS_DETACHED 0x0100U #define LOS_TASK_STATUS_DETACHED 0x0100U
/*LOS_TASK_STATUS_DETACHED是一个任务或者任务控制块状态的标志位。它表示任务处于自动删除状态。在这个状态下任务会在执行完毕后自动被删除*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Insufficient memory for task creation. * Task error code: Insufficient memory for task creation.
@ -68,7 +68,7 @@ extern "C" {
* Solution: Allocate bigger memory partition to task creation. * Solution: Allocate bigger memory partition to task creation.
*/ */
#define LOS_ERRNO_TSK_NO_MEMORY LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x00) #define LOS_ERRNO_TSK_NO_MEMORY LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x00)
/*任务错误代码:内存不足,无法创建任务。*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Null parameter. * Task error code: Null parameter.
@ -78,7 +78,7 @@ extern "C" {
* Solution: Check the parameter. * Solution: Check the parameter.
*/ */
#define LOS_ERRNO_TSK_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x01) #define LOS_ERRNO_TSK_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x01)
/*任务错误代码参数为Null*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task stack is not aligned. * Task error code: The task stack is not aligned.
@ -88,7 +88,7 @@ extern "C" {
* Solution: Align the task stack. * Solution: Align the task stack.
*/ */
#define LOS_ERRNO_TSK_STKSZ_NOT_ALIGN LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x02) #define LOS_ERRNO_TSK_STKSZ_NOT_ALIGN LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x02)
/*任务错误代码:任务堆栈未对齐*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Incorrect task priority. * Task error code: Incorrect task priority.
@ -98,7 +98,7 @@ extern "C" {
* Solution: Re-configure the task priority by referring to the priority range. * Solution: Re-configure the task priority by referring to the priority range.
*/ */
#define LOS_ERRNO_TSK_PRIOR_ERROR LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x03) #define LOS_ERRNO_TSK_PRIOR_ERROR LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x03)
/*任务错误代码:任务优先级不正确*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task entrance is NULL. * Task error code: The task entrance is NULL.
@ -108,7 +108,7 @@ extern "C" {
* Solution: Define the task entrance function. * Solution: Define the task entrance function.
*/ */
#define LOS_ERRNO_TSK_ENTRY_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x04) #define LOS_ERRNO_TSK_ENTRY_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x04)
/*任务错误代码任务入口为NULL*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task name is NULL. * Task error code: The task name is NULL.
@ -118,7 +118,7 @@ extern "C" {
* Solution: Set the task name. * Solution: Set the task name.
*/ */
#define LOS_ERRNO_TSK_NAME_EMPTY LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x05) #define LOS_ERRNO_TSK_NAME_EMPTY LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x05)
/*任务错误代码任务名称为NULL*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task stack size is too small. * Task error code: The task stack size is too small.
@ -128,7 +128,7 @@ extern "C" {
* Solution: Expand the task stack. * Solution: Expand the task stack.
*/ */
#define LOS_ERRNO_TSK_STKSZ_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x06) #define LOS_ERRNO_TSK_STKSZ_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x06)
/*任务错误代码:任务堆栈太小*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Invalid task ID. * Task error code: Invalid task ID.
@ -138,7 +138,7 @@ extern "C" {
* Solution: Check the task ID. * Solution: Check the task ID.
*/ */
#define LOS_ERRNO_TSK_ID_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x07) #define LOS_ERRNO_TSK_ID_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x07)
/*任务错误代码任务ID无效*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task is already suspended. * Task error code: The task is already suspended.
@ -148,7 +148,7 @@ extern "C" {
* Solution: Suspend the task after it is resumed. * Solution: Suspend the task after it is resumed.
*/ */
#define LOS_ERRNO_TSK_ALREADY_SUSPENDED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x08) #define LOS_ERRNO_TSK_ALREADY_SUSPENDED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x08)
/*任务错误代码:任务已挂起*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task is not suspended. * Task error code: The task is not suspended.
@ -158,7 +158,7 @@ extern "C" {
* Solution: Suspend the task. * Solution: Suspend the task.
*/ */
#define LOS_ERRNO_TSK_NOT_SUSPENDED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x09) #define LOS_ERRNO_TSK_NOT_SUSPENDED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x09)
/*任务错误代码:任务未挂起*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task is not created. * Task error code: The task is not created.
@ -168,7 +168,7 @@ extern "C" {
* Solution: Create the task. * Solution: Create the task.
*/ */
#define LOS_ERRNO_TSK_NOT_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0a) #define LOS_ERRNO_TSK_NOT_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0a)
/*任务错误代码:未创建任务*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task is locked when it is being deleted. * Task error code: The task is locked when it is being deleted.
@ -178,7 +178,7 @@ extern "C" {
* Solution: Unlock the task. * Solution: Unlock the task.
*/ */
#define LOS_ERRNO_TSK_DELETE_LOCKED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x0b) #define LOS_ERRNO_TSK_DELETE_LOCKED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x0b)
/*任务错误代码:删除任务时该任务被锁定*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task message is nonzero. * Task error code: The task message is nonzero.
@ -189,7 +189,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_MSG_NONZERO LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0c) #define LOS_ERRNO_TSK_MSG_NONZERO LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0c)
/*任务错误代码:任务消息为非零*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task delay occurs during an interrupt. * Task error code: The task delay occurs during an interrupt.
@ -199,7 +199,7 @@ extern "C" {
* Solution: Perform this operation after exiting from the interrupt. * Solution: Perform this operation after exiting from the interrupt.
*/ */
#define LOS_ERRNO_TSK_DELAY_IN_INT LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x0d) #define LOS_ERRNO_TSK_DELAY_IN_INT LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x0d)
/*任务错误代码:任务延迟发生在中断期间*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task delay occurs when the task is locked. * Task error code: The task delay occurs when the task is locked.
@ -209,7 +209,7 @@ extern "C" {
* Solution: Perform this operation after unlocking the task. * Solution: Perform this operation after unlocking the task.
*/ */
#define LOS_ERRNO_TSK_DELAY_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0e) #define LOS_ERRNO_TSK_DELAY_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0e)
/*任务错误代码:任务锁定时会出现任务延迟*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task yield occurs when the task is locked. * Task error code: The task yield occurs when the task is locked.
@ -219,7 +219,7 @@ extern "C" {
* Solution: Check the task. * Solution: Check the task.
*/ */
#define LOS_ERRNO_TSK_YIELD_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0f) #define LOS_ERRNO_TSK_YIELD_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0f)
/*任务错误代码:当任务被锁定时,任务将产生收益*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Only one task or no task is available for scheduling. * Task error code: Only one task or no task is available for scheduling.
@ -229,7 +229,7 @@ extern "C" {
* Solution: Increase the number of tasks. * Solution: Increase the number of tasks.
*/ */
#define LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x10) #define LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x10)
/*任务错误代码:只有一个任务或没有任务可用于计划*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: No free task control block is available. * Task error code: No free task control block is available.
@ -239,7 +239,7 @@ extern "C" {
* Solution: Increase the number of task control blocks. * Solution: Increase the number of task control blocks.
*/ */
#define LOS_ERRNO_TSK_TCB_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x11) #define LOS_ERRNO_TSK_TCB_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x11)
/*任务错误代码:没有可用的任务控制块*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task hook function is not matchable. * Task error code: The task hook function is not matchable.
@ -250,7 +250,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_HOOK_NOT_MATCH LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x12) #define LOS_ERRNO_TSK_HOOK_NOT_MATCH LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x12)
/*任务错误代码:任务挂钩函数不匹配*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The number of task hook functions exceeds the permitted upper limit. * Task error code: The number of task hook functions exceeds the permitted upper limit.
@ -261,7 +261,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_HOOK_IS_FULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x13) #define LOS_ERRNO_TSK_HOOK_IS_FULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x13)
/*任务错误代码:任务挂钩函数的数量超过了允许的上限*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The operation is performed on the system-level task. * Task error code: The operation is performed on the system-level task.
@ -272,8 +272,7 @@ extern "C" {
* Solution: Check the task ID and do not operate the system-level task. * Solution: Check the task ID and do not operate the system-level task.
*/ */
#define LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x14) #define LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x14)
/*任务错误代码:该操作是在系统级任务上执行的。
*LOS_ERRNO_TSK_OPERATE_idle*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task that is being suspended is locked. * Task error code: The task that is being suspended is locked.
@ -283,7 +282,7 @@ extern "C" {
* Solution: Suspend the task after unlocking the task. * Solution: Suspend the task after unlocking the task.
*/ */
#define LOS_ERRNO_TSK_SUSPEND_LOCKED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x15) #define LOS_ERRNO_TSK_SUSPEND_LOCKED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x15)
/*任务错误代码:正在挂起的任务已锁定*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task stack fails to be freed. * Task error code: The task stack fails to be freed.
@ -294,7 +293,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_FREE_STACK_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x17) #define LOS_ERRNO_TSK_FREE_STACK_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x17)
/*任务错误代码:无法释放任务堆栈*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task stack area is too small. * Task error code: The task stack area is too small.
@ -305,7 +304,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_STKAREA_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x18) #define LOS_ERRNO_TSK_STKAREA_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x18)
/*任务错误代码:任务堆栈区域太小*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task fails to be activated. * Task error code: The task fails to be activated.
@ -316,7 +315,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_ACTIVE_FAILED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x19) #define LOS_ERRNO_TSK_ACTIVE_FAILED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x19)
/*任务错误代码:任务激活失败*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Too many task configuration items. * Task error code: Too many task configuration items.
@ -327,7 +326,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_CONFIG_TOO_MANY LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1a) #define LOS_ERRNO_TSK_CONFIG_TOO_MANY LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1a)
/*任务错误代码:任务配置项过多*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: This error code is not in use temporarily. * Task error code: This error code is not in use temporarily.
@ -336,7 +335,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_CP_SAVE_AREA_NOT_ALIGN LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1b) #define LOS_ERRNO_TSK_CP_SAVE_AREA_NOT_ALIGN LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1b)
/*任务错误代码:此错误代码暂时未使用*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: This error code is not in use temporarily. * Task error code: This error code is not in use temporarily.
@ -345,7 +344,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_MSG_Q_TOO_MANY LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1d) #define LOS_ERRNO_TSK_MSG_Q_TOO_MANY LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1d)
/*任务错误代码:此错误代码暂时未使用*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: This error code is not in use temporarily. * Task error code: This error code is not in use temporarily.
@ -354,7 +353,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_CP_SAVE_AREA_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1e) #define LOS_ERRNO_TSK_CP_SAVE_AREA_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1e)
/*任务错误代码:此错误代码暂时未使用*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: This error code is not in use temporarily. * Task error code: This error code is not in use temporarily.
@ -363,7 +362,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_SELF_DELETE_ERR LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1f) #define LOS_ERRNO_TSK_SELF_DELETE_ERR LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x1f)
/*任务错误代码:此错误代码暂时未使用*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The task stack size is too large. * Task error code: The task stack size is too large.
@ -373,7 +372,7 @@ extern "C" {
* Solution: shrink the task stack size parameter. * Solution: shrink the task stack size parameter.
*/ */
#define LOS_ERRNO_TSK_STKSZ_TOO_LARGE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x20) #define LOS_ERRNO_TSK_STKSZ_TOO_LARGE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x20)
/*任务错误代码:任务堆栈大小太大*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Suspending software timer task is not allowed. * Task error code: Suspending software timer task is not allowed.
@ -384,7 +383,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x21) #define LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x21)
/*任务错误代码:不允许挂起软件计时器任务*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: The cpu affinity mask is incorrect. * Task error code: The cpu affinity mask is incorrect.
@ -394,7 +393,7 @@ extern "C" {
* Solution: Please set the correct cpu affinity mask. * Solution: Please set the correct cpu affinity mask.
*/ */
#define LOS_ERRNO_TSK_CPU_AFFINITY_MASK_ERR LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x23) #define LOS_ERRNO_TSK_CPU_AFFINITY_MASK_ERR LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x23)
/*任务错误代码cpu关联掩码不正确*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Task yield in interrupt is not permited, which will result in an unexpected result. * Task error code: Task yield in interrupt is not permited, which will result in an unexpected result.
@ -404,7 +403,7 @@ extern "C" {
* Solution: Don't call LOS_TaskYield in Interrupt. * Solution: Don't call LOS_TaskYield in Interrupt.
*/ */
#define LOS_ERRNO_TSK_YIELD_IN_INT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x24) #define LOS_ERRNO_TSK_YIELD_IN_INT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x24)
/*任务错误代码:不允许任务在中断中让步,这将导致意外结果*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Task sync resource (semaphore) allocated failed. * Task error code: Task sync resource (semaphore) allocated failed.
@ -414,7 +413,7 @@ extern "C" {
* Solution: Expand LOSCFG_BASE_IPC_SEM_LIMIT. * Solution: Expand LOSCFG_BASE_IPC_SEM_LIMIT.
*/ */
#define LOS_ERRNO_TSK_MP_SYNC_RESOURCE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x25) #define LOS_ERRNO_TSK_MP_SYNC_RESOURCE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x25)
/*任务错误代码:分配的任务同步资源(信号量)失败*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task error code: Task sync failed on operating running task across cores. * Task error code: Task sync failed on operating running task across cores.
@ -424,7 +423,7 @@ extern "C" {
* Solution: Check task delete can be handled in user's scenario. * Solution: Check task delete can be handled in user's scenario.
*/ */
#define LOS_ERRNO_TSK_MP_SYNC_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x26) #define LOS_ERRNO_TSK_MP_SYNC_FAILED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x26)
/*任务错误代码:在操作跨核心运行的任务时,任务同步失败*/
/** /**
* @ingroup los_task * @ingroup los_task
* Minimum stack size. * Minimum stack size.
@ -433,8 +432,7 @@ extern "C" {
* LOS_TASK_MIN_STACK_SIZE bytes, aligned on a boundary of LOSCFG_STACK_POINT_ALIGN_SIZE. * LOS_TASK_MIN_STACK_SIZE bytes, aligned on a boundary of LOSCFG_STACK_POINT_ALIGN_SIZE.
*/ */
#define LOS_TASK_MIN_STACK_SIZE (ALIGN(KERNEL_TSK_MIN_STACK_SIZE, LOSCFG_STACK_POINT_ALIGN_SIZE)) #define LOS_TASK_MIN_STACK_SIZE (ALIGN(KERNEL_TSK_MIN_STACK_SIZE, LOSCFG_STACK_POINT_ALIGN_SIZE))
/*这段代码是关于任务task的最小栈大小的定义通过这段代码可以看出LOS_TASK_MIN_STACK_SIZE的大小是根据KERNEL_TSK_MIN_STACK_SIZE和
LOSCFG_STACK_POINT_ALIGN_SIZE*/
#ifdef LOSCFG_BASE_CORE_TSK_MONITOR #ifdef LOSCFG_BASE_CORE_TSK_MONITOR
/** /**
* @ingroup los_task * @ingroup los_task
@ -496,9 +494,6 @@ typedef VOID *(*TSK_ENTRY_FUNC)(UINTPTR param1,
UINTPTR param4); UINTPTR param4);
#else #else
typedef VOID *(*TSK_ENTRY_FUNC)(VOID *param); typedef VOID *(*TSK_ENTRY_FUNC)(VOID *param);
/*这段代码中使用了条件预处理指令#ifdef它用于根据预定义的宏LOSOCFG_OBSOLETE_API是否存在来选择不同的类型定义,果LOSOCFG_OBSOLETE_API宏被定义
TSK_ENTRY_FUNCUINTPTRVOIDLOSOCFG_OBSOLETE_APITSK_ENTRY_FUNC
VOIDVOID*/
#endif #endif
/** /**
* @ingroup los_task * @ingroup los_task
@ -524,14 +519,7 @@ typedef struct tagTskInitParam {
UINT32 uwResved; /**< Task is automatically deleted if uwResved is set to #LOS_TASK_STATUS_DETACHED. UINT32 uwResved; /**< Task is automatically deleted if uwResved is set to #LOS_TASK_STATUS_DETACHED.
Task will not be deleted automatically if it is set to 0. */ Task will not be deleted automatically if it is set to 0. */
} TSK_INIT_PARAM_S; } TSK_INIT_PARAM_S;
/*这段代码定义了一个结构体类型TSK_INIT_PARAM_S用于传递任务创建时的参数信息
pfnTaskEntry
usTaskPrio
auwArgs/pArgsLOSCFG_OBSOLETE_API
uwStackSize
pcName
usCpuAffiMaskCPULOSCFG_KERNEL_SMP
uwResvedLOS_TASK_STATUS_DETACHED*/
/** /**
* @ingroup los_task * @ingroup los_task
* Task name length * Task name length
@ -563,23 +551,7 @@ typedef struct tagTskInfo {
BOOL bOvf; /**< Flag that indicates whether a task stack overflow BOOL bOvf; /**< Flag that indicates whether a task stack overflow
occurs or not */ occurs or not */
} TSK_INFO_S; } TSK_INFO_S;
/*这段代码定义了一个结构体类型TSK_INFO_S用于保存任务的信息
TSK_INFO_S
acNameLOS_TASK_NAMELEN32
uwTaskIDID
usTaskStatus
usTaskPrio
pTaskSem
pTaskMux
uwEvent
uwEventMask
uwStackSize
uwTopOfStack
uwBottomOfStack
uwSPSP
uwCurrUsed使
uwPeakUsed使
bOvf*/
#ifdef LOSCFG_TASK_STATIC_ALLOCATION #ifdef LOSCFG_TASK_STATIC_ALLOCATION
/** /**
* @ingroup los_task * @ingroup los_task
@ -629,24 +601,7 @@ bOvf表示任务栈是否发生溢出的标志。*/
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern UINT32 LOS_TaskCreateOnlyStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack); extern UINT32 LOS_TaskCreateOnlyStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack);
/*该函数的作用是创建一个静态分配的任务,并将其挂起。静态分配任务的栈空间由用户自行分配和释放,需要在删除任务时及时释放栈空间。
taskId[OUT] IDUINT32
initParam[IN] TSK_INIT_PARAM_S
topStack[IN] VOID
LOS_ERRNO_TSK_ID_INVALIDIDtaskIdNULL
LOS_ERRNO_TSK_PTR_NULLinitParamNULL
LOS_ERRNO_TSK_NAME_EMPTYNULL
LOS_ERRNO_TSK_ENTRY_NULLNULL
LOS_ERRNO_TSK_PRIOR_ERROR
LOS_ERRNO_TSK_STKSZ_TOO_LARGE
LOS_ERRNO_TSK_STKSZ_TOO_SMALL
LOS_ERRNO_TSK_TCB_UNAVAILABLE
LOS_ERRNO_TSK_NO_MEMORY
LOS_OK*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Create a task. * @brief Create a task.
@ -698,9 +653,7 @@ LOS_OK任务成功创建。*/
*/ */
extern UINT32 LOS_TaskCreateStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack); extern UINT32 LOS_TaskCreateStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack);
#endif #endif
/*这段代码是关于任务创建的函数LOS_TaskCreateStatic的声明。
.
ID*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Create a task and suspend. * @brief Create a task and suspend.
@ -746,9 +699,7 @@ extern UINT32 LOS_TaskCreateStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam,
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam); extern UINT32 LOS_TaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam);
/*这段代码是关于任务创建的函数LOS_TaskCreateOnly的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Create a task. * @brief Create a task.
@ -794,7 +745,7 @@ extern UINT32 LOS_TaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam); extern UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam);
/*该函数的功能是创建一个任务。如果在系统初始化之后创建的任务的优先级比当前任务高并且任务调度未被锁定,则将其调度运行。如果不是,则创建的任务将添加到就绪任务队列中*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Resume a task. * @brief Resume a task.
@ -821,9 +772,7 @@ extern UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskResume(UINT32 taskId); extern UINT32 LOS_TaskResume(UINT32 taskId);
/*这是华为LiteOS中用于恢复Resume任务的函数LOS_TaskResume的声明。
Suspended*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Suspend a task. * @brief Suspend a task.
@ -853,9 +802,7 @@ extern UINT32 LOS_TaskResume(UINT32 taskId);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskSuspend(UINT32 taskId); extern UINT32 LOS_TaskSuspend(UINT32 taskId);
/*这是华为LiteOS中用于挂起Suspend任务的函数LOS_TaskSuspend的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Delete a task. * @brief Delete a task.
@ -886,9 +833,7 @@ extern UINT32 LOS_TaskSuspend(UINT32 taskId);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskDelete(UINT32 taskId); extern UINT32 LOS_TaskDelete(UINT32 taskId);
/*这是华为LiteOS中用于删除任务的函数LOS_TaskDelete的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Delay a task. * @brief Delay a task.
@ -922,9 +867,7 @@ extern UINT32 LOS_TaskDelete(UINT32 taskId);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskDelay(UINT32 tick); extern UINT32 LOS_TaskDelay(UINT32 tick);
/*这是华为LiteOS中用于延迟Delay任务的函数LOS_TaskDelay的声明。
Ticks*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Lock the task scheduling. * @brief Lock the task scheduling.
@ -948,9 +891,7 @@ extern UINT32 LOS_TaskDelay(UINT32 tick);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_TaskLock(VOID); extern VOID LOS_TaskLock(VOID);
/*这是华为LiteOS中用于锁定任务调度的函数LOS_TaskLock的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Unlock the task scheduling. * @brief Unlock the task scheduling.
@ -972,9 +913,7 @@ extern VOID LOS_TaskLock(VOID);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_TaskUnlock(VOID); extern VOID LOS_TaskUnlock(VOID);
/*这是华为LiteOS中用于解锁任务调度的函数LOS_TaskUnlock的声明。
API*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Set a task priority. * @brief Set a task priority.
@ -1007,9 +946,7 @@ extern VOID LOS_TaskUnlock(VOID);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio); extern UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio);
/*这是华为LiteOS中用于设置任务优先级的函数LOS_TaskPriSet的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Set the priority of the current running task to a specified priority. * @brief Set the priority of the current running task to a specified priority.
@ -1039,9 +976,7 @@ extern UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_CurTaskPriSet(UINT16 taskPrio); extern UINT32 LOS_CurTaskPriSet(UINT16 taskPrio);
/*这是华为LiteOS中用于将当前运行任务的优先级设置为指定优先级的函数LOS_CurTaskPriSet的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Change the scheduling sequence of tasks with the same priority. * @brief Change the scheduling sequence of tasks with the same priority.
@ -1067,9 +1002,7 @@ extern UINT32 LOS_CurTaskPriSet(UINT16 taskPrio);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskYield(VOID); extern UINT32 LOS_TaskYield(VOID);
/*这是华为LiteOS中用于改变具有相同优先级的任务调度顺序的函数LOS_TaskYield的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Obtain a task priority. * @brief Obtain a task priority.
@ -1089,9 +1022,7 @@ extern UINT32 LOS_TaskYield(VOID);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT16 LOS_TaskPriGet(UINT32 taskId); extern UINT16 LOS_TaskPriGet(UINT32 taskId);
/*这是华为LiteOS中获取指定任务优先级的函数LOS_TaskPriGet的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Obtain current running task ID. * @brief Obtain current running task ID.
@ -1109,9 +1040,7 @@ extern UINT16 LOS_TaskPriGet(UINT32 taskId);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_CurTaskIDGet(VOID); extern UINT32 LOS_CurTaskIDGet(VOID);
/*这是华为LiteOS中获取当前正在运行的任务ID的函数LOS_CurTaskIDGet的声明。
ID*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Obtain a task information structure. * @brief Obtain a task information structure.
@ -1135,9 +1064,7 @@ extern UINT32 LOS_CurTaskIDGet(VOID);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo); extern UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo);
/*这是华为LiteOS中获取任务信息结构的函数LOS_TaskInfoGet的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Set the affinity mask of the task scheduling cpu. * @brief Set the affinity mask of the task scheduling cpu.
@ -1163,9 +1090,7 @@ extern UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo);
* @since Huawei LiteOS V200R003C00 * @since Huawei LiteOS V200R003C00
*/ */
extern UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 usCpuAffiMask); extern UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 usCpuAffiMask);
/*这是华为LiteOS中设置任务调度CPU亲和性掩码的函数LOS_TaskCpuAffiSet的声明。
CPUCPU*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Get the affinity mask of the task scheduling cpu. * @brief Get the affinity mask of the task scheduling cpu.
@ -1185,9 +1110,7 @@ extern UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 usCpuAffiMask);
* @since Huawei LiteOS V200R003C00 * @since Huawei LiteOS V200R003C00
*/ */
extern UINT16 LOS_TaskCpuAffiGet(UINT32 taskId); extern UINT16 LOS_TaskCpuAffiGet(UINT32 taskId);
/*这是华为LiteOS中获取任务调度CPU亲和性掩码的函数LOS_TaskCpuAffiGet的声明。
CPUCPU*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Recycle task stack resource. * @brief Recycle task stack resource.
@ -1206,10 +1129,7 @@ extern UINT16 LOS_TaskCpuAffiGet(UINT32 taskId);
* @since Huawei LiteOS V200R003C00 * @since Huawei LiteOS V200R003C00
*/ */
extern VOID LOS_TaskResRecycle(VOID); extern VOID LOS_TaskResRecycle(VOID);
/*这是华为LiteOS中回收任务堆栈资源的函数LOS_TaskResRecycle的声明。
使
*/
#ifdef LOSCFG_OBSOLETE_API #ifdef LOSCFG_OBSOLETE_API
#define LOS_TASK_PARAM_INIT_ARG_0(initParam, arg) \ #define LOS_TASK_PARAM_INIT_ARG_0(initParam, arg) \
initParam.auwArgs[0] = (UINTPTR)arg initParam.auwArgs[0] = (UINTPTR)arg
@ -1218,7 +1138,7 @@ extern VOID LOS_TaskResRecycle(VOID);
#define LOS_TASK_PARAM_INIT_ARG(initParam, arg) \ #define LOS_TASK_PARAM_INIT_ARG(initParam, arg) \
initParam.pArgs = (VOID *)arg initParam.pArgs = (VOID *)arg
#endif #endif
/*这段代码是关于任务参数初始化宏的定义*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Define the lowpower framework process function type. * @brief Define the lowpower framework process function type.
@ -1237,7 +1157,7 @@ extern VOID LOS_TaskResRecycle(VOID);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
typedef VOID (*LOWPOWERIDLEHOOK)(VOID); typedef VOID (*LOWPOWERIDLEHOOK)(VOID);
/*这段代码定义了一个函数指针类型LOWPOWERIDLEHOOK用于定义低功耗框架的处理函数*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Register a hook to enter lowpower framework process. * @brief Register a hook to enter lowpower framework process.
@ -1256,9 +1176,7 @@ typedef VOID (*LOWPOWERIDLEHOOK)(VOID);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_LowpowerHookReg(LOWPOWERIDLEHOOK hook); extern VOID LOS_LowpowerHookReg(LOWPOWERIDLEHOOK hook);
/*这段代码是关于注册低功耗处理函数的函数LOS_LowpowerHookReg的声明。
*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Define the type of idle handler hook function. * @brief Define the type of idle handler hook function.
@ -1275,11 +1193,7 @@ extern VOID LOS_LowpowerHookReg(LOWPOWERIDLEHOOK hook);
* @since Huawei LiteOS V200R005C20 * @since Huawei LiteOS V200R005C20
*/ */
typedef VOID (*IDLEHANDLERHOOK)(VOID); typedef VOID (*IDLEHANDLERHOOK)(VOID);
/*这段代码定义了一个函数指针类型IDLEHANDLERHOOK用于定义空闲处理函数的类型。
VOID (*IDLEHANDLERHOOK)(VOID)
使IDLEHANDLERHOOK*/
/** /**
* @ingroup los_task * @ingroup los_task
* @brief Register the hook function for idle task. * @brief Register the hook function for idle task.
@ -1298,9 +1212,7 @@ typedef VOID (*IDLEHANDLERHOOK)(VOID);
* @since Huawei LiteOS V200R005C20 * @since Huawei LiteOS V200R005C20
*/ */
extern VOID LOS_IdleHandlerHookReg(IDLEHANDLERHOOK hook); extern VOID LOS_IdleHandlerHookReg(IDLEHANDLERHOOK hook);
/*这段代码是关于注册空闲处理函数的函数LOS_IdleHandlerHookReg的声明。
*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这些代码主要用于系统计时、延时和低功耗唤醒功能,提供了丰富的 Tick 相关操作接口和功能*/
/** /**
* @defgroup los_tick Tick * @defgroup los_tick Tick
* @ingroup kernel * @ingroup kernel
@ -49,37 +49,37 @@ extern "C" {
* Number of milliseconds in one second. * Number of milliseconds in one second.
*/ */
#define OS_SYS_MS_PER_SECOND 1000 #define OS_SYS_MS_PER_SECOND 1000
/*一秒钟内的毫秒数。*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Number of microseconds in one second. * Number of microseconds in one second.
*/ */
#define OS_SYS_US_PER_SECOND 1000000 #define OS_SYS_US_PER_SECOND 1000000
/*一秒钟内的微秒数*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Number of nanoseconds in one second. * Number of nanoseconds in one second.
*/ */
#define OS_SYS_NS_PER_SECOND 1000000000 #define OS_SYS_NS_PER_SECOND 1000000000
/*1秒内的纳秒数*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Number of microseconds in one milliseconds. * Number of microseconds in one milliseconds.
*/ */
#define OS_SYS_US_PER_MS 1000 #define OS_SYS_US_PER_MS 1000
/*一毫秒中的微秒数*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Number of nanoseconds in one milliseconds. * Number of nanoseconds in one milliseconds.
*/ */
#define OS_SYS_NS_PER_MS 1000000 #define OS_SYS_NS_PER_MS 1000000
/*一毫秒中的纳秒数*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Number of nanoseconds in one microsecond. * Number of nanoseconds in one microsecond.
*/ */
#define OS_SYS_NS_PER_US 1000 #define OS_SYS_NS_PER_US 1000
/*一微秒中的纳秒数*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Tick error code: The Tick configuration is incorrect. * Tick error code: The Tick configuration is incorrect.
@ -90,7 +90,7 @@ extern "C" {
* in los_config.h. * in los_config.h.
*/ */
#define LOS_ERRNO_TICK_CFG_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x00) #define LOS_ERRNO_TICK_CFG_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x00)
/*Tick错误代码Tick配置不正确*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Tick error code: This error code is not in use temporarily. * Tick error code: This error code is not in use temporarily.
@ -99,7 +99,7 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TICK_NO_HWTIMER LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x01) #define LOS_ERRNO_TICK_NO_HWTIMER LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x01)
/*Tick错误代码此错误代码暂时未使用*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* Tick error code: This error code is not in use temporarily. * Tick error code: This error code is not in use temporarily.
@ -108,31 +108,31 @@ extern "C" {
* @deprecated This error code is obsolete since LiteOS 5.0.0. * @deprecated This error code is obsolete since LiteOS 5.0.0.
*/ */
#define LOS_ERRNO_TICK_PER_SEC_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x02) #define LOS_ERRNO_TICK_PER_SEC_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x02)
/*Tick错误代码此错误代码暂时未使用。*/
/** /**
* @ingroup los_config * @ingroup los_config
* system clock * system clock
*/ */
extern UINT32 g_sysClock; extern UINT32 g_sysClock;
/*这段代码定义了一个名为g_sysClock的全局变量它表示系统时钟。没有进行定义*/
/** /**
* @ingroup los_config * @ingroup los_config
* get system clock * get system clock
*/ */
#define GET_SYS_CLOCK() (g_sysClock) #define GET_SYS_CLOCK() (g_sysClock)
/*这段代码定义了一个宏,用于获取系统时钟的值*/
/** /**
* @ingroup los_config * @ingroup los_config
* set system clock * set system clock
*/ */
#define SET_SYS_CLOCK(clock) (g_sysClock = (clock)) #define SET_SYS_CLOCK(clock) (g_sysClock = (clock))
/*这段代码定义了一个宏,用于设置系统时钟的值*/
/** /**
* @ingroup los_config * @ingroup los_config
* ticks per second * ticks per second
*/ */
extern UINT32 g_tickPerSecond; extern UINT32 g_tickPerSecond;
/*这段代码定义了一个名为g_tickPerSecond的全局变量它表示每秒钟的时钟滴答数ticks per second*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* system time structure. * system time structure.
@ -146,7 +146,7 @@ typedef struct tagSysTime {
UINT8 ucSecond; /**< second, the value range is 0 - 59 */ UINT8 ucSecond; /**< second, the value range is 0 - 59 */
UINT8 ucWeek; /**< week, the value range is 0 - 6 */ UINT8 ucWeek; /**< week, the value range is 0 - 6 */
} SYS_TIME_S; } SYS_TIME_S;
/*这段代码定义了一个名为tagSysTime的结构体它表示系统时间信息。*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief Obtain the number of Ticks. * @brief Obtain the number of Ticks.
@ -165,9 +165,7 @@ typedef struct tagSysTime {
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT64 LOS_TickCountGet(VOID); extern UINT64 LOS_TickCountGet(VOID);
/*这段代码声明了一个函数LOS_TickCountGet用于获取自系统启动以来的Tick数。
TickUINT64Tick*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief Obtain the number of cycles in one tick. * @brief Obtain the number of cycles in one tick.
@ -185,9 +183,7 @@ extern UINT64 LOS_TickCountGet(VOID);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_CyclePerTickGet(VOID); extern UINT32 LOS_CyclePerTickGet(VOID);
/*这段代码声明了一个函数LOS_CyclePerTickGet用于获取一个Tick中的周期数。
TickCPUUINT32Tick*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief Convert Ticks to milliseconds. * @brief Convert Ticks to milliseconds.
@ -212,9 +208,7 @@ extern UINT32 LOS_CyclePerTickGet(VOID);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_Tick2MS(UINT32 tick); extern UINT32 LOS_Tick2MS(UINT32 tick);
/*这段代码声明了一个函数LOS_Tick2MS用于将Ticks转换为毫秒数。
TickstickTicksUINT32*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief Convert milliseconds to Ticks. * @brief Convert milliseconds to Ticks.
@ -240,9 +234,7 @@ extern UINT32 LOS_Tick2MS(UINT32 tick);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT32 LOS_MS2Tick(UINT32 millisec); extern UINT32 LOS_MS2Tick(UINT32 millisec);
/*这段代码声明了一个函数LOS_MS2Tick用于将毫秒数转换为Ticks。
TicksmillisecUINT32Ticks*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief Obtain system cycle count. * @brief Obtain system cycle count.
@ -268,9 +260,7 @@ extern UINT32 LOS_MS2Tick(UINT32 millisec);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo); extern VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo);
/*这段代码声明了一个函数LOS_GetCpuCycle用于获取系统启动以来的CPU周期计数。
CPUpuwCntHipuwCntLoUINT32CPU3232*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief Obtain system time in nanoseconds. * @brief Obtain system time in nanoseconds.
@ -289,9 +279,7 @@ extern VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern UINT64 LOS_CurrNanosec(VOID); extern UINT64 LOS_CurrNanosec(VOID);
/*这段代码声明了一个函数LOS_CurrNanosec用于获取系统当前的纳秒级时间。
nanoseconds*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief spinning-delay in microsecond (us). * @brief spinning-delay in microsecond (us).
@ -311,7 +299,7 @@ extern UINT64 LOS_CurrNanosec(VOID);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_Udelay(UINT32 usecs); extern VOID LOS_Udelay(UINT32 usecs);
/*这段代码声明了一个函数LOS_Udelay用于进行微秒级的自旋延迟。*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief spinning-delay in millisecond (ms). * @brief spinning-delay in millisecond (ms).
@ -331,7 +319,7 @@ extern VOID LOS_Udelay(UINT32 usecs);
* @since Huawei LiteOS V100R001C00 * @since Huawei LiteOS V100R001C00
*/ */
extern VOID LOS_Mdelay(UINT32 msecs); extern VOID LOS_Mdelay(UINT32 msecs);
/*这段代码声明了一个函数LOS_Mdelay用于进行毫秒级的自旋延迟。*/
#ifdef LOSCFG_KERNEL_TICKLESS #ifdef LOSCFG_KERNEL_TICKLESS
/** /**
* @ingroup los_tick * @ingroup los_tick
@ -352,8 +340,6 @@ extern VOID LOS_Mdelay(UINT32 msecs);
*/ */
typedef VOID (*WAKEUPTICKHOOK)(UINT32 tickNum); typedef VOID (*WAKEUPTICKHOOK)(UINT32 tickNum);
/*这段代码定义了一个函数指针类型WAKEUPTICKHOOK用于定义低功耗框架的唤醒函数。
*/
/** /**
* @ingroup los_tick * @ingroup los_tick
* @brief Register a hook to wakeup from tick interrupt. * @brief Register a hook to wakeup from tick interrupt.
@ -372,9 +358,6 @@ typedef VOID (*WAKEUPTICKHOOK)(UINT32 tickNum);
* @since Huawei LiteOS V200R005C10 * @since Huawei LiteOS V200R005C10
*/ */
extern VOID LOS_IntTickWakeupHookReg(WAKEUPTICKHOOK hook); extern VOID LOS_IntTickWakeupHookReg(WAKEUPTICKHOOK hook);
/*这段代码声明了一个函数LOS_IntTickWakeupHookReg用于注册一个从tick中断唤醒后的回调函数。
LOS_IntTickWakeupHookRegtick*/
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus

@ -26,7 +26,6 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这些代码主要用于开启和关闭 Tickless 模式,提供了 Tickless 相关操作接口和功能。*/
/** /**
* @defgroup los_tickless Tickless * @defgroup los_tickless Tickless
* @ingroup kernel * @ingroup kernel
@ -63,9 +62,7 @@ extern "C" {
* @since Huawei LiteOS V200R001C00 * @since Huawei LiteOS V200R001C00
*/ */
extern VOID LOS_TicklessEnable(VOID); extern VOID LOS_TicklessEnable(VOID);
/*这段代码声明了一个函数LOS_TicklessEnable用于启用tickless模式。
LOS_TicklessEnabletickless*/
/** /**
* @ingroup los_tickless * @ingroup los_tickless
* @brief disable the tickless mode. * @brief disable the tickless mode.
@ -86,9 +83,7 @@ LOS_TicklessEnable函数的功能是启用tickless模式。在这种模式下
* @since Huawei LiteOS V200R001C00 * @since Huawei LiteOS V200R001C00
*/ */
extern VOID LOS_TicklessDisable(VOID); extern VOID LOS_TicklessDisable(VOID);
/*这段代码声明了一个函数LOS_TicklessDisable用于禁用tickless模式。
LOS_TicklessDisabletickless*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -25,7 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这段代码提供了一些通用的宏和函数,可以帮助开发者在不同的编译环境下编写跨平台的代码,并提供了一些位操作的便利功能。*/
/** /**
* @defgroup los_toolchain * @defgroup los_toolchain
* @ingroup kernel * @ingroup kernel
@ -69,15 +69,7 @@ extern "C" {
#ifndef CLZ #ifndef CLZ
#define CLZ(value) (__clz(value)) #define CLZ(value) (__clz(value))
#endif #endif
/*这段代码是宏定义,用于在 ARM Compiler 下定义一些与编译器相关的宏和函数。
ASM __asm C
INLINE __inline
STATIC_INLINE static __inline
USED 使 GCC __attribute__((used)) 使使
WEAK 使 GCC __attribute__((weak)) weak symbol
CLZ 使 __clz
IAR Compiler */
/* for IAR Compiler */ /* for IAR Compiler */
#elif defined ( __ICCARM__ ) #elif defined ( __ICCARM__ )
@ -108,16 +100,7 @@ CLZ 宏定义了一个函数,用于计算一个数的二进制表示中前导
#ifndef CTZ #ifndef CTZ
#define CTZ(value) (__UNDEFINED(value)) #define CTZ(value) (__UNDEFINED(value))
#endif #endif
/*这段代码是宏定义,用于在 IAR Compiler 下定义一些与编译器相关的宏和函数。
ASM __asm C
INLINE inline
STATIC_INLINE static inline
USED 使 IAR Compiler __root 使使
WEAK 使 IAR Compiler __weak weak symbol
CLZ 使 IAR Compiler __iar_builtin_CLZ
CTZ 使 __UNDEFINED
IAR Compiler */
/* for GNU Compiler */ /* for GNU Compiler */
#elif defined ( __GNUC__ ) #elif defined ( __GNUC__ )
@ -152,17 +135,7 @@ CTZ 宏定义了一个函数,用于计算一个数的二进制表示中末尾
#ifndef FFS #ifndef FFS
#define FFS(value) (__builtin_ffs(value)) #define FFS(value) (__builtin_ffs(value))
#endif #endif
/*这段代码是宏定义,用于在 GNU Compiler 下定义一些与编译器相关的宏和函数。
ASM __asm C
INLINE __inline
STATIC_INLINE static inline
USED 使 GNU Compiler __attribute__((used)) 使使
WEAK 使 GNU Compiler __attribute__((weak)) weak symbol
CLZ 使 GNU Compiler __builtin_clz
CTZ 使 GNU Compiler __builtin_ctz
FFS 使 GNU Compiler __builtin_ffs
GNU Compiler */
#else #else
#error Unknown compiler. #error Unknown compiler.
#endif #endif

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*这段代码是关于 Huawei LiteOS 操作系统中的跟踪Trace功能的实现包括了跟踪数据结构、跟踪事件类型、初始化、启动、停止、事件掩码
*/
/** /**
* @defgroup los_trace Trace * @defgroup los_trace Trace
* @ingroup kernel * @ingroup kernel
@ -50,25 +49,25 @@ extern "C" {
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace Control agent task's priori00ty. * Trace Control agent task's priority.
*/ */
#define LOSCFG_TRACE_TASK_PRIORITY 2 #define LOSCFG_TRACE_TASK_PRIORITY 2
#endif #endif
#define LOSCFG_TRACE_OBJ_MAX_NAME_SIZE LOS_TASK_NAMELEN #define LOSCFG_TRACE_OBJ_MAX_NAME_SIZE LOS_TASK_NAMELEN
/*这段代码是关于轨迹追踪Trace Control的配置*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace records the max number of objects(kernel object, like tasks). if set to 0, trace will not record any object. * Trace records the max number of objects(kernel object, like tasks). if set to 0, trace will not record any object.
*/ */
#define LOSCFG_TRACE_OBJ_MAX_NUM 0 // LOSCFG_BASE_CORE_TSK_LIMIT #define LOSCFG_TRACE_OBJ_MAX_NUM 0 // LOSCFG_BASE_CORE_TSK_LIMIT
/*这段代码是关于轨迹追踪Trace Control中记录对象数量的配置*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace tlv encode buffer size, the buffer is used to encode one piece raw frame to tlv message in online mode. * Trace tlv encode buffer size, the buffer is used to encode one piece raw frame to tlv message in online mode.
*/ */
#define LOSCFG_TRACE_TLV_BUF_SIZE 100 #define LOSCFG_TRACE_TLV_BUF_SIZE 100
/*这段代码是关于轨迹追踪Trace Control中tlv编码缓冲区大小的配置*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace error code: init trace failed. * Trace error code: init trace failed.
@ -78,7 +77,7 @@ extern "C" {
* Solution: Follow the trace State Machine. * Solution: Follow the trace State Machine.
*/ */
#define LOS_ERRNO_TRACE_ERROR_STATUS LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x00) #define LOS_ERRNO_TRACE_ERROR_STATUS LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x00)
/*跟踪错误代码:初始化跟踪失败*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace error code: Insufficient memory for trace buf init. * Trace error code: Insufficient memory for trace buf init.
@ -88,7 +87,7 @@ extern "C" {
* Solution: Expand the configured system memory or decrease the value defined by LOS_TRACE_BUFFER_SIZE. * Solution: Expand the configured system memory or decrease the value defined by LOS_TRACE_BUFFER_SIZE.
*/ */
#define LOS_ERRNO_TRACE_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x01) #define LOS_ERRNO_TRACE_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x01)
/*跟踪错误代码内存不足无法进行跟踪buf-init。*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace error code: Insufficient memory for trace struct. * Trace error code: Insufficient memory for trace struct.
@ -98,7 +97,7 @@ extern "C" {
* Solution: Increase trace buffer's size. * Solution: Increase trace buffer's size.
*/ */
#define LOS_ERRNO_TRACE_BUF_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x02) #define LOS_ERRNO_TRACE_BUF_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x02)
/*跟踪错误代码:跟踪结构的内存不足 */
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace state. * Trace state.
@ -109,12 +108,7 @@ enum TraceState {
TRACE_STARTED, /**< trace is started and system is tracing */ TRACE_STARTED, /**< trace is started and system is tracing */
TRACE_STOPED, /**< trace is stopped */ TRACE_STOPED, /**< trace is stopped */
}; };
/*这段代码定义了一个枚举类型 TraceState用于表示轨迹追踪Trace Control的状态。该枚举包括以下几个取值
TRACE_UNINIT
TRACE_INITED
TRACE_STARTED
TRACE_STOPED*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace mask is used to filter events in runtime. Each mask keep only one unique bit to 1, and user can define own * Trace mask is used to filter events in runtime. Each mask keep only one unique bit to 1, and user can define own
@ -134,20 +128,7 @@ typedef enum {
TRACE_MAX_FLAG = 0x80000000, TRACE_MAX_FLAG = 0x80000000,
TRACE_USER_DEFAULT_FLAG = 0xFFFFFFF0, TRACE_USER_DEFAULT_FLAG = 0xFFFFFFF0,
} LOS_TRACE_MASK; } LOS_TRACE_MASK;
/*这段代码定义了一个枚举类型 LOS_TRACE_MASK用于在运行时过滤事件。每个标志位都保持唯一的一位为1用户可以定义自己模块的跟踪掩码
TRACE_SYS_FLAG
TRACE_HWI_FLAG
TRACE_TASK_FLAG
TRACE_SWTMR_FLAG
TRACE_MEM_FLAG
TRACE_QUE_FLAG
TRACE_EVENT_FLAG
TRACE_SEM_FLAG
TRACE_MUX_FLAG
TRACE_MAX_FLAG
TRACE_USER_DEFAULT_FLAG*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace event type which indicate the exactly happend events, user can define own module's event type like * Trace event type which indicate the exactly happend events, user can define own module's event type like
@ -227,10 +208,7 @@ typedef enum {
MUX_PEND = TRACE_MUX_FLAG | 2, MUX_PEND = TRACE_MUX_FLAG | 2,
MUX_POST = TRACE_MUX_FLAG | 3, MUX_POST = TRACE_MUX_FLAG | 3,
} LOS_TRACE_TYPE; } LOS_TRACE_TYPE;
/*这段代码定义了一个枚举类型 LOS_TRACE_TYPE用于表示不同的追踪事件类型。每个事件类型都由一个唯一的标志位组成用户可以根据需要定义自己模块的事件类型。
使便
便*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* struct to store the trace config information. * struct to store the trace config information.
@ -240,7 +218,7 @@ typedef struct {
UINT32 clockFreq; /**< system clock frequency */ UINT32 clockFreq; /**< system clock frequency */
UINT32 version; /**< trace version */ UINT32 version; /**< trace version */
} TraceBaseHeaderInfo; } TraceBaseHeaderInfo;
/*这段代码是一个注释和结构体的定义,用于存储跟踪配置信息。*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* struct to store the event infomation * struct to store the event infomation
@ -268,7 +246,7 @@ typedef struct {
UINTPTR params[LOSCFG_TRACE_FRAME_MAX_PARAMS]; /**< event frame's params */ UINTPTR params[LOSCFG_TRACE_FRAME_MAX_PARAMS]; /**< event frame's params */
#endif #endif
} TraceEventFrame; } TraceEventFrame;
/*这段代码是一个注释和结构体的定义,用于存储事件信息*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* struct to store the kernel obj information, we defined task as kernel obj in this system. * struct to store the kernel obj information, we defined task as kernel obj in this system.
@ -278,7 +256,7 @@ typedef struct {
UINT32 prio; /**< kernel obj's priority */ UINT32 prio; /**< kernel obj's priority */
CHAR name[LOSCFG_TRACE_OBJ_MAX_NAME_SIZE]; /**< kernel obj's name */ CHAR name[LOSCFG_TRACE_OBJ_MAX_NAME_SIZE]; /**< kernel obj's name */
} ObjData; } ObjData;
/*这段代码是一个注释和结构体的定义,用于存储内核对象信息*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* struct to store the trace data. * struct to store the trace data.
@ -291,7 +269,7 @@ typedef struct {
UINT16 objOffset; /**< the offset of the first obj data to record beginning */ UINT16 objOffset; /**< the offset of the first obj data to record beginning */
UINT16 frameOffset; /**< the offset of the first event frame data to record beginning */ UINT16 frameOffset; /**< the offset of the first event frame data to record beginning */
} OfflineHead; } OfflineHead;
/*这段代码是一个注释和结构体的定义,用于存储跟踪数据。*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Define the type of trace hardware interrupt filter hook function. * @brief Define the type of trace hardware interrupt filter hook function.
@ -315,7 +293,7 @@ typedef BOOL (*TRACE_HWI_FILTER_HOOK)(UINT32 hwiNum);
typedef VOID (*TRACE_EVENT_HOOK)(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount); typedef VOID (*TRACE_EVENT_HOOK)(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount);
extern TRACE_EVENT_HOOK g_traceEventHook; extern TRACE_EVENT_HOOK g_traceEventHook;
/*这段代码定义了两个函数指针类型和一个函数指针变量,这些函数指针类型和变量用于实现 Huawei LiteOS 操作系统的事件跟踪功能。*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* Trace event params: * Trace event params:
@ -334,64 +312,64 @@ extern TRACE_EVENT_HOOK g_traceEventHook;
* eg. Trace only you need parmas as: * eg. Trace only you need parmas as:
* #define TASK_PRIOSET_PARAMS(taskId, taskStatus, oldPrio, newPrio) taskId * #define TASK_PRIOSET_PARAMS(taskId, taskStatus, oldPrio, newPrio) taskId
*/ */
#define TASK_SWITCH_PARAMS(taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus) \/*这段代码是一个宏定义,用于定义任务切换所需的参数集合*/ #define TASK_SWITCH_PARAMS(taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus) \
taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus
#define TASK_PRIOSET_PARAMS(taskId, taskStatus, oldPrio, newPrio) taskId, taskStatus, oldPrio, newPrio/*这段代码是一个宏定义,用于定义任务优先级设置所需的参数集合*/ #define TASK_PRIOSET_PARAMS(taskId, taskStatus, oldPrio, newPrio) taskId, taskStatus, oldPrio, newPrio
#define TASK_CREATE_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio/*这段代码是一个宏定义,用于定义任务创建所需的参数集合*/ #define TASK_CREATE_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio
#define TASK_DELETE_PARAMS(taskId, taskStatus, usrStack) taskId, taskStatus, usrStack/*这段代码是一个宏定义,用于定义任务删除所需的参数集合*/ #define TASK_DELETE_PARAMS(taskId, taskStatus, usrStack) taskId, taskStatus, usrStack
#define TASK_SUSPEND_PARAMS(taskId, taskStatus, runTaskId) taskId, taskStatus, runTaskId/*这段代码是一个宏定义,用于定义任务挂起所需的参数集合*/ #define TASK_SUSPEND_PARAMS(taskId, taskStatus, runTaskId) taskId, taskStatus, runTaskId
#define TASK_RESUME_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio/*这段代码是一个宏定义,用于定义任务恢复所需的参数集合*/ #define TASK_RESUME_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio
#define TASK_SIGNAL_PARAMS(taskId, signal, schedFlag) // taskId, signal, schedFlag/*这段代码是一个宏定义,用于定义任务信号所需的参数集合 #define TASK_SIGNAL_PARAMS(taskId, signal, schedFlag) // taskId, signal, schedFlag
#define SWTMR_START_PARAMS(swtmrId, mode, overrun, interval, expiry) swtmrId, mode, overrun, interval, expiry/*这段代码是一个宏定义,用于定义软定时器启动所需的参数集合*/ #define SWTMR_START_PARAMS(swtmrId, mode, overrun, interval, expiry) swtmrId, mode, overrun, interval, expiry
#define SWTMR_DELETE_PARAMS(swtmrId) swtmrId/*这段代码是一个宏定义,用于定义软定时器删除所需的参数集合*/ #define SWTMR_DELETE_PARAMS(swtmrId) swtmrId
#define SWTMR_EXPIRED_PARAMS(swtmrId) swtmrId/*这段代码是一个宏定义,用于定义软定时器到期所需的参数集合。*/ #define SWTMR_EXPIRED_PARAMS(swtmrId) swtmrId
#define SWTMR_STOP_PARAMS(swtmrId) swtmrId/*这段代码是一个宏定义,用于定义软定时器停止所需的参数集合*/ #define SWTMR_STOP_PARAMS(swtmrId) swtmrId
#define SWTMR_CREATE_PARAMS(swtmrId) swtmrId #define SWTMR_CREATE_PARAMS(swtmrId) swtmrId
#define HWI_CREATE_PARAMS(hwiNum, hwiPrio, hwiMode, hwiHandler) hwiNum, hwiPrio, hwiMode, hwiHandler/*这段代码是一个宏定义,用于定义创建软定时器所需的参数集合*/ #define HWI_CREATE_PARAMS(hwiNum, hwiPrio, hwiMode, hwiHandler) hwiNum, hwiPrio, hwiMode, hwiHandler
#define HWI_CREATE_SHARE_PARAMS(hwiNum, pDevId, ret) hwiNum, pDevId, ret/*这段代码是一个宏定义,用于定义创建硬件中断所需的参数集合*/ #define HWI_CREATE_SHARE_PARAMS(hwiNum, pDevId, ret) hwiNum, pDevId, ret
#define HWI_DELETE_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断删除所需的参数集合*/ #define HWI_DELETE_PARAMS(hwiNum) hwiNum
#define HWI_DELETE_SHARE_PARAMS(hwiNum, pDevId, ret) hwiNum, pDevId, ret/*这段代码是一个宏定义,用于定义共享中断删除所需的参数集合*/ #define HWI_DELETE_SHARE_PARAMS(hwiNum, pDevId, ret) hwiNum, pDevId, ret
#define HWI_RESPONSE_IN_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断响应输入参数*/ #define HWI_RESPONSE_IN_PARAMS(hwiNum) hwiNum
#define HWI_RESPONSE_OUT_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断响应输出参数*/ #define HWI_RESPONSE_OUT_PARAMS(hwiNum) hwiNum
#define HWI_ENABLE_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断使能所需的参数集合*/ #define HWI_ENABLE_PARAMS(hwiNum) hwiNum
#define HWI_DISABLE_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断禁用所需的参数集合*/ #define HWI_DISABLE_PARAMS(hwiNum) hwiNum
#define HWI_TRIGGER_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义触发中断所需的参数集合*/ #define HWI_TRIGGER_PARAMS(hwiNum) hwiNum
#define HWI_SETPRI_PARAMS(hwiNum, priority) hwiNum, priority/*这段代码是一个宏定义,用于定义设置中断优先级所需的参数集合*/ #define HWI_SETPRI_PARAMS(hwiNum, priority) hwiNum, priority
#define HWI_CLEAR_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义清除中断所需的参数集合*/ #define HWI_CLEAR_PARAMS(hwiNum) hwiNum
#define HWI_SETAFFINITY_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask/*这段代码是一个宏定义用于定义设置中断亲和性affinity所需的参数集合*/ #define HWI_SETAFFINITY_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask
#define HWI_SENDIPI_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask/*这段代码是一个宏定义用于定义发送中断处理器间中断IPI所需的参数集合*/ #define HWI_SENDIPI_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask
#define EVENT_CREATE_PARAMS(eventCB) eventCB/*这段代码是一个宏定义用于定义创建事件event所需的参数集合*/ #define EVENT_CREATE_PARAMS(eventCB) eventCB
#define EVENT_DELETE_PARAMS(eventCB, delRetCode) eventCB, delRetCode/*这段代码是一个宏定义用于定义删除事件event所需的参数集合*/ #define EVENT_DELETE_PARAMS(eventCB, delRetCode) eventCB, delRetCode
#define EVENT_READ_PARAMS(eventCB, eventId, mask, mode, timeout) \ #define EVENT_READ_PARAMS(eventCB, eventId, mask, mode, timeout) \
eventCB, eventId, mask, mode, timeout eventCB, eventId, mask, mode, timeout
#define EVENT_WRITE_PARAMS(eventCB, eventId, events) eventCB, eventId, events/*这段代码是一个宏定义用于定义读取事件event所需的参数集合*/ #define EVENT_WRITE_PARAMS(eventCB, eventId, events) eventCB, eventId, events
#define EVENT_CLEAR_PARAMS(eventCB, eventId, events) eventCB, eventId, events/*这段代码是一个宏定义用于定义清除事件event所需的参数集合*/ #define EVENT_CLEAR_PARAMS(eventCB, eventId, events) eventCB, eventId, events
#define QUEUE_CREATE_PARAMS(queueId, queueSz, itemSz, queueAddr, memType) \/*这段代码是一个宏定义用于定义创建队列queue所需的参数*/ #define QUEUE_CREATE_PARAMS(queueId, queueSz, itemSz, queueAddr, memType) \
queueId, queueSz, itemSz, queueAddr, memType queueId, queueSz, itemSz, queueAddr, memType
#define QUEUE_DELETE_PARAMS(queueId, state, readable) queueId, state, readable/*这段代码是一个宏定义用于定义删除队列queue所需的参数集合*/ #define QUEUE_DELETE_PARAMS(queueId, state, readable) queueId, state, readable
#define QUEUE_RW_PARAMS(queueId, queueSize, bufSize, operateType, readable, writeable, timeout) \/*这段代码是一个宏定义用于定义读写队列queue所需的参数集合*/ #define QUEUE_RW_PARAMS(queueId, queueSize, bufSize, operateType, readable, writeable, timeout) \
queueId, queueSize, bufSize, operateType, readable, writeable, timeout queueId, queueSize, bufSize, operateType, readable, writeable, timeout
#define SEM_CREATE_PARAMS(semId, type, count) semId, type, count/*这段代码是一个宏定义用于定义创建信号量semaphore所需的参数集合*/ #define SEM_CREATE_PARAMS(semId, type, count) semId, type, count
#define SEM_DELETE_PARAMS(semId, delRetCode) semId, delRetCode/*这段代码是一个宏定义用于定义删除信号量semaphore所需的参数集合*/ #define SEM_DELETE_PARAMS(semId, delRetCode) semId, delRetCode
#define SEM_PEND_PARAMS(semId, count, timeout) semId, count, timeout/*这段代码是一个宏定义用于定义等待信号量semaphore所需的参数集合*/ #define SEM_PEND_PARAMS(semId, count, timeout) semId, count, timeout
#define SEM_POST_PARAMS(semId, type, count) semId, type, count/*这段代码是一个宏定义用于定义发送信号量semaphore所需的参数集合*/ #define SEM_POST_PARAMS(semId, type, count) semId, type, count
#define MUX_CREATE_PARAMS(muxId) muxId/*这段代码是一个宏定义用于定义创建互斥量mutex所需的参数*/ #define MUX_CREATE_PARAMS(muxId) muxId
#define MUX_DELETE_PARAMS(muxId, state, count, owner) muxId, state, count, owner/*这段代码是一个宏定义用于定义删除互斥量mutex所需的参数集合*/ #define MUX_DELETE_PARAMS(muxId, state, count, owner) muxId, state, count, owner
#define MUX_PEND_PARAMS(muxId, count, owner, timeout) muxId, count, owner, timeout/*这段代码是一个宏定义用于定义等待互斥量mutex所需的参数集合*/ #define MUX_PEND_PARAMS(muxId, count, owner, timeout) muxId, count, owner, timeout
#define MUX_POST_PARAMS(muxId, count, owner) muxId, count, owner/*这段代码是一个宏定义用于定义发送互斥量mutex所需的参数集合*/ #define MUX_POST_PARAMS(muxId, count, owner) muxId, count, owner
#define MEM_ALLOC_PARAMS(pool, ptr, size) pool, ptr, size/*这段代码是一个宏定义用于定义内存分配memory allocation所需的参数集合*/ #define MEM_ALLOC_PARAMS(pool, ptr, size) pool, ptr, size
#define MEM_ALLOC_ALIGN_PARAMS(pool, ptr, size, boundary) pool, ptr, size, boundary/*这段代码是一个宏定义用于定义内存分配对齐alignment所需的参数集合*/ #define MEM_ALLOC_ALIGN_PARAMS(pool, ptr, size, boundary) pool, ptr, size, boundary
#define MEM_REALLOC_PARAMS(pool, ptr, size) pool, ptr, size/*这段代码是一个宏定义用于定义重新分配内存memory reallocation所需的参数集合*/ #define MEM_REALLOC_PARAMS(pool, ptr, size) pool, ptr, size
#define MEM_FREE_PARAMS(pool, ptr) pool, ptr/*这段代码是一个宏定义用于定义内存释放memory deallocation所需的参数集合*/ #define MEM_FREE_PARAMS(pool, ptr) pool, ptr
#define MEM_INFO_REQ_PARAMS(pool) pool/*这段代码是一个宏定义用于定义获取内存信息请求memory information request所需的参数集合*/ #define MEM_INFO_REQ_PARAMS(pool) pool
#define MEM_INFO_PARAMS(pool, usedSize, freeSize) pool, usedSize, freeSize/*这段代码是一个宏定义用于定义内存信息memory information所需的参数集合*/ #define MEM_INFO_PARAMS(pool, usedSize, freeSize) pool, usedSize, freeSize
#define SYS_ERROR_PARAMS(errno) errno #define SYS_ERROR_PARAMS(errno) errno
@ -427,15 +405,7 @@ extern TRACE_EVENT_HOOK g_traceEventHook;
#else #else
#define LOS_TRACE(TYPE, ...) LOS_PERF(TYPE) #define LOS_TRACE(TYPE, ...) LOS_PERF(TYPE)
#endif #endif
/*这段代码是一个宏定义,用于在源代码中插入跟踪代码存根,以追踪事件
LOS_PERF
_inner0
_inner1g_traceEventHook
g_traceEventHook
*/
#ifdef LOSCFG_KERNEL_TRACE #ifdef LOSCFG_KERNEL_TRACE
/** /**
@ -467,13 +437,7 @@ extern TRACE_EVENT_HOOK g_traceEventHook;
#else #else
#define LOS_TRACE_EASY(...) #define LOS_TRACE_EASY(...)
#endif #endif
/*这段代码是一个宏定义,用于在源代码中插入用户自定义的跟踪代码存根,以简单地追踪事件
_inner0
_inner1g_traceEventHook
g_traceEventHookTRACE_USER_DEFAULT_FLAG | TYPE
*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Intialize the trace when the system startup. * @brief Intialize the trace when the system startup.
@ -501,19 +465,7 @@ extern TRACE_EVENT_HOOK g_traceEventHook;
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern UINT32 LOS_TraceInit(VOID *buf, UINT32 size); extern UINT32 LOS_TraceInit(VOID *buf, UINT32 size);
/*这段代码定义了一个名为LOS_TraceInit的函数用于初始化系统级别的跟踪功能
TRACE_UNINITLOS_ERRNO_TRACE_ERROR_STATUS
LOS_ERRNO_TRACE_NO_MEMORY
LOS_ERRNO_TRACE_BUF_TOO_SMALL
LOS_MpCreateLOS_ERRNO_TSK_MP_SYNC_RESOURCE
LOS_ERRNO_TSK_TCB_UNAVAILABLE
TRACE_IDLE
*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Start trace. * @brief Start trace.
@ -535,7 +487,7 @@ extern UINT32 LOS_TraceInit(VOID *buf, UINT32 size);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern UINT32 LOS_TraceStart(VOID); extern UINT32 LOS_TraceStart(VOID);
/*这段代码定义了一个名为LOS_TraceStart的函数用于启动跟踪功能*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Stop trace sample. * @brief Stop trace sample.
@ -556,7 +508,7 @@ extern UINT32 LOS_TraceStart(VOID);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern VOID LOS_TraceStop(VOID); extern VOID LOS_TraceStop(VOID);
/*这段代码定义了一个名为LOS_TraceStop的函数用于停止跟踪采样*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Clear the trace buf. * @brief Clear the trace buf.
@ -577,7 +529,7 @@ extern VOID LOS_TraceStop(VOID);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern VOID LOS_TraceReset(VOID); extern VOID LOS_TraceReset(VOID);
/*这段代码定义了一个名为LOS_TraceReset的函数用于清空跟踪缓冲区中的事件帧仅在离线模式下有效*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Set trace event mask. * @brief Set trace event mask.
@ -601,7 +553,7 @@ extern VOID LOS_TraceReset(VOID);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern VOID LOS_TraceEventMaskSet(UINT32 mask); extern VOID LOS_TraceEventMaskSet(UINT32 mask);
/*这段代码定义了一个名为LOS_TraceEventMaskSet的函数用于设置跟踪事件的掩码*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Offline trace buffer display. * @brief Offline trace buffer display.
@ -624,7 +576,7 @@ extern VOID LOS_TraceEventMaskSet(UINT32 mask);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern VOID LOS_TraceRecordDump(BOOL toClient); extern VOID LOS_TraceRecordDump(BOOL toClient);
/*这段代码定义了一个名为LOS_TraceRecordDump的函数用于在离线模式下显示跟踪缓冲区数据*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Offline trace buffer export. * @brief Offline trace buffer export.
@ -647,7 +599,7 @@ extern VOID LOS_TraceRecordDump(BOOL toClient);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern OfflineHead *LOS_TraceRecordGet(VOID); extern OfflineHead *LOS_TraceRecordGet(VOID);
/*这段代码定义了一个名为LOS_TraceRecordGet的函数用于在离线模式下导出跟踪缓冲区数据*/
/** /**
* @ingroup los_trace * @ingroup los_trace
* @brief Hwi num fliter hook. * @brief Hwi num fliter hook.
@ -668,7 +620,6 @@ extern OfflineHead *LOS_TraceRecordGet(VOID);
* @since Huawei LiteOS V200R005C00 * @since Huawei LiteOS V200R005C00
*/ */
extern VOID LOS_TraceHwiFilterHookReg(TRACE_HWI_FILTER_HOOK hook); extern VOID LOS_TraceHwiFilterHookReg(TRACE_HWI_FILTER_HOOK hook);
/*这段代码定义了一个名为LOS_TraceHwiFilterHookReg的函数用于注册硬件中断Hwi号码过滤钩子函数*/
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }

@ -49,7 +49,6 @@ extern "C" {
#define X_STRING(x) OS_STRING(x) #define X_STRING(x) OS_STRING(x)
/* type definitions */ /* type definitions */
//定义数据类型
typedef unsigned char UINT8; typedef unsigned char UINT8;
typedef unsigned short UINT16; typedef unsigned short UINT16;
typedef unsigned int UINT32; typedef unsigned int UINT32;
@ -60,10 +59,7 @@ typedef float FLOAT;
typedef double DOUBLE; typedef double DOUBLE;
typedef char CHAR; typedef char CHAR;
#ifdef __LP64__ #ifdef __LP64__
//64位数据模型
typedef long unsigned int UINT64; typedef long unsigned int UINT64;
typedef long signed int INT64; typedef long signed int INT64;
typedef unsigned long UINTPTR; typedef unsigned long UINTPTR;
@ -75,7 +71,6 @@ typedef INT64 ssize_t;
typedef UINT64 size_t; typedef UINT64 size_t;
#endif #endif
#else #else
//32位数据模型
typedef unsigned long long UINT64; typedef unsigned long long UINT64;
typedef signed long long INT64; typedef signed long long INT64;
typedef unsigned int UINTPTR; typedef unsigned int UINTPTR;
@ -85,7 +80,7 @@ typedef INT32 ssize_t;
typedef UINT32 size_t; typedef UINT32 size_t;
#endif #endif
#endif #endif
//一些常数的定义
typedef UINTPTR AARCHPTR; typedef UINTPTR AARCHPTR;
typedef size_t BOOL; typedef size_t BOOL;

@ -25,8 +25,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */ * --------------------------------------------------------------------------- */
/*代码是一个虚拟串口头文件用于定义虚拟串口的初始化、反初始化和获取串口类型等函数。在这个头文件中还定义了一个名为LOS_VIRSERIAL_CB的结构体
*/
#ifndef _VIRTUAL_SERIAL_H #ifndef _VIRTUAL_SERIAL_H
#define _VIRTUAL_SERIAL_H #define _VIRTUAL_SERIAL_H
@ -52,20 +51,16 @@ extern "C" {
#define SERIAL_TYPE_UART_DEV 1 #define SERIAL_TYPE_UART_DEV 1
#define SERIAL_TYPE_USBTTY_DEV 2 #define SERIAL_TYPE_USBTTY_DEV 2
extern INT32 virtual_serial_init(const CHAR *deviceName);/*这段代码声明了一个函数原型 virtual_serial_init用于初始化虚拟串口设备*/ extern INT32 virtual_serial_init(const CHAR *deviceName);
extern INT32 virtual_serial_deinit(VOID);/*这段代码声明了一个函数原型 virtual_serial_deinit用于反初始化虚拟串口设备*/ extern INT32 virtual_serial_deinit(VOID);
extern UINT32 SerialTypeGet(VOID);/*这段代码声明了一个函数原型 SerialTypeGet用于获取串口类型的函数*/ extern UINT32 SerialTypeGet(VOID);
typedef struct { typedef struct {
struct file *filep; struct file *filep;
UINT32 mask; UINT32 mask;
} LOS_VIRSERIAL_CB; } LOS_VIRSERIAL_CB;
/*这段代码定义了一个结构体 LOS_VIRSERIAL_CB包含两个成员变量
filep struct file
mask UINT32
filep mask */
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus

Loading…
Cancel
Save