From 99c01f46b7339f93a2aff7dfe342eabc04abc235 Mon Sep 17 00:00:00 2001 From: cailun <2505225681@qq.com> Date: Fri, 3 Nov 2023 00:31:07 +0800 Subject: [PATCH 1/4] doc --- ...teOS阅读报告.docx => 蔡伦_LiteOS阅读泛读报告.docx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/{蔡伦_LiteOS阅读报告.docx => 蔡伦_LiteOS阅读泛读报告.docx} (100%) diff --git a/doc/蔡伦_LiteOS阅读报告.docx b/doc/蔡伦_LiteOS阅读泛读报告.docx similarity index 100% rename from doc/蔡伦_LiteOS阅读报告.docx rename to doc/蔡伦_LiteOS阅读泛读报告.docx From a8f162b24c7c2517448542d2ec01a8bec8559dca Mon Sep 17 00:00:00 2001 From: cailun <2505225681@qq.com> Date: Sun, 3 Dec 2023 23:42:32 +0800 Subject: [PATCH 2/4] src --- src/kernel/base/include/los_binarytree_pri.h | 59 +++++++++++-------- src/kernel/base/include/los_err_pri.h | 3 + src/kernel/base/include/los_event_pri.h | 7 ++- src/kernel/base/include/los_exc_pri.h | 14 ++++- src/kernel/base/include/los_hwi_pri.h | 21 ++++--- src/kernel/base/include/los_memory_pri.h | 14 ++++- src/kernel/base/include/los_memstat_pri.h | 21 ++++--- src/kernel/base/include/los_misc_pri.h | 7 ++- src/kernel/base/include/los_mp_pri.h | 10 +++- .../base/include/los_multipledlinkhead_pri.h | 15 +++-- src/kernel/base/los_bitmap.c | 2 +- src/kernel/include/los_typedef.h | 7 ++- 12 files changed, 123 insertions(+), 57 deletions(-) diff --git a/src/kernel/base/include/los_binarytree_pri.h b/src/kernel/base/include/los_binarytree_pri.h index 2de75ae..8f4a675 100644 --- a/src/kernel/base/include/los_binarytree_pri.h +++ b/src/kernel/base/include/los_binarytree_pri.h @@ -35,67 +35,76 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//定义二叉树节点的模型 typedef struct tagBinNode { - struct tagBinNode *left; - struct tagBinNode *right; - UINT32 nodeId; - CHAR keyValue[0]; + struct tagBinNode *left;//左子树节点 + struct tagBinNode *right;//右子树节点 + UINT32 nodeId;//节点的编号 + CHAR keyValue[0];//节点记录的值(柔性数组,动态分配内存) } BinNode; +//链接二叉树节点 typedef struct { - BinNode leaf; - UINTPTR linkReg1; + BinNode leaf;//一个二叉树 + UINTPTR linkReg1;//无符号数的指针,可连接三个节点 UINTPTR linkReg2; UINTPTR linkReg3; } LinkRegNode; #define LR_COUNT 4096 -extern LinkRegNode g_linkRegNode[LR_COUNT]; -extern UINT32 g_linkRegNodeIndex; -extern LinkRegNode *g_linkRegRoot; +extern LinkRegNode g_linkRegNode[LR_COUNT];//4096个链接二叉树节点 +extern UINT32 g_linkRegNodeIndex;//链接二叉树节点的索引 +extern LinkRegNode *g_linkRegRoot;//链接二叉树节点的指针 +//地址二叉树节点 typedef struct { - BinNode leaf; - UINTPTR addr; + BinNode leaf;//一个二叉树节点 + UINTPTR addr;//二叉树节点记录的地址 } AddrNode; #define ADDR_COUNT 40960 -extern AddrNode g_addrNode[ADDR_COUNT]; -extern UINT32 g_addrNodeIndex; -extern AddrNode *g_addrRoot; +extern AddrNode g_addrNode[ADDR_COUNT];//40960个地址二叉树节点 +extern UINT32 g_addrNodeIndex;//地址二叉树节点的索引 +extern AddrNode *g_addrRoot;//地址二叉树节点的指针 +//请求大小二叉树节点 typedef struct { - BinNode leaf; - UINT32 reqSize; + BinNode leaf;//一个二叉树 + UINT32 reqSize;//请求数据大小 } ReqSizeNode; #define REQ_SIZE_COUNT 4096 -extern ReqSizeNode g_reqSizeNode[REQ_SIZE_COUNT]; -extern UINT32 g_reqSizeNodeIndex; -extern ReqSizeNode *g_reqSizeRoot; +extern ReqSizeNode g_reqSizeNode[REQ_SIZE_COUNT];//4096个请求大小二叉树节点 +extern UINT32 g_reqSizeNodeIndex;//请求大小二叉树节点的索引 +extern ReqSizeNode *g_reqSizeRoot;//请求大小二叉树节点的指针 +//任务编号二叉树节点 typedef struct { BinNode leaf; UINT32 taskId; } TaskIDNode; -#define TASK_ID_COUNT 1024 +#define TASK_ID_COUNT 1024//1024个任务编号 +//将节点插入二叉树的函数 extern UINT32 OsBinTreeInsert(const VOID *node, UINT32 nodeLen, BinNode **leaf, BinNode *(*GetMyBinNode)(UINT32 *nodeId), INT32 (*CompareNode)(const VOID *node1, const VOID *node2)); - +//比较两个二叉树节点 extern INT32 OsCompareLRNode(const VOID *node1, const VOID *node2); +//通过二叉树节点的编号得到二叉树 extern BinNode *OsGetLRBinNode(UINT32 *nodeId); - +//比较两个地址二叉树节点 extern INT32 OsCompareAddrNode(const VOID *node1, const VOID *node2); +//通过地址二叉树节点的编号得到地址二叉树 extern BinNode *OsGetAddrBinNode(UINT32 *nodeId); - +//比较两个请求大小二叉树节点 extern INT32 OsCompareReqSizeNode(const VOID *node1, const VOID *node2); +//通过请求大小二叉树节点的编号得到请求大小二叉树 extern BinNode *OsGetReqSizeBinNode(UINT32 *nodeId); - +//比较两个任务编号二叉树节点 extern INT32 OsCompareTaskIDNode(const VOID *node1, const VOID *node2); +//通过任务编号二叉树节点的编号得到任务编号二叉树 extern BinNode *OsGetTaskIDBinNode(UINT32 *nodeId); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_err_pri.h b/src/kernel/base/include/los_err_pri.h index 9b44583..0c1553e 100644 --- a/src/kernel/base/include/los_err_pri.h +++ b/src/kernel/base/include/los_err_pri.h @@ -40,6 +40,7 @@ extern "C" { #define OS_ERR_MAGIC_WORD 0xa1b2c3f8 /* used to call the error handling function by using an error code and return the same error code. */ +//通过调用处理异常的错误码返回错误码 #define OS_RETURN_ERROR(errNo) do { \ (VOID)LOS_ErrHandle("os_unspecific_file", OS_ERR_MAGIC_WORD, errNo, 0, NULL); \ return errNo; \ @@ -49,12 +50,14 @@ extern "C" { * Call the error handling function by using an error code and the line number of * the erroneous line, and return the same error code. */ +//通过调用异常发生行的位置返回错误码 #define OS_RETURN_ERROR_P2(errLine, errNo) do { \ (VOID)LOS_ErrHandle("os_unspecific_file", errLine, errNo, 0, NULL); \ return errNo; \ } while (0) /* Used to call the error handling function by using an error code. */ +//通过错误码进行调用处理异常的函数 #define OS_GOTO_ERR_HANDLER(errorNo) do { \ errNo = errorNo; \ errLine = OS_ERR_MAGIC_WORD; \ diff --git a/src/kernel/base/include/los_event_pri.h b/src/kernel/base/include/los_event_pri.h index 45c9beb..7c58bfb 100644 --- a/src/kernel/base/include/los_event_pri.h +++ b/src/kernel/base/include/los_event_pri.h @@ -38,10 +38,11 @@ extern "C" { #endif /* __cplusplus */ #ifdef LOSCFG_COMPAT_POSIX +//定义时间状态的结构体 typedef struct { - volatile INT32 *realValue; - INT32 value; - UINT32 clearEvent; + volatile INT32 *realValue;//指向的是一个共享资源的计数器 + INT32 value;//条件变量的值 + UINT32 clearEvent;//需要清除的事件标志 } EventCond; extern UINT32 OsEventReadWithCond(const EventCond *cond, PEVENT_CB_S eventCB, diff --git a/src/kernel/base/include/los_exc_pri.h b/src/kernel/base/include/los_exc_pri.h index 43d5a26..3bdde26 100644 --- a/src/kernel/base/include/los_exc_pri.h +++ b/src/kernel/base/include/los_exc_pri.h @@ -25,12 +25,13 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//防止同一个头文件被多次包含 #ifndef _LOS_EXC_PRI_H #define _LOS_EXC_PRI_H #include "los_exc.h" + #ifdef __cplusplus #if __cplusplus extern "C" { @@ -38,17 +39,28 @@ extern "C" { #endif /* __cplusplus */ #ifdef LOSCFG_SHELL_EXCINFO_DUMP +//用于设置异常信息读写函数的指针。 extern VOID OsSetExcInfoRW(LogReadWriteFunc func); extern LogReadWriteFunc OsGetExcInfoRW(VOID); +//用于设置异常信息缓冲区的指针。 extern VOID OsSetExcInfoBuf(CHAR *buf); +//用于获取异常信息缓冲区的指针。 extern CHAR *OsGetExcInfoBuf(VOID); +//用于设置异常信息在缓冲区中的偏移量。 extern VOID OsSetExcInfoOffset(UINT32 offset); +//用于获取异常信息在缓冲区中的偏移量。 extern UINT32 OsGetExcInfoOffset(VOID); +//用于设置异常信息转储地址。 extern VOID OsSetExcInfoDumpAddr(UINTPTR addr); +//用于获取异常信息转储地址。 extern UINTPTR OsGetExcInfoDumpAddr(VOID); +//用于设置异常信息的长度。 extern VOID OsSetExcInfoLen(UINT32 len); +//用于获取异常信息的长度。 extern UINT32 OsGetExcInfoLen(VOID); +//用于记录异常信息的时间戳。 extern VOID OsRecordExcInfoTime(VOID); +//用于将格式化的字符串写入异常信息缓冲区。 extern VOID WriteExcBufVa(const CHAR *format, va_list arg); extern VOID WriteExcInfoToBuf(const CHAR *format, ...); #endif diff --git a/src/kernel/base/include/los_hwi_pri.h b/src/kernel/base/include/los_hwi_pri.h index 257a07b..4b0ed7a 100644 --- a/src/kernel/base/include/los_hwi_pri.h +++ b/src/kernel/base/include/los_hwi_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义了一些与硬件中断处理相关的数据结构和函数接口,用于操作和管理系统中的硬件中断。 #ifndef _LOS_HWI_PRI_H #define _LOS_HWI_PRI_H @@ -67,9 +67,11 @@ typedef struct { } HwiControllerOps; extern const HwiControllerOps *g_hwiOps; - +//用于初始化硬件中断 extern VOID OsHwiInit(VOID); +//用于获取当前中断嵌套的计数值,可以用于检查当前是否处于中断嵌套状态。 extern size_t OsIrqNestingCntGet(VOID); +//用于设置中断嵌套的计数值。 extern VOID OsIrqNestingCntSet(size_t val); /** @@ -77,8 +79,9 @@ extern VOID OsIrqNestingCntSet(size_t val); * 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. */ +//一个汇编入口函数,由汇编代码在dispatch.S中调用,用于统一处理外部中断的入口,由内核接管中断处理流程。 extern VOID OsIntEntry(VOID); - +//根据中断号获取中断处理信息的指针 STATIC INLINE HwiHandleInfo *OsGetHwiForm(UINT32 hwiNum) { if ((g_hwiOps == NULL) || (g_hwiOps->getHandleForm == NULL)) { @@ -86,7 +89,7 @@ STATIC INLINE HwiHandleInfo *OsGetHwiForm(UINT32 hwiNum) } return g_hwiOps->getHandleForm(hwiNum); } - +//用于获取指定中断的响应计数值 STATIC INLINE UINT32 OsGetHwiFormCnt(UINT32 hwiNum) { HwiHandleInfo *hwiForm = OsGetHwiForm(hwiNum); @@ -96,7 +99,7 @@ STATIC INLINE UINT32 OsGetHwiFormCnt(UINT32 hwiNum) } return hwiForm->respCount; } - +//用于获取当前正在处理的中断号。 STATIC INLINE UINT32 OsIntNumGet(VOID) { if ((g_hwiOps == NULL) || (g_hwiOps->getCurIrqNum == NULL)) { @@ -104,7 +107,7 @@ STATIC INLINE UINT32 OsIntNumGet(VOID) } return g_hwiOps->getCurIrqNum(); } - +//用于判断指定的中断号是否已经注册了相应的处理函数。 STATIC INLINE BOOL OsIntIsRegisted(UINT32 num) { HwiHandleInfo *hwiForm = OsGetHwiForm(num); @@ -118,7 +121,7 @@ STATIC INLINE BOOL OsIntIsRegisted(UINT32 num) return (hwiForm->hook != NULL); #endif } - +//用于获取指定中断的注册参数信息。 STATIC INLINE HWI_ARG_T OsIntGetPara(UINT32 num) { HwiHandleInfo *hwiForm = OsGetHwiForm(num); @@ -128,7 +131,7 @@ STATIC INLINE HWI_ARG_T OsIntGetPara(UINT32 num) } return hwiForm->registerInfo; } - +//用于获取中断版本信息。 STATIC INLINE CHAR *OsIntVersionGet(VOID) { if ((g_hwiOps == NULL) || (g_hwiOps->getIrqVersion == NULL)) { @@ -143,6 +146,7 @@ STATIC INLINE CHAR *OsIntVersionGet(VOID) * handleForm to this interface. * eg: Used for arm(cortex-m),xtensa,riscv. */ +//在中断控制器驱动层实现通用的中断处理入口,用于传递中断号和处理信息给相应的处理函数。 extern VOID OsIntHandle(UINT32 hwiNum, HwiHandleInfo *handleForm); /** @@ -151,6 +155,7 @@ 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 * the implementation of the stub function to report an error in time. */ +//用于注册中断控制器相关的操作函数,需要在中断控制器初始化时被调用。 STATIC INLINE VOID OsHwiControllerReg(const HwiControllerOps *ops) { g_hwiOps = ops; diff --git a/src/kernel/base/include/los_memory_pri.h b/src/kernel/base/include/los_memory_pri.h index fe56414..7214baa 100644 --- a/src/kernel/base/include/los_memory_pri.h +++ b/src/kernel/base/include/los_memory_pri.h @@ -35,6 +35,8 @@ #include "los_spinlock.h" #include "los_misc_pri.h" +//关于内存管理的私有接口声明 + #ifdef __cplusplus #if __cplusplus extern "C" { @@ -60,6 +62,7 @@ typedef struct { struct LosSlabControlHeader slabCtrlHdr; #endif } LosMemPoolInfo; +//用于描述内存池的信息,包括内存池的起始地址、大小等信息。 #elif defined(LOSCFG_KERNEL_MEM_BESTFIT_LITTLE) @@ -90,6 +93,7 @@ extern SPIN_LOCK_S g_memSpin; #define MEM_LOCK(state) LOS_SpinLockSave(&g_memSpin, &(state)) #define MEM_UNLOCK(state) LOS_SpinUnlockRestore(&g_memSpin, (state)) +//用于系统内存的初始化。 extern UINTPTR g_sys_mem_addr_end; extern UINT32 OsMemSystemInit(UINTPTR memStart); @@ -104,11 +108,12 @@ extern UINT32 OsMemMulPoolInit(VOID *pool, UINT32 size); extern UINT32 OsMemMulPoolDeinit(const VOID *pool); extern VOID *OsMemMulPoolHeadGet(VOID); #else /* LOSCFG_MEM_MUL_POOL */ +//用于初始化多内存池,接受内存池的起始地址和大小作为参数。 STATIC INLINE UINT32 OsMemMulPoolInit(VOID *pool, UINT32 size) { return LOS_OK; } - +//用于反初始化多内存池,接受内存池的指针作为参数。 STATIC INLINE UINT32 OsMemMulPoolDeinit(const VOID *pool) { return LOS_OK; @@ -116,16 +121,21 @@ STATIC INLINE UINT32 OsMemMulPoolDeinit(const VOID *pool) #endif /* LOSCFG_MEM_MUL_POOL */ #ifdef LOSCFG_EXC_INTERACTION +//于初始化内存异常交互,接受内存起始地址作为参数。 extern UINT32 OsMemExcInteractionInit(UINTPTR memStart); #endif #ifdef LOSCFG_MEM_LEAKCHECK +//用于展示已使用的内存节点信息,接受内存池指针作为参数。 extern VOID OsMemUsedNodeShow(VOID *pool); #endif - +//用于重置内存池的结束节点,接受内存池指针和前一个地址作为参数。 extern VOID OsMemResetEndNode(VOID *pool, UINTPTR preAddr); +//用于打印内存信息,接受内存池指针作为参数。 extern VOID OsMemInfoPrint(const VOID *pool); +//用于执行内存检查的 shell 命令,接受命令参数作为输入。 extern UINT32 OsShellCmdMemCheck(INT32 argc, const CHAR *argv[]); +//用于执行多重内存完整性检查。 extern VOID OsMemIntegrityMultiCheck(VOID); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_memstat_pri.h b/src/kernel/base/include/los_memstat_pri.h index 2b43079..40d8131 100644 --- a/src/kernel/base/include/los_memstat_pri.h +++ b/src/kernel/base/include/los_memstat_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义了一些用于内存统计的数据结构和函数接口,用于跟踪和管理任务使用的内存情况。 #ifndef _LOS_MEMSTAT_PRI_H #define _LOS_MEMSTAT_PRI_H @@ -43,19 +43,22 @@ extern "C" { #ifdef LOSCFG_MEM_TASK_STAT typedef struct { - UINT32 memUsed; - UINT32 memPeak; + UINT32 memUsed;//内存使用 + UINT32 memPeak;//内存峰值 } TaskMemUsedInfo; typedef struct { - UINT32 memTotalUsed; - UINT32 memTotalPeak; - TaskMemUsedInfo taskMemstats[TASK_NUM]; + UINT32 memTotalUsed;//内存使用量 + UINT32 memTotalPeak;//内存使用峰值 + TaskMemUsedInfo taskMemstats[TASK_NUM];//使用内存的任务列表 } Memstat; - +//用于增加任务的内存使用量和峰值。 extern VOID OsMemstatTaskUsedInc(Memstat *stat, UINT32 usedSize, UINT32 taskId); +//用于减少任务的内存使用量和峰值。 extern VOID OsMemstatTaskUsedDec(Memstat *stat, UINT32 usedSize, UINT32 taskId); +//用于清除任务的内存统计信息。 extern VOID OsMemstatTaskClear(Memstat *stat, UINT32 taskId); +//用于获取任务的内存使用率。 extern UINT32 OsMemstatTaskUsage(const Memstat *stat, UINT32 taskId); #endif @@ -63,9 +66,13 @@ extern VOID OsMemTaskClear(UINT32 taskId); extern UINT32 OsMemTaskUsage(UINT32 taskId); #ifdef LOSCFG_MEM_TASK_STAT +//增加任务的内存使用量和峰值。 #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_CLEAR(taskId) OsMemTaskClear(taskId) +//获取任务的内存使用率。 #define OS_MEM_USAGE(taskId) OsMemTaskUsage(taskId) #else #define OS_MEM_ADD_USED(stat, usedSize, taskId) diff --git a/src/kernel/base/include/los_misc_pri.h b/src/kernel/base/include/los_misc_pri.h index b0a3403..041d8bd 100644 --- a/src/kernel/base/include/los_misc_pri.h +++ b/src/kernel/base/include/los_misc_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义了一些私有接口和数据结构,主要涉及与内存相关的功能和调试功能。 #ifndef _LOS_MISC_PRI_H #define _LOS_MISC_PRI_H @@ -36,7 +36,7 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//定义了一个用于将指定地址开始的连续内存字节进行转储的函数。可以用于调试和观察内存中的数据。 VOID OsDumpMemByte(size_t length, UINTPTR addr); #if defined(LOSCFG_DEBUG_SEMAPHORE) || defined(LOSCFG_DEBUG_MUTEX) || defined(LOSCFG_DEBUG_QUEUE) @@ -48,13 +48,16 @@ typedef struct { } SortParam; /* Compare the size of the last access time */ +//用于排序时比较控制块成员的大小。 typedef BOOL (*OsCompareFunc)(const SortParam *sortParam, UINT32 left, UINT32 right); /* Get the address of the comparison member variable */ +//用于获取控制块成员变量的地址。 #define SORT_ELEM_ADDR(sortParam, index) \ ((sortParam)->buf + ((index) * (sortParam)->ctrlBlockSize) + (sortParam)->sortElemOff) /* Sort this index array. */ +//用于对索引数组进行排序。 extern VOID OsArraySort(UINT32 *sortArray, UINT32 start, UINT32 end, const SortParam *sortParam, OsCompareFunc compareFunc); #endif diff --git a/src/kernel/base/include/los_mp_pri.h b/src/kernel/base/include/los_mp_pri.h index ad2d5de..0359e40 100644 --- a/src/kernel/base/include/los_mp_pri.h +++ b/src/kernel/base/include/los_mp_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义了一些私有接口、数据结构和宏,主要涉及多处理器(MP)相关的功能。 #ifndef _LOS_MP_PRI_H #define _LOS_MP_PRI_H @@ -56,10 +56,15 @@ typedef enum { typedef VOID (*SMP_FUNC_CALL)(VOID *args); #ifdef LOSCFG_KERNEL_SMP +//定义了一个用于在多处理器系统中切换调度目标的函数。 extern VOID LOS_MpSchedule(UINT32 target); +//定义了一个用于处理多处理器唤醒事件的函数。 extern VOID OsMpWakeHandler(VOID); +//定义了一个用于处理多处理器调度事件的函数。 extern VOID OsMpScheduleHandler(VOID); +//定义了一个用于处理多处理器停机事件的函数。 extern VOID OsMpHaltHandler(VOID); +//定义了一个用于初始化多处理器相关功能的函数。 extern UINT32 OsMpInit(VOID); #else STATIC INLINE VOID LOS_MpSchedule(UINT32 target) @@ -69,7 +74,7 @@ STATIC INLINE VOID LOS_MpSchedule(UINT32 target) #endif #ifdef LOSCFG_KERNEL_SMP_CALL - +//用于在目标 CPU 上调用函数 typedef struct { LOS_DL_LIST node; SMP_FUNC_CALL func; @@ -82,6 +87,7 @@ typedef struct { extern VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args); extern VOID OsMpFuncCallHandler(VOID); #else +//用于处理多处理器函数调用事件。 STATIC INLINE VOID OsMpFuncCall(UINT32 target, SMP_FUNC_CALL func, VOID *args) { (VOID)target; diff --git a/src/kernel/base/include/los_multipledlinkhead_pri.h b/src/kernel/base/include/los_multipledlinkhead_pri.h index 7befa0e..98461e2 100644 --- a/src/kernel/base/include/los_multipledlinkhead_pri.h +++ b/src/kernel/base/include/los_multipledlinkhead_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义了一个多重双向链表头的私有接口和数据结构。 #ifndef _LOS_MULTIPLE_DLINK_HEAD_PRI_H #define _LOS_MULTIPLE_DLINK_HEAD_PRI_H @@ -37,25 +37,30 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//表示最大的多重双向链表的大小的对数值。 #define OS_MAX_MULTI_DLNK_LOG2 29 +//表示最小的多重双向链表的大小的对数值。 #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_DLNK_HEAD_SIZE OS_MULTI_DLNK_HEAD_SIZE +//表示多重双向链表头结构体的大小。 #define OS_MULTI_DLNK_HEAD_SIZE sizeof(LosMultipleDlinkHead) - +//用于存储多重双向链表的头指针数组。 typedef struct { LOS_DL_LIST listHead[OS_MULTI_DLNK_NUM]; } LosMultipleDlinkHead; - +//根据给定的头地址和链表节点头指针,返回下一个多重链表的头指针。 STATIC INLINE LOS_DL_LIST *OsDLnkNextMultiHead(VOID *headAddr, LOS_DL_LIST *listNodeHead) { LosMultipleDlinkHead *head = (LosMultipleDlinkHead *)headAddr; return (&head->listHead[OS_MULTI_DLNK_NUM - 1] == listNodeHead) ? NULL : (listNodeHead + 1); } - +//对给定的头地址进行初始化,将多重双向链表的头指针数组中的所有指针置为 NULL。 extern VOID OsDLnkInitMultiHead(VOID *headAddr); +//根据给定的头地址和大小,返回对应的多重双向链表的头指针。 extern LOS_DL_LIST *OsDLnkMultiHead(VOID *headAddr, UINT32 size); #ifdef __cplusplus diff --git a/src/kernel/base/los_bitmap.c b/src/kernel/base/los_bitmap.c index 84a056a..d299fb6 100644 --- a/src/kernel/base/los_bitmap.c +++ b/src/kernel/base/los_bitmap.c @@ -35,7 +35,7 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -#define OS_BITMAP_MASK 0x1FU +#define OS_BITMAP_MASK 0x1FU//位图的掩码,与数据进行与操作得到低五位的信息 VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos) { diff --git a/src/kernel/include/los_typedef.h b/src/kernel/include/los_typedef.h index aa5e5e1..dedd290 100644 --- a/src/kernel/include/los_typedef.h +++ b/src/kernel/include/los_typedef.h @@ -49,6 +49,7 @@ extern "C" { #define X_STRING(x) OS_STRING(x) /* type definitions */ +//定义数据类型 typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned int UINT32; @@ -59,7 +60,10 @@ typedef float FLOAT; typedef double DOUBLE; typedef char CHAR; + + #ifdef __LP64__ +//64位数据模型 typedef long unsigned int UINT64; typedef long signed int INT64; typedef unsigned long UINTPTR; @@ -71,6 +75,7 @@ typedef INT64 ssize_t; typedef UINT64 size_t; #endif #else +//32位数据模型 typedef unsigned long long UINT64; typedef signed long long INT64; typedef unsigned int UINTPTR; @@ -80,7 +85,7 @@ typedef INT32 ssize_t; typedef UINT32 size_t; #endif #endif - +//一些常数的定义 typedef UINTPTR AARCHPTR; typedef size_t BOOL; From 28d27255cd018076218505a95d4bd17aac5fa254 Mon Sep 17 00:00:00 2001 From: cailun <2505225681@qq.com> Date: Sun, 3 Dec 2023 23:59:27 +0800 Subject: [PATCH 3/4] src --- src/kernel/base/include/los_binarytree_pri.h | 2 +- src/kernel/base/include/los_err_pri.h | 2 +- src/kernel/base/include/los_event_pri.h | 2 +- src/kernel/base/include/los_exc_pri.h | 1 + src/kernel/base/include/los_memory_pri.h | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/kernel/base/include/los_binarytree_pri.h b/src/kernel/base/include/los_binarytree_pri.h index 8f4a675..7c10fdc 100644 --- a/src/kernel/base/include/los_binarytree_pri.h +++ b/src/kernel/base/include/los_binarytree_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义了与二叉树相关的结构体和函数,用于实现对数据的快速查找和插入。 #ifndef _LOS_BINARYTREE_PRI_H #define _LOS_BINARYTREE_PRI_H diff --git a/src/kernel/base/include/los_err_pri.h b/src/kernel/base/include/los_err_pri.h index 0c1553e..0755153 100644 --- a/src/kernel/base/include/los_err_pri.h +++ b/src/kernel/base/include/los_err_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//用于定义一些错误处理相关的宏和函数。 #ifndef _LOS_ERR_PRI_H #define _LOS_ERR_PRI_H diff --git a/src/kernel/base/include/los_event_pri.h b/src/kernel/base/include/los_event_pri.h index 7c58bfb..3ed390d 100644 --- a/src/kernel/base/include/los_event_pri.h +++ b/src/kernel/base/include/los_event_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义了一些与事件操作相关的私有函数和结构体。 #ifndef _LOS_EVENT_PRI_H #define _LOS_EVENT_PRI_H diff --git a/src/kernel/base/include/los_exc_pri.h b/src/kernel/base/include/los_exc_pri.h index 3bdde26..93d154f 100644 --- a/src/kernel/base/include/los_exc_pri.h +++ b/src/kernel/base/include/los_exc_pri.h @@ -25,6 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ +//定义了一些与异常处理相关的私有函数和宏 //防止同一个头文件被多次包含 #ifndef _LOS_EXC_PRI_H #define _LOS_EXC_PRI_H diff --git a/src/kernel/base/include/los_memory_pri.h b/src/kernel/base/include/los_memory_pri.h index 7214baa..642d88e 100644 --- a/src/kernel/base/include/los_memory_pri.h +++ b/src/kernel/base/include/los_memory_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//定义内存管理的私有接口和数据结构。 #ifndef _LOS_MEMORY_PRI_H #define _LOS_MEMORY_PRI_H From 3c2848c185895a745e3306abad672be530f4050f Mon Sep 17 00:00:00 2001 From: cailun <2505225681@qq.com> Date: Sun, 3 Dec 2023 23:59:52 +0800 Subject: [PATCH 4/4] doc --- doc/蔡伦_LiteOS阅读泛读报告.docx | Bin 0 -> 14958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/蔡伦_LiteOS阅读泛读报告.docx b/doc/蔡伦_LiteOS阅读泛读报告.docx index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..589a7b5393bfd7ba1b3f7cd7e7625a1221bdebbc 100644 GIT binary patch literal 14958 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 S-%{4#0A25gY|`i7TK^B3O$d$v literal 0 HcmV?d00001