From 133d11be272e936af5b284a644a0d4d3b8e644ca Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Mon, 27 Nov 2023 19:48:57 +0800 Subject: [PATCH 02/11] 1 --- src/kernel/include/los_runstop.h | 47 +++---- src/kernel/include/los_sem.h | 85 ++++++++----- src/kernel/include/los_slab.h | 20 ++- src/kernel/include/los_spinlock.h | 72 +++++++++-- src/kernel/include/los_swtmr.h | 107 ++++++++++------ src/kernel/include/los_tables.h | 24 ++-- src/kernel/include/los_task.h | 178 ++++++++++++++++++++------- src/kernel/include/los_tick.h | 49 +++++--- src/kernel/include/los_tickless.h | 4 + src/kernel/include/los_toolchain.h | 31 ++++- src/kernel/include/los_trace.h | 184 ++++++++++++++++++---------- src/kernel/include/los_typedef.h | 13 +- src/kernel/include/virtual_serial.h | 10 +- 13 files changed, 566 insertions(+), 258 deletions(-) diff --git a/src/kernel/include/los_runstop.h b/src/kernel/include/los_runstop.h index 58b3a2c..eff3636 100644 --- a/src/kernel/include/los_runstop.h +++ b/src/kernel/include/los_runstop.h @@ -31,10 +31,10 @@ * @ingroup kernel */ -#ifndef _LOS_RUNSTOP_H +#ifndef _LOS_RUNSTOP_H 组的定义:该组包含了一些与运行停止有关的函数和宏定义。 #define _LOS_RUNSTOP_H -#include "los_typedef.h" +#include "los_typedef.h"包含了 LOS Kernel 所需的基本类型定义。 #ifdef __cplusplus #if __cplusplus @@ -43,7 +43,7 @@ extern "C" { #endif /* __cplusplus */ /** - * @ingroup los_runstop + * @ingroup los_runstop ##该回调函数类型定义用于在唤醒阶段调用。它允许用户定义一个函数,当系统从休眠状态唤醒时,该函数将被调用 * @brief Define the type of a runstop callback function. * * @par Description: @@ -63,7 +63,7 @@ extern "C" { * @see None. * @since Huawei LiteOS V100R001C00 */ -typedef VOID (*RUNSTOP_CALLBACK_FUNC)(VOID); +typedef VOID (*RUNSTOP_CALLBACK_FUNC)(VOID);/*函数指针类型RUNSTOP_CALLBACK_FUNC,用于定义运行停止时的回调函数,没有参数和返回值 /** * @ingroup los_runstop @@ -88,7 +88,10 @@ typedef VOID (*RUNSTOP_CALLBACK_FUNC)(VOID); * @see None. * @since Huawei LiteOS V100R001C00 */ -typedef INT32 (*FLASH_READ_FUNC)(VOID *memAddr, size_t start, size_t size); +typedef INT32 (*FLASH_READ_FUNC)(VOID *memAddr, size_t start, size_t size);/*定义了一个名为FLASH_READ_FUNC的函数指针类型,用于定义一个从Flash中读取数据的函数 +memAddr:用于存储从Flash中读取数据的内存起始地址 +start:从Flash中读取数据的起始地址 +size:从Flash中读取的数据大小。 /** * @ingroup los_runstop @@ -113,7 +116,10 @@ typedef INT32 (*FLASH_READ_FUNC)(VOID *memAddr, size_t start, size_t size); * @see None. * @since Huawei LiteOS V100R001C00 */ -typedef INT32 (*FLASH_WRITE_FUNC)(VOID *memAddr, size_t start, size_t size); +typedef INT32 (*FLASH_WRITE_FUNC)(VOID *memAddr, size_t start, size_t size);/*定义一个用于写入flash数据的函数类 +memAddr:要从中读取数据并写入到某个flash的内存起始地址。 +start:要写入数据的某个flash的起始地址。 +size:要写入到某个flash的数据的大小 /** * @ingroup los_runstop @@ -122,20 +128,17 @@ typedef INT32 (*FLASH_WRITE_FUNC)(VOID *memAddr, size_t start, size_t size); * Information of specified parameters passed in during runstop. */ typedef struct tagRunstopParam { - RUNSTOP_CALLBACK_FUNC pfIdleWakeupCallback; /* < Wake up callback function, called in idle task */ - RUNSTOP_CALLBACK_FUNC pfWakeupCallback; /* < Wake up callback function */ - RUNSTOP_CALLBACK_FUNC pfImageDoneCallback; /* < Image done callback function, called just after memory is stored */ - FLASH_READ_FUNC pfFlashReadFunc; /* < An abstract function for reading data from a certain flash */ - FLASH_WRITE_FUNC pfFlashWriteFunc; /* < An abstract function for writing data to a certain flash */ - size_t uwFlashReadAlignSize; /* < Block align size when reading data from a certain flash */ - size_t uwFlashEraseAlignSize; /* < Block align size when erasing data in a certain flash */ - size_t uwFlashWriteAlignSize; /* < Block align size when writing data to a certain flash */ - UINTPTR uwWowFlashAddr; /* < The flash starting address to which the memory is to be - stored, the address should be flash write-alignment length - aligned */ - UINTPTR uwImageFlashAddr; /* < The flash starting address where the whole application image - is burned */ -} RUNSTOP_PARAM_S; + RUNSTOP_CALLBACK_FUNC pfIdleWakeupCallback; /*< 空闲任务中的唤醒回调函数 */ + RUNSTOP_CALLBACK_FUNC pfWakeupCallback; /*< 唤醒回调函数 */ + RUNSTOP_CALLBACK_FUNC pfImageDoneCallback; /*< 内存存储完成后的回调函数 */ + FLASH_READ_FUNC pfFlashReadFunc; /*< 从某个闪存中读取数据的抽象函数 */ + FLASH_WRITE_FUNC pfFlashWriteFunc; /*< 向某个闪存中写入数据的抽象函数 */ + size_t uwFlashReadAlignSize; /*< 从某个闪存中读取数据时的块对齐大小 */ + size_t uwFlashEraseAlignSize; /*< 擦除某个闪存中数据时的块对齐大小 */ + size_t uwFlashWriteAlignSize; /*< 向某个闪存中写入数据时的块对齐大小 */ + UINTPTR uwWowFlashAddr; /* < 存储内存的闪存起始地址,地址应与闪存写入对齐长度对齐 */ + UINTPTR uwImageFlashAddr; /* < 整个应用程序镜像烧录到的闪存起始地址 */ +} RUNSTOP_PARAM_S;/*是用于传递和配置运行停止功能所需的参数信息 /** * @ingroup los_runstop @@ -159,8 +162,8 @@ typedef struct tagRunstopParam { * @see * @since Huawei LiteOS V100R001C00 */ -extern VOID LOS_MakeImage(const RUNSTOP_PARAM_S *runstopParam); - +extern VOID LOS_MakeImage(const RUNSTOP_PARAM_S *runstopParam);/*定义了一个名为LOS_MakeImage的函数,用于将内存映像存储到flash中。 +函数接受一个名为runstopParam的参数,该参数包含了一些关键信息,用于runstop使用,包括要存储内存映像的flash起始地址等。 #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/include/los_sem.h b/src/kernel/include/los_sem.h index 73c6a78..d89a281 100644 --- a/src/kernel/include/los_sem.h +++ b/src/kernel/include/los_sem.h @@ -49,17 +49,17 @@ extern "C" { * @ingroup los_sem * Max count of counting semaphores */ -#define LOS_SEM_COUNT_MAX 0xFFFE +#define LOS_SEM_COUNT_MAX 0xFFFE/*计数信号量的最大值*/ /** - * @ingroup los_sem - * Semaphore error code: The memory is insufficient. + * @ingroup los_sem 该宏定义属于信号量模块。 + * 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) +#define LOS_ERRNO_SEM_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x00)/*定义一个信号量(Semaphore)的错误码,表示内存不足 /** * @ingroup los_sem @@ -72,14 +72,15 @@ extern "C" { #define LOS_ERRNO_SEM_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x01) /** - * @ingroup los_sem - * Semaphore error code: Null pointer. + * @ingroup los_sem 该宏定义属于信号量模块。 + * 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 @@ -87,9 +88,9 @@ extern "C" { * * 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 @@ -97,9 +98,9 @@ extern "C" { * * 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 @@ -107,9 +108,9 @@ extern "C" { * * Value: 0x02000705. * - * Solution: Do not call the API during an interrupt. + * Solution: Do not call the API during an interrupt.解决该错误的方法a:不要在中断期间调用该API */ -#define LOS_ERRNO_SEM_PEND_INTERR LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x05) +#define LOS_ERRNO_SEM_PEND_INTERR LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x05)/*定义了一个信号量模块的错误码,表示在中断期间调用了该API,这是被禁止的*/ /** * @ingroup los_sem @@ -117,9 +118,9 @@ extern "C" { * * Value: 0x02000706. * - * Solution: Do not call LOS_SemPend when task scheduling is locked. + * Solution: Do not call LOS_SemPend when task scheduling is locked.解决该错误的方法:在任务调度被锁定时不要调用LOS_SemPend函数 */ -#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 @@ -127,9 +128,9 @@ extern "C" { * * 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 @@ -137,9 +138,9 @@ extern "C" { * * 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 @@ -148,9 +149,9 @@ extern "C" { * * 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 @@ -159,10 +160,10 @@ extern "C" { * * Value: 0x0200070A. * - * Solution: Do not call the API in the system-level callback. - * @deprecated This error code is obsolete since LiteOS 5.0.0. + * Solution: Do not call the API in the system-level callback.解决该错误的方法,即不要在系统级回调中调用该API。 + * @deprecated This error code is obsolete since LiteOS 5.0.0.该错误码自LiteOS 5.0.0版本起已经过时。 */ -#define LOS_ERRNO_SEM_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x0A) +#define LOS_ERRNO_SEM_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x0A)/*定义了一个信号量模块的错误码,表示在系统级回调中调用了该API,这是被禁止的*/ /** * @ingroup los_sem @@ -187,7 +188,8 @@ extern "C" { * @see LOS_SemDelete | LOS_BinarySemCreate * @since Huawei LiteOS V100R001C00 */ -extern UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle); +extern UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle);/*这段代码声明了一个函数LOS_SemCreate,用于创建信号量。该函数根据传入的初始可用信号量数量, +创建一个信号量控制结构,并返回该信号量控制结构的ID。函数的返回值包括多种情况,如传入的参数为空指针、传入的初始可用信号量数量超过最大数量、没有可用的信号量控制结构等。*/ /** * @ingroup los_sem @@ -212,7 +214,7 @@ extern UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle); * @see LOS_SemCreate | LOS_SemDelete * @since Huawei LiteOS V100R001C00 */ -extern UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle); +extern UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle);/*声明了一个函数原型 LOS_BinarySemCreate,用于创建一个二进制信号量。*/ /** * @ingroup los_sem @@ -235,7 +237,7 @@ extern UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle); * @see LOS_SemCreate | LOS_BinarySemCreate * @since Huawei LiteOS V100R001C00 */ -extern UINT32 LOS_SemDelete(UINT32 semHandle); +extern UINT32 LOS_SemDelete(UINT32 semHandle);/*这段代码定义了一个函数LOS_SemDelete,用于删除一个信号量的控制结构*/ /** * @ingroup los_sem @@ -272,7 +274,19 @@ extern UINT32 LOS_SemDelete(UINT32 semHandle); * @see LOS_SemPost | LOS_SemCreate | LOS_BinarySemCreate * @since Huawei LiteOS V100R001C00 */ -extern UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout); +extern UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout);/*该函数用于请求一个信号量 +通过semHandle参数指定要请求的信号量控制结构的ID,该ID是在信号量创建时获得的。 +timeout参数指定等待信号量的超时时间,如果timeout值为0,表示不会等待信号量。如果timeout值为0xFFFFFFFF,表示会一直等待信号量。超时时间单位为Tick。 +函数返回值为操作结果: +若返回值为LOS_ERRNO_SEM_INVALID,表示传入的semHandle值无效。 +若返回值为LOS_ERRNO_SEM_UNAVAILABLE,表示没有可用的信号量资源。 +若返回值为LOS_ERRNO_SEM_PEND_INTERR,表示在中断 [Something went wrong, please try again later.] + + + + +*/ + /** * @ingroup los_sem @@ -294,7 +308,12 @@ extern UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout); * @see LOS_SemPend | LOS_SemCreate | LOS_BinarySemCreate * @since Huawei LiteOS V100R001C00 */ -extern UINT32 LOS_SemPost(UINT32 semHandle); +extern UINT32 LOS_SemPost(UINT32 semHandle);/*这段代码定义了一个函数LOS_SemPost,用于释放一个信号量*/ +/*LOS_SemPost用于释放由semHandle指定的信号量控制结构。 +若释放前没有先创建指定的信号量,则会返回LOS_ERRNO_SEM_INVALID。 +若信号量释放的次数超过允许的最大次数,则会返回LOS_ERRNO_SEM_OVERFLOW。 +若成功释放信号量,则会返回LOS_OK。 +此函数依赖于LOS_SemPend、LOS_SemCreate和LOS_BinarySemCreate函数。*/ #ifdef __cplusplus #if __cplusplus diff --git a/src/kernel/include/los_slab.h b/src/kernel/include/los_slab.h index 1fd2ddb..a812270 100644 --- a/src/kernel/include/los_slab.h +++ b/src/kernel/include/los_slab.h @@ -46,9 +46,9 @@ extern "C" { * @ingroup los_slab * total size of each slab class. */ -#define SLAB_MEM_ALLOCATOR_SIZE 512U +#define SLAB_MEM_ALLOCATOR_SIZE 512U /*宏定义SLAB_MEM_ALLOCATOR_SIZE表示每个slab class(一种内存分配方式)所需要的总大小为512字节*/ -#define SLAB_BASIC_NEED_SIZE 0x1000 +#define SLAB_BASIC_NEED_SIZE 0x1000 /*宏定义SLAB_BASIC_NEED_SIZE表示内存分配时最小需要的空间为0x1000字节(即4KB)。*/ /** * @ingroup los_slab @@ -63,7 +63,14 @@ enum SlabBucketSizeType { #define SLAB_MEM_BUCKET_SIZE_TYPE SLAB_BUCKET_SIZE_HALF_OF_HEAP #endif - +/*这段代码主要是用于配置和定义slab内存分配器中内存块大小的相关选项。*/ +/*这段代码定义了一个枚举类型SlabBucketSizeType,用于表示slab bucket(内存块)的大小类型 +如果宏定义LOSCFG_KERNEL_MEM_SLAB_AUTO_EXPANSION_MODE被定义,那么枚举类型SlabBucketSizeType将会被定义。 +枚举类型SlabBucketSizeType包含以下取值: +SLAB_BUCKET_SIZE_HALF_OF_HEAP:表示slab内存块可以使用堆内存大小的一半。 +SLAB_BUCKET_SIZE_QUARTER_OF_HEAP:表示slab内存块可以使用堆内存大小的四分之一。 +SLAB_BUCKET_SIZE_TYPE_MAX:表示枚举类型的最大取值。 +宏定义SLAB_MEM_BUCKET_SIZE_TYPE被设置为SLAB_BUCKET_SIZE_HALF_OF_HEAP,表示默认情况下slab内存块的大小为堆内存大小的一半。*/ /** * @ingroup los_slab * @brief configure slab size. @@ -86,8 +93,11 @@ enum SlabBucketSizeType { * * @since Huawei LiteOS V200R003C00 */ -extern VOID LOS_SlabSizeCfg(UINT32 *cfg, UINT32 cnt); - +extern VOID LOS_SlabSizeCfg(UINT32 *cfg, UINT32 cnt);/*段代码是关于操作系统内存管理中的slab功能的配置函数。Slab是一种分配固定大小的内存块的机制, +用于提高内存分配和释放的效率*/ +/*该函数LOS_SlabSizeCfg用于配置slab的大小。它接受两个参数: +cfg:指向slab大小配置表的指针。这个配置表包含了每个slab类的大小信息。 +cnt:slab类的数量,必须与配置表中的项数相匹配*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/include/los_spinlock.h b/src/kernel/include/los_spinlock.h index 3e30536..fd9a673 100644 --- a/src/kernel/include/los_spinlock.h +++ b/src/kernel/include/los_spinlock.h @@ -55,13 +55,19 @@ extern "C" { #define LOCKDEP_CHECK_OUT(lock) OsLockDepCheckOut(lock) #define LOCKDEP_CLEAR_LOCKS() OsLockdepClearSpinlocks() -#define SPIN_LOCK_INITIALIZER(lockName) \ +#define SPIN_LOCK_INITIALIZER(lockName) \/*这段代码看起来是定义了一个自旋锁的初始化器。不同的编译选项将定义不同的初始化器*/ { \ .rawLock = 0U, \ .cpuid = (UINT32)(-1), \ .owner = SPINLOCK_OWNER_INIT, \ .name = #lockName, \ } +/*当预定义宏为真时,SPIN_LOCK_INITIALIZER宏会被展开为一个结构体初始化器,其中包含了一些成员变量的初始化,包括: +.rawLock:自旋锁的原始锁变量,初始化为0; +.cpuid:持有自旋锁的CPU编号,初始化为-1; +.owner:自旋锁的拥有者,初始化为SPINLOCK_OWNER_INIT; +.name:自旋锁的名称,初始化为锁的名称字符串。 +当预定义宏为假时,SPIN_LOCK_INITIALIZER宏将被定义为空。*/ #else #define LOCKDEP_CHECK_IN(lock) #define LOCKDEP_RECORD(lock) @@ -72,7 +78,8 @@ extern "C" { .rawLock = 0U, \ } #endif - +/* +定义了一些空的宏,如LOCKDEP_CHECK_IN、LOCKDEP_RECORD、LOCKDEP_CHECK_OUT和LOCKDEP_CLEAR_LOCKS,这些宏在预定义的宏为假时会被定义为空操作。*/ /** * @ingroup los_spinlock * */ -#define SPIN_LOCK_INIT(lock) SPIN_LOCK_S lock = SPIN_LOCK_INITIALIZER(lock) - +#define SPIN_LOCK_INIT(lock) SPIN_LOCK_S lock = SPIN_LOCK_INITIALIZER(lock)/*这段代码定义了一个宏SPIN_LOCK_INIT,用于将输入参数lock定义为自旋锁,并静态地初始化自旋锁*/ +/*该宏主要用于定义和初始化自旋锁,用于保护对共享资源的短时间访问。在使用自旋锁时,需要注意避免使用在耗时较长的操作上,以免影响整体系统性能*/ /** * @ingroup los_spinlock * Define the structure of spinlock. @@ -104,8 +111,13 @@ struct Spinlock { const CHAR *name; /**< the lock owner's task name. It is defined only when LOSCFG_KERNEL_SMP_LOCKDEP is defined. */ #endif -}; +};/*这段代码定义了一个名为Spinlock的结构体,用于表示自旋锁的结构*/ +/*结构体Spinlock包括以下成员变量: +rawLock:表示原始的自旋锁,类型为size_t。 +cpuid:表示获取该锁的CPU编号,类型为UINT32。当预定义宏LOSCFG_KERNEL_SMP_LOCKDEP被定义时,此成员变量才有效。 +owner:表示锁拥有者的任务控制块指针,类型为VOID*。当预定义宏LOSCFG_KERNEL_SMP_LOCKDEP被定义时,此成员变量才有效。 +name:表示锁拥有者任务的名称,类型为const CHAR*。当预定义宏LOSCFG_KERNEL_SMP_LOCKDEP被定义时,此成员变量才有效*/ #ifdef LOSCFG_KERNEL_SMP /** * @ingroup los_spinlock @@ -146,7 +158,14 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinLock(SPIN_LOCK_S *lock) LOCKDEP_CHECK_IN(lock); ArchSpinLock(&lock->rawLock); LOCKDEP_RECORD(lock); -} +}/*这段代码实现了自旋锁的加锁操作,函数名称为LOS_SpinLock。它接收一个类型为SPIN_LOCK_S*的指针参数lock,表示要加锁的自旋锁。*/ + +/*在函数内部,首先调用LOS_TaskLock函数禁用调度器,以确保当前任务不会被切换出去。然后调用LOCKDEP_CHECK_IN宏和LOCKDEP_RECORD宏,用于记录锁依赖关系, +并最终调用ArchSpinLock函数对自旋锁进行加锁操作。 +需要注意的是,如果预定义宏LOSCFG_KERNEL_SMP_LOCKDEP被定义,那么在调用LOS_SpinLock之前必须先调用LOS_LockdepCpuTryInit函数进行初始化。否则,在自旋 +锁使用过程中可能会引发锁依赖检测相关的错误。 +此外,该函数会等待获取自旋锁,直到成功获得自旋锁。如果自旋锁已经被其他线程占用,则当前线程会进入自旋等待状态,直到其他线程释放了该自旋锁。 +最后,该函数在单处理器模式下没有任何效果,只有在多处理器(SMP)模式下才有效*/ /** * @ingroup los_spinlock @@ -185,7 +204,11 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE INT32 LOS_SpinTrylock(SPIN_LOCK_S *lock) } return ret; -} +}/*这段代码实现了自旋锁的尝试加锁操作,函数名称为LOS_SpinTrylock。它接收一个类型为SPIN_LOCK_S*的指针参数lock,表示要尝试加锁的自旋锁*/ +/*首先调用LOS_TaskLock函数禁用调度器,以确保当前任务不会被切换出去。然后调用LOCKDEP_CHECK_IN宏用于记录锁依赖关系,并最终调用ArchSpinTrylock函数尝试对自旋 +锁进行加锁操作。 +如果成功获取到自旋锁(ArchSpinTrylock返回值为LOS_OK),则调用LOCKDEP_RECORD宏记录锁依赖关系,并返回LOS_OK表示成功获取自旋锁。如果自旋锁已经被其他线程占用 +,ArchSpinTrylock将直接返回LOS_NOK,表示获取自旋锁*/ /** * @ingroup los_spinlock @@ -215,7 +238,10 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlock(SPIN_LOCK_S *lock) /* restore the scheduler flag */ LOS_TaskUnlock(); -} +}/*这段代码实现了自旋锁的解锁操作,函数名称为LOS_SpinUnlock。它接收一个类型为SPIN_LOCK_S*的指针参数lock,表示要解锁的自旋锁。*/ + +/*在函数内部,首先调用LOCKDEP_CHECK_OUT宏用于检查并记录锁依赖关系,并最终调用ArchSpinUnlock函数对自旋锁进行解锁操作。 +然后,通过调用LOS_TaskUnlock函数恢复调度器的状态,允许任务切换。*/ /** * @ingroup los_spinlock @@ -249,8 +275,11 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UI { *intSave = LOS_IntLock(); LOS_SpinLock(lock); -} +}/*这段代码实现了自旋锁的带保存中断状态的加锁操作,函数名称为LOS_SpinLockSave。它接收一个类型为SPIN_LOCK_S*的指针参数lock, +表示要加锁的自旋锁;另外还接收一个类型为UINT32*的指针参数intSave,表示用于保存中断状态的指针*/ +/*在函数内部,首先调用LOS_IntLock函数禁用所有中断,并将禁用前的中断状态保存到intSave指向的地址中。然后调用LOS_SpinLock函数对自旋锁进行加锁操作。 +*/ /** * @ingroup los_spinlock * @brief Unlock the spinlock and restore the interrupt flag. @@ -279,8 +308,11 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *loc { LOS_SpinUnlock(lock); LOS_IntRestore(intSave); -} +}/*这段代码实现了自旋锁的解锁操作,并恢复中断状态。函数名称为LOS_SpinUnlockRestore。它接收一个类型为SPIN_LOCK_S*的指针参数lock,表示要解锁的自旋锁; +另外还接收一个类型为UINT32的参数intSave,表示要恢复的中断状态。*/ +/*在函数内部,首先调用LOS_SpinUnlock函数对自旋锁进行解锁操作,然后调用LOS_IntRestore函数恢复中断状态,参数为之前保存的中断状态intSave。 +需要注意的是,该函数只能在调用LOS_SpinLockSave函数之后调用,并且传入的intSave参数应该是由LOS_SpinLockSave函数返回的中断状态保存值*/ /** * @ingroup los_spinlock * @brief Check if holding the spinlock. @@ -305,8 +337,9 @@ 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) { return (lock->rawLock != 0); -} +}/*这段代码实现了检查自旋锁是否被持有的功能。函数名称为LOS_SpinHeld。它接收一个类型为SPIN_LOCK_S*的指针参数lock,表示要检查的自旋锁*/ +/*在函数内部,通过判断自旋锁的rawLock成员变量是否为0来确定自旋锁是否被持有。如果rawLock不为0,则表示自旋锁被持有,返回TRUE;否则,表示自旋锁未被持有,返回FALSE*/ /** * @ingroup los_spinlock * @brief Spinlock dynamic initialization. @@ -339,8 +372,13 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinInit(SPIN_LOCK_S *lock) lock->owner = SPINLOCK_OWNER_INIT; lock->name = "spinlock"; #endif -} +}/*这段代码是用于动态初始化自旋锁的函数LOS_SpinInit。*/ +/*函数接受一个类型为SPIN_LOCK_S*的指针参数lock,表示需要初始化的自旋锁。 +在函数内部,首先将自旋锁的rawLock成员变量设置为0,表示自旋锁未被持有。然后,根据配置项LOSCFG_KERNEL_SMP_LOCKDEP的值进行条件编译。 +如果LOSCFG_KERNEL_SMP_LOCKDEP被定义,则对其他成员变量进行初始化。其中,cpuid成员变量被初始化为-1,表示自旋锁未被任何CPU持有;owner成员变量被初始化为 +SPINLOCK_OWNER_INIT,表示自旋锁的初始状态;name成员变量被初始化为"spinlock",表示自旋锁的名称。 +如果LOSCFG_KERNEL_SMP_LOCKDEP未被定义,则不执行任何操作。*/ #else /* @@ -385,7 +423,15 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinInit(SPIN_LOCK_S *lock) { (VOID)lock; } - +/*上述代码中,是对于非多处理器系统的处理。这些函数并不实际处理自旋锁,而是为了统一代码的编写,以方便驱动程序、供应商等进行开发。 +以下是这些函数的说明: +LOS_SpinLock:空函数,不执行任何操作。 +LOS_SpinTrylock:空函数,不执行任何操作,并返回LOS_OK。 +LOS_SpinUnlock:空函数,不执行任何操作。 +LOS_SpinLockSave:空函数,不执行任何操作,并通过指针参数intSave保存中断状态。 +LOS_SpinUnlockRestore:空函数,不执行任何操作,并使用参数intSave恢复中断状态。 +LOS_SpinHeld:空函数,不执行任何操作,并返回TRUE表示自旋锁已被持有。 +LOS_SpinInit:空函数,不执行任何操作。*/ #endif #ifdef __cplusplus diff --git a/src/kernel/include/los_swtmr.h b/src/kernel/include/los_swtmr.h index 8472e15..a87f3c2 100644 --- a/src/kernel/include/los_swtmr.h +++ b/src/kernel/include/los_swtmr.h @@ -51,15 +51,15 @@ extern "C" { * * 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 * Software timer error code: The expiration time is 0. * * 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) @@ -69,17 +69,17 @@ extern "C" { * * Value: 0x02000302. * - * Solution: Check the mode value. The value range is [0,3]. + * Solution: Check the mode value. The value range is [0,3]./*要解决此错误,您需要重新定义定时器的到期时间。确保到期时间大于0,并且与您的需求相符。 */ #define LOS_ERRNO_SWTMR_MODE_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x02) - +/*错误代码LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITED表示定时器的到期时间为0。这意味着定时器的到期时间设置不合适*/ /** * @ingroup los_swtmr * Software timer error code: The passed-in software timer ID is NULL. * * Value: 0x02000303. * - * Solution: Define the software timer ID before passing it in. + * Solution: Define the software timer ID before passing it in.要解决此错误,您需要在传入函数之前定义软件定时器ID。确保为软件定时器分配一个有效的ID,并在使用该ID时进行传入。 */ #define LOS_ERRNO_SWTMR_RET_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x03) @@ -90,20 +90,20 @@ extern "C" { * Value: 0x02000304. * * 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 * Software timer error code: Invalid software timer ID. * * Value: 0x02000305. * - * Solution: Pass in a valid software timer ID. + * Solution: Pass in a valid software timer ID.解决方案:传入有效的软件计时器ID */ #define LOS_ERRNO_SWTMR_ID_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x05) - +/*错误代码LOS_ERRNO_SWTMR_ID_INVALID表示软件计时器ID无效。*/ /** * @ingroup los_swtmr * Software timer error code: The software timer is not created. @@ -113,7 +113,7 @@ extern "C" { * Solution: Create a software timer. */ #define LOS_ERRNO_SWTMR_NOT_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x06) - +/*错误代码LOS_ERRNO_SWTMR_NOT_CREATED表示软件计时器未创建*/ /** * @ingroup los_swtmr * Software timer error code: Insufficient memory for software timer linked list creation. @@ -121,20 +121,21 @@ extern "C" { * Value: 0x02000307. * * 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) - +/*错误代码LOS_ERRNO_SWTMR_NO_MEMORY内存不足,无法创建软件计时器链表*/ /** * @ingroup los_swtmr * Software timer error code: Invalid configured number of software timers. * * 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. */ #define LOS_ERRNO_SWTMR_MAXSIZE_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_SWTMR, 0x08) - +/*软件计时器错误代码:配置的软件计时器数量无效*/ /** * @ingroup los_swtmr * Software timer error code: The software timer is being used during an interrupt. @@ -142,60 +143,61 @@ extern "C" { * Value: 0x02000309. * * 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) - +/*软件计时器错误代码:软件计时器在中断期间使用*/ /** * @ingroup los_swtmr * Software timer error code: Insufficient memory allocated by membox. * * Value: 0x0200030a. * - * Solution: Expand the memory allocated by membox. + * Solution: Expand the memory allocated by membox.解决方案:扩展membox分配的内存 * @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) - +/*软件计时器错误代码:membox分配的内存不足*/ /** * @ingroup los_swtmr * Software timer error code: The software timer queue fails to be created. * * 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) - +/*软件计时器错误代码:无法创建软件计时器队列。*/ /** * @ingroup los_swtmr * Software timer error code: The software timer task fails to be created. * * 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) - +/*软件计时器错误代码:无法创建软件计时器任务。*/ /** * @ingroup los_swtmr * Software timer error code: The software timer is not started. * * 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) - +/*软件计时器错误代码:软件计时器未启动*/ /** * @ingroup los_swtmr * Software timer error code: Invalid software timer state. * * 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) - +/*软件计时器错误代码:软件计时器状态无效*/ /** * @ingroup los_swtmr * Software timer error code: This error code is not in use temporarily. @@ -204,7 +206,7 @@ extern "C" { * @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) - +/*软件计时器错误代码:此错误代码暂时未使用*/ /** * @ingroup los_swtmr * Software timer error code: The passed-in number of remaining Ticks configured on the software timer is NULL. @@ -214,7 +216,7 @@ extern "C" { * 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) - +/*软件计时器错误代码:软件计时器上配置的传入的剩余Tick数为NULL*/ /** * @ingroup los_swtmr * Software timer error code: The software sortlink fails to be created. @@ -224,7 +226,7 @@ extern "C" { * 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) - +/*软件计时器错误代码:无法创建软件排序链接。*/ /** * @ingroup los_swtmr * Software timer mode @@ -237,7 +239,11 @@ enum enSwTmrType { periodic software timer is enabled. The value is 3. This mode is not supported temporarily. */ }; - +/*这段代码定义了软件定时器的模式,使用了一个枚举类型enSwTmrType来表示。其中包含以下几种模式: +LOS_SWTMR_MODE_ONCE:一次性软件定时器,值为0。 +LOS_SWTMR_MODE_PERIOD:周期性软件定时器,值为1。 +LOS_SWTMR_MODE_NO_SELFDELETE:一次性软件定时器,但不会自我删除,值为2。 +LOS_SWTMR_MODE_OPP:在一次性定时器完成定时后,启用周期性软件定时器。该模式的值为3。目前暂不支持该模式*/ /** * @ingroup los_swtmr * @brief Define the type of a callback function that handles software timer timeout. @@ -257,7 +263,7 @@ enum enSwTmrType { * @since Huawei LiteOS V100R001C00 */ typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg); - +/*这段代码定义了一个回调函数类型SWTMR_PROC_FUNC,用于处理软件定时器超时事件。该回调函数在软件定时器超时时被调用*/ /** * @ingroup los_swtmr * @brief Start a software timer. @@ -280,6 +286,12 @@ typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_SwtmrStart(UINT16 swtmrId); +/*这段代码是一个软件定时器模块中的函数LOS_SwtmrStart的声明。它用于启动一个指定ID的软件定时器。 +函数的返回值可能有以下几种情况: +LOS_ERRNO_SWTMR_ID_INVALID:无效的软件定时器ID。 +LOS_ERRNO_SWTMR_NOT_CREATED:软件定时器未创建。 +LOS_ERRNO_SWTMR_STATUS_INVALID:无效的软件定时器状态。 +LOS_OK:成功启动软件定时器。*/ /** * @ingroup los_swtmr @@ -304,7 +316,13 @@ extern UINT32 LOS_SwtmrStart(UINT16 swtmrId); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_SwtmrStop(UINT16 swtmrId); - +/*这段代码是一个软件定时器模块中的函数LOS_SwtmrStop的声明。它用于停止一个指定ID的软件定时器 +函数的返回值可能有以下几种情况: +LOS_ERRNO_SWTMR_ID_INVALID:无效的软件定时器ID。 +LOS_ERRNO_SWTMR_NOT_CREATED:未创建软件定时器。 +LOS_ERRNO_SWTMR_NOT_STARTED:软件定时器未启动。 +LOS_ERRNO_SWTMR_STATUS_INVALID:无效的软件定时器状态。 +LOS_OK:成功停止软件定时器。*/ /** * @ingroup los_swtmr * @brief Obtain the number of remaining Ticks configured on a software timer. @@ -331,7 +349,14 @@ extern UINT32 LOS_SwtmrStop(UINT16 swtmrId); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_SwtmrTimeGet(UINT16 swtmrId, UINT32 *tick); - +/*这段代码是一个软件定时器模块中的函数LOS_SwtmrTimeGet的声明。它用于获取指定ID的软件定时器配置的剩余Ticks数 +函数的返回值可能有以下几种情况: +LOS_ERRNO_SWTMR_ID_INVALID:无效的软件定时器ID。 +LOS_ERRNO_SWTMR_TICK_PTR_NULL:输入参数tick为NULL指针。 +LOS_ERRNO_SWTMR_NOT_CREATED:未创建软件定时器。 +LOS_ERRNO_SWTMR_NOT_STARTED:软件定时器未启动。 +LOS_ERRNO_SWTMR_STATUS_INVALID:无效的软件定时器状态。 +LOS_OK:成功获取剩余Ticks数。*/ /** * @ingroup los_swtmr * @brief Create a software timer. @@ -367,7 +392,14 @@ extern UINT32 LOS_SwtmrTimeGet(UINT16 swtmrId, UINT32 *tick); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrId, UINTPTR arg); - +/*这段代码是一个软件定时器模块中的函数LOS_SwtmrCreate的声明。它用于创建一个具有指定定时时长、超时处理函数和触发模式的软件定时器,并返回一个引用该软件定时器的句柄 +函数的返回值可能有以下几种情况: +LOS_ERRNO_SWTMR_INTERVAL_NOT_SUITED:软件定时器超时间隔为0。 +LOS_ERRNO_SWTMR_MODE_INVALID:无效的软件定时器触发模式。 +LOS_ERRNO_SWTMR_PTR_NULL:处理软件定时器超时的回调函数为NULL。 +LOS_ERRNO_SWTMR_RET_PTR_NULL:传入的软件定时器ID为NULL。 +LOS_ERRNO_SWTMR_MAXSIZE:软件定时器数量超过配置的最大数量。 +LOS_OK:成功创建软件定时器。*/ /** * @ingroup los_swtmr * @brief Delete a software timer. @@ -390,7 +422,12 @@ extern UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handl * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_SwtmrDelete(UINT16 swtmrId); - +/*这段代码是一个软件定时器模块中的函数LOS_SwtmrDelete的声明。它用于删除一个软件定时器。 +函数的返回值可能有以下几种情况: +LOS_ERRNO_SWTMR_ID_INVALID:无效的软件定时器ID。 +LOS_ERRNO_SWTMR_NOT_CREATED:该软件定时器未被创建。 +LOS_ERRNO_SWTMR_STATUS_INVALID:无效的软件定时器状态。 +LOS_OK:成功删除软件定时器。*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/include/los_tables.h b/src/kernel/include/los_tables.h index 0be0942..78ca151 100644 --- a/src/kernel/include/los_tables.h +++ b/src/kernel/include/los_tables.h @@ -47,7 +47,7 @@ extern "C" { ".previous\n" \ ) #endif - +/*这段代码定义了一个宏LOS_HAL_TABLE_WOW_BEGIN,用于在汇编代码中声明一个LiteOS的表格开始位置。该宏使用了一些特定的汇编指令和标签定义*/ #ifndef LOS_HAL_TABLE_WOW_END #define LOS_HAL_TABLE_WOW_END(label, name) \ __asm__(".section \".liteos.table." X_STRING(name) ".wow.finish\",\"aw\"\n" \ @@ -58,7 +58,7 @@ extern "C" { ".previous\n" \ ) #endif - +/*。该代码定义了一个名为LOS_HAL_TABLE_WOW_END的宏,该宏的作用是在汇编代码中生成一个指定名称和标签的全局符号,用于在LiteOS系统中实现一些底层硬件操作。*/ #ifndef LOS_HAL_TABLE_SCATTER_BEGIN #define LOS_HAL_TABLE_SCATTER_BEGIN(label, name) \ __asm__(".section \".liteos.table." X_STRING(name) ".scatter.begin\",\"aw\"\n" \ @@ -69,7 +69,7 @@ extern "C" { ".previous\n" \ ) #endif - +/*这是另一段C预处理器宏定义代码。该代码定义了一个名为LOS_HAL_TABLE_SCATTER_BEGIN的宏,该宏的作用是在汇编代码中生成一个指定名称和标签的全局符号,用于在LiteOS系统中实现一些底层硬件操作。*/ #ifndef LOS_HAL_TABLE_SCATTER_END #define LOS_HAL_TABLE_SCATTER_END(label, name) \ __asm__(".section \".liteos.table." X_STRING(name) ".scatter.finish\",\"aw\"\n" \ @@ -80,7 +80,7 @@ extern "C" { ".previous\n" \ ) #endif - +/*该代码定义了一个名为LOS_HAL_TABLE_SCATTER_END的宏,用于在LiteOS系统中生成汇编代码中的全局符号*/ #ifndef LOS_HAL_TABLE_BEGIN #define LOS_HAL_TABLE_BEGIN(label, name) \ __asm__(".section \".liteos.table." X_STRING(name) ".begin\",\"aw\"\n" \ @@ -91,7 +91,7 @@ extern "C" { ".previous\n" \ ) #endif - +/*该代码定义了一个名为LOS_HAL_TABLE_BEGIN的宏,该宏的作用是在汇编代码中生成一个指定名称和标签的全局符号,用于在LiteOS系统中实现一些底层硬件操作。*/ #ifndef LOS_HAL_TABLE_END #define LOS_HAL_TABLE_END(label, name) \ __asm__(".section \".liteos.table." X_STRING(name) ".finish\",\"aw\"\n" \ @@ -102,41 +102,41 @@ extern "C" { ".previous\n" \ ) #endif - +/*该代码定义了一个名为LOS_HAL_TABLE_END的宏,用于在LiteOS系统中生成汇编代码中的全局符号*/ /* This macro must be applied to any types whose objects are to be placed in tables */ #ifndef LOS_HAL_TABLE_TYPE #define LOS_HAL_TABLE_TYPE LOSBLD_ATTRIB_ALIGN(LOSARC_ALIGNMENT) #endif - +/*通过这个宏的定义,可以在代码中统一设置表的类型或属性,使得系统中使用的表在对齐等方面具有统一的特性*/ #ifndef LOS_HAL_TABLE_EXTRA #define LOS_HAL_TABLE_EXTRA(name) \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".extra") #endif - +/*该代码定义了一个名为LOS_HAL_TABLE_EXTRA的宏,用于在LiteOS系统中生成汇编代码中的节(section)名称*/ #ifndef LOS_HAL_TABLE_WOW_ENTRY #define LOS_HAL_TABLE_WOW_ENTRY(name) \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".wow.data") \ LOSBLD_ATTRIB_USED #endif - +/*这段代码定义了一个名为LOS_HAL_TABLE_WOW_ENTRY的宏,用于在LiteOS系统中生成汇编代码中的节(section)名称,并将该符号标记为被使用。*/ #ifndef LOS_HAL_TABLE_SCATTER_ENTRY #define LOS_HAL_TABLE_SCATTER_ENTRY(name) \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".scatter.data") \ LOSBLD_ATTRIB_USED #endif - +/*这段代码定义了一个名为LOS_HAL_TABLE_SCATTER_ENTRY的宏,用于在LiteOS系统中生成汇编代码中的节(section)名称,并将该符号标记为被使用*/ #ifndef LOS_HAL_TABLE_ENTRY #define LOS_HAL_TABLE_ENTRY(name) \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data") \ LOSBLD_ATTRIB_USED #endif - +/*该宏的作用是定义一个通用的节(section),用于存储数据,并确保相关符号被正确使用和链接到系统的可执行文件中*/ #ifndef LOS_HAL_TABLE_QUALIFIED_ENTRY #define LOS_HAL_TABLE_QUALIFIED_ENTRY(name, _qual) \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data." X_STRING(_qual)) \ LOSBLD_ATTRIB_USED #endif - +/*该宏的作用是定义一个用于存储特定类型数据的节(section),并将相关符号标记为被使用,以确保可执行文件中包含该数据*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/include/los_task.h b/src/kernel/include/los_task.h index e70e3a1..e148a17 100644 --- a/src/kernel/include/los_task.h +++ b/src/kernel/include/los_task.h @@ -58,7 +58,7 @@ extern "C" { * automatically after the task is done. */ #define LOS_TASK_STATUS_DETACHED 0x0100U - +/*LOS_TASK_STATUS_DETACHED是一个任务或者任务控制块状态的标志位。它表示任务处于自动删除状态。在这个状态下,任务会在执行完毕后自动被删除*/ /** * @ingroup los_task * Task error code: Insufficient memory for task creation. @@ -68,7 +68,7 @@ extern "C" { * Solution: Allocate bigger memory partition to task creation. */ #define LOS_ERRNO_TSK_NO_MEMORY LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x00) - +/*任务错误代码:内存不足,无法创建任务。*/ /** * @ingroup los_task * Task error code: Null parameter. @@ -78,7 +78,7 @@ extern "C" { * Solution: Check the parameter. */ #define LOS_ERRNO_TSK_PTR_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x01) - +/*任务错误代码:参数为Null*/ /** * @ingroup los_task * Task error code: The task stack is not aligned. @@ -88,7 +88,7 @@ extern "C" { * Solution: Align the task stack. */ #define LOS_ERRNO_TSK_STKSZ_NOT_ALIGN LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x02) - +/*任务错误代码:任务堆栈未对齐*/ /** * @ingroup los_task * Task error code: Incorrect task priority. @@ -98,7 +98,7 @@ extern "C" { * 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) - +/*任务错误代码:任务优先级不正确*/ /** * @ingroup los_task * Task error code: The task entrance is NULL. @@ -108,7 +108,7 @@ extern "C" { * Solution: Define the task entrance function. */ #define LOS_ERRNO_TSK_ENTRY_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x04) - +/*任务错误代码:任务入口为NULL*/ /** * @ingroup los_task * Task error code: The task name is NULL. @@ -118,7 +118,7 @@ extern "C" { * Solution: Set the task name. */ #define LOS_ERRNO_TSK_NAME_EMPTY LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x05) - +/*任务错误代码:任务名称为NULL*/ /** * @ingroup los_task * Task error code: The task stack size is too small. @@ -128,7 +128,7 @@ extern "C" { * Solution: Expand the task stack. */ #define LOS_ERRNO_TSK_STKSZ_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x06) - +/*任务错误代码:任务堆栈太小*/ /** * @ingroup los_task * Task error code: Invalid task ID. @@ -138,7 +138,7 @@ extern "C" { * Solution: Check the task ID. */ #define LOS_ERRNO_TSK_ID_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x07) - +/*任务错误代码:任务ID无效*/ /** * @ingroup los_task * Task error code: The task is already suspended. @@ -148,7 +148,7 @@ extern "C" { * Solution: Suspend the task after it is resumed. */ #define LOS_ERRNO_TSK_ALREADY_SUSPENDED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x08) - +/*任务错误代码:任务已挂起*/ /** * @ingroup los_task * Task error code: The task is not suspended. @@ -158,7 +158,7 @@ extern "C" { * Solution: Suspend the task. */ #define LOS_ERRNO_TSK_NOT_SUSPENDED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x09) - +/*任务错误代码:任务未挂起*/ /** * @ingroup los_task * Task error code: The task is not created. @@ -168,7 +168,7 @@ extern "C" { * Solution: Create the task. */ #define LOS_ERRNO_TSK_NOT_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0a) - +/*任务错误代码:未创建任务*/ /** * @ingroup los_task * Task error code: The task is locked when it is being deleted. @@ -178,7 +178,7 @@ extern "C" { * Solution: Unlock the task. */ #define LOS_ERRNO_TSK_DELETE_LOCKED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x0b) - +/*任务错误代码:删除任务时该任务被锁定*/ /** * @ingroup los_task * 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. */ #define LOS_ERRNO_TSK_MSG_NONZERO LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0c) - +/*任务错误代码:任务消息为非零*/ /** * @ingroup los_task * 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. */ #define LOS_ERRNO_TSK_DELAY_IN_INT LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x0d) - +/*任务错误代码:任务延迟发生在中断期间*/ /** * @ingroup los_task * 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. */ #define LOS_ERRNO_TSK_DELAY_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0e) - +/*任务错误代码:任务锁定时会出现任务延迟*/ /** * @ingroup los_task * Task error code: The task yield occurs when the task is locked. @@ -219,7 +219,7 @@ extern "C" { * Solution: Check the task. */ #define LOS_ERRNO_TSK_YIELD_IN_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x0f) - +/*任务错误代码:当任务被锁定时,任务将产生收益*/ /** * @ingroup los_task * 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. */ #define LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x10) - +/*任务错误代码:只有一个任务或没有任务可用于计划*/ /** * @ingroup los_task * Task error code: No free task control block is available. @@ -239,7 +239,7 @@ extern "C" { * Solution: Increase the number of task control blocks. */ #define LOS_ERRNO_TSK_TCB_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x11) - +/*任务错误代码:没有可用的任务控制块*/ /** * @ingroup los_task * 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. */ #define LOS_ERRNO_TSK_HOOK_NOT_MATCH LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x12) - +/*任务错误代码:任务挂钩函数不匹配*/ /** * @ingroup los_task * 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. */ #define LOS_ERRNO_TSK_HOOK_IS_FULL LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x13) - +/*任务错误代码:任务挂钩函数的数量超过了允许的上限*/ /** * @ingroup los_task * Task error code: The operation is performed on the system-level task. @@ -272,7 +272,8 @@ extern "C" { * 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) - +/*任务错误代码:该操作是在系统级任务上执行的。 +*旧用法:该操作在空闲任务上执行(LOS_ERRNO_TSK_OPERATE_idle)*/ /** * @ingroup los_task * Task error code: The task that is being suspended is locked. @@ -282,7 +283,7 @@ extern "C" { * Solution: Suspend the task after unlocking the task. */ #define LOS_ERRNO_TSK_SUSPEND_LOCKED LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x15) - +/*任务错误代码:正在挂起的任务已锁定*/ /** * @ingroup los_task * Task error code: The task stack fails to be freed. @@ -293,7 +294,7 @@ extern "C" { * @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) - +/*任务错误代码:无法释放任务堆栈*/ /** * @ingroup los_task * Task error code: The task stack area is too small. @@ -304,7 +305,7 @@ extern "C" { * @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) - +/*任务错误代码:任务堆栈区域太小*/ /** * @ingroup los_task * Task error code: The task fails to be activated. @@ -315,7 +316,7 @@ extern "C" { * @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) - +/*任务错误代码:任务激活失败*/ /** * @ingroup los_task * Task error code: Too many task configuration items. @@ -326,7 +327,7 @@ extern "C" { * @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) - +/*任务错误代码:任务配置项过多*/ /** * @ingroup los_task * Task error code: This error code is not in use temporarily. @@ -335,7 +336,7 @@ extern "C" { * @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) - +/*任务错误代码:此错误代码暂时未使用*/ /** * @ingroup los_task * Task error code: This error code is not in use temporarily. @@ -344,7 +345,7 @@ extern "C" { * @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) - +/*任务错误代码:此错误代码暂时未使用*/ /** * @ingroup los_task * Task error code: This error code is not in use temporarily. @@ -353,7 +354,7 @@ extern "C" { * @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) - +/*任务错误代码:此错误代码暂时未使用*/ /** * @ingroup los_task * Task error code: This error code is not in use temporarily. @@ -362,7 +363,7 @@ extern "C" { * @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) - +/*任务错误代码:此错误代码暂时未使用*/ /** * @ingroup los_task * Task error code: The task stack size is too large. @@ -372,7 +373,7 @@ extern "C" { * Solution: shrink the task stack size parameter. */ #define LOS_ERRNO_TSK_STKSZ_TOO_LARGE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x20) - +/*任务错误代码:任务堆栈大小太大*/ /** * @ingroup los_task * Task error code: Suspending software timer task is not allowed. @@ -383,7 +384,7 @@ extern "C" { * @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) - +/*任务错误代码:不允许挂起软件计时器任务*/ /** * @ingroup los_task * Task error code: The cpu affinity mask is incorrect. @@ -393,7 +394,7 @@ extern "C" { * Solution: Please set the correct cpu affinity mask. */ #define LOS_ERRNO_TSK_CPU_AFFINITY_MASK_ERR LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x23) - +/*任务错误代码:cpu关联掩码不正确*/ /** * @ingroup los_task * Task error code: Task yield in interrupt is not permited, which will result in an unexpected result. @@ -403,7 +404,7 @@ extern "C" { * Solution: Don't call LOS_TaskYield in Interrupt. */ #define LOS_ERRNO_TSK_YIELD_IN_INT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x24) - +/*任务错误代码:不允许任务在中断中让步,这将导致意外结果*/ /** * @ingroup los_task * Task error code: Task sync resource (semaphore) allocated failed. @@ -413,7 +414,7 @@ extern "C" { * Solution: Expand LOSCFG_BASE_IPC_SEM_LIMIT. */ #define LOS_ERRNO_TSK_MP_SYNC_RESOURCE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x25) - +/*任务错误代码:分配的任务同步资源(信号量)失败*/ /** * @ingroup los_task * Task error code: Task sync failed on operating running task across cores. @@ -423,7 +424,7 @@ extern "C" { * 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) - +/*任务错误代码:在操作跨核心运行的任务时,任务同步失败*/ /** * @ingroup los_task * Minimum stack size. @@ -432,7 +433,8 @@ extern "C" { * 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)) - +/*这段代码是关于任务(task)的最小栈大小的定义通过这段代码,可以看出LOS_TASK_MIN_STACK_SIZE的大小是根据KERNEL_TSK_MIN_STACK_SIZE和 +LOSCFG_STACK_POINT_ALIGN_SIZE来计算的并且保证了堆栈大小是按照一定的对齐方式进行分配的。*/ #ifdef LOSCFG_BASE_CORE_TSK_MONITOR /** * @ingroup los_task @@ -494,6 +496,9 @@ typedef VOID *(*TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param4); #else typedef VOID *(*TSK_ENTRY_FUNC)(VOID *param); +/*这段代码中使用了条件预处理指令#ifdef,它用于根据预定义的宏LOSOCFG_OBSOLETE_API是否存在来选择不同的类型定义,果LOSOCFG_OBSOLETE_API宏被定义, +则TSK_ENTRY_FUNC被定义为接受四个UINTPTR类型参数并返回VOID指针的函数指针类型;如果LOSOCFG_OBSOLETE_API宏未被定义,则TSK_ENTRY_FUNC被定义为接 +受一个VOID指针参数并返回VOID指针的函数指针类型*/ #endif /** * @ingroup los_task @@ -519,7 +524,14 @@ typedef struct tagTskInitParam { 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. */ } TSK_INIT_PARAM_S; - +/*这段代码定义了一个结构体类型TSK_INIT_PARAM_S,用于传递任务创建时的参数信息 +pfnTaskEntry:任务入口函数指针。 +usTaskPrio:任务优先级。 +auwArgs/pArgs:任务参数,可以是一个指向参数列表的数组或一个指向参数结构体的指针,具体取决于LOSCFG_OBSOLETE_API是否被定义。 +uwStackSize:任务栈大小。 +pcName:任务名称。 +usCpuAffiMask:CPU亲和性掩码,仅在LOSCFG_KERNEL_SMP被定义时有效。 +uwResved:保留字段,如果设置为LOS_TASK_STATUS_DETACHED,则任务将自动删除。*/ /** * @ingroup los_task * Task name length @@ -551,7 +563,23 @@ typedef struct tagTskInfo { BOOL bOvf; /**< Flag that indicates whether a task stack overflow occurs or not */ } TSK_INFO_S; - +/*这段代码定义了一个结构体类型TSK_INFO_S,用于保存任务的信息 +TSK_INFO_S结构体包含以下成员: +acName:任务名称,长度为LOS_TASK_NAMELEN,默认值为32。 +uwTaskID:任务ID。 +usTaskStatus:任务状态。 +usTaskPrio:任务优先级。 +pTaskSem:信号量指针。 +pTaskMux:互斥锁指针。 +uwEvent:事件。 +uwEventMask:事件掩码。 +uwStackSize:任务栈大小。 +uwTopOfStack:任务栈顶部。 +uwBottomOfStack:任务栈底部。 +uwSP:任务SP指针。 +uwCurrUsed:当前任务栈使用量。 +uwPeakUsed:任务栈使用峰值。 +bOvf:表示任务栈是否发生溢出的标志。*/ #ifdef LOSCFG_TASK_STATIC_ALLOCATION /** * @ingroup los_task @@ -601,7 +629,24 @@ typedef struct tagTskInfo { * @since Huawei LiteOS V200R005C10 */ extern UINT32 LOS_TaskCreateOnlyStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack); - +/*该函数的作用是创建一个静态分配的任务,并将其挂起。静态分配任务的栈空间由用户自行分配和释放,需要在删除任务时及时释放栈空间。 + +函数的参数如下: +taskId:[OUT] 任务ID,类型为UINT32指针。 +initParam:[IN] 任务创建的参数,类型为TSK_INIT_PARAM_S结构体指针。 +topStack:[IN] 任务栈的顶部地址,类型为VOID指针。 + +函数的返回值为操作结果,可能的返回值如下: +LOS_ERRNO_TSK_ID_INVALID:无效的任务ID,taskId参数为NULL。 +LOS_ERRNO_TSK_PTR_NULL:initParam参数为NULL。 +LOS_ERRNO_TSK_NAME_EMPTY:任务名称为NULL。 +LOS_ERRNO_TSK_ENTRY_NULL:任务执行函数为NULL。 +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 * @brief Create a task. @@ -653,7 +698,9 @@ extern UINT32 LOS_TaskCreateOnlyStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initPar */ extern UINT32 LOS_TaskCreateStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, VOID *topStack); #endif - +/*这段代码是关于任务创建的函数LOS_TaskCreateStatic的声明。 +函数的功能是创建一个任务并将其挂起。如果系统初始化后创建的任务的优先级高于当前任务并且任务调度未被锁定,则会调度该任务运行.静态分配任务的栈空间由用户自行分配和释放,需要在删除任务时及时释放栈空间。 +该函数的调用需要传入任务ID、任务创建参数和任务栈的顶部地址,返回创建结果*/ /** * @ingroup los_task * @brief Create a task and suspend. @@ -699,7 +746,9 @@ extern UINT32 LOS_TaskCreateStatic(UINT32 *taskId, TSK_INIT_PARAM_S *initParam, * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam); +/*这段代码是关于任务创建的函数LOS_TaskCreateOnly的声明。 +函数的功能是创建一个任务并将其挂起。在任务创建后,该任务不会被添加到就绪任务队列中。*/ /** * @ingroup los_task * @brief Create a task. @@ -745,7 +794,7 @@ extern UINT32 LOS_TaskCreateOnly(UINT32 *taskId, TSK_INIT_PARAM_S *initParam); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam); - +/*该函数的功能是创建一个任务。如果在系统初始化之后创建的任务的优先级比当前任务高并且任务调度未被锁定,则将其调度运行。如果不是,则创建的任务将添加到就绪任务队列中*/ /** * @ingroup los_task * @brief Resume a task. @@ -772,7 +821,9 @@ extern UINT32 LOS_TaskCreate(UINT32 *taskId, TSK_INIT_PARAM_S *initParam); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskResume(UINT32 taskId); +/*这是华为LiteOS中用于恢复(Resume)任务的函数LOS_TaskResume的声明。 +该函数的功能是恢复一个被挂起(Suspended)的任务。*/ /** * @ingroup los_task * @brief Suspend a task. @@ -802,7 +853,9 @@ extern UINT32 LOS_TaskResume(UINT32 taskId); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskSuspend(UINT32 taskId); +/*这是华为LiteOS中用于挂起(Suspend)任务的函数LOS_TaskSuspend的声明。 +该函数的功能是挂起指定的任务,并将其从就绪任务队列中移除。*/ /** * @ingroup los_task * @brief Delete a task. @@ -833,7 +886,9 @@ extern UINT32 LOS_TaskSuspend(UINT32 taskId); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskDelete(UINT32 taskId); +/*这是华为LiteOS中用于删除任务的函数LOS_TaskDelete的声明。 +该函数的功能是删除指定的任务并释放其任务栈和任务控制块的资源。*/ /** * @ingroup los_task * @brief Delay a task. @@ -867,7 +922,9 @@ extern UINT32 LOS_TaskDelete(UINT32 taskId); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskDelay(UINT32 tick); +/*这是华为LiteOS中用于延迟(Delay)任务的函数LOS_TaskDelay的声明。 +该函数的功能是延迟当前任务的执行。在延迟了指定数量的Ticks后,任务可以被调度到就绪任务队列中。*/ /** * @ingroup los_task * @brief Lock the task scheduling. @@ -891,7 +948,9 @@ extern UINT32 LOS_TaskDelay(UINT32 tick); * @since Huawei LiteOS V100R001C00 */ extern VOID LOS_TaskLock(VOID); +/*这是华为LiteOS中用于锁定任务调度的函数LOS_TaskLock的声明。 +该函数的功能是锁定任务调度。如果任务调度被锁定,则不会发生任务切换。*/ /** * @ingroup los_task * @brief Unlock the task scheduling. @@ -913,7 +972,9 @@ extern VOID LOS_TaskLock(VOID); * @since Huawei LiteOS V100R001C00 */ extern VOID LOS_TaskUnlock(VOID); +/*这是华为LiteOS中用于解锁任务调度的函数LOS_TaskUnlock的声明。 +该函数的功能是解锁任务调度。调用此API将减少任务锁的数量。如果一个任务被锁定多次,则只有在锁的数量变为零时才会解锁任务调度*/ /** * @ingroup los_task * @brief Set a task priority. @@ -946,7 +1007,9 @@ extern VOID LOS_TaskUnlock(VOID); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio); +/*这是华为LiteOS中用于设置任务优先级的函数LOS_TaskPriSet的声明。 +该函数的功能是设置指定任务的优先级*/ /** * @ingroup los_task * @brief Set the priority of the current running task to a specified priority. @@ -976,7 +1039,9 @@ extern UINT32 LOS_TaskPriSet(UINT32 taskId, UINT16 taskPrio); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_CurTaskPriSet(UINT16 taskPrio); +/*这是华为LiteOS中用于将当前运行任务的优先级设置为指定优先级的函数LOS_CurTaskPriSet的声明。 +该函数的功能是将当前运行任务的优先级设置为指定的优先级。*/ /** * @ingroup los_task * @brief Change the scheduling sequence of tasks with the same priority. @@ -1002,7 +1067,9 @@ extern UINT32 LOS_CurTaskPriSet(UINT16 taskPrio); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskYield(VOID); +/*这是华为LiteOS中用于改变具有相同优先级的任务调度顺序的函数LOS_TaskYield的声明。 +该函数的功能是将当前任务移动到具有相同优先级的就绪任务队列的队尾。*/ /** * @ingroup los_task * @brief Obtain a task priority. @@ -1022,7 +1089,9 @@ extern UINT32 LOS_TaskYield(VOID); * @since Huawei LiteOS V100R001C00 */ extern UINT16 LOS_TaskPriGet(UINT32 taskId); +/*这是华为LiteOS中获取指定任务优先级的函数LOS_TaskPriGet的声明。 +该函数的功能是获取指定任务的优先级。*/ /** * @ingroup los_task * @brief Obtain current running task ID. @@ -1040,7 +1109,9 @@ extern UINT16 LOS_TaskPriGet(UINT32 taskId); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_CurTaskIDGet(VOID); +/*这是华为LiteOS中获取当前正在运行的任务ID的函数LOS_CurTaskIDGet的声明。 +该函数的功能是获取当前正在运行的任务的ID。*/ /** * @ingroup los_task * @brief Obtain a task information structure. @@ -1064,7 +1135,9 @@ extern UINT32 LOS_CurTaskIDGet(VOID); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo); +/*这是华为LiteOS中获取任务信息结构的函数LOS_TaskInfoGet的声明。 +该函数的功能是获取一个任务信息结构。*/ /** * @ingroup los_task * @brief Set the affinity mask of the task scheduling cpu. @@ -1090,7 +1163,9 @@ extern UINT32 LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo); * @since Huawei LiteOS V200R003C00 */ extern UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 usCpuAffiMask); +/*这是华为LiteOS中设置任务调度CPU亲和性掩码的函数LOS_TaskCpuAffiSet的声明。 +该函数的功能是设置任务调度CPU亲和性掩码,即指定任务允许运行在哪些CPU核心上*/ /** * @ingroup los_task * @brief Get the affinity mask of the task scheduling cpu. @@ -1110,7 +1185,9 @@ extern UINT32 LOS_TaskCpuAffiSet(UINT32 taskId, UINT16 usCpuAffiMask); * @since Huawei LiteOS V200R003C00 */ extern UINT16 LOS_TaskCpuAffiGet(UINT32 taskId); +/*这是华为LiteOS中获取任务调度CPU亲和性掩码的函数LOS_TaskCpuAffiGet的声明。 +该函数的功能是获取任务调度CPU的亲和性掩码,即获取指定任务允许运行在哪些CPU核心上*/ /** * @ingroup los_task * @brief Recycle task stack resource. @@ -1129,7 +1206,10 @@ extern UINT16 LOS_TaskCpuAffiGet(UINT32 taskId); * @since Huawei LiteOS V200R003C00 */ extern VOID LOS_TaskResRecycle(VOID); +/*这是华为LiteOS中回收任务堆栈资源的函数LOS_TaskResRecycle的声明。 +该函数的功能是回收已经被删除的任务的堆栈资源。当任务被删除时,它的堆栈内存块不会立即释放,而是留给后续新创建的任务使用。但如果一段时间后没有新任务创建, +则这些堆栈内存块会浪费系统资源,应该通过调用此函数进行回收*/ #ifdef LOSCFG_OBSOLETE_API #define LOS_TASK_PARAM_INIT_ARG_0(initParam, arg) \ initParam.auwArgs[0] = (UINTPTR)arg @@ -1138,7 +1218,7 @@ extern VOID LOS_TaskResRecycle(VOID); #define LOS_TASK_PARAM_INIT_ARG(initParam, arg) \ initParam.pArgs = (VOID *)arg #endif - +/*这段代码是关于任务参数初始化宏的定义*/ /** * @ingroup los_task * @brief Define the lowpower framework process function type. @@ -1157,7 +1237,7 @@ extern VOID LOS_TaskResRecycle(VOID); * @since Huawei LiteOS V200R005C10 */ typedef VOID (*LOWPOWERIDLEHOOK)(VOID); - +/*这段代码定义了一个函数指针类型LOWPOWERIDLEHOOK,用于定义低功耗框架的处理函数*/ /** * @ingroup los_task * @brief Register a hook to enter lowpower framework process. @@ -1176,7 +1256,9 @@ typedef VOID (*LOWPOWERIDLEHOOK)(VOID); * @since Huawei LiteOS V200R005C10 */ extern VOID LOS_LowpowerHookReg(LOWPOWERIDLEHOOK hook); +/*这段代码是关于注册低功耗处理函数的函数LOS_LowpowerHookReg的声明。 +该函数的功能是向系统注册一个用于处理低功耗操作的函数。此函数将会在系统进入低功耗模式时被调用,以执行特定的低功耗操作或处理*/ /** * @ingroup los_task * @brief Define the type of idle handler hook function. @@ -1193,7 +1275,11 @@ extern VOID LOS_LowpowerHookReg(LOWPOWERIDLEHOOK hook); * @since Huawei LiteOS V200R005C20 */ typedef VOID (*IDLEHANDLERHOOK)(VOID); +/*这段代码定义了一个函数指针类型IDLEHANDLERHOOK,用于定义空闲处理函数的类型。 + +该函数指针类型的函数原型为VOID (*IDLEHANDLERHOOK)(VOID),表示该函数没有任何参数,也没有返回值。 +在系统空闲状态时,可以使用IDLEHANDLERHOOK类型的函数指针来定义一个空闲处理函数。这个处理函数会在系统处于空闲状态时被调用,可以用于执行一些特定的任务或操作*/ /** * @ingroup los_task * @brief Register the hook function for idle task. @@ -1212,7 +1298,9 @@ typedef VOID (*IDLEHANDLERHOOK)(VOID); * @since Huawei LiteOS V200R005C20 */ extern VOID LOS_IdleHandlerHookReg(IDLEHANDLERHOOK hook); +/*这段代码是关于注册空闲处理函数的函数LOS_IdleHandlerHookReg的声明。 +该函数的功能是向系统注册一个用于处理空闲状态的函数。此函数将会在系统进入空闲状态时被调用,以执行特定的任务或操作*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/include/los_tick.h b/src/kernel/include/los_tick.h index 2265b6e..fed2f10 100644 --- a/src/kernel/include/los_tick.h +++ b/src/kernel/include/los_tick.h @@ -49,37 +49,37 @@ extern "C" { * Number of milliseconds in one second. */ #define OS_SYS_MS_PER_SECOND 1000 - +/*一秒钟内的毫秒数。*/ /** * @ingroup los_tick * Number of microseconds in one second. */ #define OS_SYS_US_PER_SECOND 1000000 - +/*一秒钟内的微秒数*/ /** * @ingroup los_tick * Number of nanoseconds in one second. */ #define OS_SYS_NS_PER_SECOND 1000000000 - +/*1秒内的纳秒数*/ /** * @ingroup los_tick * Number of microseconds in one milliseconds. */ #define OS_SYS_US_PER_MS 1000 - +/*一毫秒中的微秒数*/ /** * @ingroup los_tick * Number of nanoseconds in one milliseconds. */ #define OS_SYS_NS_PER_MS 1000000 - +/*一毫秒中的纳秒数*/ /** * @ingroup los_tick * Number of nanoseconds in one microsecond. */ #define OS_SYS_NS_PER_US 1000 - +/*一微秒中的纳秒数*/ /** * @ingroup los_tick * Tick error code: The Tick configuration is incorrect. @@ -90,7 +90,7 @@ extern "C" { * in los_config.h. */ #define LOS_ERRNO_TICK_CFG_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x00) - +/*Tick错误代码:Tick配置不正确*/ /** * @ingroup los_tick * 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. */ #define LOS_ERRNO_TICK_NO_HWTIMER LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x01) - +/*Tick错误代码:此错误代码暂时未使用*/ /** * @ingroup los_tick * 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. */ #define LOS_ERRNO_TICK_PER_SEC_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TICK, 0x02) - +/*Tick错误代码:此错误代码暂时未使用。*/ /** * @ingroup los_config * system clock */ extern UINT32 g_sysClock; - +/*这段代码定义了一个名为g_sysClock的全局变量,它表示系统时钟。没有进行定义*/ /** * @ingroup los_config * get system clock */ #define GET_SYS_CLOCK() (g_sysClock) - +/*这段代码定义了一个宏,用于获取系统时钟的值*/ /** * @ingroup los_config * set system clock */ #define SET_SYS_CLOCK(clock) (g_sysClock = (clock)) - +/*这段代码定义了一个宏,用于设置系统时钟的值*/ /** * @ingroup los_config * ticks per second */ extern UINT32 g_tickPerSecond; - +/*这段代码定义了一个名为g_tickPerSecond的全局变量,它表示每秒钟的时钟滴答数(ticks per second)*/ /** * @ingroup los_tick * system time structure. @@ -146,7 +146,7 @@ typedef struct tagSysTime { UINT8 ucSecond; /**< second, the value range is 0 - 59 */ UINT8 ucWeek; /**< week, the value range is 0 - 6 */ } SYS_TIME_S; - +/*这段代码定义了一个名为tagSysTime的结构体,它表示系统时间信息。*/ /** * @ingroup los_tick * @brief Obtain the number of Ticks. @@ -165,7 +165,9 @@ typedef struct tagSysTime { * @since Huawei LiteOS V100R001C00 */ extern UINT64 LOS_TickCountGet(VOID); +/*这段代码声明了一个函数LOS_TickCountGet,用于获取自系统启动以来的Tick数。 +函数的功能是获取自系统启动以来经过的Tick数,即系统已经运行的时间。它返回一个UINT64类型的值表示Tick数*/ /** * @ingroup los_tick * @brief Obtain the number of cycles in one tick. @@ -183,7 +185,9 @@ extern UINT64 LOS_TickCountGet(VOID); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_CyclePerTickGet(VOID); +/*这段代码声明了一个函数LOS_CyclePerTickGet,用于获取一个Tick中的周期数。 +函数的功能是获取一个Tick中的CPU周期数。它返回一个UINT32类型的值,表示一个Tick中的周期数*/ /** * @ingroup los_tick * @brief Convert Ticks to milliseconds. @@ -208,7 +212,9 @@ extern UINT32 LOS_CyclePerTickGet(VOID); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_Tick2MS(UINT32 tick); +/*这段代码声明了一个函数LOS_Tick2MS,用于将Ticks转换为毫秒数。 +该函数的功能是将Ticks转换为相应的毫秒数值。参数tick表示待转换的Ticks数,返回值为UINT32类型的毫秒数。*/ /** * @ingroup los_tick * @brief Convert milliseconds to Ticks. @@ -234,7 +240,9 @@ extern UINT32 LOS_Tick2MS(UINT32 tick); * @since Huawei LiteOS V100R001C00 */ extern UINT32 LOS_MS2Tick(UINT32 millisec); +/*这段代码声明了一个函数LOS_MS2Tick,用于将毫秒数转换为Ticks。 +该函数的功能是将毫秒数转换为相应的Ticks数值。参数millisec表示待转换的毫秒数,返回值为UINT32类型的Ticks数*/ /** * @ingroup los_tick * @brief Obtain system cycle count. @@ -260,7 +268,9 @@ extern UINT32 LOS_MS2Tick(UINT32 millisec); * @since Huawei LiteOS V100R001C00 */ extern VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo); +/*这段代码声明了一个函数LOS_GetCpuCycle,用于获取系统启动以来的CPU周期计数。 +该函数的功能是获取系统自启动以来的CPU周期计数。参数puwCntHi和puwCntLo是指向UINT32类型的指针,用于存储CPU周期计数的高32位和低32位。*/ /** * @ingroup los_tick * @brief Obtain system time in nanoseconds. @@ -279,7 +289,9 @@ extern VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo); * @since Huawei LiteOS V100R001C00 */ extern UINT64 LOS_CurrNanosec(VOID); +/*这段代码声明了一个函数LOS_CurrNanosec,用于获取系统当前的纳秒级时间。 +该函数的功能是获取系统当前的时间,单位为纳秒(nanoseconds)*/ /** * @ingroup los_tick * @brief spinning-delay in microsecond (us). @@ -299,7 +311,7 @@ extern UINT64 LOS_CurrNanosec(VOID); * @since Huawei LiteOS V100R001C00 */ extern VOID LOS_Udelay(UINT32 usecs); - +/*这段代码声明了一个函数LOS_Udelay,用于进行微秒级的自旋延迟。*/ /** * @ingroup los_tick * @brief spinning-delay in millisecond (ms). @@ -319,7 +331,7 @@ extern VOID LOS_Udelay(UINT32 usecs); * @since Huawei LiteOS V100R001C00 */ extern VOID LOS_Mdelay(UINT32 msecs); - +/*这段代码声明了一个函数LOS_Mdelay,用于进行毫秒级的自旋延迟。*/ #ifdef LOSCFG_KERNEL_TICKLESS /** * @ingroup los_tick @@ -340,6 +352,8 @@ extern VOID LOS_Mdelay(UINT32 msecs); */ typedef VOID (*WAKEUPTICKHOOK)(UINT32 tickNum); +/*这段代码定义了一个函数指针类型WAKEUPTICKHOOK,用于定义低功耗框架的唤醒函数。 +定义该函数指针类型是为了在实现低功耗功能时,可以根据实际情况定义自己的唤醒函数,用于在系统进入低功耗模式后,当有外部事件需要唤醒系统时调用该函数*/ /** * @ingroup los_tick * @brief Register a hook to wakeup from tick interrupt. @@ -358,6 +372,9 @@ typedef VOID (*WAKEUPTICKHOOK)(UINT32 tickNum); * @since Huawei LiteOS V200R005C10 */ extern VOID LOS_IntTickWakeupHookReg(WAKEUPTICKHOOK hook); +/*这段代码声明了一个函数LOS_IntTickWakeupHookReg,用于注册一个从tick中断唤醒后的回调函数。 + +LOS_IntTickWakeupHookReg函数的功能是在系统从tick中断唤醒后注册一个恢复函数,用于在系统唤醒后执行一些特定的操作*/ #endif #ifdef __cplusplus diff --git a/src/kernel/include/los_tickless.h b/src/kernel/include/los_tickless.h index 012033e..e50ef5b 100644 --- a/src/kernel/include/los_tickless.h +++ b/src/kernel/include/los_tickless.h @@ -62,7 +62,9 @@ extern "C" { * @since Huawei LiteOS V200R001C00 */ extern VOID LOS_TicklessEnable(VOID); +/*这段代码声明了一个函数LOS_TicklessEnable,用于启用tickless模式。 +LOS_TicklessEnable函数的功能是启用tickless模式。在这种模式下,系统从周期性时钟模式切换到动态时钟模式,能够有效地减少系统的功耗*/ /** * @ingroup los_tickless * @brief disable the tickless mode. @@ -83,7 +85,9 @@ extern VOID LOS_TicklessEnable(VOID); * @since Huawei LiteOS V200R001C00 */ extern VOID LOS_TicklessDisable(VOID); +/*这段代码声明了一个函数LOS_TicklessDisable,用于禁用tickless模式。 +LOS_TicklessDisable函数的功能是禁用tickless模式。在这种模式下,系统从动态时钟模式切换回周期性时钟模式,系统将会以固定的时间间隔来产生时钟中断。*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/include/los_toolchain.h b/src/kernel/include/los_toolchain.h index 677ea04..c0efeaa 100644 --- a/src/kernel/include/los_toolchain.h +++ b/src/kernel/include/los_toolchain.h @@ -69,7 +69,15 @@ extern "C" { #ifndef CLZ #define CLZ(value) (__clz(value)) #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 */ #elif defined ( __ICCARM__ ) @@ -100,7 +108,16 @@ extern "C" { #ifndef CTZ #define CTZ(value) (__UNDEFINED(value)) #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 */ #elif defined ( __GNUC__ ) @@ -135,7 +152,17 @@ extern "C" { #ifndef FFS #define FFS(value) (__builtin_ffs(value)) #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 #error Unknown compiler. #endif diff --git a/src/kernel/include/los_trace.h b/src/kernel/include/los_trace.h index 8a965b3..f3eed5f 100644 --- a/src/kernel/include/los_trace.h +++ b/src/kernel/include/los_trace.h @@ -49,25 +49,25 @@ extern "C" { /** * @ingroup los_trace - * Trace Control agent task's priority. + * Trace Control agent task's priori00ty. */ #define LOSCFG_TRACE_TASK_PRIORITY 2 #endif #define LOSCFG_TRACE_OBJ_MAX_NAME_SIZE LOS_TASK_NAMELEN - +/*这段代码是关于轨迹追踪(Trace Control)的配置*/ /** * @ingroup los_trace * 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 - +/*这段代码是关于轨迹追踪(Trace Control)中记录对象数量的配置*/ /** * @ingroup los_trace * 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 - +/*这段代码是关于轨迹追踪(Trace Control)中tlv编码缓冲区大小的配置*/ /** * @ingroup los_trace * Trace error code: init trace failed. @@ -77,7 +77,7 @@ extern "C" { * Solution: Follow the trace State Machine. */ #define LOS_ERRNO_TRACE_ERROR_STATUS LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x00) - +/*跟踪错误代码:初始化跟踪失败*/ /** * @ingroup los_trace * Trace error code: Insufficient memory for trace buf init. @@ -87,7 +87,7 @@ extern "C" { * 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) - +/*跟踪错误代码:内存不足,无法进行跟踪buf-init。*/ /** * @ingroup los_trace * Trace error code: Insufficient memory for trace struct. @@ -97,7 +97,7 @@ extern "C" { * Solution: Increase trace buffer's size. */ #define LOS_ERRNO_TRACE_BUF_TOO_SMALL LOS_ERRNO_OS_ERROR(LOS_MOD_TRACE, 0x02) - +/*跟踪错误代码:跟踪结构的内存不足 */ /** * @ingroup los_trace * Trace state. @@ -108,7 +108,12 @@ enum TraceState { TRACE_STARTED, /**< trace is started and system is tracing */ TRACE_STOPED, /**< trace is stopped */ }; +/*这段代码定义了一个枚举类型 TraceState,用于表示轨迹追踪(Trace Control)的状态。该枚举包括以下几个取值: +TRACE_UNINIT:表示轨迹追踪未初始化。 +TRACE_INITED:表示轨迹追踪已经初始化,但尚未启动。 +TRACE_STARTED:表示轨迹追踪已经启动,系统正在进行追踪。 +TRACE_STOPED:表示轨迹追踪已经停止。*/ /** * @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 @@ -128,7 +133,20 @@ typedef enum { TRACE_MAX_FLAG = 0x80000000, TRACE_USER_DEFAULT_FLAG = 0xFFFFFFF0, } 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 * Trace event type which indicate the exactly happend events, user can define own module's event type like @@ -208,7 +226,10 @@ typedef enum { MUX_PEND = TRACE_MUX_FLAG | 2, MUX_POST = TRACE_MUX_FLAG | 3, } LOS_TRACE_TYPE; - +/*这段代码定义了一个枚举类型 LOS_TRACE_TYPE,用于表示不同的追踪事件类型。每个事件类型都由一个唯一的标志位组成,用户可以根据需要定义自己模块的事件类型。 +该枚举类型包括了各种事件类型,如系统事件、硬件中断事件、任务事件、软件定时器事件、内存事件、队列事件、事件事件、信号量事件和互斥锁事件等。 +每个事件类型都使用了特定的跟踪掩码,以便在运行时进行事件过滤和分析。 +通过定义自己模块的事件类型,用户可以灵活地追踪和记录特定模块的事件,以便进行调试和性能分析*/ /** * @ingroup los_trace * struct to store the trace config information. @@ -218,7 +239,7 @@ typedef struct { UINT32 clockFreq; /**< system clock frequency */ UINT32 version; /**< trace version */ } TraceBaseHeaderInfo; - +/*这段代码是一个注释和结构体的定义,用于存储跟踪配置信息。*/ /** * @ingroup los_trace * struct to store the event infomation @@ -246,7 +267,7 @@ typedef struct { UINTPTR params[LOSCFG_TRACE_FRAME_MAX_PARAMS]; /**< event frame's params */ #endif } TraceEventFrame; - +/*这段代码是一个注释和结构体的定义,用于存储事件信息*/ /** * @ingroup los_trace * struct to store the kernel obj information, we defined task as kernel obj in this system. @@ -256,7 +277,7 @@ typedef struct { UINT32 prio; /**< kernel obj's priority */ CHAR name[LOSCFG_TRACE_OBJ_MAX_NAME_SIZE]; /**< kernel obj's name */ } ObjData; - +/*这段代码是一个注释和结构体的定义,用于存储内核对象信息*/ /** * @ingroup los_trace * struct to store the trace data. @@ -269,7 +290,7 @@ typedef struct { 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 */ } OfflineHead; - +/*这段代码是一个注释和结构体的定义,用于存储跟踪数据。*/ /** * @ingroup los_trace * @brief Define the type of trace hardware interrupt filter hook function. @@ -293,7 +314,7 @@ typedef BOOL (*TRACE_HWI_FILTER_HOOK)(UINT32 hwiNum); typedef VOID (*TRACE_EVENT_HOOK)(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount); extern TRACE_EVENT_HOOK g_traceEventHook; - +/*这段代码定义了两个函数指针类型和一个函数指针变量,这些函数指针类型和变量用于实现 Huawei LiteOS 操作系统的事件跟踪功能。*/ /** * @ingroup los_trace * Trace event params: @@ -312,64 +333,64 @@ extern TRACE_EVENT_HOOK g_traceEventHook; * eg. Trace only you need parmas as: * #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 -#define TASK_PRIOSET_PARAMS(taskId, taskStatus, oldPrio, newPrio) taskId, taskStatus, oldPrio, newPrio -#define TASK_CREATE_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio -#define TASK_DELETE_PARAMS(taskId, taskStatus, usrStack) taskId, taskStatus, usrStack -#define TASK_SUSPEND_PARAMS(taskId, taskStatus, runTaskId) taskId, taskStatus, runTaskId -#define TASK_RESUME_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio -#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_DELETE_PARAMS(swtmrId) swtmrId -#define SWTMR_EXPIRED_PARAMS(swtmrId) swtmrId -#define SWTMR_STOP_PARAMS(swtmrId) swtmrId +#define TASK_PRIOSET_PARAMS(taskId, taskStatus, oldPrio, newPrio) taskId, taskStatus, oldPrio, newPrio/*这段代码是一个宏定义,用于定义任务优先级设置所需的参数集合*/ +#define TASK_CREATE_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio/*这段代码是一个宏定义,用于定义任务创建所需的参数集合*/ +#define TASK_DELETE_PARAMS(taskId, taskStatus, usrStack) taskId, taskStatus, usrStack/*这段代码是一个宏定义,用于定义任务删除所需的参数集合*/ +#define TASK_SUSPEND_PARAMS(taskId, taskStatus, runTaskId) taskId, taskStatus, runTaskId/*这段代码是一个宏定义,用于定义任务挂起所需的参数集合*/ +#define TASK_RESUME_PARAMS(taskId, taskStatus, prio) taskId, taskStatus, prio/*这段代码是一个宏定义,用于定义任务恢复所需的参数集合*/ +#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_DELETE_PARAMS(swtmrId) swtmrId/*这段代码是一个宏定义,用于定义软定时器删除所需的参数集合*/ +#define SWTMR_EXPIRED_PARAMS(swtmrId) swtmrId/*这段代码是一个宏定义,用于定义软定时器到期所需的参数集合。*/ +#define SWTMR_STOP_PARAMS(swtmrId) swtmrId/*这段代码是一个宏定义,用于定义软定时器停止所需的参数集合*/ #define SWTMR_CREATE_PARAMS(swtmrId) swtmrId -#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_DELETE_PARAMS(hwiNum) hwiNum -#define HWI_DELETE_SHARE_PARAMS(hwiNum, pDevId, ret) hwiNum, pDevId, ret -#define HWI_RESPONSE_IN_PARAMS(hwiNum) hwiNum -#define HWI_RESPONSE_OUT_PARAMS(hwiNum) hwiNum -#define HWI_ENABLE_PARAMS(hwiNum) hwiNum -#define HWI_DISABLE_PARAMS(hwiNum) hwiNum -#define HWI_TRIGGER_PARAMS(hwiNum) hwiNum -#define HWI_SETPRI_PARAMS(hwiNum, priority) hwiNum, priority -#define HWI_CLEAR_PARAMS(hwiNum) hwiNum -#define HWI_SETAFFINITY_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask -#define HWI_SENDIPI_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask - -#define EVENT_CREATE_PARAMS(eventCB) eventCB -#define EVENT_DELETE_PARAMS(eventCB, delRetCode) eventCB, delRetCode +#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_DELETE_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断删除所需的参数集合*/ +#define HWI_DELETE_SHARE_PARAMS(hwiNum, pDevId, ret) hwiNum, pDevId, ret/*这段代码是一个宏定义,用于定义共享中断删除所需的参数集合*/ +#define HWI_RESPONSE_IN_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断响应输入参数*/ +#define HWI_RESPONSE_OUT_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断响应输出参数*/ +#define HWI_ENABLE_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断使能所需的参数集合*/ +#define HWI_DISABLE_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义中断禁用所需的参数集合*/ +#define HWI_TRIGGER_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义触发中断所需的参数集合*/ +#define HWI_SETPRI_PARAMS(hwiNum, priority) hwiNum, priority/*这段代码是一个宏定义,用于定义设置中断优先级所需的参数集合*/ +#define HWI_CLEAR_PARAMS(hwiNum) hwiNum/*这段代码是一个宏定义,用于定义清除中断所需的参数集合*/ +#define HWI_SETAFFINITY_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask/*这段代码是一个宏定义,用于定义设置中断亲和性(affinity)所需的参数集合*/ +#define HWI_SENDIPI_PARAMS(hwiNum, cpuMask) hwiNum, cpuMask/*这段代码是一个宏定义,用于定义发送中断处理器间中断(IPI)所需的参数集合*/ + +#define EVENT_CREATE_PARAMS(eventCB) eventCB/*这段代码是一个宏定义,用于定义创建事件(event)所需的参数集合*/ +#define EVENT_DELETE_PARAMS(eventCB, delRetCode) eventCB, delRetCode/*这段代码是一个宏定义,用于定义删除事件(event)所需的参数集合*/ #define EVENT_READ_PARAMS(eventCB, eventId, mask, mode, timeout) \ eventCB, eventId, mask, mode, timeout -#define EVENT_WRITE_PARAMS(eventCB, eventId, events) eventCB, eventId, events -#define EVENT_CLEAR_PARAMS(eventCB, eventId, events) eventCB, eventId, events +#define EVENT_WRITE_PARAMS(eventCB, eventId, events) eventCB, eventId, events/*这段代码是一个宏定义,用于定义读取事件(event)所需的参数集合*/ +#define EVENT_CLEAR_PARAMS(eventCB, eventId, events) eventCB, eventId, events/*这段代码是一个宏定义,用于定义清除事件(event)所需的参数集合*/ -#define QUEUE_CREATE_PARAMS(queueId, queueSz, itemSz, queueAddr, memType) \ +#define QUEUE_CREATE_PARAMS(queueId, queueSz, itemSz, queueAddr, memType) \/*这段代码是一个宏定义,用于定义创建队列(queue)所需的参数*/ queueId, queueSz, itemSz, queueAddr, memType -#define QUEUE_DELETE_PARAMS(queueId, state, readable) queueId, state, readable -#define QUEUE_RW_PARAMS(queueId, queueSize, bufSize, operateType, readable, writeable, timeout) \ +#define QUEUE_DELETE_PARAMS(queueId, state, readable) queueId, state, readable/*这段代码是一个宏定义,用于定义删除队列(queue)所需的参数集合*/ +#define QUEUE_RW_PARAMS(queueId, queueSize, bufSize, operateType, readable, writeable, timeout) \/*这段代码是一个宏定义,用于定义读写队列(queue)所需的参数集合*/ queueId, queueSize, bufSize, operateType, readable, writeable, timeout -#define SEM_CREATE_PARAMS(semId, type, count) semId, type, count -#define SEM_DELETE_PARAMS(semId, delRetCode) semId, delRetCode -#define SEM_PEND_PARAMS(semId, count, timeout) semId, count, timeout -#define SEM_POST_PARAMS(semId, type, count) semId, type, count +#define SEM_CREATE_PARAMS(semId, type, count) semId, type, count/*这段代码是一个宏定义,用于定义创建信号量(semaphore)所需的参数集合*/ +#define SEM_DELETE_PARAMS(semId, delRetCode) semId, delRetCode/*这段代码是一个宏定义,用于定义删除信号量(semaphore)所需的参数集合*/ +#define SEM_PEND_PARAMS(semId, count, timeout) semId, count, timeout/*这段代码是一个宏定义,用于定义等待信号量(semaphore)所需的参数集合*/ +#define SEM_POST_PARAMS(semId, type, count) semId, type, count/*这段代码是一个宏定义,用于定义发送信号量(semaphore)所需的参数集合*/ -#define MUX_CREATE_PARAMS(muxId) muxId -#define MUX_DELETE_PARAMS(muxId, state, count, owner) muxId, state, count, owner -#define MUX_PEND_PARAMS(muxId, count, owner, timeout) muxId, count, owner, timeout -#define MUX_POST_PARAMS(muxId, count, owner) muxId, count, owner +#define MUX_CREATE_PARAMS(muxId) muxId/*这段代码是一个宏定义,用于定义创建互斥量(mutex)所需的参数*/ +#define MUX_DELETE_PARAMS(muxId, state, count, owner) muxId, state, count, owner/*这段代码是一个宏定义,用于定义删除互斥量(mutex)所需的参数集合*/ +#define MUX_PEND_PARAMS(muxId, count, owner, timeout) muxId, count, owner, timeout/*这段代码是一个宏定义,用于定义等待互斥量(mutex)所需的参数集合*/ +#define MUX_POST_PARAMS(muxId, count, owner) muxId, count, owner/*这段代码是一个宏定义,用于定义发送互斥量(mutex)所需的参数集合*/ -#define MEM_ALLOC_PARAMS(pool, ptr, size) pool, ptr, size -#define MEM_ALLOC_ALIGN_PARAMS(pool, ptr, size, boundary) pool, ptr, size, boundary -#define MEM_REALLOC_PARAMS(pool, ptr, size) pool, ptr, size -#define MEM_FREE_PARAMS(pool, ptr) pool, ptr -#define MEM_INFO_REQ_PARAMS(pool) pool -#define MEM_INFO_PARAMS(pool, usedSize, freeSize) pool, usedSize, freeSize +#define MEM_ALLOC_PARAMS(pool, ptr, size) pool, ptr, size/*这段代码是一个宏定义,用于定义内存分配(memory allocation)所需的参数集合*/ +#define MEM_ALLOC_ALIGN_PARAMS(pool, ptr, size, boundary) pool, ptr, size, boundary/*这段代码是一个宏定义,用于定义内存分配对齐(alignment)所需的参数集合*/ +#define MEM_REALLOC_PARAMS(pool, ptr, size) pool, ptr, size/*这段代码是一个宏定义,用于定义重新分配内存(memory reallocation)所需的参数集合*/ +#define MEM_FREE_PARAMS(pool, ptr) pool, ptr/*这段代码是一个宏定义,用于定义内存释放(memory deallocation)所需的参数集合*/ +#define MEM_INFO_REQ_PARAMS(pool) pool/*这段代码是一个宏定义,用于定义获取内存信息请求(memory information request)所需的参数集合*/ +#define MEM_INFO_PARAMS(pool, usedSize, freeSize) pool, usedSize, freeSize/*这段代码是一个宏定义,用于定义内存信息(memory information)所需的参数集合*/ #define SYS_ERROR_PARAMS(errno) errno @@ -405,7 +426,15 @@ extern TRACE_EVENT_HOOK g_traceEventHook; #else #define LOS_TRACE(TYPE, ...) LOS_PERF(TYPE) #endif +/*这段代码是一个宏定义,用于在源代码中插入跟踪代码存根,以追踪事件 + +宏定义内部的实现逻辑如下: +首先调用LOS_PERF宏,执行与性能相关的操作。 +创建一个名为_inner的数组,将事件类型和参数存储其中。数组的第一个元素为0,表示未知。 +获取_inner数组的长度,并判断是否大于1,并且全局变量g_traceEventHook不为空。 +如果满足条件,则调用g_traceEventHook函数,将事件类型、第二个元素以及后续元素传递给该函数。 +宏定义结束。*/ #ifdef LOSCFG_KERNEL_TRACE /** @@ -437,7 +466,13 @@ extern TRACE_EVENT_HOOK g_traceEventHook; #else #define LOS_TRACE_EASY(...) #endif +/*这段代码是一个宏定义,用于在源代码中插入用户自定义的跟踪代码存根,以简单地追踪事件 +宏定义内部的实现逻辑如下: +创建一个名为_inner的数组,将参数存储其中。数组的第一个元素为0,表示未知。 +获取_inner数组的长度,并判断是否大于1,并且全局变量g_traceEventHook不为空。 +如果满足条件,则调用g_traceEventHook函数,将标志为TRACE_USER_DEFAULT_FLAG | TYPE的事件类型、身份标识、第二个元素以及后续元素传递给该函数。 +宏定义结束*/ /** * @ingroup los_trace * @brief Intialize the trace when the system startup. @@ -465,7 +500,19 @@ extern TRACE_EVENT_HOOK g_traceEventHook; * @since Huawei LiteOS V200R005C00 */ extern UINT32 LOS_TraceInit(VOID *buf, UINT32 size); - +/*这段代码定义了一个名为LOS_TraceInit的函数,用于初始化系统级别的跟踪功能 +函数实现逻辑如下: + +首先判断跟踪状态是否为TRACE_UNINIT,如果不是则返回错误码LOS_ERRNO_TRACE_ERROR_STATUS。 +然后检查是否有足够的内存来初始化跟踪,如果没有则返回LOS_ERRNO_TRACE_NO_MEMORY。 +检查跟踪缓冲区的大小是否足够,如果不够则返回LOS_ERRNO_TRACE_BUF_TOO_SMALL。 +调用LOS_MpCreate接口创建跟踪任务的同步资源,如果失败则返回错误码LOS_ERRNO_TSK_MP_SYNC_RESOURCE。 +创建跟踪任务的控制块,如果失败则返回错误码LOS_ERRNO_TSK_TCB_UNAVAILABLE。 +初始化跟踪任务的消息队列。 +完成跟踪缓冲区的初始化。 +初始化其他跟踪相关参数。 +设置跟踪状态为TRACE_IDLE。 +完成初始化。*/ /** * @ingroup los_trace * @brief Start trace. @@ -487,7 +534,7 @@ extern UINT32 LOS_TraceInit(VOID *buf, UINT32 size); * @since Huawei LiteOS V200R005C00 */ extern UINT32 LOS_TraceStart(VOID); - +/*这段代码定义了一个名为LOS_TraceStart的函数,用于启动跟踪功能*/ /** * @ingroup los_trace * @brief Stop trace sample. @@ -508,7 +555,7 @@ extern UINT32 LOS_TraceStart(VOID); * @since Huawei LiteOS V200R005C00 */ extern VOID LOS_TraceStop(VOID); - +/*这段代码定义了一个名为LOS_TraceStop的函数,用于停止跟踪采样*/ /** * @ingroup los_trace * @brief Clear the trace buf. @@ -529,7 +576,7 @@ extern VOID LOS_TraceStop(VOID); * @since Huawei LiteOS V200R005C00 */ extern VOID LOS_TraceReset(VOID); - +/*这段代码定义了一个名为LOS_TraceReset的函数,用于清空跟踪缓冲区中的事件帧,仅在离线模式下有效*/ /** * @ingroup los_trace * @brief Set trace event mask. @@ -553,7 +600,7 @@ extern VOID LOS_TraceReset(VOID); * @since Huawei LiteOS V200R005C00 */ extern VOID LOS_TraceEventMaskSet(UINT32 mask); - +/*这段代码定义了一个名为LOS_TraceEventMaskSet的函数,用于设置跟踪事件的掩码*/ /** * @ingroup los_trace * @brief Offline trace buffer display. @@ -576,7 +623,7 @@ extern VOID LOS_TraceEventMaskSet(UINT32 mask); * @since Huawei LiteOS V200R005C00 */ extern VOID LOS_TraceRecordDump(BOOL toClient); - +/*这段代码定义了一个名为LOS_TraceRecordDump的函数,用于在离线模式下显示跟踪缓冲区数据*/ /** * @ingroup los_trace * @brief Offline trace buffer export. @@ -599,7 +646,7 @@ extern VOID LOS_TraceRecordDump(BOOL toClient); * @since Huawei LiteOS V200R005C00 */ extern OfflineHead *LOS_TraceRecordGet(VOID); - +/*这段代码定义了一个名为LOS_TraceRecordGet的函数,用于在离线模式下导出跟踪缓冲区数据*/ /** * @ingroup los_trace * @brief Hwi num fliter hook. @@ -620,6 +667,7 @@ extern OfflineHead *LOS_TraceRecordGet(VOID); * @since Huawei LiteOS V200R005C00 */ extern VOID LOS_TraceHwiFilterHookReg(TRACE_HWI_FILTER_HOOK hook); +/*这段代码定义了一个名为LOS_TraceHwiFilterHookReg的函数,用于注册硬件中断(Hwi)号码过滤钩子函数*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/include/los_typedef.h b/src/kernel/include/los_typedef.h index aa5e5e1..10b721b 100644 --- a/src/kernel/include/los_typedef.h +++ b/src/kernel/include/los_typedef.h @@ -48,7 +48,7 @@ extern "C" { #define OS_STRING(x) #x #define X_STRING(x) OS_STRING(x) -/* type definitions */ +/* type definitions *//*类型定义*/ typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned int UINT32; @@ -149,7 +149,7 @@ typedef volatile INT64 Atomic64; #ifndef LOSARC_ALIGNMENT #define LOSARC_ALIGNMENT 8 #endif -/* And corresponding power of two alignment */ +/* And corresponding power of two alignment *//*使用 2 的幂次方作为对齐大小*/ #ifndef LOSARC_P2ALIGNMENT #ifdef LOSCFG_AARCH64 #define LOSARC_P2ALIGNMENT 3 @@ -158,12 +158,12 @@ typedef volatile INT64 Atomic64; #endif #endif -/* Give a type or object explicit minimum alignment */ +/* Give a type or object explicit minimum alignment *//*为类型或对象指定明确的最小对齐方式*/ #if !defined(LOSBLD_ATTRIB_ALIGN) #define LOSBLD_ATTRIB_ALIGN(__align__) __attribute__((aligned(__align__))) #endif -/* Assign a defined variable to a specific section */ +/* Assign a defined variable to a specific section *//*将定义的变量分配给特定节*/ #if !defined(LOSBLD_ATTRIB_SECTION) #define LOSBLD_ATTRIB_SECTION(__sect__) __attribute__((section(__sect__))) #endif @@ -174,6 +174,11 @@ typedef volatile INT64 Atomic64; * but using the unused attribute should stop warnings. */ #define LOSBLD_ATTRIB_USED __attribute__((used)) +/*告诉编译器不要丢弃变量或函数。仅已知 + +*3.3.2或更高版本提供。旧版本没有把它们扔掉, + +*但是使用未使用的属性应该停止警告*/ #ifdef __cplusplus #if __cplusplus diff --git a/src/kernel/include/virtual_serial.h b/src/kernel/include/virtual_serial.h index 959511f..d140b54 100644 --- a/src/kernel/include/virtual_serial.h +++ b/src/kernel/include/virtual_serial.h @@ -51,16 +51,20 @@ extern "C" { #define SERIAL_TYPE_UART_DEV 1 #define SERIAL_TYPE_USBTTY_DEV 2 -extern INT32 virtual_serial_init(const CHAR *deviceName); -extern INT32 virtual_serial_deinit(VOID); +extern INT32 virtual_serial_init(const CHAR *deviceName);/*这段代码声明了一个函数原型 virtual_serial_init,用于初始化虚拟串口设备*/ +extern INT32 virtual_serial_deinit(VOID);/*这段代码声明了一个函数原型 virtual_serial_deinit,用于反初始化虚拟串口设备*/ -extern UINT32 SerialTypeGet(VOID); +extern UINT32 SerialTypeGet(VOID);/*这段代码声明了一个函数原型 SerialTypeGet,用于获取串口类型的函数*/ typedef struct { struct file *filep; UINT32 mask; } LOS_VIRSERIAL_CB; +/*这段代码定义了一个结构体 LOS_VIRSERIAL_CB,包含两个成员变量: +filep:指向 struct file 类型的指针,表示一个文件指针。 +mask:无符号整数类型 UINT32,用于表示掩码。 +这个结构体的作用可能是用于虚拟串口的控制、配置或状态管理。其中的 filep 可能用于表示虚拟串口对应的文件,而 mask 则可能用于存储一些状态或掩码信息。*/ #endif #ifdef __cplusplus -- 2.34.1 From bc798a6338042a9232b89d07323ef4dbf44a31f6 Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Mon, 4 Dec 2023 20:11:07 +0800 Subject: [PATCH 03/11] 12 --- src/kernel/include/los_runstop.h | 2 +- src/kernel/include/los_sem.h | 2 +- src/kernel/include/los_slab.h | 2 +- src/kernel/include/los_spinlock.h | 2 +- src/kernel/include/los_swtmr.h | 2 +- src/kernel/include/los_sys.h | 2 +- src/kernel/include/los_tables.h | 3 ++- src/kernel/include/los_task.h | 2 +- src/kernel/include/los_tick.h | 2 +- src/kernel/include/los_tickless.h | 1 + src/kernel/include/los_toolchain.h | 2 +- src/kernel/include/los_trace.h | 3 ++- src/kernel/include/los_typedef.h | 4 +++- src/kernel/include/virtual_serial.h | 3 ++- 14 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/kernel/include/los_runstop.h b/src/kernel/include/los_runstop.h index eff3636..ed864f7 100644 --- a/src/kernel/include/los_runstop.h +++ b/src/kernel/include/los_runstop.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. * --------------------------------------------------------------------------- */ - +/*该函数定义提供了运行停止功能所需的接口和参数类型,为嵌入式系统中的运行停止操作提供了基本的支持 /** * @defgroup los_runstop Wakeup * @ingroup kernel diff --git a/src/kernel/include/los_sem.h b/src/kernel/include/los_sem.h index d89a281..0dc1842 100644 --- a/src/kernel/include/los_sem.h +++ b/src/kernel/include/los_sem.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. * --------------------------------------------------------------------------- */ - +/*这段代码实现了对信号量操作的基本功能,包括创建、删除、请求和释放信号量,并对可能出现的错误情况进行了定义和说明。*/ /** * @defgroup los_sem Semaphore * @ingroup kernel diff --git a/src/kernel/include/los_slab.h b/src/kernel/include/los_slab.h index a812270..d6ef4e4 100644 --- a/src/kernel/include/los_slab.h +++ b/src/kernel/include/los_slab.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. * --------------------------------------------------------------------------- */ - +/*以上代码是关于内存管理中的slab功能的实现。Slab是一种分配固定大小的内存块的机制,用于提高内存分配和释放的效率。以上代码提供了对slab内存分配器的配置和定义*/ /** * @defgroup los_slab Slab * @ingroup kernel diff --git a/src/kernel/include/los_spinlock.h b/src/kernel/include/los_spinlock.h index fd9a673..7faa3d2 100644 --- a/src/kernel/include/los_spinlock.h +++ b/src/kernel/include/los_spinlock.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. *---------------------------------------------------------------------------*/ - +/*以上代码实现了自旋锁的基本操作,并根据多处理器系统和非多处理器系统分别进行了处理*/ /** * @defgroup los_spinlock Spinlock * @ingroup kernel diff --git a/src/kernel/include/los_swtmr.h b/src/kernel/include/los_swtmr.h index a87f3c2..6cadc48 100644 --- a/src/kernel/include/los_swtmr.h +++ b/src/kernel/include/los_swtmr.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. * --------------------------------------------------------------------------- */ - +/*这段代码是关于软件定时器的管理接口,主要包括软件定时器的创建、启动、停止、删除等操作。这段代码提供了一套完整的软件定时器管理接口,方便开发人员在嵌入式系统中实现基于时间的任务调度和处理。*/ /** * @defgroup los_swtmr Software timer * @ingroup kernel diff --git a/src/kernel/include/los_sys.h b/src/kernel/include/los_sys.h index fb15c63..915db8d 100644 --- a/src/kernel/include/los_sys.h +++ b/src/kernel/include/los_sys.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. * --------------------------------------------------------------------------- */ - +/*这个头文件提供了系统时间模块的接口和基本定义,为系统时间的管理提供了必要的支持*/ /** * @defgroup los_sys System time * @ingroup kernel diff --git a/src/kernel/include/los_tables.h b/src/kernel/include/los_tables.h index 78ca151..82779bc 100644 --- a/src/kernel/include/los_tables.h +++ b/src/kernel/include/los_tables.h @@ -25,7 +25,8 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/*以上代码是LiteOS系统中定义表格的头文件,其中定义了一些宏用于在汇编代码中生成指定名称和标签的全局符号,用于在LiteOS系统中实现一些底层硬件操作。 +同时还定义了一些用于存储数据的节(section),以确保在可执行文件中包含该数据。此外,还定义了一些用于设置表的类型或属性的宏。*/ #ifndef _LOS_TABLES_H #define _LOS_TABLES_H diff --git a/src/kernel/include/los_task.h b/src/kernel/include/los_task.h index e148a17..bf0cdaa 100644 --- a/src/kernel/include/los_task.h +++ b/src/kernel/include/los_task.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. * --------------------------------------------------------------------------- */ - +/*该函数定义了一些任务错误情况以及一些关于任务处理的函数*/ /** * @defgroup los_task Task * @ingroup kernel diff --git a/src/kernel/include/los_tick.h b/src/kernel/include/los_tick.h index fed2f10..73aef50 100644 --- a/src/kernel/include/los_tick.h +++ b/src/kernel/include/los_tick.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. * --------------------------------------------------------------------------- */ - +/*这些代码主要用于系统计时、延时和低功耗唤醒功能,提供了丰富的 Tick 相关操作接口和功能*/ /** * @defgroup los_tick Tick * @ingroup kernel diff --git a/src/kernel/include/los_tickless.h b/src/kernel/include/los_tickless.h index e50ef5b..10c6dc7 100644 --- a/src/kernel/include/los_tickless.h +++ b/src/kernel/include/los_tickless.h @@ -26,6 +26,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ +/*这些代码主要用于开启和关闭 Tickless 模式,提供了 Tickless 相关操作接口和功能。*/ /** * @defgroup los_tickless Tickless * @ingroup kernel diff --git a/src/kernel/include/los_toolchain.h b/src/kernel/include/los_toolchain.h index c0efeaa..c46f60e 100644 --- a/src/kernel/include/los_toolchain.h +++ b/src/kernel/include/los_toolchain.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. * --------------------------------------------------------------------------- */ - +/*这段代码提供了一些通用的宏和函数,可以帮助开发者在不同的编译环境下编写跨平台的代码,并提供了一些位操作的便利功能。*/ /** * @defgroup los_toolchain * @ingroup kernel diff --git a/src/kernel/include/los_trace.h b/src/kernel/include/los_trace.h index f3eed5f..713a86b 100644 --- a/src/kernel/include/los_trace.h +++ b/src/kernel/include/los_trace.h @@ -25,7 +25,8 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/*这段代码是关于 Huawei LiteOS 操作系统中的跟踪(Trace)功能的实现,包括了跟踪数据结构、跟踪事件类型、初始化、启动、停止、事件掩码 +设置以及导出等一系列相关操作。此外,还定义了一些宏,用于用户自定义的跟踪代码存根,以简单地追踪事件。*/ /** * @defgroup los_trace Trace * @ingroup kernel diff --git a/src/kernel/include/los_typedef.h b/src/kernel/include/los_typedef.h index 10b721b..98d5ce6 100644 --- a/src/kernel/include/los_typedef.h +++ b/src/kernel/include/los_typedef.h @@ -25,7 +25,9 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/*以上代码是一个类型定义的头文件,用于定义各种数据类型。其中包括基本的整数类型(如UINT8、INT16)、浮点类型(如FLOAT、DOUBLE)、字符类型(CHAR)等。 +此外还定义了一些常用的宏和常量,如NULL、TRUE、FALSE、LOS_OK等。代码中还包含了一些编译器相关的宏定义和属性设置,用于控制变量对齐方式、变量和函数的节 +分配等。该头文件适用于嵌入式系统开发,可以提高代码的可读性和可移植性。*/ /** * @defgroup los_typedef Type define * @ingroup kernel diff --git a/src/kernel/include/virtual_serial.h b/src/kernel/include/virtual_serial.h index d140b54..68d31ef 100644 --- a/src/kernel/include/virtual_serial.h +++ b/src/kernel/include/virtual_serial.h @@ -25,7 +25,8 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/*代码是一个虚拟串口头文件,用于定义虚拟串口的初始化、反初始化和获取串口类型等函数。在这个头文件中,还定义了一个名为LOS_VIRSERIAL_CB的结构体, +用于表示虚拟串口的控制、配置或状态管理。此外,代码中还包含了一些条件编译的指令,用于根据配置情况包含相应的头文件或功能实现*/ #ifndef _VIRTUAL_SERIAL_H #define _VIRTUAL_SERIAL_H -- 2.34.1 From 5d032e444bb3d639a010ffa5bb84caa190c23bcd Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Thu, 28 Dec 2023 21:30:08 +0800 Subject: [PATCH 04/11] 1 --- src/kernel/base/sched/sched_mq/los_sched.c | 37 ++++++++++--------- src/kernel/base/sched/sched_sq/los_priqueue.c | 14 +++---- src/kernel/base/sched/sched_sq/los_sched.c | 6 +-- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/kernel/base/sched/sched_mq/los_sched.c b/src/kernel/base/sched/sched_mq/los_sched.c index a9070c5..8c32b92 100644 --- a/src/kernel/base/sched/sched_mq/los_sched.c +++ b/src/kernel/base/sched/sched_mq/los_sched.c @@ -58,7 +58,7 @@ typedef struct { LOS_DL_LIST queues[NPQS]; /* one for each priority */ SPIN_LOCK_S lock; /* private spinlock */ } PriQueue; - +/*用于实现一个具有多个优先级的队列结构,并提供了相关的数据结构和锁来支持队列操作的线程安全性*/ /* priority queue per-cpu */ STATIC PriQueue g_priqueue[LOSCFG_KERNEL_CORE_NUM]; @@ -68,17 +68,20 @@ STATIC INLINE UINT32 OsMpIdleMask(VOID) { return ((~g_activeCpu) & LOSCFG_KERNEL_CPU_MASK); } - +/*这个函数可能用来计算当前处于空闲状态的 CPU 核心的掩码。STATIC 关键字表示该函数是静态的,只在当前文件内可见, +而 INLINE 关键字通常用于建议编译器内联该函数以提高执行效率。*/ STATIC INLINE VOID OsMpSetIdle(UINT32 cpu) { g_activeCpu &= ~CPUID_TO_AFFI_MASK(cpu); } - +/*这个函数可能用于将指定的 CPU 核心设置为待机状态。 +它通过将对应的位掩码从 g_activeCpu 中清除,以实现将核心置为非活动状态。*/ STATIC INLINE VOID OsMpSetActive(UINT32 cpu) { g_activeCpu |= CPUID_TO_AFFI_MASK(cpu); } - +/*这个函数可能用于将指定的 CPU 核心设置为活动状态。 +它通过将对应的位掩码加入到 g_activeCpu 中,以实现将核心置为活动状态*/ VOID OsPriQueueInit(VOID) { LOS_DL_LIST *priQueues = NULL; @@ -97,7 +100,7 @@ VOID OsPriQueueInit(VOID) } } } - +/*这段代码的作用是初始化多核系统中每个核心的优先级队列,确保每个队列都处于初始状态*/ UINT32 OsPriQueueSize(UINT32 priority) { UINT32 itemCnt = 0; @@ -112,7 +115,7 @@ UINT32 OsPriQueueSize(UINT32 priority) return itemCnt; } - +/*这段代码的作用是获取多核系统中某个核心指定优先级的队列中的任务数量*/ UINT32 OsPriQueueTotalSize(VOID) { UINT32 priority; @@ -125,7 +128,7 @@ UINT32 OsPriQueueTotalSize(VOID) return totalSize; } - +/*这段代码的作用是计算多核系统中所有优先级队列的总任务数量,以便进行系统性能监控和优化*/ UINT32 OsSchedPickCpu(LosTaskCB* task) { UINT32 cpuid, lastMask, cpuidMask, affinity; @@ -158,7 +161,7 @@ UINT32 OsSchedPickCpu(LosTaskCB* task) return cpuid; } - +/*这段代码的作用是根据任务的亲和性、空闲核心和任务上次运行的核心等信息,选择一个适合调度任务的 CPU 核心。*/ VOID OsPriQueueAdd(PriQueue *priQueue, LosTaskCB* task, QueueOps flag) { LOS_DL_LIST *priQueues = NULL; @@ -179,7 +182,7 @@ VOID OsPriQueueAdd(PriQueue *priQueue, LosTaskCB* task, QueueOps flag) LOS_ListTailInsert(&priQueues[priority], &task->pendList); } } - +/*这段代码的作用是根据任务的优先级,将任务插入到对应优先级的队列中,并更新相应的位图信息。*/ /* * Insert a task to the head of priority queue, only available * when putting running task back to the ready queue. @@ -189,14 +192,14 @@ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *queueNode, UINT32 priority) LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList); OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_HEAD); } - +/*这段代码的作用是将指定任务插入到指定优先级队列的队头,用于在将当前任务从运行态切换到就绪态时,将当前任务重新插入到相应优先级队列的队头*/ VOID OsPriQueueEnqueueTail(LOS_DL_LIST *queueNode, UINT32 priority) { LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList); OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_TAIL); } - +/*这段代码的作用是将指定任务插入到指定优先级队列的队尾,用于在将一个新的任务从就绪态加入到相应优先级队列时,将任务插入到队尾*/ /* * Insert a task to the tail of priority queue. The pri-queue might be * this or another core's. @@ -215,7 +218,7 @@ VOID OsPriQueueEnqueue(LOS_DL_LIST *queueNode, UINT32 priority) /* add the task to the cpu per-core pri-queue */ OsPriQueueAdd(&g_priqueue[cpuid], task, QUEUE_TAIL); } - +/*这段代码的作用是将指定任务加入到相应的优先级队列中,并根据任务的调度要求选择适当的 CPU*/ VOID OsPriQueueDequeue(LOS_DL_LIST *queueNode) { LosTaskCB *task = NULL; @@ -234,7 +237,7 @@ VOID OsPriQueueDequeue(LOS_DL_LIST *queueNode) (*bitmap) &= ~(PRI0_BIT >> task->priority); } } - +/*这段代码的作用是从优先级队列中删除指定的任务节点,并在必要时更新位图以反映每个优先级队列的状态*/ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) { LosTaskCB *newTask = NULL; @@ -262,7 +265,7 @@ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) out: return newTask; } - +/*这段代码的作用是从当前 CPU 的优先级队列中获取具有最高优先级的任务,并将其从队列中删除。*/ VOID OsSchedResched(VOID) { LosTaskCB *runTask = NULL; @@ -326,7 +329,7 @@ VOID OsSchedResched(VOID) /* do the task context switch */ OsTaskSchedule(newTask, runTask); } - +/*这段代码实现了两个任务之间的上下文切换,包括状态更新、占用时间计算、任务监控等一系列处理,并最终调用 OsTaskSchedule 函数切换到新的任务执行。*/ VOID OsSchedPreempt(VOID) { LosTaskCB *runTask = NULL; @@ -357,7 +360,7 @@ VOID OsSchedPreempt(VOID) SCHEDULER_UNLOCK(intSave); } - +/*这段代码实现了抢占式调度的功能,能够在高优先级任务到来时立即暂停正在运行的低优先级任务,提高系统的响应速度和稳定性*/ #ifdef LOSCFG_BASE_CORE_TIMESLICE LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) { @@ -370,7 +373,7 @@ LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) } } #endif - +/*这段代码实现了基于时间片的轮转调度算法,通过限制每个任务的执行时间,实现了任务之间的公平调度*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/base/sched/sched_sq/los_priqueue.c b/src/kernel/base/sched/sched_sq/los_priqueue.c index c3a5592..124f49e 100644 --- a/src/kernel/base/sched/sched_sq/los_priqueue.c +++ b/src/kernel/base/sched/sched_sq/los_priqueue.c @@ -60,7 +60,7 @@ UINT32 OsPriQueueInit(VOID) return LOS_OK; } - +/*这段代码是用于初始化优先级队列的函数 OsPriQueueInit*/ 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); } - +/*这段代码是用于将一个节点插入到优先级队列头部的函数*/ 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); } - +/*这段代码是用于将一个节点插入到优先级队列尾部的函数*/ VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem) { LosTaskCB *runTask = NULL; @@ -103,7 +103,7 @@ VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem) g_priQueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runTask->priority); } } - +/*这个函数的作用是取出优先级队列中的队首节点,并更新相应的状态信息。*/ LOS_DL_LIST *OsPriQueueTop(VOID) { UINT32 priority; @@ -115,7 +115,7 @@ LOS_DL_LIST *OsPriQueueTop(VOID) return NULL; } - +/*这个函数的作用是获取当前优先级队列中的队首节点,并返回该节点的指针,以供后续操作使用*/ UINT32 OsPriQueueSize(UINT32 priority) { UINT32 itemCnt = 0; @@ -140,7 +140,7 @@ UINT32 OsPriQueueSize(UINT32 priority) return itemCnt; } - +/*这个函数的作用是计算指定优先级队列中节点的数量,可以用于监控任务在不同优先级队列中的排队情况*/ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) { UINT32 priority; @@ -170,7 +170,7 @@ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) OUT: return newTask; } - +/*这个函数的作用是获取优先级最高的任务控制块,并将其从相应的优先级队列中移除,以便进行调度执行*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/base/sched/sched_sq/los_sched.c b/src/kernel/base/sched/sched_sq/los_sched.c index 5e10fb4..14d1118 100644 --- a/src/kernel/base/sched/sched_sq/los_sched.c +++ b/src/kernel/base/sched/sched_sq/los_sched.c @@ -103,7 +103,7 @@ VOID OsSchedResched(VOID) /* do the task context switch */ OsTaskSchedule(newTask, runTask); } - +/*这段代码实现了操作系统的任务调度功能,根据任务的优先级和状态来选择合适的任务进行切换,并更新任务状态及相关信息,最终实现任务的切换和调度*/ VOID OsSchedPreempt(VOID) { LosTaskCB *runTask = NULL; @@ -134,7 +134,7 @@ VOID OsSchedPreempt(VOID) SCHEDULER_UNLOCK(intSave); } - +/*这段代码实现了在需要进行任务抢占时,将当前任务标记为就绪状态并重新加入就绪队列,然后触发任务重新调度,以实现任务的抢占和切换。*/ #ifdef LOSCFG_BASE_CORE_TIMESLICE LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) { @@ -147,7 +147,7 @@ LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) } } #endif - +/*这段代码实现了时间片轮转调度算法中的时间片检查和调度触发功能,当任务时间片用尽时,会自动触发调度,让其他可运行任务有机会获得 CPU 时间片并进行执行。*/ #ifdef __cplusplus #if __cplusplus } -- 2.34.1 From 4d16b4937bb57c73212cb39d60a76835f35c5d2a Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Mon, 1 Jan 2024 00:17:13 +0800 Subject: [PATCH 05/11] 12 --- src/kernel/include/los_typedef.h | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/kernel/include/los_typedef.h b/src/kernel/include/los_typedef.h index 98d5ce6..dedd290 100644 --- a/src/kernel/include/los_typedef.h +++ b/src/kernel/include/los_typedef.h @@ -25,9 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ -/*以上代码是一个类型定义的头文件,用于定义各种数据类型。其中包括基本的整数类型(如UINT8、INT16)、浮点类型(如FLOAT、DOUBLE)、字符类型(CHAR)等。 -此外还定义了一些常用的宏和常量,如NULL、TRUE、FALSE、LOS_OK等。代码中还包含了一些编译器相关的宏定义和属性设置,用于控制变量对齐方式、变量和函数的节 -分配等。该头文件适用于嵌入式系统开发,可以提高代码的可读性和可移植性。*/ + /** * @defgroup los_typedef Type define * @ingroup kernel @@ -50,7 +48,8 @@ extern "C" { #define OS_STRING(x) #x #define X_STRING(x) OS_STRING(x) -/* type definitions *//*类型定义*/ +/* type definitions */ +//定义数据类型 typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned int UINT32; @@ -61,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; @@ -73,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; @@ -82,7 +85,7 @@ typedef INT32 ssize_t; typedef UINT32 size_t; #endif #endif - +//一些常数的定义 typedef UINTPTR AARCHPTR; typedef size_t BOOL; @@ -151,7 +154,7 @@ typedef volatile INT64 Atomic64; #ifndef LOSARC_ALIGNMENT #define LOSARC_ALIGNMENT 8 #endif -/* And corresponding power of two alignment *//*使用 2 的幂次方作为对齐大小*/ +/* And corresponding power of two alignment */ #ifndef LOSARC_P2ALIGNMENT #ifdef LOSCFG_AARCH64 #define LOSARC_P2ALIGNMENT 3 @@ -160,12 +163,12 @@ typedef volatile INT64 Atomic64; #endif #endif -/* Give a type or object explicit minimum alignment *//*为类型或对象指定明确的最小对齐方式*/ +/* Give a type or object explicit minimum alignment */ #if !defined(LOSBLD_ATTRIB_ALIGN) #define LOSBLD_ATTRIB_ALIGN(__align__) __attribute__((aligned(__align__))) #endif -/* Assign a defined variable to a specific section *//*将定义的变量分配给特定节*/ +/* Assign a defined variable to a specific section */ #if !defined(LOSBLD_ATTRIB_SECTION) #define LOSBLD_ATTRIB_SECTION(__sect__) __attribute__((section(__sect__))) #endif @@ -176,11 +179,6 @@ typedef volatile INT64 Atomic64; * but using the unused attribute should stop warnings. */ #define LOSBLD_ATTRIB_USED __attribute__((used)) -/*告诉编译器不要丢弃变量或函数。仅已知 - -*3.3.2或更高版本提供。旧版本没有把它们扔掉, - -*但是使用未使用的属性应该停止警告*/ #ifdef __cplusplus #if __cplusplus -- 2.34.1 From 290dd0e976cd66dbc5f63372e5e885ff31346820 Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Mon, 22 Jan 2024 08:46:11 +0800 Subject: [PATCH 06/11] 12 --- doc/用例描述王维轮.docx | Bin 0 -> 12921 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/用例描述王维轮.docx diff --git a/doc/用例描述王维轮.docx b/doc/用例描述王维轮.docx new file mode 100644 index 0000000000000000000000000000000000000000..9bf7d222006ecdbd9b62f65525ccf81da3aa5d6d GIT binary patch literal 12921 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 T)FHh8ugKK<{q&Xg1N8p@Au;hG literal 0 HcmV?d00001 -- 2.34.1 From 7b35cb073e9b0c3908d54a7aa1238d0cb3d208b0 Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Mon, 22 Jan 2024 16:14:29 +0800 Subject: [PATCH 07/11] 12 --- doc/王维轮泛读报告.docx | Bin 0 -> 89972 bytes doc/用例描述王维轮.docx | Bin 12921 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/王维轮泛读报告.docx delete mode 100644 doc/用例描述王维轮.docx diff --git a/doc/王维轮泛读报告.docx b/doc/王维轮泛读报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..61e44137cce5bcf2db4b2f5e8917d8608d694633 GIT binary patch literal 89972 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≷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 T)FHh8ugKK<{q&Xg1N8p@Au;hG -- 2.34.1 From 388ea2d72e80c10050394dbf3cbd4e7fec891d64 Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Mon, 22 Jan 2024 19:01:31 +0800 Subject: [PATCH 08/11] 12 --- doc/王维轮泛读报告.docx | Bin 89972 -> 89992 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/王维轮泛读报告.docx b/doc/王维轮泛读报告.docx index 61e44137cce5bcf2db4b2f5e8917d8608d694633..8a82c4e2d6b6f90fc61f5034b4cfb3b3affbbad5 100644 GIT binary patch delta 6960 zcmV-08_(qQz6FTC1+dQn4i0zB6KMee0D%Gk01*I}VO#+dlkfo%e=UDe;!1!zQ3;76 z5JM%)zHOr>PGp;=eHm63b|&6|r(oq3aMCmsf!KU~&i(H3Pdr%VnYRRO(n2MO1_XJa zL?Kf(OVI6j=$|6bSgs_`3Iz#TgFyqfzZZ)#5`~6qU6i103dVCJWg<}~Xl`v8VQj=4 za&7|WP)?i{I_K7ve|m;XE*5+SI3(m4=U}RRvYAiQ)27d_TInX^!frs=g}$ zh{aMg<07GfTacauM4NG2<*s*eIUXVwlCbB~&?o&drBVMRS|a2j##>k0UjsL+LbHM| zypNaX+SKjU50Y_XNAB&WDai9R`+R#kn7qGE4&5Tgzx6I--uC<-vhNe>hhZI(km%@a zC*&5u>J%E5Y5kp8pEOgux~YDC8ukUVS_1+M2~e=}uhsx4Y%CM1)}z6o1^5?OM|atQhL+wuWqqRCFp);?M8Q{DZk)%x`1C8xb-EK0)JxNn{s z{T^m1&j?$O`**j~lVQJCO2jfmIm6@r4wwBepa1;h({@y1DM764feBWQ@^swaNLh>q zgEHOV9F?cMzzmoxE^>b);a98&ITBA*agy@9K$0v8C2}{g48!ZUX85>Y2{vj?oa7`G zyyPpXR7QNYA}MY^ord@ozl~AW+vPxXH(q)7MnHsp1t`3M85`0|1V8QIt_tN}k6^qP@NCc6+)l%F~p!n>ebPX%B#PQ0n*c zbab(1T%aWdcy3Ln{~56P%6Z<~jtVSNC^rDxGWr9>SVBC2_L$GPTvS5vie={*0S&~T z5k&QY;FNRuPB4FKG4)jdGgWv3OPB%ZQ>?JIx0vA-s;In0%Z21c=g#SNmI<_lYMlv^ zeaAwQ6wyV2QXqArrt399WTY%8+MRPjUOAJ9#s}R54)boW@kYKg`!CXrf2~+5tNLvG zg#|m_LSr!9Ac0cIMZ3cYb|EYikBQwwFPXjd3L;}E4!B}L_CqPkMetmv&kq)u5wsHKya0(#eCLss$z zOK2>$EXp1Mc2|Vqb4=D7dBLD4^hoVqpyC$4$a^9;br1*tcO_0xDJLaCEEE_$-Bc8p z%@#^LO|E~?j#u)H`~}MZ2a|GMhL;hgSUvD{*6Z2QCXQ((cXl%rKegtXU9` zrL|_+wlUP}1g7KaIf-Qkq0WzOSiU}QPGAh}p-#sME#LFCoY*&__ELFUAJ;W)Lz}ms z*VOZ!Kp&46*hZ+$s2BT_P+M(3bR1usgQ0(84u8V&{V32zIs{JKUhQuq9S$LLT2uvw z<#}!Qe5(`KmYrzh2_|ObXfqmwW)x_vJ+W*fj&${z*rsV~kGg-` z?FTJw7ZTyGYPbnOH3!WwOuT6?1?@HQ^U4gZKTtQmrS&sVwxDyM3VzQ z3~kr&HM{nc*mk3&)`6z1k^r4JAE~#;_5v5a@06Tw14V`?X=F%9iYO{2P#QI>jl@MAgOvaacTWVm( z;tVG9qVcwcVXV2SJ9nnzwDt&tF)r`uWwl&%S`1zsM=Tigub+i7I5?zdJCg8FttXx< zbeOX-JGon^%M!PP-njp|If>><8}3{x7V3SAXQ(Ke(RjHw$9<|MNmHpw_{&t_om>Ab z*H+83Y99P4Uj2ho6)Z@%3nkDjL8@IGXm&@l4>WkiHFC~@=5{pqK=V2pytB8X4NO{s z67~e+WVclG6{nPMadzGj$NhJtI)#VF|L1>`fH5SqZxuxb3hrubbFvZu01$SQz8e{T zTUXmwzJH&!<~w-#Dbv*e29gG^!mO60Y1ZPjoRXgN*b%k>O>E0Y5^>Tea^aS6nOi*KlLk|-`@W%S+Zrvw?OLhkRVIixBvaNw?6*sg?KD*Ue_rCEp5SooQSAVB{AF`{QB%?M^6NQ1G*t4qEbvv$lbwF10)1wWN}IOC%u#iHrL} z9j$njZxjr~BjGc{300E@V^~`%)EP*Hjs+Nl1bZO62G!_A_SYDUi9h{+nz$G+F2>|Q zDtumwbq70wt>X6o;#R6V2>FOs7nA5z8Z}hs@tH)l=!NJ7$$9=MC<#)Qccv!o?wQz& zVcn^4M2)GCJiJf*)W7WxcC!0=Qi@=#HtHxQ4;i(#9aIf~wAR*|GCWfA&`LsAqVngp zj!n(~r?%#;9La9*561d`q>Jh(TTLF3LyF5%DZO^GsU8phvVHHOjAO=sx1pcLQR)P>#BuqnP@J9R-& zxf@Q0WLh0_Hk?cy)Pu6#KROgNqX~-CK9}7hqP?qwam2`1qfGvPN=Bb7>72tD4ccuY zoa!Q?hlmidoQMm#i8T{1CRwW_HTru5FLFs8fh8(y#KWThK`y%odv*Lpdwv&xMN>}w z;!W){HDTy%zDmOA4zjs^qANmr`*nla^rUxw$Shs5ZcnCnHd+4$jl%!O9QllCfxqu% zZtY~BUNWye&R*GnExk;(T9PM+QpKyY-#6uVC{-YkgpTGsN|NMlQU$M8D>!0OV%Qc> za^mRM156^?vZXut?a0yIFPOkW*S19LiK+TG%vp`LL`pLolZEd@rqr;=L3@S5@PN4W z+;J~1y|ZIpTh4A=F}I(ZH)hPKNo)4|(#u5CLz&|12OP?O6kn5@5zJuB5peX=v2JZ1 zdw(nyOz`b8B`Oa|qcP!~)GAVvn(}|6@~GU5QYEvtoLQJ4*^;?`)e$e&^t0^pOm2DG z+@3!aGTp&ygAIp5=1|B4>$O{8+AvF{5%Lp)?JWyi+% z8IEoWGAG8ZrLEHRVw=kXs%67=9yb&zpAwE~1L2riTmvQ60lsRSY3tEdYic3AJ(1oT zOK<&X-CDP1E}1L$0YBnK#)Pl$n&VTM?Ps~WkIkt&4uAgkdWMOM?KyMpQD$z#&8y}7 zazWF7bu(>t=8C!aq6D0bo<7BpzZ@tgi}coWN3f95Un8NsFMMZC&t`VltcS~pAeVr~ zI}jW&iF!Q1efe`{XWm>`H?OUluQsjcKbTuv*}VlgPagP|)g$$bQ_y7P!_|dB1^{9a zP?Y)nuK8dUd;=aLKFB>7L%=)x{lAD^Jd^T&C@-%t^3zZalr8D)mGt%vpa|NwkXFjf zs=$P+3vLyyrmhhfWYqrD~I2yJWW zl{LFYH0qY^=7tD3f>v&9+PeNv(v7*X%jUv= z6amtKU!b@D>j0Fcxp$?hfzs&$N_uAwa52~JgEnaCzC@Cpduh(!HpgFD52mdLW4V9b zbqopiK9AxzHO!8=U`AOAa8-8w2`!xrW#}uWEf-%{w}k=Mi?>&|BG z&Womo)A5!70mEFI0jpVSztW=3g*kwKCoj2v7_%Nfp+}kNN$c*qx$qPaGB%U#b%H&EG*1-)3Aj%@E%LX-Ep3aGA;D^vSwpO&ZVG3ij7MdbTvZ#5YamX_h9>--aX0gSy6KL>7!=Wh@n2y50-p#OWPiPCZ7-NFe>SHk za^tfI#GydWgJA}!!W4+0A3u4}K)C*1A_Z>pN`-47^H7TiUM*|5dV@^+9>J&|N$vZI zB*a3p*Dhx+zj9(B*32aQT?Z3nq%nl8yvSWafa$im@dg*ojf0N;!~uc~1>k0Z`)513 zdn<$t!cgrH_tIp8q-iaG@~3k@!773>yEmaXec*flDo8u`^fm#PR9ANImbv%{aSOT$ zss{pcH>N59eS@4!Tt%e4tZ zRM!YhP9Rt9hE{QZW{er78xzIQ%C5aZ84LjC=JBQm6%y6v)63Q)Q8&pFVpO9xUF>++gbn)m zABUx!IMIcFi$QeT)n>nsL#g_;fD*;cU?3r}1e3Y=21N$}{Eo_c1nrJVoyR)|LqlC{ zogcLi9&c}#I|ide(YCIL6dmg75+g^xIDcA`k|RpwGY$Q)iem|r4L!%Vd4NW#8BkXbruYLs-GxWM1@P6}Mu~Bp$ z^OwSZ7lyPrYl*|C0^kzRI@p76vzEf(p0cciA?)T!O*c-#7{n7LHLYX+`n<{$N_ep7Z11w$LzOgf2X1kWz(z6=EFM_Y%(Wzt?xF> z`D^C*CffmXYc7XL@mKEQ_pp{Rne_G|VF06;vnXGmF<(9b z9BeBC$ru10@!!7G`!(gi*>3VP3B@?_m%oJrNHGvHvM(Ng zXJ7o_Btr`bg0iBe3QvJxbL~p{_5IwXS#xfJUUpUK7L${3D91M`k4jk%XK>iMnSX8{ zv~l~6*%D5-3n2r_xAKv%&wO#VqaD&-Q8gTg>A?@N8>NzbGoylSxkCZ*mYbX}M2lZO zl`%55|E(=Mb>=`8p@TYMn0mEI`KZi)&P{l}O^z3M_%6JhRShY|k>iIAoL{hZr;t^s zOw^7wIcaNaY)1%PU*!0;0_-7lfqB=2#9Rc^@(B>Xxe@3dh!B{0flWe7)=!rq$Z-b| zFjV>yR*NUr%-Rq^3P5v!9n{mWM9%dlN00QW`dLXo*Zb)Q0Rw+Mh%Vf^vHdfD0BDUp z`_I@Vh^XA1pGhX-Cczw)!`8o-ML5hU)qg(i#67Cq-2k~-Y6^%hVIn}LyG!hrz@7>4 zuuJ?}51+VWF-^|Dh^@HT<&$Xih^_PjA3(Bl_4i?*0OubD`28=FdSECf4VNVWo3j~X z6>Z=#*I!`+kCWvGA{@RXMx+RTS$?0-?kv3AdV_O6TL%!&6Vsl5{N)h z6OI-(F!8O-uu}+kO%CA`c}4RTqF2y2UKqOrzzo9PoihLqL_ey6unXK>Kg9O!N34&ip9*JPSt=ck+|FGtsWu8w{ zt_U+ED*~N6Rth5}u3K?`cqo=DtQ6WB#5vSiCWfZKc9WAqSDp;|HCc`)3;Ztfzp0GK zd_7N2HpBkzO@gZRe1*UWyfB91juy+tQ9T)lYHo5CDNE}m4(VIMP9;icI_#FmzHLl$ z6y>S17)`ze+015PsEy<4tP+>?7`}DTJ0eF4grYccVSB=Syp70zhqEaTu*&YPWq1Eg zxT63G@h@CrW)N^p`EoAWI{i?Avc-4YF+}q;qw^GA0ByQsd+i91Om&uJwm%#e-Jve> zhl#Y^VJ4P%+`4|y(WQ56YlTXLd-5R`uR;g8I*}kow0v&_ZJ2=fz-n7AuNK$z| zITvICdsP|feHg#amWl$Hi+GwV@M2BBVODdAQ!~hp1|n=1N^H%b`%Ddb$7*Wk@CI>8 zW-T~+d{u>Sn!+vLL=LG$vV!Fzc+i`mPrV5h#pCJ>Pn4PD?y7K*AFQUgW|3(uP>s~w zn!ADCtSjSx=ESd{m8Qm@f83|CQ)Ap%s*{Nb$>^{cjXw%SVvs{HWPgt00eWpD)CZ=1edT~0UCpsF1MF1 z0i`Sfg_k{B0YCxWmwsCTGXeoum$O>|k_8TT%oAysN?ZX{0a=%yTme7&o}?rLmvvJwCQ5Ox3n5dZ)H z000000RSKX0069)mR$ip0gac{T>(D0XPA^mrh;*C>v0)^RLzg002S|000pH z0000000031AOHXWO_z~g0X_lOm(X4TJONUd4POB`0(%vckrfx0US9za1}0kp00001 C@Fh<7$)C0WE)xpt90b0@Mj4B!WN;l`Q+VjT$?VZTj;v ztSszIyaP|c$}8ZcZ72e<`TCsu-Q%BhxKd@X0Aq_v4-kzA3P6iW7J52BxA`dSqrf_@ zB`+%t1GENPAa3g^QC{8 z;+l&&p8}2vIl&4Xm)vpO0K>W?qAgO24p~2%vIR(ip#%lmSxh5}zr7BOvVS(T%AQjd zZe9B`ZR75UYH@pcNamr-qd{tuaigobgPlRl$87Wel;?f_Yn!oZ?vzEhTv zc4}9*)z43peF0EQ0|b|jTmc%hcLU@L37k}^?9T-N04S4W4VD(9uS|iuW!9_1&I|fZ zUsLU-idSSMkZ8&b065x3UW8>Kc@`mw_V%i(I<4~JG-2%~j;dxkePA7wj9!+EFE)$| zw4wmd%5sg*fX!FVvtBjMu}GlY0BqYd`iilFcmVAYUvRlBh2SMi&oKfTh(9BU>I1$OWFnY!TN}dXeitSW&rJ7mNTY*TOvW8Gg$1gebuH}}jn;G+#-rc!?mH^uEP z$1{weN^r;gez+ewt1&U7B%c#F`l2b!|K@*;tk+mTp25&=4d&-<3zTW6PUqhrsYJQZEAJkvhYIf-Ym}w;;GJ>4e{7oYqsN< zBfXAqxdS~Xwk*7)n?QWtkBn1dulso6zb|Tbu7!##xo5p%h%>@8V$UGtF;z;GhZ7I z03`Oc*$D<_q(^Vyn_-~ETL=*Crkb~T3%$W8(4r~~Onan_Ck(BbrOi$l55s@%cKgB4 z%p7{!97L|`d)i$`o)!Dr%Egu&Iod83yUtXfgPG~r18thTCWNf`fWB=FOILGTd8}ymo;~Oh_aO+s5e({5@^`jcqN_!!aDv6!+461Im>d@ zF;7k!Mv);(XE5h=j2a->SWSPQ5nk73=^Tm8!EP%dv{aaXFZZ_8SdPUR%-?zAt%8xO zxsN+{mg~0m2!mlQ>*z(fT6S6t-W5kI80N2^g)-Pbq^BB7c#hU{%@sOK)0myyE!CBX z+i`AUylzjzh0=zbm5QZ$#o{^2^JV~EZLEnw)x2maH3@$yyk_g4)y7V4d3Mc%KgFwm zP@;kb>2{$6nk7iJiv!K+XwHEKZ?#6wJR0&x-uIDY$(9{&fz;t5L6-Dx&-Om+ zf2)uGd_EovoD)?|k`vv*P)l1dASNPmR7#9=2frTt?C6PLK+}apREWt5u{(G{)PjHR z`QslxPKKj$WGpTw^Z>d@XyK$1=?;$Sx)N?})gq%}T+mwLQbd(Cd020W$njQrcvy;v ztw~vpwzjv0+W3{C$`Mi1FkY{aI45X9f2+HAac{CBCNS2pti}ahYmwEF*0`Xa9aD~? zcSX>pAt@&57tnXxal0G2J2<8$!q$Y2Iul||!Zac4kKIBoT7}QJ)bgYS0X|}@D#kDe zIiZb8N`4u&_J$>n+EY4LZV~6=G5fuw66!1(&slOMI5?>aNuVO%VNrKJz=%?#e|U`G z!0?;LYGIF+bm;BD?l&$-31?!pEz||7P+K{mT9m;ik{|L|(cH_zww=?rYe)qwRS$!l zR^>6pnT{gW*V~!IS*I_?*;UM}?Re4Bw5mEN;{Ab9K@pwlC|d8Brpxh@f-X4yCX>mQ zq@uM%5|$uwabKvT6_4_bf`ND>e|%;nA*;er3~NhfO`U=L*1kQ}|h{^~<9 z>rcOGT@2_KVqzc}J}1PwgB`(E>-OJqE7=`{d_=1Y3OW_WblG`)CJ`-qA$neLo_`8T zf|TW*$%@@Q6MHeNI~k71F&UDF_lcj{x81=`c3)G32*zroj$-1lUTfPSe_01eYi+Gc zBcnABEhRK5Dt=z;*wp-QwKZ?$NOpsNDAp%jkjL0+@`xOkbO%?xVl4I-f#`wb%8Pdg ztrj-$G}MM|((cZA?m)amdmE-DI-r?5lcApunVwdqD5Itk{Oy%v7#-bohK^g5;(MFA zuv_Xj#rLbH&RbOOhSMRLe^$qw4JT6v^`NYGj}9%GQ7wv8KNsC1qP?qwam46XV@&=E zdY>q0oWmFm+HE47>LOMT5lh5!A}-`6*35cQVXYKu^v?)h7}rI*Q8OY-DUs(AP8cWv`KlqwKN)*j7ylqAWU zqzYcGR&d0G#E31P#Kh6B2be^(WlMMP+tH)FUoe4%u5F3f6O*-Xn6VmdiIiqGCJWz+ zOsQd!L-qBjD(#quts(_U>pZnBbdbN>m&c#$uLrQmaT&RO$c5#4)iMrAlUfC9^n5vL$ox ziX&dknWx#6+1yIXNG%)+neJe<&W1xFb0}nj_3AB9ZJ4G~e~Fz{i){Pt)pYxBuVzZK z_ra=4b<6GojmfnK2yTVOiw{Dx1qH?kq=B_Ho_`|#j&HPy&1G;Ln z*xu0CUp_qlj}+{~fy2e1wgFZJo0M`#WNxmdUtcp8=YD&2&qE<)`>vZp%^P#+-TRqe zb}~DUtgZL%e;T%7H|2V!20Yv=%@~1+r zF>OA)VooonQ4?u(x@I}66*hH-Vxc)4Xh`@z`W&h9P3c=Euv>^@Sz zI0a2se?DAY7-Rq-76C;W&+Zua*T6U6A>xDF{c$+Fv)})R*u^s`&*tS7Mt(a~17%A( zwVF;{2a2%U7Sc+YSrw>ob-}Ho)zmct!%V0pV9BqWYv%L|a{)4L)r}uxdecq5{~Nzl zDT;o7z-Vs?I6~W8ere9F6OFoMyRm6GKg@;ef5yaPfG4xGZKQ6x-y!)Aa&KyAb-19F z8=o<+{hRj2-1sG9ahd?>z%S6-|8)SHrLlLpse#hz0!n&k9&j<%?}0XG>Apmgoqu60 z+%hI!nD=MQ`{TL)+;J2M_CELGH#N+TxnM?73UF0+<1sCr6lLsJY`0u`Zr-vKsLa(Z ze{=jIQ=sOSpQkE>WiX6ZTGx@N|~Rc=B8?97et%;{US z?HLolE@E>eaBt663ZzK*&n zoVhy6hL9R%88*rjVbgSxty7hM!H?c-E~&yA^6Q3^?S8ron3-?;3JOS;$tLa%f2c8% zR*kF6l>sq`8UdtY#3iKZp7LZ|RqKswAWq7Cwh~zSc^8ie+F5om>-Soo67IE(^fEW19x1eJs&{moty}km*x6w$>fkm z8E3T2gR(zMXGJ$^eeag>Sz@by*A1vTW8mOQOH0;!C^%iYis#)IY7yujjw)60(kOB( zYijO86x<80auT+zV*TcBm_>Tv#@^}`q&rYloBZ_qNmtm8D<7_Ie@mrQNSnOUo{9MF zorhMcyB4r+Y#^TP4p&=oN!v1{@EWs6rY4QmDP!}e%#M|ZfIvU9ByVlvDG@G-r$X(m z3=T`|AzYcNRz6mwFVzh#1ianQDh{tP&31FL7+Tr&*T|&-z}!6E)SyDN+jw%xd}t+K zvZxwmf8DzRAh{ujf0&c;(?etR3hE?`yKCva74zaoQ^N*9Zvue9?Ikz+fSbsfM_^#| z^yHEikK++r1aNt7Kzer%8gFKPs;MD`P`4GWy*XD3ia&UXiowSUyv5yESc3plqW)cMizu4CL`p@hZZVKJhgqIYqs3tmE% zKmNywD<@8L;bI8gcD32><7BITHNZR@p1w(f2!RTbu6$M6At}x;C;Q7{q)Rg zC?+YNNim#4B!t;@Kn;uWArYjfo{4rcGzwu&S4BNC$}WfT>Q_K9L$B)r?>FBS8%5)R z10j5VSdFumIMFHqE&;8BJ$S9Q5C->@WgQG*H&;|mKP}??Aa;StVGcl<5Ejn$Y1VA) zS1`5we+2j?e)9QRgwLqO{TtVg9AMXZ@qlY^%zlgZD$Lz#cPpNcu(o16xJ}L`V`|s@ zZqrz}YD{dgGMbxf;Y#hZ0^Pnok-RTbU+>B8-9?TV9h?F^j9_5tUQl0oF@n2F`1gLBzpl`3NpxYe-FNgwv5T7Q%i&ajAG0o2Y%Lg@fdi> z?oDOZuHmM+uz(b<+Via&gOw&@09eHT_)_avrN6S0^fL)bKk}!4gae3E5HhmQA7!8a z;6zjl2!cYZrLtFnU}ODq`qjPM#W`bsl3sSD`WBOuWl&CRQ81Q5CC=c`bu<4?9kg=$ zf0iW@jBXb~2BdGrBVV8SVz8qf(q58PoT=%-53w7?qkO}w7Ta=z0^%(w*wF2xRbb)!-gsiz(e@x3KK>X%LpnD)fVCFe0jh4-yEj1WPrnp7+pCNn>65iVK|9;~=?4KFe?5pUtp7;;3;>$rPyaW5 z5h5yg`)87gxJfWa`my=n70Vsw*OPC0d>FyFG7bv^{e-FFF zuleAy+ZWU1{0rZTi(Nj6MvvH=Uf=^rR=)jx7%0H`hXH>7OGOI|$ApoxBw%wkW2~Yo zAYjK=epH$2oWxDazvHBivo0EOt z^qm3cNxdi1CK*niNACwg){JhE_AWnWrE=3r4ZK8Lmxsq}v3lVT?!q7q$ z6t9Pdo^>0jpj)6BCOiWOmo zq(z`}M@wO(#P?R5K#JvBS_;({aSnBsiJ{4{-Q;A@l_!IKRTSe&f!#&+H>D97uNKJ2 zX4v1oK~OcHtr8f47sgQBf6!vlI7&+6P|Z!vA!KR3z)640D0iZOro(P|?AyvDM^T?*5l>M-CF= zUzo&9A>f$uo|p1h02yP<RuwE`Ug#6`{f%FB;r(h<&z9-OvGoPm3CA`id3(s#4$99#3n>P;< z$M$@h8pq@zvYiILcB-3?nWz_4W+()%P_i9_EO1H@f7=GVV>LB%c%3*UqZS-J zzFUQFn8GdJtQb;>UJD~wwX>fiV>Bmc5(&;J91jV`y1E&; z$yNaXmoHrb7MH7A0U84BR+q&Zq6PG7l0XP9Xmtb81FB_Afoid~n0019%000pH0000000031AOHXWrkAQ+0X_kF zm+4&rKLLT4DP93M0jif`UI8c@oK&go&jkPgC=dVu5dZ)H000000RSKX002&xrCtF( f0oa%1UI9D-OqU^F0XPA5ms(!|C Date: Mon, 22 Jan 2024 23:12:00 +0800 Subject: [PATCH 09/11] 12 --- doc/王维轮泛读报告.docx | Bin 89992 -> 90052 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/王维轮泛读报告.docx b/doc/王维轮泛读报告.docx index 8a82c4e2d6b6f90fc61f5034b4cfb3b3affbbad5..57ce131d8849b92217184d255cf02a6cc761854a 100644 GIT binary patch delta 7346 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
    Date: Mon, 22 Jan 2024 23:28:43 +0800 Subject: [PATCH 10/11] 12 --- doc/王维轮泛读报告.docx | Bin 90052 -> 91146 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/王维轮泛读报告.docx b/doc/王维轮泛读报告.docx index 57ce131d8849b92217184d255cf02a6cc761854a..a01069eccfda1dc827ab980eda7b5eaba687abc6 100644 GIT binary patch delta 8114 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 Date: Mon, 22 Jan 2024 23:32:24 +0800 Subject: [PATCH 11/11] 12 --- doc/蔡伦_LiteOS阅读泛读报告.docx | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/蔡伦_LiteOS阅读泛读报告.docx diff --git a/doc/蔡伦_LiteOS阅读泛读报告.docx b/doc/蔡伦_LiteOS阅读泛读报告.docx deleted file mode 100644 index e69de29..0000000 -- 2.34.1