From 99c4c8235c1b2384b08f3b652ffc6f7afde31b30 Mon Sep 17 00:00:00 2001 From: cailun <2505225681@qq.com> Date: Tue, 26 Dec 2023 20:41:32 +0800 Subject: [PATCH 1/4] src --- src/kernel/base/include/los_membox_pri.h | 2 +- .../base/include/los_multipledlinkhead_pri.h | 2 +- src/kernel/base/include/los_mux_debug_pri.h | 14 ++++++++--- src/kernel/base/include/los_mux_pri.h | 19 +++++++++++---- src/kernel/base/include/los_percpu_pri.h | 23 +++++++++---------- src/kernel/base/include/los_printf_pri.h | 9 +++++--- src/kernel/base/include/los_priqueue_pri.h | 10 +++++++- src/kernel/base/include/los_queue_debug_pri.h | 10 +++++++- src/kernel/base/include/los_queue_pri.h | 11 ++++++--- src/kernel/base/include/los_sched_debug_pri.h | 16 ++++++------- src/kernel/base/include/los_sched_pri.h | 16 +++++++++---- src/kernel/base/include/los_sem_debug_pri.h | 7 +++++- src/kernel/base/include/los_sem_pri.h | 15 ++++++++---- src/kernel/base/include/los_slab_pri.h | 18 +++++++-------- src/kernel/base/include/los_sortlink_pri.h | 10 +++++--- src/kernel/base/include/los_stackinfo_pri.h | 19 +++++++++------ src/kernel/base/include/los_swtmr_pri.h | 17 ++++++++++---- src/kernel/base/include/los_task_pri.h | 3 ++- src/kernel/base/include/los_tick_pri.h | 13 ++++++++++- 19 files changed, 159 insertions(+), 75 deletions(-) diff --git a/src/kernel/base/include/los_membox_pri.h b/src/kernel/base/include/los_membox_pri.h index 6b64895..c7def84 100644 --- a/src/kernel/base/include/los_membox_pri.h +++ b/src/kernel/base/include/los_membox_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件的作用是定义了与内存池相关的私有函数和数据结构。 #ifndef _LOS_MEMBOX_PRI_H #define _LOS_MEMBOX_PRI_H diff --git a/src/kernel/base/include/los_multipledlinkhead_pri.h b/src/kernel/base/include/los_multipledlinkhead_pri.h index 98461e2..f8c3880 100644 --- a/src/kernel/base/include/los_multipledlinkhead_pri.h +++ b/src/kernel/base/include/los_multipledlinkhead_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ -//定义了一个多重双向链表头的私有接口和数据结构。 +//这个头文件定义了一个多重双向链表头的私有接口和数据结构。 #ifndef _LOS_MULTIPLE_DLINK_HEAD_PRI_H #define _LOS_MULTIPLE_DLINK_HEAD_PRI_H diff --git a/src/kernel/base/include/los_mux_debug_pri.h b/src/kernel/base/include/los_mux_debug_pri.h index 30e49dd..6aabee6 100644 --- a/src/kernel/base/include/los_mux_debug_pri.h +++ b/src/kernel/base/include/los_mux_debug_pri.h @@ -26,6 +26,9 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ +/*这个头文件定义了一些用于互斥锁(mutex)调试的接口和函数,包括死锁检测、互斥锁状态跟踪、互斥锁泄漏检查等。 + 这些接口和函数主要用于开发人员在调试过程中分析互斥锁的使用情况,帮助找出潜在的问题并解决它们。*/ + #ifndef _LOS_MUX_DEBUG_PRI_H #define _LOS_MUX_DEBUG_PRI_H @@ -35,7 +38,7 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//初始化死锁检测机制 /* Deadlock detection initialization interface */ extern UINT32 OsMuxDlockCheckInit(VOID); STATIC INLINE UINT32 OsMuxDlockCheckInitHook(VOID) @@ -46,7 +49,7 @@ STATIC INLINE UINT32 OsMuxDlockCheckInitHook(VOID) return LOS_OK; #endif } - +//向死锁检测机制中添加任务持有的互斥锁信息 /* Add holding mutex lock node information */ extern VOID OsMuxDlockNodeInsert(UINT32 taskId, VOID *muxCB); STATIC INLINE VOID OsMuxDlockNodeInsertHook(UINT32 taskId, VOID *muxCB) @@ -55,6 +58,7 @@ STATIC INLINE VOID OsMuxDlockNodeInsertHook(UINT32 taskId, VOID *muxCB) OsMuxDlockNodeInsert(taskId, muxCB); #endif } +//从死锁检测机制中删除任务持有的互斥锁信息 /* Delete holding mutex lock node information */ extern VOID OsMuxDlockNodeDelete(UINT32 taskId, const VOID *muxCB); STATIC INLINE VOID OsMuxDlockNodeDeleteHook(UINT32 taskId, const VOID *muxCB) @@ -63,6 +67,7 @@ STATIC INLINE VOID OsMuxDlockNodeDeleteHook(UINT32 taskId, const VOID *muxCB) OsMuxDlockNodeDelete(taskId, muxCB); #endif } +//更新任务最后执行的时间 /* Update the last time the task was executed */ extern VOID OsTaskTimeUpdate(UINT32 taskId, UINT64 tickCount); STATIC INLINE VOID OsTaskTimeUpdateHook(UINT32 taskId, UINT64 tickCount) @@ -71,7 +76,7 @@ STATIC INLINE VOID OsTaskTimeUpdateHook(UINT32 taskId, UINT64 tickCount) OsTaskTimeUpdate(taskId, tickCount); #endif } - +//初始化互斥锁状态跟踪机制 /* mutex debug initialization interface */ extern UINT32 OsMuxDbgInit(VOID); STATIC INLINE UINT32 OsMuxDbgInitHook(VOID) @@ -82,6 +87,7 @@ STATIC INLINE UINT32 OsMuxDbgInitHook(VOID) return LOS_OK; #endif } +//更新互斥锁最后执行的时间 /* Update the last time the mutex was executed */ extern VOID OsMuxDbgTimeUpdate(UINT32 muxId); STATIC INLINE VOID OsMuxDbgTimeUpdateHook(UINT32 muxId) @@ -90,6 +96,7 @@ STATIC INLINE VOID OsMuxDbgTimeUpdateHook(UINT32 muxId) OsMuxDbgTimeUpdate(muxId); #endif } +//在创建或删除互斥锁时更新互斥锁的状态跟踪信息 /* Update the MUX_DEBUG_CB of the mutex when created or deleted */ extern VOID OsMuxDbgUpdate(UINT32 muxID, TSK_ENTRY_FUNC creator); STATIC INLINE VOID OsMuxDbgUpdateHook(UINT32 muxId, TSK_ENTRY_FUNC creator) @@ -98,6 +105,7 @@ STATIC INLINE VOID OsMuxDbgUpdateHook(UINT32 muxId, TSK_ENTRY_FUNC creator) OsMuxDbgUpdate(muxId, creator); #endif } +//检查互斥锁是否泄漏 /* check the leak of mutex */ extern VOID OsMutexCheck(VOID); STATIC INLINE VOID OsMutexCheckHook(VOID) diff --git a/src/kernel/base/include/los_mux_pri.h b/src/kernel/base/include/los_mux_pri.h index c2ffb83..0361b35 100644 --- a/src/kernel/base/include/los_mux_pri.h +++ b/src/kernel/base/include/los_mux_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//一个关于互斥锁的内部实现的头文件 #ifndef _LOS_MUX_PRI_H #define _LOS_MUX_PRI_H @@ -45,12 +45,13 @@ extern "C" { * Mutex base object must be the same as the first three member names of LosMuxCB, * so that pthread_mutex_t can share the kernel mutex mechanism. */ +//这是互斥锁的基本控制块,包含了互斥锁的一些基本信息 typedef struct { - LOS_DL_LIST muxList; /* Mutex linked list */ - LosTaskCB *owner; /* The current thread that is locking a mutex */ - UINT16 muxCount; /* Times of locking a mutex */ + LOS_DL_LIST muxList;//连接列表 /* Mutex linked list */ + LosTaskCB *owner; //互斥锁的拥有者 /* The current thread that is locking a mutex */ + UINT16 muxCount; //被锁定的次数 /* Times of locking a mutex */ } MuxBaseCB; - +//这是互斥锁的控制块,包含了更多的互斥锁信息 typedef struct { LOS_DL_LIST muxList; /* Mutex linked list */ LosTaskCB *owner; /* The current thread that is locking a mutex */ @@ -60,21 +61,29 @@ typedef struct { } LosMuxCB; /* Mutex global array address, which can be obtained by using a handle ID. */ +//全局变量:这是一个互斥锁的全局数组地址,可以通过互斥锁的 ID 来获取对应的互斥锁对象。 extern LosMuxCB *g_allMux; /* COUNT | INDEX split bit */ #define MUX_SPLIT_BIT 16 /* Set the mutex id */ +//设置互斥锁的 ID #define SET_MUX_ID(count, muxId) (((count) << MUX_SPLIT_BIT) | (muxId)) +//根据互斥锁的 ID 获取索引 #define GET_MUX_INDEX(muxId) ((muxId) & ((1U << MUX_SPLIT_BIT) - 1)) +//根据互斥锁的 ID 获取计数值 #define GET_MUX_COUNT(muxId) ((muxId) >> MUX_SPLIT_BIT) /* Obtain the pointer to a mutex object of the mutex that has a specified handle. */ +//根据互斥锁的 ID 获取对应的互斥锁对象指针 #define GET_MUX(muxId) (((LosMuxCB *)g_allMux) + GET_MUX_INDEX(muxId)) +//初始化互斥锁 extern UINT32 OsMuxInit(VOID); +//执行互斥锁的等待操作 extern UINT32 OsMuxPendOp(LosTaskCB *runTask, MuxBaseCB *muxPended, UINT32 timeout, UINT32 *intSave); +//执行互斥锁的释放操作 extern UINT32 OsMuxPostOp(LosTaskCB *runTask, MuxBaseCB *muxPosted); #ifdef __cplusplus #if __cplusplus diff --git a/src/kernel/base/include/los_percpu_pri.h b/src/kernel/base/include/los_percpu_pri.h index bc8f0fa..340ed0f 100644 --- a/src/kernel/base/include/los_percpu_pri.h +++ b/src/kernel/base/include/los_percpu_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件定义了关于每个CPU的私有数据结构,这个结构体存储了与每个 CPU 相关的一些信息。 #ifndef _LOS_PERCPU_PRI_H #define _LOS_PERCPU_PRI_H @@ -47,35 +47,34 @@ typedef enum { CPU_EXC /* cpu in the exc */ } ExcFlag; #endif - +//排序链表的属性结构体,用于表示任务链表和软件定时器链表 typedef struct { SortLinkAttribute taskSortLink; /* task sort link */ #ifdef LOSCFG_BASE_CORE_SWTMR SortLinkAttribute swtmrSortLink; /* swtmr sort link */ #endif - UINT32 idleTaskId; /* idle task id */ - UINT32 taskLockCnt; /* task lock flag */ - UINT32 swtmrHandlerQueue; /* software timer timeout queue id */ - UINT32 swtmrTaskId; /* software timer task id */ - - UINT32 schedFlag; /* pending scheduler flag */ + UINT32 idleTaskId;//空闲任务的任务 ID /* idle task id */ + UINT32 taskLockCnt;//任务锁计数,用于标记任务是否被锁定 /* task lock flag */ + UINT32 swtmrHandlerQueue;//软件定时器的超时队列 ID /* software timer timeout queue id */ + UINT32 swtmrTaskId;//软件定时器任务的 ID /* software timer task id */ + UINT32 schedFlag;//调度标志,用于表示是否需要进行调度 /* pending scheduler flag */ #ifdef LOSCFG_KERNEL_SMP - UINT32 excFlag; /* cpu halt or exc flag */ + UINT32 excFlag;//CPU 异常标志,用于表示 CPU 的运行状态,包括运行、休眠和异常状态 /* cpu halt or exc flag */ #ifdef LOSCFG_KERNEL_SMP_CALL - LOS_DL_LIST funcLink; /* mp function call link */ + LOS_DL_LIST funcLink;//多处理器函数调用链表,用于多处理器间的函数调用 /* mp function call link */ #endif #endif } Percpu; /* the kernel per-cpu structure */ extern Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM]; - +//用于获取当前CPU STATIC INLINE Percpu *OsPercpuGet(VOID) { return &g_percpu[ArchCurrCpuid()]; } - +//用于获取指定CPU的Percpu结构体指针 STATIC INLINE Percpu *OsPercpuGetByID(UINT32 cpuid) { return &g_percpu[cpuid]; diff --git a/src/kernel/base/include/los_printf_pri.h b/src/kernel/base/include/los_printf_pri.h index b150765..0dd3b03 100644 --- a/src/kernel/base/include/los_printf_pri.h +++ b/src/kernel/base/include/los_printf_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//关于打印函数的私有头文件 #ifndef _LOS_PRINTF_PRI_H #define _LOS_PRINTF_PRI_H @@ -36,13 +36,16 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//在控制台上打印格式化字符串 extern VOID ConsoleVprintf(const CHAR *fmt, va_list ap); +//在串口上打印格式化字符串 extern VOID UartVprintf(const CHAR *fmt, va_list ap); +//打印异常信息 extern VOID PrintExcInfo(const CHAR *fmt, ...); - +//打印内核调试信息 extern VOID LkDprintf(const CHAR *fmt, va_list ap); #ifdef LOSCFG_SHELL_DMESG +//打印系统日志信息 extern VOID DmesgPrintf(const CHAR *fmt, va_list ap); #endif diff --git a/src/kernel/base/include/los_priqueue_pri.h b/src/kernel/base/include/los_priqueue_pri.h index 79cd22d..eecc647 100644 --- a/src/kernel/base/include/los_priqueue_pri.h +++ b/src/kernel/base/include/los_priqueue_pri.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. * --------------------------------------------------------------------------- */ - +/*这个头文件定义了优先级队列的相关操作函数, +包括初始化优先级队列、插入项目到优先级队列、从优先级队列中删除项目、获取具有最高优先级的项目等*/ #ifndef _LOS_PRIQUEUE_PRI_H #define _LOS_PRIQUEUE_PRI_H @@ -57,6 +58,7 @@ extern "C" { * @see none. * @since Huawei LiteOS V100R001C00 */ +//初始化优先级队列 extern UINT32 OsPriQueueInit(VOID); /** @@ -79,6 +81,7 @@ extern UINT32 OsPriQueueInit(VOID); * @see OsPriQueueDequeue. * @since Huawei LiteOS V100R001C00 */ +//根据项目的优先级将项目插入到优先级队列中 extern VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority); /** @@ -99,6 +102,7 @@ extern VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority); * @see OsPriQueueEnqueue. * @since Huawei LiteOS V100R001C00 */ +//从优先级队列中删除一个项目 extern VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem); /** @@ -120,6 +124,7 @@ extern VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem); * @see none. * @since Huawei LiteOS V100R001C00 */ +//获取优先级队列中具有最高优先级的项目 extern LOS_DL_LIST *OsPriQueueTop(VOID); /** @@ -140,6 +145,7 @@ extern LOS_DL_LIST *OsPriQueueTop(VOID); * @see none. * @since Huawei LiteOS V100R001C00 */ +//获取具有指定优先级的项目数量 extern UINT32 OsPriQueueSize(UINT32 priority); /** @@ -159,6 +165,7 @@ extern UINT32 OsPriQueueSize(UINT32 priority); * @see none. * @since Huawei LiteOS V100R001C00 */ +//获取优先级队列中项目的总数 extern UINT32 OsPriQueueTotalSize(VOID); /** @@ -181,6 +188,7 @@ extern UINT32 OsPriQueueTotalSize(VOID); * @see OsPriQueueDequeue. * @since Huawei LiteOS V100R001C00 */ +//根据项目的优先级将项目插入到优先级队列的头部 extern VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_queue_debug_pri.h b/src/kernel/base/include/los_queue_debug_pri.h index 4186e09..806239a 100644 --- a/src/kernel/base/include/los_queue_debug_pri.h +++ b/src/kernel/base/include/los_queue_debug_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件提供了针对队列调试的相关函数声明 #ifndef _LOS_QUEUE_DEBUG_PRI_H #define _LOS_QUEUE_DEBUG_PRI_H @@ -40,7 +40,9 @@ extern "C" { #endif /* __cplusplus */ /* queue debug initialization interface */ +//队列调试初始化接口 extern UINT32 OsQueueDbgInit(VOID); +//队列调试初始化的钩子函数,根据配置是否开启队列调试功能来调用OsQueueDbgInit STATIC INLINE UINT32 OsQueueDbgInitHook(VOID) { #ifdef LOSCFG_DEBUG_QUEUE @@ -50,7 +52,9 @@ STATIC INLINE UINT32 OsQueueDbgInitHook(VOID) #endif } /* Update the last time the queue was executed */ +//更新队列上次执行的时间 extern VOID OsQueueDbgTimeUpdate(UINT32 queueId); +//更新队列执行时间的钩子函数 STATIC INLINE VOID OsQueueDbgTimeUpdateHook(UINT32 queueId) { #ifdef LOSCFG_DEBUG_QUEUE @@ -58,7 +62,9 @@ STATIC INLINE VOID OsQueueDbgTimeUpdateHook(UINT32 queueId) #endif } /* Update the task entry of the queue debug info when created or deleted */ +//当队列被创建或删除时,更新队列调试信息中的任务入口信息 extern VOID OsQueueDbgUpdate(UINT32 queueId, TSK_ENTRY_FUNC entry); +//新队列调试信息的钩子函数 STATIC INLINE VOID OsQueueDbgUpdateHook(UINT32 queueId, TSK_ENTRY_FUNC entry) { #ifdef LOSCFG_DEBUG_QUEUE @@ -66,7 +72,9 @@ STATIC INLINE VOID OsQueueDbgUpdateHook(UINT32 queueId, TSK_ENTRY_FUNC entry) #endif } /* check the leak of queue */ +//检查队列内存泄漏 extern VOID OsQueueCheck(VOID); +//检查队列内存泄漏的钩子函数 STATIC INLINE VOID OsQueueCheckHook(VOID) { #ifdef LOSCFG_DEBUG_QUEUE diff --git a/src/kernel/base/include/los_queue_pri.h b/src/kernel/base/include/los_queue_pri.h index 8f1674a..5a5b13a 100644 --- a/src/kernel/base/include/los_queue_pri.h +++ b/src/kernel/base/include/los_queue_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件定义了私有队列相关的一些结构体、宏和函数声明 #ifndef _LOS_QUEUE_PRI_H #define _LOS_QUEUE_PRI_H @@ -42,12 +42,12 @@ typedef enum { OS_QUEUE_WRITE = 1, OS_QUEUE_N_RW = 2 } QueueReadWrite; - +//枚举类型,分别表示队列的读写操作和队列头尾操作 typedef enum { OS_QUEUE_HEAD = 0, OS_QUEUE_TAIL = 1 } QueueHeadTail; - +//用于生成或获取队列操作类型和读写类型 #define OS_QUEUE_OPERATE_TYPE(ReadOrWrite, HeadOrTail) (((UINT32)(HeadOrTail) << 1) | (ReadOrWrite)) #define OS_QUEUE_READ_WRITE_GET(type) ((type) & 0x01U) #define OS_QUEUE_READ_HEAD (OS_QUEUE_READ | (OS_QUEUE_HEAD << 1)) @@ -73,6 +73,7 @@ typedef enum { #define GET_QUEUE_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosQueueCB, readWriteList[OS_QUEUE_WRITE]) /* Queue information block structure */ +//队列信息块结构体,包含了队列的各种属性和状态信息 typedef struct { UINT8 *queueHandle; /* Pointer to a queue handle */ UINT8 queueState; /* state */ @@ -88,12 +89,16 @@ typedef struct { } LosQueueCB; /* Queue information control block */ +//全局变量,指向所有队列信息块的起始地址 extern LosQueueCB *g_allQueue; /* alloc a stationary memory for a mail according to queueId */ +//用于在指定的内存池中为邮件分配内存 extern VOID *OsQueueMailAlloc(UINT32 queueId, VOID *mailPool, UINT32 timeout); /* free a stationary memory for a mail according to queueId. */ +//释放邮件占用的内存 extern UINT32 OsQueueMailFree(UINT32 queueId, VOID *mailPool, VOID *mailMem); +//列初始化函数,用于初始化队列池 extern UINT32 OsQueueInit(VOID); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_sched_debug_pri.h b/src/kernel/base/include/los_sched_debug_pri.h index 7e28ae5..2188c24 100644 --- a/src/kernel/base/include/los_sched_debug_pri.h +++ b/src/kernel/base/include/los_sched_debug_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件定义了调度器相关的一些结构体和函数声明 #ifndef __LOS_SCHED_DEBUG_PRI_H #define __LOS_SCHED_DEBUG_PRI_H @@ -34,19 +34,19 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//表示单个CPU的运行时间和上下文切换次数 typedef struct { UINT64 runtime; UINT32 contexSwitch; } SchedPercpu; - +//表示整个系统的调度统计信息 typedef struct { - UINT64 startRuntime; - UINT64 allRuntime; - UINT32 allContextSwitch; - SchedPercpu schedPercpu[LOSCFG_KERNEL_CORE_NUM]; + UINT64 startRuntime;//开始运行的时间 + UINT64 allRuntime;//所有CPU的总共运行时间 + UINT32 allContextSwitch;//上下文切换次数 + SchedPercpu schedPercpu[LOSCFG_KERNEL_CORE_NUM];//每个CPU的具体情况 } SchedStat; - +//用于统计中断处理的时间和次数 extern VOID OsHwiStatistics(size_t intNum); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_sched_pri.h b/src/kernel/base/include/los_sched_pri.h index e5ae61d..5ea0138 100644 --- a/src/kernel/base/include/los_sched_pri.h +++ b/src/kernel/base/include/los_sched_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件定义了调度器相关的一些结构体和函数声明 #ifndef _LOS_SCHED_PRI_H #define _LOS_SCHED_PRI_H @@ -37,21 +37,22 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//表示任务调度标志位,每个位代表一个核心,用于防止在OSStartToRun之前进行内核调度 extern UINT32 g_taskScheduled; /* * Schedule flag, one bit represents one core. * This flag is used to prevent kernel scheduling before OSStartToRun. */ +//设置对应核心的调度标志位 #define OS_SCHEDULER_SET(cpuid) do { \ g_taskScheduled |= (1U << (cpuid)); \ } while (0); - +//清除对应核心的调度标志位 #define OS_SCHEDULER_CLR(cpuid) do { \ g_taskScheduled &= ~(1U << (cpuid)); \ } while (0); - +//判断当前核心的调度标志位是否激活 #define OS_SCHEDULER_ACTIVE (g_taskScheduled & (1U << ArchCurrCpuid())) typedef enum { @@ -60,6 +61,7 @@ typedef enum { } SchedFlag; /* Check if preemptable with counter flag */ +//用于判断当前任务是否可以被抢占 STATIC INLINE BOOL OsPreemptable(VOID) { /* @@ -76,7 +78,7 @@ STATIC INLINE BOOL OsPreemptable(VOID) LOS_IntRestore(intSave); return preemptable; } - +//用于判断当前任务是否可以在调度过程中被抢占 STATIC INLINE BOOL OsPreemptableInSched(VOID) { BOOL preemptable = FALSE; @@ -104,6 +106,7 @@ STATIC INLINE BOOL OsPreemptableInSched(VOID) * Current task needs to already be in the right state or the right * queues it needs to be in. */ +//选择下一个任务并切换到它 extern VOID OsSchedResched(VOID); /* @@ -111,12 +114,14 @@ extern VOID OsSchedResched(VOID); * try to do the schedule. However, the schedule won't be definitely * taken place while there're no other higher priority tasks or locked. */ +//将当前任务放回就绪队列,并尝试进行调度 extern VOID OsSchedPreempt(VOID); /* * Just like OsSchedPreempt, except this function will do the OS_INT_ACTIVE * check, in case the schedule taken place in the middle of an interrupt. */ +//触发调度,如果在中断中则设置调度标志位 STATIC INLINE VOID LOS_Schedule(VOID) { if (OS_INT_ACTIVE) { @@ -138,6 +143,7 @@ STATIC INLINE VOID LOS_Schedule(VOID) * This API is used to check time slices. If the number of Ticks equals to the time for task switch, * tasks are switched. Otherwise, the Tick counting continues. */ +//检查时间片,如果满足任务切换的条件则进行切换 extern VOID OsTimesliceCheck(VOID); #endif diff --git a/src/kernel/base/include/los_sem_debug_pri.h b/src/kernel/base/include/los_sem_debug_pri.h index 2b43684..8b8a7e1 100644 --- a/src/kernel/base/include/los_sem_debug_pri.h +++ b/src/kernel/base/include/los_sem_debug_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件定义了一些用于调试信号量的接口和函数声明 #ifndef _LOS_SEM_DEBUG_PRI_H #define _LOS_SEM_DEBUG_PRI_H @@ -39,7 +39,9 @@ extern "C" { #endif /* __cplusplus */ /* semaphore debug initialization interface */ +//信号量调试初始化接口 extern UINT32 OsSemDbgInit(VOID); +//更新信号量最后一次执行的时间 STATIC INLINE UINT32 OsSemDbgInitHook(VOID) { #ifdef LOSCFG_DEBUG_SEMAPHORE @@ -49,6 +51,7 @@ STATIC INLINE UINT32 OsSemDbgInitHook(VOID) #endif } /* Update the last time the semaphore was executed */ +//更新信号量最后一次执行的时间 extern VOID OsSemDbgTimeUpdate(UINT32 semId); STATIC INLINE VOID OsSemDbgTimeUpdateHook(UINT32 semId) { @@ -58,6 +61,7 @@ STATIC INLINE VOID OsSemDbgTimeUpdateHook(UINT32 semId) return; } /* Update the SEM_DEBUG_CB of the semaphore when created or deleted */ +//在创建或删除信号量时更新SEM_DEBUG_CB的信息 extern VOID OsSemDbgUpdate(UINT32 semID, TSK_ENTRY_FUNC creator, UINT16 count); STATIC INLINE VOID OsSemDbgUpdateHook(UINT32 semId, TSK_ENTRY_FUNC creator, UINT16 count) { @@ -67,6 +71,7 @@ STATIC INLINE VOID OsSemDbgUpdateHook(UINT32 semId, TSK_ENTRY_FUNC creator, UINT return; } /* get the full data of SEM_DFX_CB */ +//取SEM_DFX_CB的完整数据 extern UINT32 OsSemInfoGetFullData(VOID); STATIC INLINE VOID OsSemInfoGetFullDataHook(VOID) { diff --git a/src/kernel/base/include/los_sem_pri.h b/src/kernel/base/include/los_sem_pri.h index de3a5bb..ba40aec 100644 --- a/src/kernel/base/include/los_sem_pri.h +++ b/src/kernel/base/include/los_sem_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件定义了一些关于信号量的数据结构和函数声明,用于信号量的控制和管理。 #ifndef _LOS_SEM_PRI_H #define _LOS_SEM_PRI_H @@ -38,24 +38,28 @@ extern "C" { #endif /* __cplusplus */ /* Semaphore control structure. */ +//信号量控制块的数据结构 typedef struct { - UINT8 semStat; /* Semaphore state, enum LosSemState */ - UINT8 semType; /* Semaphore Type, enum LosSemType */ - UINT16 semCount; /* number of available semaphores */ - UINT32 semId; /* Semaphore control structure ID, COUNT(UINT16)|INDEX(UINT16) */ + UINT8 semStat;//信号量的状态 /* Semaphore state, enum LosSemState */ + UINT8 semType;//信号量的类型 /* Semaphore Type, enum LosSemType */ + UINT16 semCount;//信号量可用数量 /* number of available semaphores */ + UINT32 semId;//信号量ID /* Semaphore control structure ID, COUNT(UINT16)|INDEX(UINT16) */ LOS_DL_LIST semList; /* List of tasks that are waiting on a semaphore */ } LosSemCB; /* Semaphore type */ +//信号量类型的枚举值:包括计数信号量和二进制信号量 enum { OS_SEM_COUNTING, /* The semaphore is a counting semaphore which max count is LOS_SEM_COUNT_MAX */ OS_SEM_BINARY, /* The semaphore is a binary semaphore which max count is OS_SEM_BINARY_COUNT_MAX */ }; /* Max count of binary semaphores */ +//二进制信号量的最大计数值 #define OS_SEM_BINARY_COUNT_MAX 1 /* Semaphore information control block */ +//信号量信息控制块的全局指针 extern LosSemCB *g_allSem; #define GET_SEM_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosSemCB, semList) @@ -75,6 +79,7 @@ extern LosSemCB *g_allSem; /* This API is used to create a semaphore control structure according to the initial number of available semaphores * specified by count and return the ID of this semaphore control structure. */ +用于根据初始可用信号量的数量创建信号量控制结构的函数 extern UINT32 OsSemInit(VOID); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_slab_pri.h b/src/kernel/base/include/los_slab_pri.h index 24c8b94..e7c37e7 100644 --- a/src/kernel/base/include/los_slab_pri.h +++ b/src/kernel/base/include/los_slab_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件是操作系统中关于 Slab 内存分配的底层实现和接口声明 /** * @defgroup los_slab Slab * @ingroup kernel @@ -53,7 +53,7 @@ extern "C" { /* max slab block size */ #define SLAB_MEM_MAX_SIZE (SLAB_MEM_CALSS_STEP_SIZE << (SLAB_MEM_COUNT - 1)) - +//描述 Slab 内存分配器状态的结构体 typedef struct tagLosSlabStatus { UINT32 totalSize; UINT32 usedSize; @@ -61,13 +61,13 @@ typedef struct tagLosSlabStatus { UINT32 allocCount; UINT32 freeCount; } LosSlabStatus; - +//Slab 块的节点结构体 typedef struct tagOsSlabBlockNode { UINT16 magic; UINT8 blkSz; UINT8 recordId; } OsSlabBlockNode; - +//原子位图结构体,用于表示 Slab 内存分配器中的位图 struct AtomicBitset { UINT32 numBits; UINT32 words[0]; @@ -144,25 +144,25 @@ extern UINT32 OsSlabGetMaxFreeBlkSize(const VOID *pool); extern VOID *OsSlabCtrlHdrGet(const VOID *pool); #else /* !LOSCFG_KERNEL_MEM_SLAB_EXTENTION */ - +//初始化 Slab 内存池 STATIC INLINE VOID OsSlabMemInit(VOID *pool, UINT32 size) { } - +//销毁 Slab 内存池 STATIC INLINE VOID OsSlabMemDeinit(VOID *pool) { } - +//从 Slab 内存池中分配内存 STATIC INLINE VOID *OsSlabMemAlloc(VOID *pool, UINT32 size) { return NULL; } - +//释放 Slab 内存池中的内存 STATIC INLINE BOOL OsSlabMemFree(VOID *pool, VOID *ptr) { return FALSE; } - +//检查指针是否属于 Slab 内存池 STATIC INLINE UINT32 OsSlabMemCheck(const VOID *pool, const VOID *ptr) { return (UINT32)-1; diff --git a/src/kernel/base/include/los_sortlink_pri.h b/src/kernel/base/include/los_sortlink_pri.h index 6faeaeb..1f2b66a 100644 --- a/src/kernel/base/include/los_sortlink_pri.h +++ b/src/kernel/base/include/los_sortlink_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//一个用于操作排序链表(SortLink)的私有头文件。 #ifndef _LOS_SORTLINK_PRI_H #define _LOS_SORTLINK_PRI_H @@ -118,13 +118,17 @@ typedef struct { UINT16 cursor; UINT16 reserved; } SortLinkAttribute; - +//初始化排序链表 extern UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader); +//一个节点添加到排序链表中 extern VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList); +//从排序链表中删除一个节点 extern VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList); +//获取下一个到期时间 extern UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader); +//获取目标节点的到期时间 extern UINT32 OsSortLinkGetTargetExpireTime(const SortLinkAttribute *sortLinkHeader, - const SortLinkList *targetSortList); +//更新到期时间 const SortLinkList *targetSortList); extern VOID OsSortLinkUpdateExpireTime(UINT32 sleepTicks, SortLinkAttribute *sortLinkHeader); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_stackinfo_pri.h b/src/kernel/base/include/los_stackinfo_pri.h index 4d9c9ae..0642106 100644 --- a/src/kernel/base/include/los_stackinfo_pri.h +++ b/src/kernel/base/include/los_stackinfo_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//一个用于处理堆栈信息的私有头文件 #ifndef _LOS_STACK_INFO_PRI_H #define _LOS_STACK_INFO_PRI_H @@ -37,20 +37,25 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//堆栈信息结构体 typedef struct { - VOID *stackTop; - UINT32 stackSize; - CHAR *stackName; + VOID *stackTop;//堆栈的顶部 + UINT32 stackSize;//堆栈的大小 + CHAR *stackName;//堆栈的名称 } StackInfo; - +//表示无效的水位线值 #define OS_INVALID_WATERLINE 0xFFFFFFFF +//于检查堆栈顶部的魔术字是否有效的宏定义 #define OS_STACK_MAGIC_CHECK(topstack) (*(UINTPTR *)(topstack) == OS_STACK_MAGIC_WORD) /* 1:magic valid 0:unvalid */ - +//用于异常时获取堆栈信息的函数 extern VOID OsExcStackInfo(VOID); +//用于注册异常时获取的堆栈信息的函数 extern VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum); +//用于初始化堆栈的函数 extern VOID OsStackInit(VOID *stacktop, UINT32 stacksize); +//用于获取堆栈的水位线和使用峰值的函数 extern UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop, UINT32 *peakUsed); +//用于获取堆栈信息的函数 extern VOID OsGetStackInfo(const StackInfo **stackInfo, UINT32 *stackNum); #ifdef __cplusplus diff --git a/src/kernel/base/include/los_swtmr_pri.h b/src/kernel/base/include/los_swtmr_pri.h index 39f64a3..791e096 100644 --- a/src/kernel/base/include/los_swtmr_pri.h +++ b/src/kernel/base/include/los_swtmr_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//一个用于实现软件定时器的私有头文件。 #ifndef _LOS_SWTMR_PRI_H #define _LOS_SWTMR_PRI_H @@ -40,7 +40,7 @@ extern "C" { #endif /* __cplusplus */ #ifdef LOSCFG_BASE_CORE_SWTMR - +//软件定时器的状态枚举,包括未使用、已创建和计时中 enum SwtmrState { OS_SWTMR_STATUS_UNUSED, /* The software timer is not used. */ OS_SWTMR_STATUS_CREATED, /* The software timer is created. */ @@ -48,12 +48,13 @@ enum SwtmrState { }; /* Structure of the callback function that handles software timer timeout */ +//处理软件定时器超时回调的回调函数结构体 typedef struct { SWTMR_PROC_FUNC handler; /* Callback function that handles software timer timeout */ UINTPTR arg; /* Parameter passed in when the callback function that handles software timer timeout is called */ } SwtmrHandlerItem; - +//软件定时器控制块结构体 typedef struct { SortLinkList sortList; UINT8 state; /* Software timer state */ @@ -71,22 +72,28 @@ typedef struct { } LosSwtmrCB; /* Type of the pointer to the structure of the callback function that handles software timer timeout */ +//指向处理软件定时器超时回调的回调函数结构体的指针类型 typedef SwtmrHandlerItem *SwtmrHandlerItemPtr; - +//软件定时器控制块数组 extern LosSwtmrCB *g_swtmrCBArray; /* The software timer count list */ +//软件定时器排序链表 extern SortLinkAttribute g_swtmrSortLink; - #define OS_SWT_FROM_SWTID(swtmrId) ((LosSwtmrCB *)g_swtmrCBArray + ((swtmrId) % KERNEL_SWTMR_LIMIT)) /* This API is used to scan a software timer when a Tick interrupt occurs and determine whether * the software timer expires. */ +//在Tick中断发生时扫描软件定时器,判断是否到达超时时间 extern VOID OsSwtmrScan(VOID); +//初始化软件定时器 extern UINT32 OsSwtmrInit(VOID); +//软件定时器任务,用于处理软件定时器的超时事件 extern VOID OsSwtmrTask(VOID); +//软件定时器自旋锁 extern SPIN_LOCK_S g_swtmrSpin; #ifdef LOSCFG_EXC_INTERACTION +//判断当前任务是否为软件定时器任务 extern BOOL IsSwtmrTask(UINT32 taskId); #endif #endif /* LOSCFG_BASE_CORE_SWTMR */ diff --git a/src/kernel/base/include/los_task_pri.h b/src/kernel/base/include/los_task_pri.h index 4dab9bb..e755763 100644 --- a/src/kernel/base/include/los_task_pri.h +++ b/src/kernel/base/include/los_task_pri.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中任务调度相关的头文件,其中定义了任务控制块的数据结构和一些任务管理的接口函数。 +在这个头文件中,定义了任务的状态、优先级、标志位等信息,并提供了一些操作这些信息的宏和函数。*/ #ifndef _LOS_TASK_PRI_H #define _LOS_TASK_PRI_H diff --git a/src/kernel/base/include/los_tick_pri.h b/src/kernel/base/include/los_tick_pri.h index 5e67cef..5019d05 100644 --- a/src/kernel/base/include/los_tick_pri.h +++ b/src/kernel/base/include/los_tick_pri.h @@ -25,7 +25,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +//这个头文件是关于系统时钟中断tick的定义和操作。 #ifndef _LOS_TICK_PRI_H #define _LOS_TICK_PRI_H @@ -40,30 +40,41 @@ extern "C" { #endif /* __cplusplus */ /* spinlock for tick */ +//用于保护tick相关操作的自旋锁 extern SPIN_LOCK_S g_tickSpin; +//获取tick自旋锁并保存状态 #define TICK_LOCK(state) LOS_SpinLockSave(&g_tickSpin, &(state)) +//释放tick自旋锁并恢复状态 #define TICK_UNLOCK(state) LOS_SpinUnlockRestore(&g_tickSpin, (state)) /* Count of Ticks */ +//全局变量,保存系统tick的计数值 extern volatile UINT64 g_tickCount[]; /* Cycle to nanosecond scale */ +//循环周期到纳秒的转换比例 extern DOUBLE g_cycle2NsScale; /* This API is called when the system tick timeout and triggers the interrupt. */ +//系统tick中断处理函数,当系统tick超时触发中断时调用 extern VOID OsTickHandler(VOID); +//初始化系统tick相关配置 extern UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond); +//启动系统tick中断 extern VOID OsTickStart(VOID); /* Convert from the cycle count to nanosecond. */ +//将循环周期转换为纳秒 #define CYCLE_TO_NS(cycles) ((cycles) * g_cycle2NsScale) /** * Current system timer register is 32 bit, therefore TIMER_MAXLOAD define just in order to avoid ambiguity. */ +//定时器最大加载值,用于避免歧义 #define TIMER_MAXLOAD 0xffffffff #ifdef LOSCFG_KERNEL_TICKLESS +//tick中断标志,在LOSCFG_KERNEL_TICKLESS选项开启时使用 #define LOS_TICK_INT_FLAG 0x80000000 #endif -- 2.34.1 From a0bc24b6c18179795b7f005fd71d3f305f4015b0 Mon Sep 17 00:00:00 2001 From: cailun <2505225681@qq.com> Date: Tue, 26 Dec 2023 20:41:59 +0800 Subject: [PATCH 2/4] doc --- doc/蔡伦_LiteOS阅读泛读报告.docx | Bin 14958 -> 17703 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/蔡伦_LiteOS阅读泛读报告.docx b/doc/蔡伦_LiteOS阅读泛读报告.docx index 589a7b5393bfd7ba1b3f7cd7e7625a1221bdebbc..0a783a053357a4ec994b9e271fdba1e3ebf06a04 100644 GIT binary patch delta 8704 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 Fe*hX^qzC{2 delta 5956 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 vMi?9d`tP0mNB Date: Sun, 31 Dec 2023 23:54:38 +0800 Subject: [PATCH 3/4] src --- src/kernel/base/shellcmd/hwi_shellcmd.c | 37 ++++--- src/kernel/base/shellcmd/mempt_shellcmd.c | 64 ++++++++--- src/kernel/base/shellcmd/stack_shellcmd.c | 29 +++-- src/kernel/base/shellcmd/swtmr_shellcmd.c | 41 +++---- src/kernel/base/shellcmd/sysinfo_shellcmd.c | 54 ++++++++-- src/kernel/base/shellcmd/task_shellcmd.c | 112 +++++++++++++------- 6 files changed, 236 insertions(+), 101 deletions(-) diff --git a/src/kernel/base/shellcmd/hwi_shellcmd.c b/src/kernel/base/shellcmd/hwi_shellcmd.c index 5ea7227..30a7e5f 100644 --- a/src/kernel/base/shellcmd/hwi_shellcmd.c +++ b/src/kernel/base/shellcmd/hwi_shellcmd.c @@ -25,7 +25,11 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/* +这个文件是针对LiteOS操作系统中的Shell命令编写的,主要实现了对硬件中断信息的获取和显示功能, +包括了对硬件中断的共享模式、响应次数、CPU利用率等信息的获取和显示。根据操作系统配置不同, +还包括了对CPU利用率的不同时间段(所有时间、最近10秒、最近1秒)的统计和显示。 +*/ #include "los_config.h" #ifdef LOSCFG_SHELL #ifdef LOSCFG_CPUP_INCLUDE_IRQ @@ -39,7 +43,7 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//这个函数实现了打印硬件中断信息的表头 LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdHwiInfoTitle(VOID) { #ifdef LOSCFG_CPUP_INCLUDE_IRQ @@ -53,7 +57,7 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdHwiInfoTitle(VOID) PRINTK("----------- ----- ------------- --------- --------\n"); #endif } - +//这个函数会根据传入的硬件中断句柄信息,获取该中断是否为共享模式 STATIC BOOL GetHwiShare(const HwiHandleInfo *hwiForm) { #ifndef LOSCFG_SHARED_IRQ @@ -64,9 +68,10 @@ STATIC BOOL GetHwiShare(const HwiHandleInfo *hwiForm) } #ifdef LOSCFG_CPUP_INCLUDE_IRQ -STATIC CPUP_INFO_S g_hwiCpupAll[LOSCFG_PLATFORM_HWI_LIMIT]; -STATIC CPUP_INFO_S g_hwiCpup10s[LOSCFG_PLATFORM_HWI_LIMIT]; -STATIC CPUP_INFO_S g_hwiCpup1s[LOSCFG_PLATFORM_HWI_LIMIT]; +STATIC CPUP_INFO_S g_hwiCpupAll[LOSCFG_PLATFORM_HWI_LIMIT];//所有时间段CPU利用率的统计信息 +STATIC CPUP_INFO_S g_hwiCpup10s[LOSCFG_PLATFORM_HWI_LIMIT];//最近10sCPU利用率的统计信息 +STATIC CPUP_INFO_S g_hwiCpup1s[LOSCFG_PLATFORM_HWI_LIMIT];//最近1sCPU利用率的统计信息 +//这个函数实现了硬件中断信息的查询,根据参数argc和argv判断是否有误,并调用其他函数获取硬件中断的各项信息,最终打印输出硬件中断的详细信息。 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) { UINT32 i, intSave; @@ -75,22 +80,24 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) HwiHandleInfo *hwiForm = NULL; (VOID)argv; + //打印错误信息 if (argc > 0) { PRINTK("\nUsage: hwi\n"); return OS_ERROR; } - (VOID)memset_s(g_hwiCpupAll, size, 0, size); - (VOID)memset_s(g_hwiCpup10s, size, 0, size); - (VOID)memset_s(g_hwiCpup1s, size, 0, size); + (VOID)memset_s(g_hwiCpupAll, size, 0, size);//置零 + (VOID)memset_s(g_hwiCpup10s, size, 0, size);//置零 + (VOID)memset_s(g_hwiCpup1s, size, 0, size);//置零 intSave = LOS_IntLock(); (VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpupAll, CPUP_ALL_TIME, 0); (VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpup10s, CPUP_LAST_TEN_SECONDS, 0); (VOID)LOS_AllCpuUsage(LOSCFG_PLATFORM_HWI_LIMIT, g_hwiCpup1s, CPUP_LAST_ONE_SECONDS, 0); LOS_IntRestore(intSave); - + //打印硬件中断信息的表头 OsShellCmdHwiInfoTitle(); + //打印CPU硬件中断的利用率 for (i = 0; i < LOSCFG_PLATFORM_HWI_LIMIT; i++) { if (!HWI_IS_REGISTED(i)) { continue; @@ -101,6 +108,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) } /* Different cores has different hwi form implementation */ + //打印各个时间内的硬件中断利用率 hwiForm = OsGetHwiForm(i); PRINTK("%-8u\t %-s\t %-10u\t %-10llu %2u.%-7u %2u.%-7u %2u.%-6u", i, GetHwiShare(hwiForm) ? "Y" : "N", OsGetHwiFormCnt(i), cycles, @@ -110,6 +118,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) #ifdef LOSCFG_SHARED_IRQ hwiForm = hwiForm->next; #endif + //打印中断设备ID和信息 if ((hwiForm->registerInfo != 0) && ((HWI_IRQ_PARAM_S *)hwiForm->registerInfo)->pName != NULL) { PRINTK("\t %-16s 0x%-.8x\n", ((HWI_IRQ_PARAM_S *)hwiForm->registerInfo)->pName, @@ -128,24 +137,28 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) return 0; } #else +//这个函数主要实现对hwi命令的解释功能,输出硬件中断信息 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) { UINT32 i; HwiHandleInfo *hwiForm = NULL; + //参数错误,打印错误信息 (VOID)argv; if (argc > 0) { PRINTK("\nUsage: hwi\n"); return OS_ERROR; } - + //打印硬件中断信息的表头 OsShellCmdHwiInfoTitle(); + //遍历所有硬件中断寄存器 for (i = 0; i < LOSCFG_PLATFORM_HWI_LIMIT; i++) { if (!HWI_IS_REGISTED(i)) { continue; } /* Different cores has different hwi form implementation */ + //输出信息 hwiForm = OsGetHwiForm(i); PRINTK("%-8u\t %-s\t %-10u", i, GetHwiShare(hwiForm) ? "Y" : "N", OsGetHwiFormCnt(i)); #ifdef LOSCFG_SHARED_IRQ @@ -170,7 +183,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) return 0; } #endif - +//该函数实现了OsShellCmdHwi的函数调用,用户可以输入hwi命令来调用该函数,从而查询和展示硬件中断信息 SHELLCMD_ENTRY(hwi_shellcmd, CMD_TYPE_EX, "hwi", 0, (CmdCallBackFunc)OsShellCmdHwi); #ifdef __cplusplus diff --git a/src/kernel/base/shellcmd/mempt_shellcmd.c b/src/kernel/base/shellcmd/mempt_shellcmd.c index 9c4be25..b67641e 100644 --- a/src/kernel/base/shellcmd/mempt_shellcmd.c +++ b/src/kernel/base/shellcmd/mempt_shellcmd.c @@ -25,7 +25,10 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/* +这个文件是针对LiteOS操作系统中的Shell命令编写的, +主要实现了系统内存的安全检查、系统内存使用情况的显示、读取指定内存中指定位置指定长度的信息和释放内存空间。 +*/ #include "stdlib.h" #include "stdio.h" #include "los_memory_pri.h" @@ -45,54 +48,60 @@ extern "C" { #define MEM_SIZE_1K 0x400 #define MEM_SIZE_1M 0x100000 - +//这个函数用于检查内存完整性 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemCheck(INT32 argc, const CHAR *argv[]) { + //打印错误信息 if (argc > 0) { PRINTK("\nUsage: memcheck\n"); return OS_ERROR; } - + //调用OsMemIntegrityMultiCheck函数完成内存完整性检查 OsMemIntegrityMultiCheck(); return 0; } #ifdef LOSCFG_SHELL +//这个函数可以读取内存中指定位置指定长度的数据,调用OsDumpMemByte函数完成内存读取并打印数据 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemRead(INT32 argc, const CHAR *argv[]) { size_t tempAddr; size_t length; CHAR *ptrlen = NULL; CHAR *ptrAddr = NULL; - + //读取错误,打印错误信息 if ((argc == 0) || (argc > 2)) { /* argc is num of parameters */ PRINTK("\nUsage: readreg [ADDRESS] [LENGTH]\n"); return OS_ERROR; } - + //读取正确 if (argc == 1) { length = 0; } else { + //读取长度为负数,打印错误信息 length = strtoul(argv[1], &ptrlen, 0); if ((ptrlen == NULL) || (*ptrlen != 0)) { PRINTK("readreg invalid length %s\n", argv[1]); return OS_ERROR; } } + //保存ptrAddr的地址 tempAddr = strtoul(argv[0], &ptrAddr, 0); + //地址错误,打印错误信息 if ((ptrAddr == NULL) || (*ptrAddr != 0) || (tempAddr > g_sys_mem_addr_end) || ((tempAddr + length) > g_sys_mem_addr_end) || (tempAddr > (OS_NULL_INT - length))) { PRINTK("readreg invalid address %s\n", argv[0]); return OS_ERROR; } - + //调用OsDumpMemByte函数,打印指定内存位置读取的信息。 OsDumpMemByte(length, tempAddr); return 0; } - +//这个函数用于输出代码段、数据段、只读数据段和BSS段的大小信息。 LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR *argv[]) { + //计算各部分长度 size_t textLen = &__text_end - &__text_start; size_t dataLen = &__ram_data_end - &__ram_data_start; size_t rodataLen = &__rodata_end - &__rodata_start; @@ -103,7 +112,7 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR dataLen += &__fast_data_end - &__fast_data_start; rodataLen += &__fast_rodata_end - &__fast_rodata_start; #endif - + //打印代码段、数据段、只读数据段、BSS段的大小信息 PRINTK("\r\n text data rodata bss\n"); if ((argc == 1) && (strcmp(argv[0], "-k") == 0)) { PRINTK("Mem: %-9lu %-10lu %-10lu %-10lu\n", textLen / MEM_SIZE_1K, dataLen / MEM_SIZE_1K, @@ -115,19 +124,24 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR PRINTK("Mem: %-9lu %-10lu %-10lu %-10lu\n", textLen, dataLen, rodataLen, bssLen); } } - +//这个函数用于输出系统可用的内存总量、已经使用的内存量和剩余内存量的大小 LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OsShellCmdFreeInfo(INT32 argc, const CHAR *argv[]) { #ifdef LOSCFG_EXC_INTERACTION + //调用LOS_MemTotaUsedGet函数得到已经使用的内存量 UINT32 memUsed0 = LOS_MemTotalUsedGet(m_aucSysMem0); + //调用LOS_MemPoolSizeGet函数得到系统可用的内存总量 UINT32 totalMem0 = LOS_MemPoolSizeGet(m_aucSysMem0); + //计算得到系统剩余的内存量 UINT32 freeMem0 = totalMem0 - memUsed0; #endif - + //调用LOS_MemTotaUsedGet函数得到已经使用的内存量 UINT32 memUsed = LOS_MemTotalUsedGet(m_aucSysMem1); + //调用LOS_MemPoolSizeGet函数得到系统可用的内存总量 UINT32 totalMem = LOS_MemPoolSizeGet(m_aucSysMem1); + /计算得到系统剩余的内存量 UINT32 freeMem = totalMem - memUsed; - + //打印统可用的内存总量、已经使用的内存量和剩余内存量的大小 if ((argc == 0) || ((argc == 1) && (strcmp(argv[0], "-k") == 0)) || ((argc == 1) && (strcmp(argv[0], "-m") == 0))) { @@ -157,47 +171,57 @@ LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OsShellCmdFreeInfo(INT32 argc, const CHAR * PRINTK("Mem1: %-9u %-10u %-10u\n", totalMem0, memUsed0, freeMem0); #endif } else { + //打印错误信息 PRINTK("\nUsage: free or free [-k/-m]\n"); return OS_ERROR; } return 0; } - +//这个函数用于显示系统内存的使用情况,调用了OsShellCmdFreeInfo和OsShellCmdSectionInfo函数完成内存使用情况和内存分配情况的打印输出。 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdFree(INT32 argc, const CHAR *argv[]) { + //打印错误信息 if (argc > 1) { PRINTK("\nUsage: free or free [-k/-m]\n"); return OS_ERROR; } + //打印错误信息 if (OsShellCmdFreeInfo(argc, argv) != 0) { return OS_ERROR; } + //调用OsShellCmdSectionInfo函数输出存使用情况和内存分配情况 OsShellCmdSectionInfo(argc, argv); return 0; } - +//这个函数根据参数选择输出不同的系统信息,在控制台上输出相应的信息。 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdUname(INT32 argc, const CHAR *argv[]) { + //如果参数为0,在控制台上打印Huawei LiteOS if (argc == 0) { PRINTK("Huawei LiteOS\n"); return 0; } if (argc == 1) { + //系统参数为-a时,打印LiteOS所有的信息 if (strcmp(argv[0], "-a") == 0) { PRINTK("%s %s %s %s %s\n", HW_LITEOS_VER, HW_LITEOS_SYSNAME, HW_LITEOS_KERNEL_VERSION_STRING, __DATE__, __TIME__); return 0; + //系统参数为-s时,打印Huawei LiteOS } else if (strcmp(argv[0], "-s") == 0) { PRINTK("Huawei LiteOS\n"); return 0; + //系统参数为-t时,打印系统创建的时间信息 } else if (strcmp(argv[0], "-t") == 0) { PRINTK("build date : %s %s", __DATE__, __TIME__); return 0; + //系统参数为-v时,打印LiteOS的版本信息和时间信息 } else if (strcmp(argv[0], "-v") == 0) { PRINTK("%s %s %s %s\n", HW_LITEOS_SYSNAME, HW_LITEOS_KERNEL_VERSION_STRING, __DATE__, __TIME__); return 0; + //系统参数为--help时,打印各参数的含义 } else if (strcmp(argv[0], "--help") == 0) { PRINTK("-a, print all information\n" "-s, print the kernel name\n" @@ -206,20 +230,22 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdUname(INT32 argc, const CHAR *argv[]) return 0; } } - + //如果都不是,打印错误信息,提示用户输入--help来查看信息 PRINTK("uname: invalid option %s\n" "Try 'uname --help' for more information.\n", argv[0]); return OS_ERROR; } #ifdef LOSCFG_MEM_LEAKCHECK +//这个函数打印了系统已使用的内存信息 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemUsed(INT32 argc, const CHAR *argv[]) { + //打印错误信息 if (argc > 0) { PRINTK("\nUsage: memused\n"); return OS_ERROR; } - + //调用OsMemUsedNodeShow函数,输出已使用的节点信息 OsMemUsedNodeShow(m_aucSysMem1); #ifdef LOSCFG_EXC_INTERACTION @@ -230,6 +256,14 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemUsed(INT32 argc, const CHAR *argv[]) } #endif +/* +命令解释器个各个命令调用的函数以及作用 +memcheck命令:检查内存完整性。调用了OsMemIntegrityMultiCheck函数完成内存完整性检查。 +memread [ADDRESS] [LENGTH]命令:读取指定地址和长度的内存数据。调用了OsDumpMemByte函数完成内存数据读取并打印输出。 +free命令:显示系统内存的使用情况。调用了OsShellCmdFreeInfo和OsShellCmdSectionInfo函数完成内存使用情况和内存分配情况的打印输出。 +uname [-a/-s/-t/-v]命令:显示系统信息。根据参数选择输出不同的系统信息。调用了PRINTK宏在控制台上输出相应的信息。 +*/ + #ifdef LOSCFG_MEM_LEAKCHECK SHELLCMD_ENTRY(memused_shellcmd, CMD_TYPE_EX, "memused", 0, (CmdCallBackFunc)OsShellCmdMemUsed); #endif diff --git a/src/kernel/base/shellcmd/stack_shellcmd.c b/src/kernel/base/shellcmd/stack_shellcmd.c index 1ac2386..607fac0 100644 --- a/src/kernel/base/shellcmd/stack_shellcmd.c +++ b/src/kernel/base/shellcmd/stack_shellcmd.c @@ -25,7 +25,10 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/* +这段文件是针对LiteOS操作系统中的Shell命令编写的, +主要实现了内核异常处理机制中与堆栈相关的功能,包括堆栈信息的获取和检查。 +*/ #include "securec.h" #include "los_config.h" #include "los_stackinfo_pri.h" @@ -34,7 +37,7 @@ #include "shcmd.h" #include "shell.h" #endif - +//这个函数用于检查堆栈是否溢出 VOID OsExcStackCheck(VOID) { UINT32 index; @@ -42,15 +45,17 @@ VOID OsExcStackCheck(VOID) UINTPTR *stackTop = NULL; const StackInfo *stackInfo = NULL; UINT32 stackNum; - + //获取堆栈信息,如果堆栈信息错误,直接返回 OsGetStackInfo(&stackInfo, &stackNum); if ((stackInfo == NULL) || (stackNum == 0)) { return; } - + //从头开始,遍历所有的堆栈 for (index = 0; index < stackNum; index++) { for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) { + //堆栈的栈顶 stackTop = (UINTPTR *)((UINTPTR)stackInfo[index].stackTop + cpuid * stackInfo[index].stackSize); + //检查栈顶信息是否被篡改,如果被篡改输出该堆栈溢出的信息 if (*stackTop != OS_STACK_MAGIC_WORD) { PRINT_ERR("cpu:%u %s overflow , magic word changed to 0x%x\n", LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, stackInfo[index].stackName, *stackTop); @@ -58,7 +63,7 @@ VOID OsExcStackCheck(VOID) } } } - +//这个函数用于获取并打印所有的堆栈信息 VOID OsExcStackInfo(VOID) { UINT32 index; @@ -68,29 +73,31 @@ VOID OsExcStackInfo(VOID) UINTPTR *stack = NULL; const StackInfo *stackInfo = NULL; UINT32 stackNum; - + //获取堆栈信息,如果堆栈信息错误,直接返回 OsGetStackInfo(&stackInfo, &stackNum); if ((stackInfo == NULL) || (stackNum == 0)) { return; } - + //输出堆栈名、CPU ID、堆栈的地址、堆栈的总大小,堆栈已使用的大小 PrintExcInfo("\n stack name cpu id stack addr total size used size\n" " ---------- ------ --------- -------- --------\n"); - + //从头开始,遍历所有的堆栈 for (index = 0; index < stackNum; index++) { for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) { + //获取堆栈的栈顶 stackTop = (UINTPTR *)((UINTPTR)stackInfo[index].stackTop + cpuid * stackInfo[index].stackSize); stack = (UINTPTR *)((UINTPTR)stackTop + stackInfo[index].stackSize); + //调用OsStackWaterLineGet函数计算堆栈已使用的大小 (VOID)OsStackWaterLineGet(stack, stackTop, &size); - + //输出各类信息 PrintExcInfo("%11s %-5d %-10p 0x%-8x 0x%-4x\n", stackInfo[index].stackName, LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, stackTop, stackInfo[index].stackSize, size); } } - + //进行堆栈溢出检查 OsExcStackCheck(); } - +//注册Shell命令stack,调用OsExcStackInfo函数获取并打印所有堆栈信息至控制台。 #ifdef LOSCFG_SHELL SHELLCMD_ENTRY(stack_shellcmd, CMD_TYPE_EX, "stack", 1, (CmdCallBackFunc)OsExcStackInfo); #endif diff --git a/src/kernel/base/shellcmd/swtmr_shellcmd.c b/src/kernel/base/shellcmd/swtmr_shellcmd.c index 476c660..95039e2 100644 --- a/src/kernel/base/shellcmd/swtmr_shellcmd.c +++ b/src/kernel/base/shellcmd/swtmr_shellcmd.c @@ -25,7 +25,10 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/* +这个文件主要是针对LiteOS系统中软件定时器的命令行操作进行定义和实现的, +主要实现了根据软件定时器的ID输出软件定时器的各种信息。 +*/ #include "los_config.h" #ifdef LOSCFG_SHELL #include "stdlib.h" @@ -42,20 +45,20 @@ extern "C" { #define SWTMR_STRLEN 12 #ifdef LOSCFG_BASE_CORE_SWTMR - +//展示g_shellSwtmrMode的数据 LITE_OS_SEC_DATA_MINOR STATIC CHAR g_shellSwtmrMode[][SWTMR_STRLEN] = { "Once", "Period", "NSD", "OPP", }; - +//展示g_shellSwtmrStatus的数据 LITE_OS_SEC_DATA_MINOR STATIC CHAR g_shellSwtmrStatus[][SWTMR_STRLEN] = { "UnUsed", "Created", "Ticking", }; - +//这个函数用于打印软件定时器的信息,包括定时器ID、状态、模式、间隔、参数和处理函数地址等。 STATIC VOID OsPrintSwtmrMsg(const LosSwtmrCB *swtmr) { PRINTK("0x%08x " @@ -64,20 +67,20 @@ STATIC VOID OsPrintSwtmrMsg(const LosSwtmrCB *swtmr) "%-6u " "0x%08x " "%p\n", - swtmr->timerId % LOSCFG_BASE_CORE_SWTMR_LIMIT, - g_shellSwtmrStatus[swtmr->state], - g_shellSwtmrMode[swtmr->mode], - swtmr->interval, - swtmr->arg, - swtmr->handler); + swtmr->timerId % LOSCFG_BASE_CORE_SWTMR_LIMIT,//打印定时器ID + g_shellSwtmrStatus[swtmr->state],//打印定时器的状态 + g_shellSwtmrMode[swtmr->mode],//打印定时器的模式 + swtmr->interval,//打印定时器的间隔 + swtmr->arg,//打印定时器的参数 + swtmr->handler);//打印定时器的处理函数地址 } - +//这个函数用于打印软件定时器信息的表头 STATIC INLINE VOID OsPrintSwtmrMsgHead(VOID) { PRINTK("\r\nSwTmrID State Mode Interval Arg handlerAddr\n"); PRINTK("---------- ------- ------- --------- ---------- --------\n"); } - +//这个函数用于获取软件定时器的信息。 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **argv) { #define OS_ALL_SWTMR_MASK 0xffffffff @@ -87,34 +90,36 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **a size_t timerId; UINT16 num = 0; CHAR *endPtr = NULL; - + //打印错误信息 if (argc > 1) { PRINTK("\nUsage: swtmr [ID]\n"); return OS_ERROR; } - + //获取计时器ID if (argc == 0) { timerId = OS_ALL_SWTMR_MASK; } else { + //没有这个ID,打印错误信息 timerId = strtoul((CHAR *)argv[0], &endPtr, 0); if ((endPtr == NULL) || (*endPtr != 0) || (timerId > LOSCFG_BASE_CORE_SWTMR_LIMIT)) { PRINTK("\nswtmr ID can't access %s.\n", argv[0]); return OS_ERROR; } } - + //遍历所有计时器,让计时器的状态加1 for (index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr1++) { if (swtmr1->state == 0) { num = num + 1; } } - + //达到时间限制,输出错误信息 if (num == LOSCFG_BASE_CORE_SWTMR_LIMIT) { PRINTK("\r\nThere is no swtmr was created!\n"); return OS_ERROR; } - + //打印软件定时器信息的表头 OsPrintSwtmrMsgHead(); + //打印软件定时器的各类信息 if (timerId == OS_ALL_SWTMR_MASK) { for (index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++, swtmr++) { if (swtmr->state != 0) { @@ -132,7 +137,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **a } return LOS_OK; } - +//注册Shell命令swtmr,调用OsShellCmdSwtmrInfoGet函数获取软件定时器的信息。根据输入的参数获取特定或者所有软件定时器的状态信息并打印出来。 SHELLCMD_ENTRY(swtmr_shellcmd, CMD_TYPE_EX, "swtmr", 1, (CmdCallBackFunc)OsShellCmdSwtmrInfoGet); #endif diff --git a/src/kernel/base/shellcmd/sysinfo_shellcmd.c b/src/kernel/base/shellcmd/sysinfo_shellcmd.c index 69f73a5..813a2ea 100644 --- a/src/kernel/base/shellcmd/sysinfo_shellcmd.c +++ b/src/kernel/base/shellcmd/sysinfo_shellcmd.c @@ -25,7 +25,10 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/* +这段文件是针对LiteOS操作系统中的Shell命令编写的, +主要实现了获取系统信息的功能,获取的信息包括进程数量、信号量数量、互斥锁数量、消息队列数量和软件定时器数量。 +*/ #include "los_config.h" #include "los_swtmr.h" #include "los_sem_pri.h" @@ -43,141 +46,173 @@ extern "C" { #endif #endif /* __cplusplus */ - +//这个函数用于获取当系统的进程数量 UINT32 OsShellCmdTaskCntGet(VOID) { UINT32 loop; UINT32 taskCnt = 0; UINT32 intSave; LosTaskCB *taskCB = NULL; - + //加上锁,用于防止中断 intSave = LOS_IntLock(); + //遍历所有进程,并统计进程数量 for (loop = 0; loop < g_taskMaxNum; loop++) { taskCB = (LosTaskCB *)g_taskCBArray + loop; + //若该进程未使用,则直接跳过 if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { continue; } taskCnt++; } + //为进程解锁 LOS_IntRestore(intSave); + //返回系统的进程数量 return taskCnt; } #ifdef LOSCFG_BASE_IPC_SEM +//这个函数用于获取当前系统信号量的数量 UINT32 OsShellCmdSemCntGet(VOID) { UINT32 loop; UINT32 semCnt = 0; UINT32 intSave; LosSemCB *semNode = NULL; - + //加上锁,用于防止中断 intSave = LOS_IntLock(); + //遍历所有信号量 for (loop = 0; loop < LOSCFG_BASE_IPC_SEM_LIMIT; loop++) { semNode = GET_SEM(loop); + //如果该信号量被使用了,数量加1 if (semNode->semStat == LOS_USED) { semCnt++; } } + //为进程解锁 LOS_IntRestore(intSave); + //返回系统信号量的数量 return semCnt; } #endif #ifdef LOSCFG_BASE_IPC_MUX +//这个函数用于获取当前系统互斥锁的数量 UINT32 OsShellCmdMuxCntGet(VOID) { UINT32 loop; UINT32 muxCnt = 0; UINT32 intSave; LosMuxCB *muxNode = NULL; - + //加上锁,用于防止中断 intSave = LOS_IntLock(); + //遍历所有互斥锁 for (loop = 0; loop < LOSCFG_BASE_IPC_MUX_LIMIT; loop++) { muxNode = GET_MUX(loop); + //如果互斥锁的状态被使用了,数量加1 if (muxNode->muxStat == LOS_USED) { muxCnt++; } } + //为进程解锁 LOS_IntRestore(intSave); + //返回系统互斥锁的数量 return muxCnt; } #endif #ifdef LOSCFG_BASE_IPC_QUEUE +//这个函数用于获取系统消息队列的数量 UINT32 OsShellCmdQueueCntGet(VOID) { UINT32 loop; UINT32 queueCnt = 0; UINT32 intSave; LosQueueCB *queueCB = NULL; - + //加上锁,用于防止中断 intSave = LOS_IntLock(); queueCB = g_allQueue; + //遍历所有消息队列 for (loop = 0; loop < LOSCFG_BASE_IPC_QUEUE_LIMIT; loop++, queueCB++) { + //如果消息队列的状态为使用,数量加1 if (queueCB->queueState == LOS_USED) { queueCnt++; } } + //为进程解锁 LOS_IntRestore(intSave); + //返回系统获取消息队列的数量 return queueCnt; } #endif #ifdef LOSCFG_BASE_CORE_SWTMR +//这个函数用于获取系统软件定时器的数量 UINT32 OsShellCmdSwtmrCntGet(VOID) { UINT32 loop; UINT32 swtmrCnt = 0; UINT32 intSave; LosSwtmrCB *swtmrCB = NULL; - + //加上锁,用于防止中断 intSave = LOS_IntLock(); swtmrCB = g_swtmrCBArray; + //遍历所有软件定时器 for (loop = 0; loop < LOSCFG_BASE_CORE_SWTMR_LIMIT; loop++, swtmrCB++) { + //如果软件定时器的状态不是没有使用,数量加1 if (swtmrCB->state != OS_SWTMR_STATUS_UNUSED) { swtmrCnt++; } } + //为进程解锁 LOS_IntRestore(intSave); + //返回系统软件定时器的数量 return swtmrCnt; } #endif - +//这个函数用于打印系统信息,包括进程数量、信号量数量、互斥锁数量、消息队列数量和软件定时器数量。 LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdSystemInfoGet(VOID) { + //打印表头 PRINTK("\n Module Used Total\n"); PRINTK("--------------------------------\n"); + //打印进程数量 PRINTK(" Task %-10u%-10d\n", OsShellCmdTaskCntGet(), LOSCFG_BASE_CORE_TSK_LIMIT); #ifdef LOSCFG_BASE_IPC_SEM + //打印信号量数量 PRINTK(" Sem %-10u%-10d\n", OsShellCmdSemCntGet(), LOSCFG_BASE_IPC_SEM_LIMIT); #endif #ifdef LOSCFG_BASE_IPC_MUX + //打印互斥锁数量 PRINTK(" Mutex %-10u%-10d\n", OsShellCmdMuxCntGet(), LOSCFG_BASE_IPC_MUX_LIMIT); #endif #ifdef LOSCFG_BASE_IPC_QUEUE + //打印消息队列数量 PRINTK(" Queue %-10u%-10d\n", OsShellCmdQueueCntGet(), LOSCFG_BASE_IPC_QUEUE_LIMIT); #endif #ifdef LOSCFG_BASE_CORE_SWTMR + //打印软件定时器数量 PRINTK(" SwTmr %-10u%-10d\n", OsShellCmdSwtmrCntGet(), LOSCFG_BASE_CORE_SWTMR_LIMIT); #endif } - +//这个函数用于处理shell的systeminfo命令,根据相应的参数,做出相应的处理 INT32 OsShellCmdSystemInfo(INT32 argc, const CHAR **argv) { + //如果参数数量为0,调用OsShellCmdSystemInfoGet函数,打印所有的系统信息。 if (argc == 0) { OsShellCmdSystemInfoGet(); return 0; } + //参数数量不正确,打印错误信息 PRINTK("systeminfo: invalid option %s\n" "Systeminfo has NO ARGS.\n", argv[0]); @@ -185,6 +220,7 @@ INT32 OsShellCmdSystemInfo(INT32 argc, const CHAR **argv) } #ifdef LOSCFG_SHELL +//注册Shell命令systeminfo,调用OsShellCmdSystemInfo,根据参数输出当前系统的程数量、信号量数量、互斥锁数量、消息队列数量和软件定时器数量。。 SHELLCMD_ENTRY(systeminfo_shellcmd, CMD_TYPE_EX, "systeminfo", 1, (CmdCallBackFunc)OsShellCmdSystemInfo); #endif /* LOSCFG_SHELL */ diff --git a/src/kernel/base/shellcmd/task_shellcmd.c b/src/kernel/base/shellcmd/task_shellcmd.c index 43dbde6..35ed967 100644 --- a/src/kernel/base/shellcmd/task_shellcmd.c +++ b/src/kernel/base/shellcmd/task_shellcmd.c @@ -25,7 +25,10 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------------- */ - +/* +这段文件是针对LiteOS操作系统中的Shell命令编写的, +主要实现了操作系统的任务管理模块,通过进程号获取该进程的所有信息,或者直接获取所有进程的信息。 +*/ #include "stdio.h" #include "stdlib.h" #include "los_config.h" @@ -53,55 +56,65 @@ extern "C" { #define OS_INVALID_SEM_ID 0xFFFFFFFF #ifdef LOSCFG_KERNEL_CPUP -LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpupAll[LOSCFG_BASE_CORE_TSK_LIMIT]; -LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup10s[LOSCFG_BASE_CORE_TSK_LIMIT]; -LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup1s[LOSCFG_BASE_CORE_TSK_LIMIT]; +LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpupAll[LOSCFG_BASE_CORE_TSK_LIMIT];//所有时间段CPU利用率的统计信息 +LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup10s[LOSCFG_BASE_CORE_TSK_LIMIT];//最近10sCPU利用率的统计信息 +LITE_OS_SEC_BSS STATIC CPUP_INFO_S g_taskCpup1s[LOSCFG_BASE_CORE_TSK_LIMIT];//最近1sCPU利用率的统计信息 #endif -LITE_OS_SEC_BSS STATIC UINT32 g_taskWaterLine[LOSCFG_BASE_CORE_TSK_LIMIT]; - +LITE_OS_SEC_BSS STATIC UINT32 g_taskWaterLine[LOSCFG_BASE_CORE_TSK_LIMIT];//记录各个堆栈最低的水位 +//这个函数通过进程状态位来判断进程的状态,并返回相应的字符串表示进程状态。 LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellCmdConvertTskStatus(UINT16 taskStatus) { + //进程处于运行状态,返回Running if (taskStatus & OS_TASK_STATUS_RUNNING) { - return (UINT8 *)"Running"; + return (UINT8 *)"Running"; + //进程处于就绪状态,返回Ready } else if (taskStatus & OS_TASK_STATUS_READY) { return (UINT8 *)"Ready"; + //其他的进程状态 } else { + //进程处于延迟状态,返回Delay if (taskStatus & OS_TASK_STATUS_DELAY) { return (UINT8 *)"Delay"; } else if (taskStatus & OS_TASK_STATUS_PEND_TIME) { + //进程处于定时挂起状态,返回SuspendTime if (taskStatus & OS_TASK_STATUS_SUSPEND) { return (UINT8 *)"SuspendTime"; + //进程处于定时等待状态,返回PendTime } else if (taskStatus & OS_TASK_STATUS_PEND) { return (UINT8 *)"PendTime"; } + //进程处于等待状态,返回Pend } else if (taskStatus & OS_TASK_STATUS_PEND) { return (UINT8 *)"Pend"; + //进程处于挂起状态,返回SusPend } else if (taskStatus & OS_TASK_STATUS_SUSPEND) { return (UINT8 *)"Suspend"; } } - + //进程状态不合法,返回Invalid return (UINT8 *)"Invalid"; } - +//这个函数用于获取所有堆栈的栈水位(堆栈的使用情况) STATIC VOID OsShellCmdTaskWaterLineGet(const LosTaskCB *allTaskArray) { const LosTaskCB *taskCB = NULL; UINT32 loop; - + //遍历所有堆栈 for (loop = 0; loop < g_taskMaxNum; ++loop) { taskCB = allTaskArray + loop; + //如果该堆栈未使用,直接跳过 if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { continue; } - + //调用OsStackWaterLineGet,输出堆栈的栈水位信息 (VOID)OsStackWaterLineGet((const UINTPTR *)((UINTPTR)taskCB->topOfStack + taskCB->stackSize), (const UINTPTR *)taskCB->topOfStack, &g_taskWaterLine[taskCB->taskId]); } } #ifdef LOSCFG_SHELL_EXCINFO_DUMP +//这个函数用于在异常信息输出缓冲区中打印任务信息的标题。 LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitleExc(VOID) { WriteExcInfoToBuf("\r\nName TaskEntryAddr TID "); @@ -133,7 +146,7 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitleExc(VOID) WriteExcInfoToBuf("\n"); } #endif - +//这个函数用于在控制台打印任务信息的标题。 LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID) { PRINTK("\r\nName TaskEntryAddr TID "); @@ -165,14 +178,15 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID) PRINTK("\n"); #ifdef LOSCFG_SHELL_EXCINFO_DUMP + //在异常信息输出缓冲区中打印任务信息的标题。 OsShellCmdTskInfoTitleExc(); #endif } - +//这个函数通过TCB(进程控制块)获取进程所持有的信号量的ID。 LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsGetSemID(const LosTaskCB *taskCB) { UINT32 semId = OS_INVALID_SEM_ID; - + //返回该进程的信号量ID if (taskCB->taskSem != NULL) { semId = ((LosSemCB *)taskCB->taskSem)->semId; } @@ -181,12 +195,13 @@ LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsGetSemID(const LosTaskCB *taskCB) } #ifdef LOSCFG_SHELL_EXCINFO_DUMP +//这个函数用于将TCB(进程控制块)中的进程信息输出到异常信息输出缓冲区。 LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoDataExc(const LosTaskCB *allTaskArray) { const LosTaskCB *taskCB = NULL; UINT32 loop; UINT32 semId; - + //遍历所有的堆栈 for (loop = 0; loop < g_taskMaxNum; ++loop) { taskCB = allTaskArray + loop; if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { @@ -194,21 +209,25 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoDataExc(const LosTaskCB *all } semId = OsGetSemID(taskCB); - + //调用WriteExcInfoToBuf函数,将TCB(进程控制块)的信息写入缓冲区 WriteExcInfoToBuf("%-23s0x%-18.8x0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskId); #ifdef LOSCFG_KERNEL_SMP + //调用WriteExcInfoToBuf函数,将TCB(进程控制块)的信息写入缓冲区 WriteExcInfoToBuf("0x%04x %4d ", taskCB->cpuAffiMask, (INT16)(taskCB->currCpu)); #endif + //调用WriteExcInfoToBuf函数,将TCB(进程控制块)的信息写入缓冲区 WriteExcInfoToBuf("%-11u%-13s0x%-11x0x%-11x 0x%-.8x 0x%-.8x 0x%-11x", taskCB->priority, OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize, g_taskWaterLine[taskCB->taskId], taskCB->stackPointer, taskCB->topOfStack, semId); #ifdef LOSCFG_BASE_IPC_EVENT + //调用WriteExcInfoToBuf函数,将TCB(进程控制块)的信息写入缓冲区 WriteExcInfoToBuf("0x%-6x", taskCB->eventMask); #endif #ifdef LOSCFG_KERNEL_CPUP + //调用WriteExcInfoToBuf函数,将TCB(进程控制块)的信息写入缓冲区 WriteExcInfoToBuf(" %4u.%1u%9u.%1u%8u.%1u ", g_taskCpupAll[taskCB->taskId].uwUsage / LOS_CPUP_PRECISION_MULT, g_taskCpupAll[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT, @@ -218,41 +237,47 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoDataExc(const LosTaskCB *all g_taskCpup1s[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT); #endif /* LOSCFG_KERNEL_CPUP */ #ifdef LOSCFG_MEM_TASK_STAT + //调用WriteExcInfoToBuf函数,将TCB(进程控制块)的信息写入缓冲区 WriteExcInfoToBuf(" %-11u", OsMemTaskUsage(taskCB->taskId)); #endif + //调用WriteExcInfoToBuf函数,将TCB(进程控制块)的信息写入缓冲区 WriteExcInfoToBuf("\n"); } } #endif - +//这个函数可以将TCB(进程控制块)中的信息输出到控制台。 LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTaskArray) { const LosTaskCB *taskCB = NULL; UINT32 loop; UINT32 semId; - + //遍历所有的堆栈 for (loop = 0; loop < g_taskMaxNum; ++loop) { taskCB = allTaskArray + loop; if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { continue; } - + //调用OsGetSemID获取该进程的信号量ID semId = OsGetSemID(taskCB); - + //输出进程信息到控制台 PRINTK("%-23s0x%-18.8x0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskId); #ifdef LOSCFG_KERNEL_SMP + //输出进程信息到控制台 PRINTK("0x%04x %4d ", taskCB->cpuAffiMask, (INT16)(taskCB->currCpu)); #endif + //输出进程信息到控制台 PRINTK("%-11u%-13s0x%-11x0x%-11x 0x%-.8x 0x%-.8x 0x%-11x", taskCB->priority, OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize, g_taskWaterLine[taskCB->taskId], taskCB->stackPointer, taskCB->topOfStack, semId); #ifdef LOSCFG_BASE_IPC_EVENT + //输出进程信息到控制台 PRINTK("0x%-6x", taskCB->eventMask); #endif #ifdef LOSCFG_KERNEL_CPUP + //输出进程信息到控制台 PRINTK(" %4u.%1u%9u.%1u%8u.%1u ", g_taskCpupAll[taskCB->taskId].uwUsage / LOS_CPUP_PRECISION_MULT, g_taskCpupAll[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT, @@ -262,16 +287,19 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTas g_taskCpup1s[taskCB->taskId].uwUsage % LOS_CPUP_PRECISION_MULT); #endif /* LOSCFG_KERNEL_CPUP */ #ifdef LOSCFG_MEM_TASK_STAT + //输出进程信息到控制台 PRINTK(" %-11u", OsMemTaskUsage(taskCB->taskId)); #endif + //输出进程信息到控制台 PRINTK("\n"); } #ifdef LOSCFG_SHELL_EXCINFO_DUMP + //将进程信息输出到异常信息输出缓冲区。 OsShellCmdTskInfoDataExc(allTaskArray); #endif } - +//这个函数可以通过进程号获取进程的信息 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId) { BOOL backupFlag = TRUE; @@ -279,50 +307,57 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId) UINT32 size, intSave; LosTaskCB *tcbArray = NULL; INT32 ret; - + //如果是目标进程 if (taskId == OS_ALL_TASK_MASK) { size = g_taskMaxNum * sizeof(LosTaskCB); tcbArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem1, size); + //如果目标进程信息为空,输出错误信息,将backup设置为Fasle,不备份该进程信息 if (tcbArray == NULL) { PRINTK("Memory is not enough to save task info!\n"); tcbArray = g_taskCBArray; backupFlag = FALSE; } #ifdef LOSCFG_KERNEL_CPUP - (VOID)memset_s((VOID *)g_taskCpupAll, sizeof(g_taskCpupAll), 0, sizeof(g_taskCpupAll)); - (VOID)memset_s((VOID *)g_taskCpup10s, sizeof(g_taskCpup10s), 0, sizeof(g_taskCpup10s)); - (VOID)memset_s((VOID *)g_taskCpup1s, sizeof(g_taskCpup1s), 0, sizeof(g_taskCpup1s)); + (VOID)memset_s((VOID *)g_taskCpupAll, sizeof(g_taskCpupAll), 0, sizeof(g_taskCpupAll));//置零 + (VOID)memset_s((VOID *)g_taskCpup10s, sizeof(g_taskCpup10s), 0, sizeof(g_taskCpup10s));//置零 + (VOID)memset_s((VOID *)g_taskCpup1s, sizeof(g_taskCpup1s), 0, sizeof(g_taskCpup1s));//置零 #endif - (VOID)memset_s((VOID *)g_taskWaterLine, sizeof(g_taskWaterLine), 0, sizeof(g_taskWaterLine)); - + (VOID)memset_s((VOID *)g_taskWaterLine, sizeof(g_taskWaterLine), 0, sizeof(g_taskWaterLine));//置零 + //如果没有调度器自旋锁,为该进程添加调度器自旋锁 if (LOS_SpinHeld(&g_taskSpin) == FALSE) { SCHEDULER_LOCK(intSave); lockFlag = TRUE; } + //如果需要将进程信息备份 if (backupFlag == TRUE) { + //将进程信息备份到tcbArray ret = memcpy_s(tcbArray, size, g_taskCBArray, size); + //如果没有备份成果返回错误 if (ret != EOK) { return LOS_NOK; } } #ifdef LOSCFG_KERNEL_CPUP - (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpupAll, CPUP_ALL_TIME, 1); - (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup10s, CPUP_LAST_TEN_SECONDS, 1); - (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup1s, CPUP_LAST_ONE_SECONDS, 1); + (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpupAll, CPUP_ALL_TIME, 1);//显示CPU所有时段的使用率信息 + (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup10s, CPUP_LAST_TEN_SECONDS, 1);//显示CPU最近10s的使用率信息 + (VOID)LOS_AllCpuUsage(LOSCFG_BASE_CORE_TSK_LIMIT, g_taskCpup1s, CPUP_LAST_ONE_SECONDS, 1);//显示CPU最近1s的使用率信息 #endif + //获取进程的栈水位信息 OsShellCmdTaskWaterLineGet(tcbArray); - + //如果进程有调度器自旋锁,将该进程解锁 if (lockFlag == TRUE) { SCHEDULER_UNLOCK(intSave); } - + //打印进程信息标题 OsShellCmdTskInfoTitle(); + //打印进程信息的数据 OsShellCmdTskInfoData(tcbArray); - + //如果进程信息数据备份成果,释放tcbArrayd的内存空间 if (backupFlag == TRUE) { (VOID)LOS_MemFree(m_aucSysMem1, tcbArray); } } else { + //调用 OsTaskBackTrace函数来获取该任务的回溯信息。 OsTaskBackTrace(taskId); } @@ -330,29 +365,34 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId) } #ifdef LOSCFG_SHELL +//这个函数用于处理task命令,通过各种参数输出结果 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv) { size_t taskId; CHAR *endPtr = NULL; - + //当参数数量合法时 if (argc < 2) { /* 2:Just as number of parameters */ + //如果没有参数,进程号是所有进程 if (argc == 0) { taskId = OS_ALL_TASK_MASK; + //存在一个参数为进程号 } else { taskId = strtoul(argv[0], &endPtr, 0); + //如果进程号不合法,打印错误信息 if ((*endPtr != 0) || (taskId >= g_taskMaxNum)) { PRINTK("\ntask ID can't access %s.\n", argv[0]); return OS_ERROR; } } - + //调用OsShellCmdTskInfoGet函数,输出该进程的进程信息 return OsShellCmdTskInfoGet((UINT32)taskId); } else { + //参数不合法,打印错误信息 PRINTK("\nUsage: task or task ID\n"); return OS_ERROR; } } - +//注册Shell命令task,调用OsShellCmdDumpTask,根据参数(进程号或者没有参数)获取进程信息并输出。 SHELLCMD_ENTRY(task_shellcmd, CMD_TYPE_EX, "task", 1, (CmdCallBackFunc)OsShellCmdDumpTask); #endif -- 2.34.1 From dc810a0753e1095201c44f1069f1765152eb32cc Mon Sep 17 00:00:00 2001 From: cailun <2505225681@qq.com> Date: Sun, 31 Dec 2023 23:54:47 +0800 Subject: [PATCH 4/4] doc --- doc/用例描述_蔡伦.docx | Bin 0 -> 17632 bytes doc/蔡伦_LiteOS阅读泛读报告.docx | Bin 17703 -> 152986 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/用例描述_蔡伦.docx diff --git a/doc/用例描述_蔡伦.docx b/doc/用例描述_蔡伦.docx new file mode 100644 index 0000000000000000000000000000000000000000..7c2941e1a899844dd1509ee8bd94e0b1e9ff2795 GIT binary patch literal 17632 zcmeIagj721jEF(h%Q|n$+kc>eys~Of%h)r&!r|3K>0g1X6pQ%@t_GtZ# zG0Aq47&Zk)*!-2r>jpXx8} zW-BwJS~+by<(D)-dxk+f9Q%}5jtd`4S&KvvV}2 zH?}i!vH6(8{+PVZbXFYKhBCTy%RL}cFNpI$(`2ZZ)E=}_mF-3(rjJpk1(U?Ip+b42 zQ**@FP^P5rvPY(Vb2S{yNndu%&XPbG85_U>F08qMo>Qklf{Ozt6wKGzbqoi^dfmPB zd-dFZ@#EC0!r`!C)!O$wKY~r$H;qwmGVD^Wrp3#Cx?? zO6Qw+zvb)lGp$ypr&FuS@Ci;RZ914_i4ZeOvF>10qiBqfQeCi~P#qgI?NZUJHH*Br z%ST-HKC^xvST2BP;MVQSgP_s@jH`a?GphrlV&NWXy zSoqh4#|0`Q>;~(D3pR!ze3Qtlleh+pt-v763P;$d5)C&lNSbEn#U{llAu%op{*m;} zI?3=rIU3u&%V5ELN3ctS)y8v0n?`x!plpB0E6IMKag2N{x!xyccJC)1W`j0YasaWW zRjMFr@=!4WO8I?)ia-%w^7BmkzNrme<@=_sPwai$SKps?S_9>UUbH^h%C(cL$tfEZ zYtqCWU)#~Z(ex}sidFI)E0;8-_J?epOHGSJVNyMXWn+g^aUm{#+jJ<^H&(BrVQl+dpXj&yU46*Gih~%UMMsU z8AY5WaH-+ODHu8U#aszAbgv&NQD4Tc*7=Ha?*=3?numO1J=&{!Wppwev7Q#!pq<3k zs$9rC7=hjoYad3m+!6DJbN4IDbH{&EJFWEFn!87&9~vK5Qg*4=Vz)$7g4E z?(E0;esECU@Z{z7qS@!Q{)y^|)_n04#d>l_{f& zOqXiJJatxm25W^PyG3*5_@!=sOXPwgIQUTFW+seW)`HZ=l3NG-63FqZ(SE~st>dlG z_p=enpNNY*5>LEpd5g?$tA$TX!a&G(Z#^?!EHO?w^&q?xCLP^czYMy3%he(W>fe_I z+g9rNs^>I&J1Wz5RC?sA)KV&R^}ecYcI@yeR=jKEbp>ox_`y~4FK-G|^O>heZ7zvC zOIUz*8u}0V_kCLf3fGlcQ|hfY_;P@K4I|6!9J0Gtst38#lY{I%dv{{RNl!fS*{=iR z7n}!eXy9GjawOnKuL;>%JLq63J4%X`h#c5yFE-zmKtnzrQ{e0~n`+zsG{sCVE z&juQ0dtFAJ1$YSgYh?$)iYE63KWuGp{rn>ir_2XG-cp=MC+frRwTx)VYQDWteD ziWekz%W5j^G)%fg>YPfZ2{P(emqLyTp>E@3JqDF5nP28^a1!ZQf3koa-Q8CzzMwr4T z!o(CW*;*=BZ8CtrZhrMzq3|o>bwAo1!fZ?>4nsl~;UFN);M@YXbE4C6&hh0E;M+A3 ziZ@vhYKFKl1C>mGuEp~COwu_%wg+g6Z#Qf7gQ%PMQ6|iH`ZBrW1!X6WBo~CcOPU55 zcxFW%txF>9uE0k^?_odUQ_Cqp-(@ed#f9!j zz%k&a%?S6H$l<$Z^F$_x&aZTkJ{l;ek|g5fmyTb_Y_GX=&C!-Pme~|z2ahLG(iLT2T8x%I_|;2k_dc{Bgprm0@rX|0TS4GiHxnYu~0SHC+6^6%?bAq<#AClq#36`t#(%*Va+}9)rP+P)-fyqPQ8{Wr;O)LnRnQCYVyy zWT~WQZ-2t(_e&B@JoN|6wK%aq1aEWQl8+)G3-o152xWr z%3j(`>=f%-q5hN-cEwE(qb*-=_UN#Tgy>h4szR+HQ{lX>-I!Etl5>;Wco-z&GZ|gs z*V)?e-Uo76L%+rq+aBxZ?eqk5_<;O4B6QechxA;<_+FqPFk>>*ML2ameYFHD9f0Ch z?})E`VXGSvNu9bg0c(YlNGdH{h?xDYJ`!9Q%H6F*u)j}{%`fQu?j8ARy5P=G2c$^F*3ycKT&CZN7#@>e6JQn$G+f?_Zw%3LAn{4#D&TG}n ziPYf_(Zk8ZJh7KZHISYM+h?nZ&?-X{12|#m2caE(f91MLkO7!yCBl)5XRyPItp@gc zeGnA?Li;->?qfgoW?I!RLXc~>ejJRl>}e>G4xcUUc+RoK>Gw*Qp-VwTh;f3{YXeP6 zk2g0k2B1V4my@)k`ZYRMJ)Xv2FATg6mx96{C0yeaj*(}sCPSTGVIGfTCl^zkjOLzx zjNsERu4%OdV(k2SXqlXJaXXhf9F%0E-bNKbVqlgH2!mu8zE{c72Sa3yWsBZ~^uCHO zw2W=L%JWWGeJFT%kfGwH(pij301NUjwddwCigfRl%EB0|^lBGV{~@RKZE!a1g1%Qk z%5rSsYpXWLdDSd@GvZkaF7^FIz;x&{s->L~uD4NAIM zeK5d)H(#NYB2c@?l%Jby-`{^m`!^IAGyA_=&k4DO%UOgGcP0r05*9b4$f zKX0MTqOcbt3S2*r1{H81&6lMW037sYjWe=EdX)mS%T-<4O!j*gKARi1{{jKkonZ-2 zr`%J4lZ;s0%3+7&jOtAWl#)ah?t`j{dQc>Um4}?Z9%umtmZk94m*?VzH4pP+%csIo zG<>WQ3bCR4XMCc+RN3tPx=Vj~?IK{{m|EPZdAq3QzNoh0#HP1c#1BQvs(=UXxU%H& zJmc<>CEZ>BIik_UlfRg$)zXof3FX5sItLyQ8fUUjbuJG|Pvvh$mdBo*8urbLXNZ?P z9|+9PMnsxtCIPCDJc*IVgkit5egj|4+*OkBv%n&(#%>xfD*$>i96{#vC1I@_JFJ)t z5jC~)N7*lT7wf$x3GM7Kpi+41pG*8;zVYNF*Wj zG)xC!ui^|U(EzdUa)Ipyq#kA1g9{rg9_uR}o<{|w$}7W`%}vWRYlpn~Oq6B{KCV19 z9a}b_iH_m%YfrCB1YO{%+1d0Kf^w-)P>Nt7=4Y0+8c6)m=CaFPj{GMJmp;ktBB< z1Kr*ppJW3s_Kv~)wE7Hm+BMHYV;45vKEv3a-ypUf0S->;O?2%T@#LOt8W z2PJBc6$lE05e6B`PJi%9?lKLpOLR!I-_~!srmgPe?IyY7X1UEFTJ*3C6Q9cfwQFEK zc5v#H-8lO+(3}D*)0RETd1OnOnTK<@G7KV}nFPq+KK{;q#DqQApt#r~l_Mueu^L3J zl%K$uh^!Zw+XQvQqs_wo6*`SaI=8aqSGqQ)|?f&HU_r1_OVuTjElyuG8qIwnU&8d z5iu7=5D*X)y`>Q^>#Hxtr^UTvVQ}JzyeNW2v;wyRc?5YQ=-hgpt?UB27X@v`4+K5g zZ=%mf=!?ZJ$5`YGxgFpCiAyjflua;ynQ)Imf-gRyMUrnB+wQ99;O#um%Wh)hEdcn- z!(tU6nC#Q1M!j`R930qkuT#m_Z%i?Fd1QhlFSS+(N)!=+hz-Gy*-5;Z`-thtonCgN zM;vE$P6-}*2X)aGr*<8D(b`m*ZIqKwT<2A&kB49KqMsKre|nCZRAh`IDwuvE6+!9? zr4TDY6(mEZvHnr2@?Au|p`f%_sA|RL;!X5$6ZPQN#75HrCCZ=x5K<6N6clDep#=%& zD66)@OacfD7^92n^oH{IX7l9of@%39&ipLdClD28Ku1QvFgUEMThFd(JRrI2u4Bq# zd(%Ir#1@{(PrnXA4v)@~On%9vKZjYk_A520n8Gbr*?s(4kZ`zRF^vbOIvUP5%*THE zO#!&a&+AQU7tbbG^9ybbuT_eVj&Mvf@Tl~n%6kMiIo zhCfSehcKk#j6PI}1JS{I4;zvC;nV0ik?NXtG^;r^f=IBufvV1JLjLWvp6v3W#QxX3 z2ZK?6VIf;$Bse@gvKi2JjbLsC9FE`;Aaf2$qjW9Co9!D&{8h)MYp4ag@)XjVy{Yki zc6M|Fg3)FDp&kZNXwdOI-2oda&4i)idJOs2GHVLYy8$J%>E((v@@DZO7};r1l6vYc z5gFhNzEcjK_B1qgG=kE!6S0C~iJKHCc$p|5_+wb({Um^xD3$!{N><-w=vUA80swgi z4ezH(7A*P}(3RC#TiOb9d^ySN@H?L&bh%%Li0@+9fH-zPUB__WLy`Fx%z(jIX}+{Y z>`h6)J2~$`#{MAb+RFm`WDmDS%eiNh9!^&N47EX9 z$yyJrmVBiecTppjY5b5atb~1sGQB4sXD9YN^?t^}jh;vk4*l97sa-!@=qk*&Z9h2Q z>W*zC^=eI4uebLPFVuhgsT#T?alt-3Sj`{+01f~W=pTNne>!vj>aF^>V;ATn-ttlV z|LvnPapI47L-1utchIsIEticDRJ;>qfVS2nkg?aR(7jQijAoCIh$PY%@VTHEW<#^? zkOj}%Dpanow_U8j^(0`S#q}$J-p38fWZl|A>6Z+#WpZgl( z3_JZ}%+(z(Dn2#ch2u^Krw(z_Qi?C#2&m@Pi*$?6k-E*ney?F#sYcs&y(g|U#JS>I zX|{NV*0X6^GCvXpdlW}uyCqa=N0aCskq|_?T7!%%g=C@10>-)5_CagdJaY-Bv-T!r z*K$G_OG7|0y#}^V>M>;-zQRe&s|$tJD2Eze$p~_ffVvLZf5}bEN+U<`yk6B&78)|9V#hU&J!aFZ43~u9zCk@`{+9p4`Ya zOCxKDEm&t$+2(yX{`oMA!>Q5hX|xMc>q{Jy@Q)OoZsmGfj2GjuA74$j@a|yX)(mmJ z3HeLFYCXU*y^J1|^YC&mVg5Dqx%G26PI)5j*j zLU$t)3i{p@ryaCQ7Ijb50OLyzU7j_I6}0!1fGeN6x!}m^2Hoo{4mJ?U4DgK&&lb(a zE6mpgR`0ds9xUB}gyM$K%g3(yP)zw*=cOy#l9l6=XH*J{#l@?8#g5Z?)=uCMjKN)2 z=aDLvu0h+>IK)0JQTI8Q=lfBdocxINBgs9Z9CRy0c7jHFz-XI)!Sas=C>$WYZQb`@ zgQr{Xjm-)O5v`g2X$*{-4VdqTNzvT&4KPm^U%U zsnP4<@p(G@I%?S+j*Z2CWzzG~v4#02pn7p0tM~qLmUll@v(@8s6OB1l?`~ry%D!ao z^YZIH@~|ey_x_-S9NaxK@Ri2fpXhrf_SN@x5u!SQ0bu*w?%Zz#pcK?IF(BZE1SYUY zc<`)u(U`rx{-^vKF>a;b(a5$Jjsry9=?j%&V0%vu3W3}p`)~!Lz1r!PMl}tvAPxqP zSt2{Ydh;x7>;}iWj)jAHn9A-1OJ~*x`}Ya_8TV4Mh>alO4BZfC&)S2$B{47^PU-47 z0hlsO{4bg;MS@xsNWSUmkkEcs%`0t2E|6?xm;FMxl#}4SWXT9trk&8mIKrYs1pOL& zY}Si3mV?*9gN@^Lm>vWX zWTLVZa7^oR>*^pC^v{uONd)eYiC+5Q2_{`0aY0$#a=n}FB3X<-A#gAk6%zx6`{J3o zgMO9p$Q0F#uu(FOikW1Y7WBdvgpKJ%5IlV_BjZjtXOolAgAq|(2_#$72Jx&M^@YW3 zRJJj)r!mz0e$nT@ceRpUMUsOVM$CW9vW0OWdL=G7%MgRr)s>G>ez9 zg?4OU+DhZx^j#NG*7vS4Ok^eqd;*XyEm4vOx8@0ezD)p&J~%*Qt=O4bnB}pA=!TuL zu1vwU5Px+ZZZJ86T<}@~Y+CYoH%IT77&=OAi-%c%s(76dL{8~wZ$Dw-h77(%bKX7p z)6B5moO2(`X2=gLMt*w9jL3uoKfT$#?88XGgZ#KQ3gdC2L;3H8O_82}M)&c8M&Y(8 zZ&Aoy9^L`_%(C(?;SGFekpc?}f@5ORiSjImV-~IczzfY3JGsPo7a{sYDU=ncz-(%` z3|4|^6j}4N3N2Z^bLL-Q6K5Pfu9cM_0XZ>|{Z@>0U_g{F zyd+GK$0X(8NcV%=P$ct{lffc$z4?R-hxPLKPBmd;BfvLpt*0bW!mZ(Pc#?diH!znu zZ6&u+Wp*8g%eqRAJlJwpBuqQSiQj__DClArc9F>KNk4C^ zUuuZ`7+2BB8-hqo;X&F;6K2kU^pQ5D@(*e?dGWSAf*+wl9(6~rWe6xMGk!<>5vPeE zLbTXm+v_k|rCm10<6F3wQ4~AnctU(?%#J0Hdl*%y!Wm1F6nLZ2m(tDNjB?PLQETp?-urpyDAx))YVD_@w&o z&71ipzdPngW&K%3xZk>xP9Z;TeWdh*n3s zfD9A6w5WiyiJ1nHX^d8g`7(z6bWNYtav!X&lv>5^yoqgv4RfXskk)4juyo| z5PcvyX)f)*lygVpUQoXB}UQL?*3c_)-Ij(m6RkLWTl8viL zuwnHAJA>%Q&WWe&({Lsq*(-+de+dCPnK(OJ*qS;0F&{RnZ8@#7 zBlz~Dzu;r!#QI0Wg;JjT*JU~h4Va8FDPEwxPCZ@|96bgLn}kwOU+4RM%YQ$(&-Lr% z90yB5niqzrkYuEv72!**&w&3zG~p2N4Yk4^YCGi`SmNhihe5zkAsskHRb}x6xIAIJ zFBj%4$DdiOXKFk+>?pv&Bsh?*sgp;tY+6VLC-|)TavN$GH5wY}>?!YKgkmUv_DaSl zN~$;iP+I|v(~i8EeOX4IKf%qKVUF?A=jPJj9_BHTcStcL+zy1c#3eE5sC&envACpO z?%>ET26i$lR6ERhp(nQQAx7fw1k7%O^9s%$UkJ%v{oS zj6m!0`x%Yu19lu5Y>47PArA8UlTJL76{C8$2E2zAfRcwK8)ZUUN{essY>-B%Ilu$?3ng%hER25QE9mUULUD8K2muiM&QswAaTT6j=o!Z95@<2L*mp5gRzlw--mLg7`PO$l21*6 znoMi2cvyFDgbCd3Al14u#EU@-P@4$mT-A?n_EADIWI(>RL-08PQY{bR<02l1p@%U9 zQ1W`-awhJw2a}ZDKySjgk}!?;?AD^JTha!=K^^Zt&BoZfPCKwkymdT;pg({mDx?kBzMwA+c?YYx9XUctBY%m@DbH{Td#GRSmF`v$uDV?T7Ca*)dxDGoy z!_hAsl-aHGOw<>ng}}8$;ZVXXhYyO=M=SKreFf!Q%6LD@Y=aR}%oc~uWEYzxLpC*= zTqjoSt&n*!o*7Rpn>^a*bB?Pg!c=ig`2E%0P(&LRJ)dKTVo13fMkE3%wygZ6EZkS2 zqPiV;YDG=&puDkNCz7(yXgIL21kl13u#`qXKGTAa)vTK*tX)FhOE+v-ol4Lf4;$f9 z_rBv>g6K7{p4+8NVBgExbC%Q-klMuz_VYJM7R!U%_Fx0!w+C`g*_(Da#z{#U>GoPm z&o^3eyk(WCj7atr5gL#9_Jgjv!u=#Y@=pNWLMkSsBc_Km&&sR}V(Ah;N4HBN-!OS)1&t9%!U5je1kxYOQ=5C6i1M0@+~z&AZ;@{zT&oGrntRD z?}$p8QY{tMa?!@}>8fA7=h@C%VL(fAJA`c5a4tqrZOB0q^ezCpm~5nV@NG72x34r| zv-D}6+0l&ydVqo<{P3seYC^k8Z9m=Ji1jZ$zH~^h;bufQ|7eG6Mh8T|`{(SdT{^HrM$p%P+G9XzdQoP^cN7*a-+$F!@{Fbd>0kJ^>0e%usnRu?sDKMJI^d`AQ-GQ zF=*o;g3zJZSREzwQp@BEa~^|STBs(JfL<2sQ;{8`j_EMKe|+qU{R!8-N>kQ{DpW`g`}EUzKuxv>kbL^&jRH!|hMKW;-4KVW&exA1 z^Wl8u0Pad857p<(4#;=$I$AlFXWrFaO417%7pA}k?b6g#?XIbGJq|iTrFs^Rb$i0= zazO01r#ixpstfP|I`AONf}UgP^Mr;L+3>QPyy{N!EKtYOOHPdY4FN6j!JL}=54Q2w;ck|Eyc#84EkZ}$Zxo2?5$G=z3_)4 zVt1Xc1?WOMfj^218e4#_1Oa$JF=8~Kf-!eyt=mBIwZ` z9qa~8=E6(C9aR#TYd4hZDdDC)mX$LkSZgidtC;OQ`+~~3y;9_&qExw^8?N)8Hq+5u z_iVa8J2`t;oBYGz>dcmLT4P5Fz0_)Y4=9?uAdK(H zE*xSup}t;ab@+kFk;p78h&Du$2UfN`S)&IaA^k2RZ(X~T`YnGM9>}=|j-}^r%uY@N z>vg*vfr$_Myk`Sjgge%R=;ozirln)-^QEYQLOr)Z+4$4SQ963TmhbB!pRdO+`J^dI zdLp>*k?ED#2ImXR4b@sYaxWi#&1j zF0XN6E?_KtAv$zIyp3hjHQ}bOdR4zxMmEu<`Brak9_wQst4JzEYNU(OKBu91%|v#? zYWfc8&xA;=@!jJ|)veezUc}<|mFGn*#TGEk-U|fC`t}QI*j92&0nM+qd#cE=K{>H;iTJ$rd*DP* z`}+ak3%OtYnhd&Vk0mV$)7$q$>*SP>r&3#$*Sa_3_l_hF4dGaPbwn74671601Sp^0 zirY>E;#W8`5f5F+1K+2zP1A0@G+Zs(-F#;@y)faZp@XmR+WXI^_%uA&xXPIkxuqYE4y})Fw|p4bg{o-7*^w+0njqo6_BBGR!`u4Tws1#fL-o+HNh+TbRN7&q_^8 zk%)6A3z|8qlp=m(hq)%ddJ`?mdf2hg(}j+sx2o-u<0MO>8)jY}?}sR-z9owz<#2Hw zz{Fo&!sPf-yVtM04HqT*b`hpjXutcodm477p^cQ3q|wU|&1@Zv!ycg<#btD<89Lcp zy={T3#u`<;1~Mng6uhQFu6d*U=v7CNwOdQCK=*0!%KPN}Qxk&IvkC;aXE8ul_msb+ z#^tM9jSE5KlOLY=UbyVKtDidt|Hj~TDdNO+7~I6QIn>0pIM~EB1<=GbC}+lQxDm@R zaxtVVrI8*AXP@s;_=D}m1qV@7hnFPe?nMqze`^P_FNT|&FZ}L>?4iN>#tK(d2bacf z+kzr>`y$iWSRYlUl*U2*p2A3O=$v}BM)SAAopgy<>I7LN{qk{Dxo<%hj19SNVqvHj zKfQG`Bxw_F&FL=GBG7}dCvWk&lcn(LNM^VNzy8>l^bjQ>DMrn88oW(Y0%yZzLFI_O zQDGwvn;`8VH@fB~#On?fPe54&no!;E4--ZJbr~`w{qk9css7iM2Fk$jD1UyWN`@oR zB68mK0)tnD6xgD8>v)U*a>oH}mQ|Y<@*j(Ear{Wn}r8C{SeIh2aT22F^yf>i18MS{i{$L^#PN6ChB;$ z8d0Q1rsQi78LVzkUB{xa`Y(NjQt8Dv@#N0mEXs^gt*ZCnE2TUo-jtfPYXz4zEnsH+ z%I$2)!)%uw?Z4P6kvU@Z_;@BV#)~>rhgEcBPR(R%XE4pd!opn%rWB2TPrFa=_47Gw z@S9_~(njxlVpg!53YUe~SQbW*W0NIQ9}rX)p<+5PlK^dXU9NquS8p!Ogwk6OTBOo>x;bo8#9g zrDG-Y1-n~%xgSoCNZsz_xbGXifLV+E09Qvy!O0nki3nk5s(g@#@`jE3{41{RuLbUO zNmjigXOLyUh-fX)$I4M!O+#1yVfhA<%i3f9l@u0pjF_F&%;Q~wh|noCM8TuKzjR&S zK$*9eK@kGBM`$OCImk$1wbmJvzAJ~|`LB;Vo*7bX5dw3?mVp5?bIPx4?Y=7_4TXd0S zAm19j4^ttfSP>~(YfYMc(eY)oNyqeoF{)3dRYqeRok^zk=5EBU;&lHwVesC<)4r`{ z$zp2ihp&R@+~BiyPbA06n#BsrnU-k>{4(1C`9vbQjp=7@#EMD_3h%TZd$m1v(MPnq z1sg+|$=_1;9pt3k#}hYFGF5I;_AUN6apR$_l5L^sxVwrk`?AQ-ejbtQ5`75OJy%Vk ziQR(NOdYqFVngV@iYlU|7(ThXtWE2`d0c|oEJJ)$0J)h&HI5sBKqq!LSS0uF#eCK z@`7Lo0)inZjq?90YVw?C&@P?EBUd)Z|A0UtQWgHQYyWEKAN~37E?Ux~eL|pW9EL(& z{Q`-qC>RV)`JcZ16Y|HYWN9zA_@BMkxz^CjzuPeFiRC*z?lS6mFREx)@N18C>?j?0 zD=k*>Red)@q$~6e)5PcIZoC)e3ri~!TveLS89Sj{+C&Oyzj|_+eGQJ4!v8s2^sE8t zHG$F_`>Yx0L?xy}c&QmkbXiJ0t0Pr=!hJH@T}_$>9^0N!y}H)W%Ibixa#}^+cy0A3^zvMP7giF`HZ1*q9XN%) z>d;aKwSjM8A7%PFxH(y`!31g`(ybMQRLctps0Wtp$p$)bQ0i(zz>5nYmS8u zmSNCNtlH~;UW!B5v-F2@V-*JLz{>B}hATI2tRMtBwG{7d$3hC!hGW?IXh>g8NIA9Q zTqB8At$_P1Z5PcThR{~f71m*7g%P$i1?RNaa)c06Rccx-ddguT;gp3hujcVraJTIp zvi#ef;Z@9i!8G1OLBDo%Marr+E}b&pM+@3bdoHZinkUZxCN~{eYP3yl{~(;)94}A; z)k7*$+5aKFYP;n{Y=0r}S#e!y_J0(}eh|{03Wo*7%)gO@rG-|@vblegk;{)(=MVly ze(Oa03|Zhds{CA38B@NO-a0BZ8Y%XhW4~S7j}U3UE0X;46EkJ{;aDv`Ka=H$mixQ6 zB0T0>aOXpZqC!s)Yq&-(T`Q!99(@xm#D$(!m3RAO8!Mlp#kVSG9oeOqvvZk;Pjuw> z3nM1?LME|9@v#Sewxo0SF$;Kp!xN$DH0Un7RV%HwFxEbu(-X0$O9oGxJrEg}9&=ST zLu7%OT~@i);GL^>R;?9_o|+n1gU(I%Tg<)5i{9s+dgQS>aB~xBMGIG_eAQ07dBe|U zL*?LPa+QL|m*m_scIr(n+Rtt>Po0(B8(R%EobK1Jm7Z3)OS&s}7hq8>*h)TUpF&S~ z-tK)My7PF=F)h77#-|l7cHU&DKM7EmS6a%7Ees5^JX9d|yk;y2K&~xu%XZUt4LpjK zBzk%}cKH#i^e0b%B)grz9f-`kAp4z2jJ(wuGwQu3Wl!F;T;_2E^)g!s=@X%O#f`m$ELI!-eL5Dh&ubb$A$d8vTjP+}`1zH3I}S z#=d9x3DX7TOYE%e-Wff^F+>!-e_5ywpOGsAiC7L-@zJ5QTny!8);p;axIAKHc`6g{ zW`(tpigI%PiFUBBgpBO^W|P~V^F!k`#{6pix0;-*0aD!cW^KPU7olaBQyVD5K78O) z^Q@;p)X*1yIDxqH`g*j?)I+hH?|eO`*Kq&q{yWnoU|@XgJ4^fsIRD3qWBRc@RN27L z+T;%>&U&JZZ59K{@ME$k#GViMz&HXYG%{&olycc5s9xtmOA_XO^fWN1j5}JonS!Ie~U}-W6j0>|$_Z#Om5}@h2U_$5j*kr<# z3k%U~U1h8pVHjn7{ZybQq#)8q*`ef2oz}?9H(v>!pHTcG`q<)SY5GC(Fj_SU6ND$S zeIKfS-#^^cjG(VfRTR|~c)}Ug1Eo-GIac@;n*kppYzhEn^2H&l(I`01V|3?H0%xtE`GEY($KYV62WzY#69BB9b65z z025k=pel@Qyl<6%eH09_llP(gL7Q*JUaCTO3voi{{yb@iRN8t1-0TR?2xqHisZ=E& zwu-+^`miM%siW!Fb)HgjP++zo&v1_@?HA8U1Q4sxDrB=5?$@7hcekmZ1Lq%r8oPgR zk&V@On;(o9L2CDJ%g*Q0w3kcTwC4?W)hkR`;A+?S7p7kNiJdnbA$JI8;B(Z^24 z|4VrJxOGtpGO`~DFCmZO>x4JFF20(e3JH?_?fFPZA_T5OInBl4Mk}^LmwjN%_Rui{ zfkxXTGJ?YBXQsb4z06SkNXM>aju>)jhGCjiA_u##i}DDd-t6)7&SFyG`y}#(?H@Vv=RW3 z;}+_~5R52f59VwlCJaGRfU9V$q6&gB7$@+l-~24rd)*7JR2v_+G+A#lE3+%OU{UpK zy(YtLsGdg5L|yCrjn_A8Yki^T#8JUS1gMCyAby7|h-Jvfg1XDc7sxVWx4Mp1gv zwq^?c@a4Q~ajk*s9PVsPkkN)5BD;xkTG_$k43}-aFTll2IJ2#5o)p5h?UL_Wt$ZEY zwbK*+xYgC!#v8Il118N#C_DpFYoD;QU3Xj_%U$5;IRIOmrjy}jDE^Q~B@^zzOW#+0 z8~@w1-p@pHB-n7;uTW+`8Rq_Xs?Egd5~b&d)XscJEy7==*1+EWkFoFng!V&XKaMQL zu|I^illU55;i4)L1>tKIwQ?}~RRY$w^-AWq{yN$H)BXKMvQ6#qNTRKv| zN%bV$2O_%g=5H)?cSH)O=6kqDk$WzTgaLrmOJEq-pbs5QtzlLvY+05 zD0Mv+4(APRV#mjA!6llOX`ckhP|VXoDV^eZsHjpK7USUwN5&(wp_YNU7 zXG02-LC2?7L|kD4&^NJZMe@C$s#5wymI}|_=A79e0h#zfn#NylSdSVH!D>BVKCdPO zCD>w6-=GO&2VZu>%Hp0CGPD-Kx)Vza>+=DubuL3ldDv76ACd5V&gs6ecZ>Q4HL&Ko zoVe};FJ3#1&hcVO`nuXJ{H(LHQvpr z>Fvq+>p#{K5HRhBW%R!v+q;-)#OT6adKmX!0*x&wmI0z6={C^znzk`3bnEwQ4vi}SGoBjMd zhu>|!KRIA?{)@xkEWqFKf1m6BL<0au+yKCT&HTT^|32vc6^{84X#5ZSUqi6G6xfG& S0RXTcFQ5+z9TE8B?EeFPjSr9j literal 0 HcmV?d00001 diff --git a/doc/蔡伦_LiteOS阅读泛读报告.docx b/doc/蔡伦_LiteOS阅读泛读报告.docx index 0a783a053357a4ec994b9e271fdba1e3ebf06a04..6bfadf4a5ffcd27543911dbc2e6ae7c4ded2c299 100644 GIT binary patch delta 147939 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 !rk+Vx4vld{YbXZhp>erT^TPS`~93910;qNJe> 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

@y7> zk!b5-FX_tGUPPC5KqO#WpK%8LSa)6Zpgzh#dsv-b6;n9r-Yi45B|9M%yTJWSkan+QpXz-(t;2;@Oh3ajv!rWYRBri+U%v8WcZK#d4NAdj4; zj&7V{4@l~!K4uv@DIYawjn4}DL z)J;e+XVhcxApDLmhMQbMXjtNW*^GYBS6zJb0ArCJdGRNyjE#MeEd5-#X1wkN>jL`HFynVuo z5BQ=Oqyo2xT62G><y@JytdiRb^S zxN|>NqQ0dA=N+Q(m4YM0Lq_!%)imKBO>ZuUsM}cCEsnSRQ{zJK)vMRU0HyL?wL_2l z#15siw;wKVDY6)$SP%Fg^FOKwWXJ{uvmXF6Axa=#%GpA(2T7^^-w>} zDS}#O&DnkXp`0zWeUey3YwE=ModhynkE&jYc#2ilzGT;NbWX*Th*hdoKFq{8wIEM+ zE49GXGVcWPAk-~M{-JAFt?x%A7oK8Mh;}hNfz1TaCl;mA-=un%%l7aLcan17DJzd zvU{=6LzA8BgUs2;BqE>@(&eq#8S~!X&vK@0;Y}L6r>1 zToPlcQaV;#&Jb*zwoEx4GK%T^?+ZHFI2Tfhy!wC6DSv-umDgjPng>rVGW0r{Ol~KT z!!t{{ThY_|Okf(4HmL&_2cZyp2hD@|z`uZ0!HsS%GH(U)Aep6g_)F89U*uF1oQm$4 z*@hsHZ;x+E0p2=ciFZy~BPextCsddz1f><>#Y3h%gq4zO+=!AK%p}AmHN53@ra@yd z)V+Ta2fChZ!^d2aqn0`fL+CFmy4FHYt%w&Kq9F5+1~!;P<6G+jNGpi2^inF8E2d(_ z47O#LM3A{C;`_OreWraLZoZ{#9$98fZeubRhaM~YPRB3#zKl(mWz&~2yK%k&SZq>y>vk;z6ek$nb?%~;cDb(K0y(R*4hj}lM2@1IGn_S38w9~*U?$AGpBVA`3 zf4WBGA{2kl z?GH5%R_QQ;)sTUD69Glapb%P5?lHm(@vtOw{Gg)dLlE+c--u5>^i7y zn7n5p3FLooFh)js1B?P$#efM^iq%Zx8m6ieO(EhagzR$%OpskByc6d#f|aTz03sOP1AoLQWoJUCM1`#a+&k-khyT<^og{k@(FBv$#_gLiGP=6 z+xj)69=a}KER>7K!D9bvR^}is$w7VVF{he@xTy zp-Bcl)lb7G4n@!kEynB0@sMW6u;5}Qv|>u|vPu%3(M-cX;kD57$iaX1pbDr37Gbj+ z6T}+qc-i)su;bqwUV~jmNx1(^JeFu?;bK@BzEETPaF*=@+vlZhUmsLT#%iUc+n(Pg zY`#Tjw_|HFvcw(;!ALOeaAVL?r|E7wf znr80bOvy%Os|%RG$Ps@8@-Wa#gt|{2+N#S(e$VIlwS*v$2dHXl<37d@v+IHeG)-5i zqxlNC1W=dmAQYt`F1K<-F?jcz1atq{$w+n}?--3I_876}#>~AxCd)sSx|ff$O2_Y3 z8C={hJ0FK-7j88Yji0-h!#FSpkDQ8OLM|3d*t}#fTNL1!cQ$_(oQ}mC)IzHk2dQ&$ zSSpz=%jT6nJFuQ5tXxX6?BKeWo@3MHVp%zxK3FznS(<+-m7izxDWqVJe-VCQ;&ci7 zE_+FgOR;76Nmqmq4AStPVLA>4mtmW!2yYwZV4Hn99+zj^W8!mnWHtV}5{p;u%ix+& zjBkuHaVn-7mu!Di@q|G(F8LSWl}j;r_;L!~G{}QlQaLs`<>4R8bo}OBhEq1__}#4l zN8NJqiIxb@U1s8&?Yoph61D|ZVuNlR9=RgI$5#2!imt#$CdR+A%EO;#tn$E)?^*pE zoc77VlNZ>2OOEpvW5>McOf25fNkv}W^h8e~*Bct_dBT4>Y(o9;DT2l><3Rk+uPW^Q z?1%Cxc83%d)o@q3Zxo!SJ;S8H)F24t+d%IV4^|6)@3bvmIbsfz;Ixs(?w@lA0vT|L z&Bd$7EO_fkaGKz2JQMI272=tFCcJf-V*gT0?r=EA!f+B}@v zOoCdospWrtDtet=Ga8uCi(x|b_C_N08=opTM&{vDT_zMQ)9|ExG!wqjcuY-%_w|yo zT15nnybjp=iSevbJXR|wG7%Y%cT6(zi(wL$osGfsI%2H1O2bp~F_2~Jm1WC6p_zvD z4mtSKJQa^$h=z<@4A!V5;%T-HTJ{enc2~3V#ixIw@v>C`bOLhl1p6*^I*N(ias;Im z;SJSfe5fzNJK8CDLn8@q8nW%!WMjQ#ow7`L?hLQQc4HC#a>&A;jyYIwosDyW1$aj> z8f)~kaLF$puP8*}VZ}teV^xTN^a{35Vti|rg`+-&*kqB8pDZ)6C$J2MOp_peCK`{b zitvA04F_i@RfBgw4=)Kk4Xx)1XMxKI}I`?qadT0jN{=I*lv^nDYooz z=XuZ;v18lil8e46ayz&gYE(L47R=LNM`Vug-k@GPQ}+I)nDQ&P>fwP+hRCj*S|5Kp z28t#Ax2D&$g>4j=dIW)d7s$VkVjEI=Pa1#4P5JKU8}nHpQ#h+_`u;pZ1$7?|ZNU_n zUda6-ySxEg_5AS6eq&ydz2p+hUtoi-Q8c=qrjhH^L}L_~ie;O$;WJL(=!qsVzlx9O zr@_aQPd`4@PloiVa4eOJxUET@j=<;cmB^^9hhb>mpnZ&BK33 z*7*pl>p@y}Ikqqn_^oFpe3Q!9v=TVxG{B6BQN@T77^T+3J2DH8o(RKhY+3L0Dk%6A zKuc5)*Wh$4JrRlDd`sahuI1Y@NpFC2NCs9gfxRoJ3@2@pu;fH2q~#NEFr)_I$vIfT z1m!zAiCC);fknqduuL}_jtPZ$^;~~Aq}l#2ITwYUVO2P25Qj&Z2!7Ep7e4uQIBb!? z*Y%jL7#Dq6CHg`b79J19(-wsgmDXdAX#!re$c1ru5jHVl|BGoFj>lF**(x5gr^B(F ziSME_w0(cl@#yI= z$li30huRWmE6+uusDAodIw{MWb8HSiIAaSXx41F+{!>;+a(AQz9A+VDu#L&Xzc(7+ zHBrb!LW!Q%u=hXp9tzL@`Gp{mM+glXqWt#{ZPme1t56iqz)|Xx#e5aWE^)bd{(vby zI%CHpDG1D5XyA;pTRc8JXODlCTXf(UGZ5c=leQ23^{WaWP&tuMMmicfZx@v*DVcuA z=hHeOlgDJ;uJ4DY_Abek$)l>J3r}8(g3QSfEIl21Ta!8&im$w@5S^Njmre&k=28;O zv+A+UC>k#_5ojKtjsF}8!_mY>T(*eB1II$}OGq8UquF^r7KG;<%8-AVUy2XT21Dj@ z20RPP@dXo!Z<&g*&LAFdsI%YRz6fz_p0`ehI2Q?Uss1PKRI#+y5nU;k*TT zuWk(9G7{scUja_I=P-Z4UWzOJIoRf!i_1P)c;##m?q@=Fy?Z(0b4zi^uNaD91yB#j z!_WE&_(VGiyCN!}U=|D6Q*7PLq|ZfTt6wR08%5!n%dvRRGy_^u#aO2si{IQzVHuT! zZ!}}DgzeW$=DDzmU=@q=>^z(r{#*~5EHn4?8p$s;eH2zV@ic$t6n8tNuv$`jXQ&05 z+#6SJ(d7gG$oH4HQyk>UfbMVF2Srx#7RDpZKLmk13g`tCkXFP;%|3s~6b1pJNe^o? z6PRxTnG#s+F%IMch(uTY6lZx87(3L$V;_};#DXgBazPOrw(I-z(e5MhRUQfXRZUpE zQy=>N14%Y!0@QzMe$+CIM^&LD4%E6n6|{Es;svEBNFNWvl9R!=wZ%+;e(g~X#}F}A z9SXp`XCiSbz8X8Nh7KZze1mP$DYS?Dv;d`eX{G$~yaL!HyLF#M-w)mE?XHFE})=I!{c3Ch;t%jma5H|4jc;D1JGnE3_I5-tcH)+EtC{=$D$MY0HAdi8T&Tiu4depZJCX_H{oeT3sR$@0)nJ!d6kfC_gh^}$ z?%97Ih+~NjP-2zSe;x3{k4zxjxyNGBAz!R9D?nsICLUwkkv*FXyZlmo#f0VAw0c;& zC1A}dCZe@75mr!&kC~`lA6N+k9eNU>t?1xAosI>Ds1~pHfnJf5rO%OAdtrajiTSeZgfgALjFkwQ=Be$ zs+bP~nZi~5%@fAxL&ZHFT|INZXJCK6(B0b$!vGNvb4Ftc)@yhnV}iq-O(&wFYTn~P z&!g!ex26qGUkGAC)*G@%eTOv?(4VgiQ4v19;Dgs}iea6Yfq(Du z#-{LEc!Y@X=EWfV5nKaT&uA<>;Dt5jg-A-tz+;EJAS0Iu*OGF4b0&ld>RNv|`m^6w zD;5WXs!&u{i7%KqT<2E-abY>O8pUFRcL}1>^6>KcFq{l6#v#K{EIQ}|*&}R!6_Q~R zD#D7xURZD_0IwIv0#p$9=dM-5pkrLpq^&`eG;(pHcYBwGe^g zV*H^Vig!)Zpz0&WODDasn5}%o`70if7_H4_l0r@V#0vWZ1cq zV(WigTLj&Z9Q?w{mK^cLi&{xg45s+sUU*b14f>%O_)y*-iw=8Z!2ut<*yZ-cyxat%F0(-H{eb& z9Fr}Ospo}4K|Z`qmnSR|nBNEjd7O~jMF@LHekt$3bHE$17jg3x`2I~Lb6FtM?`IJv z=Dx@@4N63mao1yftVc3s;DNQ5WAUp|1Qzc1!0O9!Pz*1` zIqPVAq?dqoY#ylto_J6(20Ki`vGR~7WR8bmy=?+sJnD(n%CWc*S^({!EbL_K-fSC- zXAb&ey9}n#F!naPjPP@UeOXKDZLj=83|mYT@|7 zE)$0SV!U#~9gEp|Ng(S*W#Gk=-gxX{1a^C5;BU4M4_*kzLEk*6d8gqkC4b1U^F_xk zdm?}z?@qg9e5!xo!_K1@6VN{R${`=VX(iaB8_Wc}A2xa9;ka2CWY{t?!<}b3KkV;W zFN*3ib1V7o@p(L5`9>Wd9JdZbMrj?7C4RStiOCembC-n$Abtl8ZpM0(po>_|Jn{{|*%#lJ_5YIY9@`x9M^j*Em zyMrmqCJhjJ_p~)m*-U(rk+D!v-N>VL&_2#2Jku)i)LB0)*zXFdgYJ+ybfZZfaK-(5 zU9p&n(~n*xU-6gcMuP{rd-&m1gDlv3Um8<%awB(0bVX zY@UTokS;syj)nVNaNiym{AZ6B{`N0{xoZRyJY55Koo%pfY+EO`ZQHhOn;8eW&NJ_WnLT^&Nq6dn+gcOpy!9S8iH(+#6WIQIKfDj+ z^lL&asGcyk^#t-Jy+^dLdpE^)?(HD=KIFpllZh4B8jwycOgx=A&&UaRTbY^SH9w{? zuboUfPav4~l%j{ip|xB#UNVaS!mCkrKV5D}Q~Rg`XMfVRV4A}9TcIEkXt2R(OR!mZ z))(5dq1tpZ(r{lKsHQ)3f~Y*CqBaI|_gj#j;7P@+hbJ({u}S}~GP?Nf71RHWcciX> zy#FGPH{PkO{Bl!@w?f=DmLW^x+Q=PqaU0dlT6A4)ECkwi4V)5EWefbBgC(?{#72NLXzwLn@R+IU?`h%`Yn-nYYiQb(hL+%Hq+ip80pc zTr)VV-=g=vaDto!wT{C_l=K#b9(?(Tj6RazsPzk_ULHAU3UYHy15%x{m5G?LE#9Oo zLQX@N&1sZ3y8ZtGJ0kE)F1+tR9uoPB)Wln~ciQdQh0zaRetd{r$^=YyV>K%rm@53M zK`|Hc2=m1tO~g(l>^N(M1F#^CB$*~S69q9rZlg$b;VbkNaA>S3+P@Ldk9ecAhjA}y z#Gj{8cg`#R-slh$s0=bM zSl$q?`<}^>x5=>5lueV=$okEGzvP34PGPgU9R47 zdDvDLlDu~ngygesj=}j=`02gdtc=TN8}|~#mx7cl3|_%v2q73Zvv8-;&GBF)x^2(m zowM;@5&4~*dphnsP9qedtM+;8;58?_M5$b?QYk|f*trvA^5T8z{BbKc zQRlR4{{`H;pA0|+Nd#EbsY4tJjTSAaXn)rz6NNE4P{PFuCG4y&RI|5kPEm#J0%*4u zRvl>A4PiK_Z$OpaNz9Do z%};YqkyP0sFeAc#`oxbyy7yvfy+4^&Bl%9%M}ke&sNX`)^cqN`@l-nZKk9Hhd|UW& zUD_j;R2T=S+Wca0t~M-^|2gpt{T@PnQDH`}`jWAmtuvd^GHo@kyOW~Lup?rhlnoGj zX(&9E*oW*1l#8r%_`P=Rw-8(xUSOIPjZm{(SE8E@!Nk|>nCKlOz_KjHMdx@pkmjy< zkD#FFE|!#Rc@PhsXk0=xd`5l&QmcqXC8AqaHo=l@(y1G-o{;Huv@A{}48=2=6S)pvI_FfNUDs=A@5aA6g0yPydv%C?Nry?sF5n6_|HyUpbRk@ zdMBU*6k+HExCjcV(UG~qQ9*VVi8gl0ek1?WP+HeQL=ybB7Ir13vJI5jp|Y`)@|4V? z)kswJy@H6>rI~a~xcAiR{AfoHC4F#tvknSe-rWtCMAFM!cP{WZJ@_I`3->Ko&*A){ z_bFJQ+VyN$eM(KJZRiuYI`D?2B6rdWbA0KySlEd@8y3Q$Aj}s$bo@wz-pSvFvYS7p z>y{6RjHa#*;-~~_61$-)RK?F9l)`5HgAHjd?rTbBpyy?V)OuJ>5|`ne8-uceFUkWR z6$TUSiV`8a@5o3B_4l!ES|pAbDmD6@Uo=WPf$&%fN8g;x^lkU6*dp+aKv==}C0=EiYAnAvCf8@ueJlfQ17K z@4})O-!Lhe{8KDjD+B3bGqQduW8Jj?8m%YbCj>y%m9R;`_;{>B{jlw2 zxq4MZd;X}4dE>=5+mnG}`ehY6l3%rL*Nr6K-}1L3mBR6cT}Lkho% zkWCEQk@0Pe&!<_w(E%O-JbP;I79LO93Tspa#!)z1r;Z|#P6?%B%T+$GUgE#Ee8Q(Z z*!!DA$}o)~QZA(9h$CCcl)CveG)H&4Vr4(*QhkJl@&p}vE z&jNWV8pOqDq-75c`(XSA2Lz^$467)GP$zC-mSC&H|2quAm-<}#JFD_{O>B~UjDr`9 z%WBr*vIzu#jgnR|TGWL(c99{(eLq*u@Mj8vZtSdu5xRm=@!Glz>r?EEh!eEDJ2pP- zb1#~>?p&7C31{gI+T1rE&92iPf=xnJHg+|h9$!@hv zi1Ja&s{to}1b(He>xFg2dA1g6FSR#&nrw&WY%2J%?>T`ACx$&SpYmf4biGM?0#^`f zo^vhtU}skrA>kSKG{KH5O&mCavAgYlNY<`zAwyY)GzCk5om6Zv;k& z?(@Dd^MF#p4#GFPkFP)zxHGC^F4+hXk~8Mt@&u@>X`lE4%pMn(t}76P!BvXL6}oa;$+?X3kt1BPY>sD&q0|TyI|36os*zVUwKoRjQj^-?xUnJ?Vp8} zO?XEz2Gh^q^YdE?ccm8N-Ie5hw_P_^E_E?!uDCyc=bP<)f!rvtS<3pn_uZMIC*Hsx zKP!Gz<;GXi7Yz4a_Opc4F#e`i!%kqtETs&8TmLh>nZ;|Yqrh<8_aD0I1|~=i9a>KF ziNi;!PSAMmrr;3WG%?nZ8W2>k6bV3YX-cdd7IN3d9?p;;kN z({R;WmqX{()%jXV_j(xv`Qc33IC#U^xJ#fr(C?eE0teSa$o2V|lxARqlvRuJ(_=}L zv*&QV+dZ_$g5BkBab~RfLz)cJX8Qm890;-LDuoRL>t zL|YNO4o2>c9Mzs-bmqRnp*DAEWZbC36S3>nXIw*on23VI1xRy@nl*yTq@>q=J}^t z2@7|U3(22**x7OSA=0r*a}n}Z^u)oKW~qYn!@o=lQ+{Yc6=yGmHXd5UGM<|qGfKdx z4F61-ttTQy)FrBM8>GXB>uoV7$b#@cfgbm_A^R3!$0j^9_T6@_f;C{RXzEMq=#p(;&vwGyUQo9 z7Q{ep$uW{Kg$L71ap9WS9iLj*{Oz^vB#`(!;oZmTinbE8UAn^mQHU>LbT_TZUOkf z43s-5F}n^7&Fy(7@$wB~RqEXHD9AZ{{GY2UaPKwK5@> zCiUQ+;pS0V_UhgSC&W>PCahClSCtj~8eFl^sMK zJ&qPQ)Z#J4>-;h^PWM$ZSP~^&ALc{FWQc@0YTjFJ)Om4{3rBp17pB6Q7cn_&G~h6k z*Vxoo73n9E;{s1&LSAUUl{m$Hsy|zbO4A&box&!4v}Fh1_+h;Tac2Cp%EoSUppe&J z4Y!@^Z#`l1=wpxvd*IfURWa}~JMzvMO}}Ur>bARoEK6;4pc9W4RP*lVT+H(!x2G9H1pd=zQg~`wV@(BvB20XoNRT;;rTrH^7pi_0pKFuOf|fmoVi% z!c9=<6#P`Lt|p(`$*V4DNb4#c;@1rd>AM*1wy4U>rAVC!-luqDroRzFsJO#G{fVAK zq~^!%aEpVpET=Gv8U+C^5A*jWC0XiBm;Sih_z329c%--P(45yO*#|$th5}yri*@ zPzD#&VPz5FEwDGvL?8XN4)1Upa#wRRx;~3=jo)9qa4Uk~@gf(zv6`II$X39O77liS z5~%EeQ8f!$2z+EvlKkoSlh~m;Zi2o@XEkku8j*aJ%A-Y&rFxW6mfrh2T!UQ3MtW$! z-m7VFuhK(y6Un zIRe3oa!!g5$Ey_F^c7~pUwhoSGX!cGn7GQ%gCyhrxtfJ>ki9|3O1Hf<9YIt*fS)`&PS*8&J(Hz&X4{|4cx1sr25%S_N$6CyZ{e3}Zn!pJCfO+yr@{^=(M z4#h+v-4{{)rC}xh6)^H0`%E%9DMTt!nPn8hD0v_BZth-TdDSqFQ7|{kNipI6kfmi5 z?$kZ#DB4Hhc~69hh3_oH#VZ?$F+#TjmQIlix?kAn8BiO`DY1=RPPvg zE6H{}{0bhjmU7rW`U-Sj7*x!APm_A&Y)Kpg_Xzv4zq$4&hKb1?kA&5@j^Z{ zg;fJ^YM|Qod|2M7M?vd^RERC@@ayup%Y{T29~Rv7!LAlx;LrA-l2gngXx9bJqcyVA z<|Kve)UB^)*yD%b;B{sYn)AX4sH`6WL5P)2)c*YUo-jw*0mE;G_`O3SRP7VGNNn!1 z?iz#=jHY>a#AuwF@{^Mau^H)UsajI6#r%12UJ-=z5A2*={=w?dxcC*BSS0BVJKQ;j z+cdQ#CK+dc1TNxmbB6=O5h|Vax~Tz}4fyJ>gk~|496dv&=EU0Jqkk0m{GcTlg>l6@ zQBKe7#rg6pukcZ0_;fmdY#Y;(v5~7;WCFD8Sp2<&o0}Hv zu=7e8D-%Sy*`mfP$4U7y^{S$jEvCX!JqXl2w+|wgFI0Gqllf$@(4#V*fp}nm1b}wm zWYc$kEom28XI~xF(Ss57NC`q=Y&OzGj4)ku-(6}I>qH6C zEWhBBbOKdorp<0%($cgnczKU}QZ$`NH3cRqK4*c<4Sn(Ztbe{bHuQqP- zvSL`}2y(Un!Bj)7u=L~ghhZ>g4s%XS-a2JG$1kBmfw7gH>!+AC9HM4 z+*L0T5q3p$efj{t4)ed79}P%p3-T{ROb8}lapag>Ps*BVnmJ4GB^|!wo#j%;R;MQZ zw1MQO;DA|)g4+N7qmE!@z(Q)P_DlT}8FM?ayfzdw56OjfsS`$`a2Ob8HT?G~9?lRo zm`p-aRh6~N&(V!EK7P`Sz%bsT?^K&gD#2}>2KKFBSkB3;p{kGv3tg9A| zRXf@-(~U2Ap1pPXSugAmkO$6(QdOj&LHJzRSWPxZIH=t z2UF63QyAt~m7}D`N4l@qVrZXlV^l;9h=}y{1<^2MQ@*qv(||y=NtMsfWpT`!T8rT& zCf1OU8S)k(IDML41HXi$)qE0&p2^lGEY!$Ov`~8XzK;0eV2y!&eDQ}tIR?XwV-Ly1 z&J<)}uPCnKSN7Lp>Xs)c?gHH#8|n)p@5(>7mOY)d9_@beXbMb%9FBXTf`x_cE-pGP z$Eh0e)QvUaT%4uOWDRxk@>~(ecjlym4Q)xg0{{3i-W!DnaRRvE4M1ov6f}d}h(-3P zl{7XQozp@*Gy}V{iVy$!}g_fo|Y< zy+dTEQ`46OMp;mUJ!V08Uo026WwAQpm52d+&l2z!FfU6+!^^{NX!e1OJhnnQoCiN( zitOj?6UH>oVW*myg-Eh;+%YCjkpyP3e6v$;K=dY6Y?bnsBj7eLLAxpA^s zy65-<5es>b63}+6!?VAUFe|hlQL4zK+Qnt)rpz?_uU7LUVhO3nHOYz{6R{@WKWF|Q zFb0#w2oka#P)U1YUzbA$`D}+FL4(VRmoSC{dxbNoQ>T6#bfB$IG7AVnrQd|(k$Er> z{zv@+^;!uPv?f>#x(9tsQHEXBab5_7I8})lSyb^rn;W^nJQ2d}5%?7S@R`O8_@E!B zFIwL^gj|#ic7!|pV&OM(@2Y$)Pr50*pjN%;$||t;@BLf+_w?IG_%uffYB2U|K`-Uw zUujN?$S?iV|NS|9#DemK(g zXrf;fB1|0M-;9;4a=+5L0)~#vaNS8zvLu%l6fhj#C+Z1!6%Z9%KL!rm9Id_iubsL2cKypi!(|J#}diTCvZA_a>_ z7AOFaD>0AU_o9I2cm)vgqk9N)?2R0QR2XO)%+(I!po(3pSDsFMxQaU|M6O1!%IIOj zcvh@?gFbmVF!MKz0LNnp?IdTldxgUi4tglZKlqFVi%Et-EQM>%k&?#)@7?Xy4{f;* zqew~Q{|Vlo@?p!gs*MoYfQZc5*w-@;z`tqH^lpb2ZTCaZ(YlT%dWJ>*UrC-r=^!^J=+zep&or!%XD=NlSt9qjc z%@LJPX?mc&@#t3`4USJJF0l~mor^rFd&a`qBIA*vOr7|#AS{yNdmRj1Q>g6x zWq87n_izqJ0cVZ;s>~t=!y~O1dEBGq_o?zkpH*4qC)s4`JgyM@(|>kKS{kmRoFrpD zq`t|?X3u{UA|m7c6kr3S=-4`YXF`b6PEqO7>H>Cz{mQpDF_sK49OAu(4=(TT;gt0q zV=0VA-}*0rQx3UGSLZljeh*gr?@a_d_?3RMH?#VXgYmF5q(#e?tQ+NG$mv6Z-;7K8 zB_d?Ft=IL+JoK|^jL+@ou#tf}vxx;xZ;HM&tA8OCwj6W)@mb)Gu=UV^n&$bdlP_~_ zLTUq(G($;YHYILJS+Ww>qMgh2Adj%9P@5#F{A;@^D%Uckf9hsDEVy>{W>7%e*D7mv zrnca}E}2!BVeDMp;n_Fc%lU&ovlwT~n->hY@+}!M&AMOwJo#v!D14J%)XV>2=llSU z)NNRP?vZ8So*G}}gj-FqxN@dZj1lisKJ@Lp{e4_srH_$Y{4oyRpWy1K!e$J_I@?9G z$EUNms+*mo^8^)7@V>s{fq96Q$B}&lz5M)_9F{O8HPwVHRm_wzCtM1f=ZN_!j#Uik z=6+{(1eKxlF{UP~7M4OjyQGI^8IZ_0gAkO9JO73GR#bWyuG7Nf$U!$s$tht>y~$n) zxtnkEf_{=O9zf4-D&|x7cC7j+i^6CQ>bv(N8F@qcmyC1fze^rFTdTbE%rB6<8te1XTQU%SKv|EL z&995uU!J|PUqN{+8vpy zKv`AW_xYLSZ^hn!97=NR6)G`(S!Rim9`W$fB&tK**<3^f=~{B$v@g*RWgg~v^uTUX zb4L&nz77RSzUsme^GE1t+5ciAJxh(@I04uB9Rh^lFElX@7`5~q<-i^xz$?*krN4t? zt?3Fk9V3_a<50|{q2$qWU@WuMi_4|VsMMZCgpt}#U-#0S{|NQqCp}fgNB6%J7baBK zdKBUSB>fqpm#XPW?1gqpvQ~IBmxZu`V5(oT{QW+a2v*?~x5O5ZuYuBdpgCi+D>7hP zcYACz6EON1?j!ljnw<0A;N4~=Zh@7w)ZP!fQEJiA$;QFLbgh0%7>w8jmTO4b*>4}p zREILRfY_~2*lf^H97YCB7!J@C`d=8_ZG>FrP;>QQQES4;AXyVo^HK!NYE(Ga3mek6 z?A$5;>bOvm50=>>6u|;602~BHoSWC;$wiTTh$=uq%VGD$> zw=4~?Q*7yfkA__q_U*@>tY4}V@ECvYun*6eN&QEO;)jSkSBKk`i#QTrk<$cpmbwhm4Zw6GU`(s0a?brJmoReVMFkw4Vfo#)Z}zsK_Cvi1Jn9k$bD-!3NTlcjGjcW zMVt&R-9#fnbnWe46@_&G#Xal48TLs#4P zO44_d#$uaVAH4$uvlHwXuy^43L>X@&Zrqd!t`BOqvt_-AUa4pI6Gcn}`o=7Nv_}VJ zEj~RJnfu$Yv52m(bzkw~8Gd=@s>oYVf8*+L-^46AqweuwTeSnsWL&?2{B9cwN@>QW z9e99^Z;-Owi+MXhV7Mk@rDUKG6gD9aoI~O}qzadknD(<_OpZv(+jLpbky#A#$Yr9&HI)AzEY zsPNxJhRQg`7Pkaga~b6L@`=6=4`n4SXxh%fboN)$>WiT`Tu)?0`X)pDrhiQ6a&@MU zYwXS>gJns7bv1CLN#dQHvZ{H=mO+4%L>ap8`0lvWoLQu+@D;2j8AY;vch~Xl*)F8m zHvmbed-}z9AlFpa5NtAMfT2MHHmaL1yaRV-EH+PVR$xmGeu5YcU1V0eBQa=8JfcL% z??N%`RZ`X$?Fk>QpMyzK!^4)MWztWV>6K9hI`ifLj@mY8z+`Fg)6ZO(IPggRL6xjk z)@_&r6=)0Vj;g{p=J)pJx?Xf`-=T(L5}vaj_ zk%s!^m)R!7q7ChR%?*Vh3(dHc++aK7IJ8>WkDtB_RcA%)Z@>BwMZ2{QR8t6@ZtF)1 zLj{OY>c`e&VU3aA~jY-rw?32H>T@z}4p6Yi9%n369kbK{s)zg2_yuMxW|2P$J8+ zxbM`rY%#gW>te#}rTspN5mI_M7Fg}WCc+A(u`x~xceLE*nPNX9!z*Fnsy zhTgqo;MXqobmL^J$)f?q%16)a%tcWscoPH88Em1x!STFv0Mw^3jpv1E znI&1RfKkDqkQ7rchtL7Wxa6%o%kKIM-9oISS5|7UVrYi(LMU&Fp+!U%Z$J(@A=-nQ zt_NVrf;+}E)FFqL^Qy(&=2>)jjeX%?u$h9>yIZjEiBg@>weIhDWjewRX06qrFAP?h z)fBfvJ;E<*!2jJto}XYwRz||V+1br-^(leia&G4B2_0*`#%ta(niKaBWZc$|b?krZR^hJoFD13+R`i2lTSj2%wrZ0mIM04hWSqk?Bt;mn z(JGl@G}WWESD*Vc5Z}Glod*v#5S2vFsJ+LTi1e{DfLu!?^yr7~=E53J-zf~2MMy?H zn(Bh1RIjR|Dez>M-*3^a=BNc&l)! z>R`Ys5P*m%->1uADObxWllv{iY5)yY!f>A3%^ z8q4LY@XMr3(iKXB%q`xaZ)i?K@&deij>FH>9-p?}hX?uo|&9mg~N9zfLMEoyzj_;^*4&~+pw`#R&n3mL7Nr!|@N_C$Y zmrqidZO0e`sYx{$pq@HZ$hWy!M|iG*PGnngSDo*u&P(m!Vv|ER=#Zq0HW*BLk}d{{ zg#G5S^fWM+y_L!n21PiAcox3nEpc<5G&&T2AYPVrIEK1T`G~q_YAXn=2To0ok$Vmr zz4ryO7ms@p*{$H;lr203+R|8i2BlC#eJ*>u;n+#jSo|9JfL$*yKrXyE|3^RXlk?N;rHHBOZhrPdmNRjJvoSZ z#KfdKF^U*hN7YU7%D9HYnIN^+6E^MGXOOHKgXm`S58B z=sV(wNcSKU>TMDGsBF~SA#RuVTihxIGBnIAlSxh&btR+UK6$km3y@e)BQqaB3Dc+R zaU3BAc7^NJL(7A?$8+=#PAK>Cnr}73n2cP(b-v(5+3!Vz)zJU|63MZ5@BX8VusnX?ys|cCUC`F{ijL!fJlcWV@5ybhr2P@Az)u68VcQ zN79q}u?3+HL&9x@G6d$-2Cc9YacBSE`l|s+aAzE1l}Ofo5c+t8n(AgY9^RM-W zh*=EfVmjmm92X79f}*P*Cd4iuX<#B})x5eB`$sRk5v`Ke^DFnUF-VmDibg9}P`gCP zQ4#@qRs1VeDuTj7$R4^5;TXI+6SR$pIRSOg@?$3y z&5a6Eho$1ST`p>vkeoW;7M};bS5nutW=S0Tv#Y692vG^Nv@gawC+NP;316UixAemA7x~LF%{lS1`0}n&Yi-D1x@7j2G}Zq8TQVM*eX8h zz3$r&bU1x88_D%}I;|B-0IG_uIev|E zE*cyX>r5QliYYaIslZMafK2E=l)RL6z`)V-5CL(V>^EHuzBo;E^2rq?MKBqX2Ac+m zBsaYMdT>0t4HC&60AD+GRv~-1kF%37>UCmcC5U$DN(|8=%^ArLOc7G_)E0)XGAr)p zs)fd|4x97Wr7*Vxf?C(}@;&AQA!3io;cJr-KD&&F$K=izBTfQV!XvW;X$GA}=ZWUm zqGi@lV;Sl`EqP!9Q=DE&da|N<#ftEL^iQ$I#S&hVf;7j6+r${JlH1}3GU(hcX?BL96aW1nHDWY54r7AL?c&iA z7XU>Uzl-{wlmTUBdfdV#>_-nbKaa0duUlD|(LNJ}=j|*ES}kBwOliop;XJ~5M$(!f z`6X3e)ePuA;JHf45d3G`#G7n5=!yxasMHQThz27`5gNCHag^7{0KX!ns!hVaUs>h z!u7KSqz>aS#~%KS6d6`aypmX9(&$}6oS&>H4w#j3Od^k&Hkh1X%o3POpMc=h#`^Qb z;U324v2oiY1 zdXII($;oGW0QTwG%8EMEc=47l-!!`JEw~DCP5Nk$vCPS?LfbN5Uf@t-s&P&{artCj z06d3EoU-&)uE!}O=04e?P4sqc*EoLY$-)Wf#K7cpT_n&A;nKugtH|zA=Ue2!+T0&y zZ+n@@Sbo3Q=UnK(msT zs&(mr{N3-lsDDYK9y1d?68h##F zVTaO_60`}=RD`z!_d^+@IhJXnDvR{4|DsWj)ZsoojS|?0aaeqcN~p8|^7RGmpf{}D zFVG1IwwKu>j|k$EJ~2ZvT*b6WI4Zqq^&}v*{#W9ID8h}t$7w@)RwXZk= z&twyR$2f)DQ-vKzJB{Qv!H;t7Kzm?JQ_S0mw->67xng3mujyje+w9S_hNB%NY=EKX zM^D1DuMt$77v4fn&G%dL)8jbU;=Oia_=BKL6yZV^l$-y2y#SnS zK_JQ9KZaumNXZ{IE0*2?_BPo)%bZzQ6X58q58X)^S&_|VZV}C^0@fpEb9R8OpWzBq zN;TE-2;qL7DqR|MFo_e&3kR+ec`>@dahMo80QK1?&X@_&lzi8X`l&ki*QIA&Nf^sa zl~G#qSc@*J5P_)s3u@HG2(}(BkHiE6NR>^zi@g?id*G{H2oGp-A9gJYZy+`9xFK`s zb|=)qPugZL_de|f{Idf3I1Dh@C_|RHn$VkFX^qT%m{1d{Mo&-*Bh9_qPl+>uEtMOX;Zl`?kuVFBb`Lt#yOI=nIMc}IW+n0 zN#Jk9nEj`ZpHq4<>>A;066w2_rw!iGKE&t4aEJHei}=ew zAL9*qg{KsrIO1e;kib)XyCTmh5?&NECJ-jlhpjuGaXIZG5HfM}|#r$33tmLuWd7n_JZGjXHu2sEBR-Lpq#;>C_O)F@XvrPqpsyHFXmy@uM7at72&v7= zBn3jWZ1*4ZKH-88MqRgG`CRi8d0EDG#pK9Y1mbV9Jh0pT;7Du>6kf)N0%pZ~+7)ax z)e$#egV`md{Qd3=L_a9;phk*?g8aeM&AO`2243T6ta-MBWPGGx{NX*UEx(|; zqEIOFBeiDv;i4yt_hQ1)lWd!*G%+6ExV`g^SK_2mt7JHfnO8L}?vzd0&jEBtBxOw= z38+Gt0F1?n1VEK&D2186@dGD##JkuTl=QuvfGKvhos+Ef;;92>i#L2e^|6 zl$<@`P;+1oN|?L&W}wHsth4e_08F1sC%;nf3-;xHspoWLba(#sd~pxZ!!r-a&#GW} zYOH_|2HX3Uwgethp4x9a{|R{!Uy#0`EsBafTr!_<7p1ugA`hH)bsEk3oSqP+?t^lO zJk*$oFyBCYU-BD0VoXZ|Y?h%BYwC?zTx5de-y-+EtB+bl$6hFk6vV^!iJJ z`4wmmnga-B7Rmj{Us;L9EkQKF$073Iek6`>^z%=OmQ$}51LmZ1?B*&PrhfCJ=kIs! zQnZlImyaXQEV*mI7^xAs_uF1a8dRb&3;ul5tUAvHa?q%?7eCg_!Sf6G0&5n zV(W9`Aiht6r8VvgY&i%|`LlC$O3}{$!X&p-pGk7nD5|?ZQvKnv#=1BK5=#M#HnhjJ zsLE`Pw2N4vH)jME-9!z@{y}>kccQ{~@S2ffIrqga-2C)nwwV_AEONfr+MtrXv*1y` ze~HW%V>x=}r8&w#qw^e4Km`mJ$i5b@pp#P!zAW6R45AK&nvb|zTM_{da8X5>#YPBzY$CdVwOyRg{yvEZ=tbpniy4$Kg19bxV*3M5n!E%5NS^q(%9a60`gW zbD-zpQm8Av(mdpQGIkT8naUP_*!JF=P}UGH`7xbVGp4ok2vgw}cR5yKR!6EKy07rv z+>&ITsbGYQG7-Ob3A&Z__@*r~Y_u;3BcL4#J!w1%W->gyzs)7%PTA_vApWbQlLo2% zqs46}!#=-b3wV<*{KOM%iN;xBG&rD6%(UQY(;L~dZv!K#$Vk%ClbTK}ytfw?rR5;E zz`zOJ*0>8f7|5;^YwWDVfw_8b4^1p%6RJc6!P|B~Nx4-LsgT+9py)3PUA6U#h?b>p zY|7RMz+Y%OTwBh{*L(Ao$a;q`Z7?Vss%N->$7BdF=o&J~5EJ^YjHkfTgq4NjDl{zv zJmEV$FgjqbZV}&ZIhNWiB@BF|R%ViEmtK%P8A+=_&(q&FQ|jr=C)Ab1Gz70M;mg2MHZfONchE&;9i@zU3_)Ya?@*I$Sy<3GiMxa{J8 za|&2>Ko&*o&m%E^n^=3`-?W0syr=Q5?W8Qfh*K2`?+qM3noV_>PmIVBe~%w9(4iTb zgl$*ee{X6D@k>Nlj(QWm?K3Ct)4T(p90BeM{bgfzA--~?_oIvqdw!+^w!3`mK6qEY zW8dxvUJOK04V^UImiS?IjGs;x%X8!xeUg8ENbPDqx&@Wl5Gqy|rWbimw7d8-y0u_dDEKS>N9W;gZ+^HhQ}E05l$v8WW}H zglZz{5_h6UJuC>O2P;s9P3sW;67b(V6YQ+E(p^e9g;8X|R;YImO5I_vVe@)MV8QWB zOYh=wYKk2jlHGE!X~3{ra8mD8BV6n zH9}@g_Cz-;_(Osjdyk*eH>G$S4ghFI1hmn(zRwn3WQK#qK*CFMRv?B^fRyGoOON{O z#6h4lu9EdPFoL};U*-<+!3m&CEG9Zz(U=H0jsA_QqzFFL%RvGjCjhXe;~U#$*CEgc zeA3Iq831G9{1TV0Et#-2N8)kWj+7V=9R#C>vxzb-J}FyyfL+J16|9SqsUNkqa;q0O zNb-CMZXDSceoEawCtKrFc1VG`+ObclfFr)G34yM)K-8D^IixS9E@K@c#oM?b1pt_pDPCRo!h){WQeBk?c>1uogPkAz|CHy=C zBcK=p>9tIS%EFhh@k8?NV`dLAVv_F@VS#_D1-LSltsJF^v04!_$)62)GDh)zxku>I z(NH8JyH1OzRqe1?P$6PkGf#@TxZXEzOWkH(+fs@LT<_b0en7S5$xvQBb%_{3Z+O zLj;#h-xbxrS<+PjC1cM2BF+gvSKu{}F3j^XXXCl~V;M5RM^D_Ls?`kBaQY(5IqUtM z$>!wvwoK*aCLQf?OM3iUPs`LI__8r&diW=bf!eb|X6CdAaL7eAGjhai!oB&(1@-@n zD+XXO9GN5_B9v8IsftF66=aFwnRByIGldIT=d zBz%x3^{-22Jm)cS_bTs430;mdeN2;H(u^pk_m$~o?N7iBJfwJEQ zFQIp;XTmIx(xT3%NILqbNSEcd8|y~0AtVCs!+|-D36oWy{~7iz#?26}IAG%213pY4 z`~l72skIG4&WeS<;QQN_@R`}5VGb#}DbpMd)w2Z1xvmuN!oCkRn)2OGj?Pm<2jY(c z-W_MZX!=2KsUyJSD$*HPF>9fi=%)>u-W0Q}r}|%?&C3WxW1tEQnLptT3DeoC!1ClZ z0lKZ7z#_T|Va#22M#zd7*SpJ#CH`;=pJZVRSb0ykE^8mii-xE8!70>Gn;n270mO7b z=>PyAATSi>*?2gB&gB9;30DX)>GofRJ9GMNE*3y_8;20aytr#y7SV2=3gRJ;rO|#* z^V@mn>!x3jDInOjw#jsP;zrPjMQJE*gG7VL^MA%h_jh?+zrlA&r%YgQyil&FWiT#R zvsstbYj*m&gu&d(x29DcZ8xdLS+&w5-ouTD@YOK1k8Q4$Js_a6u?>Wb0^mtT65ELZ z>_unAEgrt@@Ur>GIuH314kLvwX?R2q0Q$Os{$LUtJ)g}-!=sUqRtq)?1D~-OTB1S6 zIUKPPUnT`$q#=KtwrMMticqf-7FT20xUXyvPvoSf__Mbzza6GUSwN>@-)JIes=?cj zSCinUbZqK1$0$^R0|4h)75aSl9`jkhdg62)V$T;?7VP)@YoG&iy!8b6ed~|u#Qhn< zRP(1cf$VX2JzTl?&aUPDiA)!@@|@cGITaKPy@4!xmHOY|Scrax0q2Bgzu;)@t;RCV zJxA~NlMJNeVNi%wYJq(cq2%=6XSJ*TvG56ezF-acc#{A1s}acl6AH$R=lvwrX;Lq? zcIHns9K56X*0j8n213176umva`KH?Wt8#{f8bG4!_aA98P~@r{@B@Uu0aY!T$!|!4 z2<~}tRmLf`e!P`GQqiY)o0)cc*xw>91<)J1DRnEh*`DxW4#;)9c+i=kFfn!;Xmi5> zZ$=Q$pYio&iWPx9n$W2itzyExUTsQQ|4!@FxH}SK0{iE&Kyt-Ek%Fqrn;Jf(4?ngd zyF4Ch#@-9bI{2U~ zjv!7tv>iC`Oal*ki2kZ_@Jx+Y6J2NLK}ddPi!0%j4Un4A(Bf)&tzb-@2nKqB|5jin zdNA8|L*95g$EViBsEaoz60FWPj^~CTB3vOR746W=;%k;fNg8g32==HWw#_K_8@#)(DD)~)ij$i2t zG7!@MR6iy(T}AiEj@;6BeUD;+5zX?YW!eJ7T_8?!6Kjyh5D={asxpYU&686VMDmf+bx72MKQ)qTL6_VDac1H z!hE;#1a-rqM;aT7S^J99tZ`K71Or)p`0&i-I~F*i{Q)iK=lW@+vQ9g^wE68s zM5y5o&PR&MX%DUzQ+JTWmRCm;3ma?O-pb z`+IoAb2Ut8Ch9DHsV1WI`Gs4b(BN9Uol}a2aHoA>T^#85kDF7Es_f$tzNp(%K>4^s z&-2PRp*2wgz@wcL8Nv1qPze_0t<0)j@#1yqXlc10)n;?Tp@&=P5G`2tQ41vy$>Za* zka?}JL|>+*;k~jC1>g>w728r_1aX-gZ2Se zj^bR9h4_eT-%1( z%eS8{gEJb*mxUoMS$Hk+E26IwrR8#y)Q zcvAM?*$6zsMTWGfHkzgb#txz`Sw;SrM&I{*tj;w@2>7C#S1=w*PDcA6pDyDUVfOFz zf#2s1Xr+MN62qI0%<~j~#?X9Q{52g5SWoC8Pvt-$&epiY6T+Q9&?lBi{r)3u7O-A( z0*7fKNb`O87uXSIkhR9OR<>Il@~TXtet4V#)q?-F8qY3*PmUL!DvR*%{x#5S)WdD! zv3Mfi%S-;ERDny8N1%RY<>}rw2Yv(OAwoM|Qcvxw=X`q$V=_pO%+6uryx0DRW+sqU zSa4D0J!@tLzn8JBkvvV=@?W)?wQ&9GmOwrC1+9jB+I%GAV`B*x;j-%0uqfAC;x_^n&iNUk@F2e4Cx6^MX7_QlFe!gk0K3f)$cL$3$k z-w#_~ksMt$xOnZ`@U?%vOv@HXFM>*nb)xUnQ@GI9;AFKsTqL^_i$hDh*@~=m%T1#A zeZ8B8GAgaE0cWMPrn2svIIY{U0u(>QBiA?I$cux@O*7|F+I~YwK)kA7WDUt!mjdmX z8bt2D1eM8&HZ8o!%yo5NYx*QPJ3qAO|Inp7AMm!aJ0xkgXT-z2E2pPWD&*2k( z>r}lx=zvliQp6a1IKW^{TJ+!l_-&D((7D6Yv00G0-1cn?e=1q#Arv27{o;~A}Cr=55mFblfF+xnVtB;ILld%Am>*rrL!Rlce_LWG7a zs>i-GDEbt%n~4YwS{(gE&hcJuY^F68?#XMhZYR>vVU<}3R%j#Q;^lcP{7g)^+X&m$ zit7ULZKkXS{!IE9;o$dEVN_32(sUHy$@Ns1oq=~FAVNtPWv>gbfNE8Id@Y*gFAH7~ z_L?zzjPnt{745En0}HXy*{Tip@{Vm9LgwZ3>^fA^%Tm{kjh|ZDx(hCHiJ44InNvHBRBSAQ9^1`?D7AhkL2h>6dS5$S$l$KKn=LB^A%H) zA-ZXwY!EWh_rGQifJeV!Ij8GvurcK}@tIX;&BmnHah?tSix({kZJVT*ap2<+;!9_8 z2JSqdXmASv&x&5tn;2e8v6X-G`FTfE_n=0IbotKi>|hX;v;&6TRgcR%uw~FWL~d88 z!8KfhskFvJUJgCBNRFGT`ChdL=+#3y#op=`wN{eCiF3FWoCdAW$=j{9Cs!$`tcDn&;<*&*;l`gVBkp*~`hPiWZjXjW0WgzDt@=5@&O1SYXwX)!cQ!P zedc)mi16H%?{dMn^M^=Esp-PDAx}2@r#_@4cjTB@fCjb!i?#Gmh9+$0_s4Lk5MlRG zsIn-DIoW+%_98~Cbj6N#2r9pGBQc0NgAG~thx!YaIRqw2)KR-d#&K<+aekp4QD~10 zT9)-Ur~}WWv+s?NzoQ#RfP)?nAj*&w5x}EJ-U+H};^Ru=5 z21LYkh4JcM000iZveIerzESwF&-L$y132e&*`a>FInn~Mae>MlF&Kz)QkMI!E}G?*^qWyCZq8_ov{<#vzGR8+9(cGPXo-+j|8xR1BOZ~019`_7D#O#~I#KO338Hg(zYLtl%Qg(U7^Y7=V8R6s|Ad?`2&7o$yndbMsD{%d}#Ms ziMl68EhO1KLJHZf4neNNzLigCP>g5oT#hr^yECiftE zAMUFM#T|Cd8MB_31Yn{LjqZ!$sXZ+fWL*yRe`4Y9>?D3Hw&XiX6l6{Hy9t?(3OC0? zfz@#88aL9j-G=2lOYdRazeL0GZ!J_s%HBRdz1@ji9DWkKr|gkAm%+3o7zkdzm4J|$ zN4vgLtr1vGCjnp)0iJxbkH1`cA#^V<&sZWxD^ry-{L8YIT_@=<*aVL^YGl#M$V0Wa zmw9NAd9_jq*o0kJOE6Szt=`MABu9=a1E8b+C|6kB7#X;?8KFmO;#Srm=DCG-P`y(0 zh&H;6 zwSKBNbqh^NSD4*5Dl_1Uzyx9l?Og?aP}6-?xz*xJ)bLui-&&L+BIsyc_)wloA-WwirfZf%6o9Z8HOu!g;9|&+ZGfs_OG|#Xm6i4H^@~nwD1~0@L^s=#-sI$6=>}5%Ef)0A|pWQ_J zkdDofc~aR5EkZB*UsXC3k`qERPAm3|dK+wB;6{7(0ZFRHG5^T$87`LwAsw1V?E zFltzSygY1FrY(<#(1`>NsWN?5j0xA|y-3qQ?~M+LD*e(;OQii9z|3&t;$KO9LJ$PR zq35$T^f?dfk42ps4=Q*4v(^9_@#Q*pN>` zx$p9N=M501AW10x-m)R6M10?~r-L5%gqqWrF|_WL+1qJ@D&+82#>i_viecA9_0bH0 zL1YHS4brUCI!Z$s-575@et!r+ei?W-q{S3A1(P!!uyzEv)e0Ywo#cR<_j@xH%=sGc z2N#|=dG>_Gb7@XW_edXxgwGln@I7=kCn>utF2rdt1W*NTX>CMB?NF+bp+l}4Pc_M; zG#CWMdXb3#vO-9V++e&M(Je|u9NQ9j13)a;s`Z;?NVjV16?F@fG3z~;)F&=C4d-4C z4fAGWu?HJUl3fe$ZzF&8FdVi-Sd*s#Oq2#$_qq{A7i{ z=28|0(J@D#&sOcV(3f>#FBu^HpqTLKV|ZON**&}ax7_t0%v5DOwwlM*BwYDxzvrUN zURKOLnlYJIInJe+Be(PPr1?>ci=#k>KrQU&Tf6)Q&%ukFmZ{iKot66^=aup@L(K=|o2{x;2VZw~iAyZ)}NU4HEC|3d4CvpzePh`u*&|A(x|m9*s~Kj~!23OUIzmIcwD}q0 zj{$Tnw!U}@8#h&l2$ru(1PHv0wV0nir?MJFBBB)ogig>-HRaT!7-6=Pmm)41ri85O@!VoL_Wuho>`U_Hn4_y ztD|ezd-@;fqI9*(y(<*#7Hp(6DI3_9W%`z5aaAkFNmBmS&FrgDpeomZ^j~$19gWPI z^*7XP9#j*cq!Z79qx|(Jb3D%+7sJ@FKo@wYUh;r@cM_K*Cglu`!GY#W~Ab|XG z0Z1?AV##cr0atW42rw}h$|aJVmCk)>tev9$LlA)s<;+i%UBz)i^zRC!>vkzhL7={X z8Cub1EmE5k`spRQ{sc-~K!TYqJXKnslU!+Pz;y8r#!~lcxb9S}Dl>*FW&o_pfX}vg z!?LEsspE+C;|(z74i2BkD<(*F-> zGZNjvG13}VmG;?~^R7K;-ZjuM&vDxf8jJf!7A%+O=shf|VTJiob`v*Cxd8*86KRi| z%*qpJP-6e%e=S*m*Kz+>esKG5Xz7wwW`cLBY1|>)Lc3YqNLq@ zAg^~e8w*Hoce2HT27;>LGTb`IZc;|5#+oW$erG7Ki&60JLS;A!>Q=(?#IvW{mBLuM z7Eu<&l6;(@wVZR$3UKET0>%jjoG*`&ZKUnnkV!s%mn=$n z4LJ(!=HsE^qU7!KD+VPbn6NA|1V)-yVeGhfB7-+fJF_#)R8)$G^{)ESzC&R_28Mbm4*|`bRv;G z8WowKtkCZ4UOpaNwx)v%6iPGEaoE4D_CLeMOXA-}$T&$>%Duga;h3xo|0v&tr{u|- zUXGy0_#***9zx567o2gCWhp`yGEm$LuQelBYwnjh8Zp}=Gv@{UO(q|?RTRV+`?%5? zUkCa;Mw|~YWr(yDMt>~UvI~<$$ex^=Lmw`Cd=@X&D?l#^_ov>-oBdfd6`;uq|N7|; zLx|~1_{mh%44wa@I;h3UM!M!i6D>6x&GM?=v+i6;6=IU-%^MT9>3j^FCuj(IrcS1W zxq*cgjex%9cxYJn{~yg9LWX|AVK`f*BT1_Tb0YAog58cT4qEUOXfQVrT=JFoZYz%s z{QGHCZKF5Sjbb15fq6W_&B)qoaeAqo9k%(S1pium1pLrULs%y`S$|t2vDP#N35^0A zNrZ@p4U8pt6nc%P3{RlS{ds4h&9;OSaU4K-Lw?(!UNal(O_07MO2ALmZW?X+3ce5B zTqI;aqb7%nNfFXt;8@-he_6nmd3TT<_($7(_}*$$Yz`^=l4x6=kB1Z0dfVMf*anov zj0odVK51cSJ5S(x+qb9P?GtzhQG`Gw8a^k}wMk(L;FBe(2i5|)#y`qdA7450<)eWz zJYK5A5*LXn8W^$P->NO<0x=I{e_li?cP!#;6cUpjId zY0O%qyhyDpBLB}quax4!+b^Mxr3IaW6&CmgLs{BBHQ4yu4mn5k{ocG%9cgVLrYEpl{Qz9J zr8MW#UYr(kKKCB})k3_%XshND*4@b|d=QNb`t^O|P4AFCT+Q<4&vMiVHzw)!B3tB7 zw22!*zZx2k?Pm9+#-jEr@;WHlX@k; zZ}kQ8AW(o~Mg>qUz#Cw=8WIC^cvr&tTx`qU`Dk?2bNC`Y7rQ8a%&K?`?E6s2HXRqc z_)aA1EaGcGebJ^YqMLbM6Y+Ro z^V-_bGt?E%baek2kX?Zv4GNBIWdAfvf|Ajj&J9UBf1X{ z2q)tx|&36R)=xG~76+$OHA+4mAuxnDPi(XU` zJ2hZ^ctet38)A(2Gutcv#2y=D^5aPnl>z@@C%gukBhz+)U=~gc4Y$Wtk3A(s-dLL4h24r1>fa}8lo*t6nkk95U+Bv^_dLIGV^%Eg$ z1OINsa;_n%oX8Q}k1agYhp}l|kb>GC`j=f4LmLkNy7?r5Q;inzVm(m-A#j)r~@WR}-OFtW7YW{~|ks?z_lPr5DzfvG2 zTk_4wppXuJz#LBB5}|Q|@IfduaS(h7S)$?{e#HBpfo5CMV8O4wH3N)@2Fm8}rhlN2 zleqi%Flmk!G{_rnvnf`DzMSO5%(sM>(Kx=Q1$yjHYB#-{1urO@FoL5DL_zet_&G*# zC``ggNY=tBROh(Zs_hW)Fp+CZ-_Q~1KTqOZN+6~Kj*%qIZ2#C6af(*p50khzr>=p& zrI=ENOfhd-wvD!x(~+1h_zkA&2m`=(ABen`i#NEgWU|eJymItk%`ZpROedh*kTSVt z-1`3wK{W}eG)ICiGHtOjN{IT86RNTfN%D)5uIF8K^XY6sTo|F00xw6vsgZ{Z4co43 zf~bF|k=5MBx>@dZ{hhP0Ii`rTb0cZyg5XDF1ntziBlCZfj7iLu*lO3g3641k;j3TK zPTcS<>OT=Z)hYFfC%cGx{KSsW#vQ1Zo4(Z-AxCY;G$l?Pknu){^DW*^|IGWu9Wi*0 zk_g^=C9)<4IlEl3^ zCZH#u0Hl2dwyMMjbIAZL2GZ%v3WCjygz)Srl$2Ti0)SJ@Z1S!700E&->b!J!yP{Mtrlw#jQ_yB-Q0_*8Xc`)80Vx7PnTu>P_9jWPh25CwMoZc=hH z-G&A9=o{hp)?H&IAUZ-{lcn9BaS@C$Zy_oBJi;>x0t7}HeB*cf(VkFq&@5I@PXd;I z!#aAk-jB@+Gj0GgnixH#wBG@TDVq3~l7{9r^ufjIo%!F_PI6+>2^GRTMi8SR*Da>g zPB!gjWYNi!cFja7krpJ1??(G?J{^M}EOL-?BK%MIV!DeljCI?m$S|*cHn^SA1;E%ELB3e|=+!G1;Sd4+hmn4P_0%{QZn*2ja3;#KeCoeaSW;5EnjGOf zwE-3^if=p3x9;zfoj?-V7hnA#ETHW7>AKX9cS+V>>zt_V?B}>`A?D)W4!s(@|9q=B zlk2klWXA9H3TeZeU)8^|dvgC1X2q&w1c1W3091oC`D(=!Gz>^j3hFipvJlsI5M->s zzBg2l{=ih^cOO!MP@g02b^6xh`g=(!=~kxGYi%!vvI@c;*_?}!^DpjR5Q^~`{qH$2 ztbqf$Y%GWFz;C`Mm?eGG&%!6>P@oRHoIbstb0YHf+-l|qb$%0Ui%67D{yp(0lEo)X zO5Wv-uM1(_y*M%{Ui6*$n1`Mn&0BeaG*w`_rVn^7$$%8W|B6V!#aG7BfmHK>uXZm) zgc@cQKHx_Qq3u|3m4SXiADnV@Gd&`X++99hth;VLSEJ?hW!!4v%e|e@55Ycqc~Zze z818p+QK!c{`3lLLB`ZFa29}Cw;`DO)`cVYravq=xvXlnrUnL6?A)&S6-R(UtgRvXUOmjS2d zFV@D|Pu4)YWN?|evgXrJc!x{1$#Se?j!XQM ztlAP9uj{pmtg94yx?C#*f1%YIP+Kfs*JwY)il0?Kw8qOj=twnI8Odhu5ABa;L@1e~ znyT$!-{X6R76wKFV-rKrjXpo#l?pE z8-ibvVm;J)G@UkjDx5<5E-j32tMx>m%y0{xJ?P;kT3iY|we1RZkEmWkTMQHLKs;DI zA93*o9Avf<-oMQi+lbgthrq@NXXWbdzhN2wXlb;1fS@xxr6OHksB9*_bm+EO#EHKt>?GQ5@1phYJK>U(evU_qhL2f#Vrk67Tw zZO27|6(^}~oa=i#3^;1R#n?YGU~P*e&P{`T`@!GwlLDvW47LNV9|IA^-&qp=gWGO; z4!nT0`z%om_5Fh1d{tn|o~g|RygZd3)|xpf&W2 z$pgRhG@BEm-KVg6cr?fZNI0dBIllrM8e_XJWNhWrEDOh5y3rSiSBlG~1Eg zElW5dmk5{m9`6j(81^f=HOcT53{`T03)z)%LfL;R;J{ypFEL$h5xKZRJ3AUcSs0bW z8_Y^&z9b!3nJ1Gy8hsobE%7hZhSxxPJ@;NU^5UMbo!(#%N!?GK@T?L5H1HADm!8~8 zj#8F(%otg^$RE_koBo9qy6V=9LpHVthhUyFvmkKE&kU)~KPUwjjFt0Z<34xLxyB)*z(62ci!kQH#Uw z*b`7k*quW@s*%hehi@hZdo_Dw8f5`DlMfqPRN4vj%TAH^Uc#oy(XYZA#ArL_f}#&m zZx*Gki;25ZNkQJd@p4jNw_-+Wn026R@YtF;$jG1)UTa4%nelgfljhJ6usM-_hSm%94`>cU$whUqtfI-ErzVa1v#57{sb^R zEJBTEBg0#bxT!6N+)gQfUfYU!aKeO=7Og_Ls&BXRZCLZ&%coZ%B5j%CZ0<=l=lR5M z3qDLsA#?1i%{O#Q0ZcLXv`DAs#a5{WK@?IknUX5!&;md1@$5%emNJ44DylbCc3u@P{(jne`R!jJ-9!@ z6x3>qm_~2EdnT_1krMuB2>l{0NoVbD7=M{c-E7sg0Z)Jokn zkaJDmTZHCLhJGvT+r-G-tbIBLd=-vy_ee$jVZ_QI67G1&D_f`MgCx?Y`jMT?1FBf; z21)}s{$Y#O1o*B2^K4m^77Bm@_yMGeu%l7Oa2Y7X)t02QWh}aeM%?*tk1)7z*^?Z*)yXE$HktHpy8#0l(ZD~5di09+pO5Jr#W&c z2b#esvf=M`c)qSItcC2PSiaFmVhC9!tWu_RfcOqcF-XR=7RkX{QF?;V*D!lzOUkQc zr2~*x99OO^YMCs>93$b3LH3fEv4P zdv+o1-MX`bAZRQl(%NFBX$0-&;k}V#7}&O&*jRiwge#@P zb(AMCdTViB-CqZAgsIPJ?O#_@(gk|J3&=2-U|?Y_)wdxH5{Pn)x%S+1`Dyd*dfB#vr=F!k<$>l6HpZm zU3W`;_^BE^*&KMWp>7{JAiT2vVHP)r67CvRdp+aYZ$kxWHB&`j}w# zO@g%GH%vuJ$NCW1o_y!#`3C^ zB6?U!4A4u3D8YPEtgaii@Ef*|64tqeh`(h-02Qesf`1ZP0K+Ywnt*(^E=_O#%a;a% zlDmkS1yQVZE~`Q2%J@z$8sic#>XA9EuHatLFJv#MS_` z8&p{!6{+LErgs@&csc6i>JkMQ)BA|w<}CD$qPD5?jU8PKdx;skMQ*O6M=74Xaq8dS zy8|D%36rq>Fw01K#a1*%G|&Wskg-t!0)HG@?XHl+`%Aj@@cLcQXYVYVcLk5lGj4*a z6n~BW=D$*cT{<7^Z>WQbaRUYa)AZBig`6T}>=jT&biQ`a%M+30^zhOOOeD3qSR8Wly%F{YslsG!61GeB)y*T76p6pOfWPk+)#oBa@Tkua2CR zcZ6fj>(QrR8TOlmgZm_bd>Xq|cZAuqZSSY6mB{VGj<~BU>uBFiOO7atLQD~7W31sF zB@Oa~Lg+8qkLOg$+e62YtrfbvQ30%Bjo6oq-an#0wH1DwUSoJdYk1En?U6ef)nDf; zGwOhsq!((WXoVJ`(JLVrI5Eu#dn0}Nw}k%F01OO;i8(q{AS|0J)xHlo-|*o781<7v z$6iMJD>7rF%1?vkpKlO8`Axl;LYnb(jaVNs52o6W!bY2z@7_6afvBbhc^Y`r0D4kz zK-=BgnWOLFi`&W{;$ui%h2~Y$SBt7H8wzV@?M)k-aagW;csR7QA6n|N{)y1bYHsrr z&-2I9$I#u;i=59Wl(VfDOLY9yi$;;>G?fFn^dh;-1q4#RfBjiusgyq{H<4sCR;k-M zCDc0mGl746O*k{v1j%C-R~nL8D)KR>`Xzi$P#qxRsr%J=fGu1W@A{@8r>g^@EAH)P z9&_xpg7_?H?cPs3?|j>TS?T`Dp25B<{RS35Wi0-^&s)~^p%&aFbJqX# z+xG$9{IWXy7_Od4l{a+g+BF-FHsP&W0a;5`7bUYADqSHL^&gJ-b|U=1+CXk_Ne(~p z3KcP&@~&12_4Cr)0AwfIi9ZE*WtR=qfu?Ob$(}#gK~T6tDQbCVg1SN@wrg7`A)*$& z@~(|whWVI@LpjmS>hA1`!t_p~=p0#r2OAgUJy7Cbl1+W29YHt!4VuEib9Dne^6EY% z#aLLTWxrCQH6>^5M!30N=_(DqJ-l4(!<3iGNgw6myT~PudW&182a`MlLE89kb9cHH zg?N=|NFmI?R#qw&|GxjcaRnA*UVx37#D-sb{@ZY!TRbYR(+o>Brj?B9V6e0w!?MwD z%dUJi5TVWH{$Fc8pr-SB; zNI>yA??qmC2rkx$6%mlBERf?$gq74U>Lx90K^8k5Uh$IEiVp>`8ib<_o|ZI1H#D`8 z=^Z+6r8g+7MiDPnWjDUILkuUsJaiEu^5Xj>huKuT%ZPu|LVaCD_W(8#dJsr8eIgkM z&1`Cc5$bwJLL{IpD_7@B`cZBD?IKf6%O`q!5BulgvzwY)3;`XDGVI40Ud3ot>)4uG zkTaD5dKcCU({C8Kps&(JHl4HUqVT7u7pk@aB7JdIo4e_4ijmCm3sKzDA^fg$;HMh$ zsW453nxAoBYf&EfSH8Tk!bF(T+Wa_ub5cnREAukj+{Y00slxBElY8Ll{W2vR@%c{z zit``^T=^R;UIjyxVwx7ggM*s%xRdJ}5oCQ)JIYV?vwX<9{I!mm3KW@(M$LRFjF)}9 zW@}pkJ6GIXrlvP&{j{=sDwy@6FPQ(Gu6bWCn2;oAZYxlQF`WbY{AYy(iSg*-ro#G! zMCxwJmE>fCFFL_d&QzO&T3;t7V=H<%Z=2&nl}O42bl)Cn!8m6)9sfJ?n?ug69b{G1 z=?~v9_8iFxK^Gz?+*kwXT>5;(&tZIgmsb70qH6h3QAQhSD0S2HJ34w9O8*-QyiaPu z+XL7NZ}>KCp*V?|0?nv9F>(2RwphV9nBvjXQtRR|wbRrgxoqz(-;*xghyCOebzSpr zCzZGOfTy__MP5L*oK*Hn1mF&Re+jW1^FZTl?EM+g7#$Ptx}(ecl)9CE>+cy1uvK4o zcDMS5|D0!-U!IFSSaHj)$jB7wns42g- z5|d8R_rX?2XzfGk5IxVMyDXu=(BVZdI-(bmkjv{XoGvVOqVEQg3rR;cZ@%LXS$W>Z zqILIJkv#ZDQ}Qj4ZY3gW>1OHr>-e%4fl zCn0Vo)7nT;{(cN@uS`WEV+*+`egoLqoq!FL{mx90b796YLgwqaIDF0TPwP=xFF-EH z0TlT?S9D)*2c9t6{RblkY{~&2M4_Teu7P_NZ18?FhAPrwZCiiPf=t^wWmz{@{5-9) z)lj%i*##&81J{YA-wF&%bR7dGI=`} z(KjUODR-Tt_c1Jb$hb_10%HLBwZQveuhr#T8+&-0{>z8EVl}mT9UBsESgN6~ zLLs@?{*8)9Z4mcrs1Rb~6uxW(%cGw!@Z3_4!%&*iDyaEB@QC*&w3K)tQ}|@k{>y0; zK7I#`Dm$==K;;5!ytUP}jm&R{Bqh^OEsC|=n;!Z@`($VUGxl@j%M7N0FUm4HGt3Au z)$2FhHbyVcR%qMQe(kR_@=JZU>vj%Kxph!R^y=5y2>dMkV^$b)(F>JsPd^Ch7>G2v z8-vsEFr7@k-Kb2LBht@;k9=1bt*ghV-NJo%ddL6tsLP)O5{nov>%k0Xt1T}>ls8Xl zwur@$ul)R`tY+)cq7clv6a^FII5X7Pz&VAe)X~)q2fZi80mTWLJLZ!}EPd}0f;%tD zqhj)yguq(N4bCALnp?4a!k{;Hy>%9>?JhqkaVy699;Lp*()Hqt1$WH{mk`Dc&KIZd z=tIQG48!(uN-iwbgi?Pf_R*GI)Qc6~PMG1_1}nk4ix89zG-AAEUoEC;$0E}ooR5`} zNVQ^Ahre;Tmm_{~SGm0r3r%PFo682hDeWU~r__&Jr`d_sOY2@FPsx;Ku2nmJm~lE!MvRrWXWNR+ritYOYs7-DsrlcGd?!;FVeSHEZIh>nuZF{iU}#{plujdE263m`ly9 zYbmEF)D;T{r$A%eegAB1iZ&iRw>1HNP+RaW& z%*%%2`+2A6^g7tYKoV!9+-p75ycMnT*G$t7W;aME>1TNI@6HdBPltbXSD5}L1vUTP zsS=dFTp62*?fbWwwok}=E$B}sjgzB&=+$zog&f>2qTRJMGmS1(O9t1awQfI2zO=63 z?EO1R0*Yks>(xY!a-_$i`DEq_C02UB+wA9zZSKMJ0P-Q(b1atuR}xmE>}_O~Tfy=V zWgy+?LQm^;poef>0j7EcK5Z74l1|K*X1x9udN{_TAUSY50iVu(R6=h2kQeJkJrxFf zS{D3_t`N-SzE02a>9{*f-ZH(Dm9&0gZ##1JgJ`2h9ApnxBdi>nrh0raMQG2iQ1Kp| zfvChVd&^x)T|Qajk_Xf2niFcaF=4#kgOJ1PD|y@9CPU`-HPgF{!ywC_g5(7wEouZv zXLLxn#A;W1HCRR6)xx{ksd8c3fj?QeZ8>gI2F&|MXwKHhe6tHkf^NS)Nc0U?wq z&FZTZ>o-SYac#MMpMVu8E0A))q44uvf+nb&ES73y>rYD2+?B!u9OoozLE7y6{rOL{ zR=@j%M2#TaB#LQ%-ms@N9HM!}n<^R^y+-20R;FPh`-kmj0-OG{5$OUlhxpMA6IW6S1o&fL~etc1<(BDPD)RsDiw>aiMwU zLpfFXmdDQq+=4m#K2CUHopSrRJFG_NQ+OTAZ6d_+rBFrphPZ?O6V_#Re6MTO>`v~D zC$goI18(lhD=vh~0lr~OX{)o{!$C7iru_26v)0R%0A%ZGl0YxVYes$tEeKA4yL!A> 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