From 5d032e444bb3d639a010ffa5bb84caa190c23bcd Mon Sep 17 00:00:00 2001 From: eonaholic <1452381148@qq.com> Date: Thu, 28 Dec 2023 21:30:08 +0800 Subject: [PATCH] 1 --- src/kernel/base/sched/sched_mq/los_sched.c | 37 ++++++++++--------- src/kernel/base/sched/sched_sq/los_priqueue.c | 14 +++---- src/kernel/base/sched/sched_sq/los_sched.c | 6 +-- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/kernel/base/sched/sched_mq/los_sched.c b/src/kernel/base/sched/sched_mq/los_sched.c index a9070c5..8c32b92 100644 --- a/src/kernel/base/sched/sched_mq/los_sched.c +++ b/src/kernel/base/sched/sched_mq/los_sched.c @@ -58,7 +58,7 @@ typedef struct { LOS_DL_LIST queues[NPQS]; /* one for each priority */ SPIN_LOCK_S lock; /* private spinlock */ } PriQueue; - +/*用于实现一个具有多个优先级的队列结构,并提供了相关的数据结构和锁来支持队列操作的线程安全性*/ /* priority queue per-cpu */ STATIC PriQueue g_priqueue[LOSCFG_KERNEL_CORE_NUM]; @@ -68,17 +68,20 @@ STATIC INLINE UINT32 OsMpIdleMask(VOID) { return ((~g_activeCpu) & LOSCFG_KERNEL_CPU_MASK); } - +/*这个函数可能用来计算当前处于空闲状态的 CPU 核心的掩码。STATIC 关键字表示该函数是静态的,只在当前文件内可见, +而 INLINE 关键字通常用于建议编译器内联该函数以提高执行效率。*/ STATIC INLINE VOID OsMpSetIdle(UINT32 cpu) { g_activeCpu &= ~CPUID_TO_AFFI_MASK(cpu); } - +/*这个函数可能用于将指定的 CPU 核心设置为待机状态。 +它通过将对应的位掩码从 g_activeCpu 中清除,以实现将核心置为非活动状态。*/ STATIC INLINE VOID OsMpSetActive(UINT32 cpu) { g_activeCpu |= CPUID_TO_AFFI_MASK(cpu); } - +/*这个函数可能用于将指定的 CPU 核心设置为活动状态。 +它通过将对应的位掩码加入到 g_activeCpu 中,以实现将核心置为活动状态*/ VOID OsPriQueueInit(VOID) { LOS_DL_LIST *priQueues = NULL; @@ -97,7 +100,7 @@ VOID OsPriQueueInit(VOID) } } } - +/*这段代码的作用是初始化多核系统中每个核心的优先级队列,确保每个队列都处于初始状态*/ UINT32 OsPriQueueSize(UINT32 priority) { UINT32 itemCnt = 0; @@ -112,7 +115,7 @@ UINT32 OsPriQueueSize(UINT32 priority) return itemCnt; } - +/*这段代码的作用是获取多核系统中某个核心指定优先级的队列中的任务数量*/ UINT32 OsPriQueueTotalSize(VOID) { UINT32 priority; @@ -125,7 +128,7 @@ UINT32 OsPriQueueTotalSize(VOID) return totalSize; } - +/*这段代码的作用是计算多核系统中所有优先级队列的总任务数量,以便进行系统性能监控和优化*/ UINT32 OsSchedPickCpu(LosTaskCB* task) { UINT32 cpuid, lastMask, cpuidMask, affinity; @@ -158,7 +161,7 @@ UINT32 OsSchedPickCpu(LosTaskCB* task) return cpuid; } - +/*这段代码的作用是根据任务的亲和性、空闲核心和任务上次运行的核心等信息,选择一个适合调度任务的 CPU 核心。*/ VOID OsPriQueueAdd(PriQueue *priQueue, LosTaskCB* task, QueueOps flag) { LOS_DL_LIST *priQueues = NULL; @@ -179,7 +182,7 @@ VOID OsPriQueueAdd(PriQueue *priQueue, LosTaskCB* task, QueueOps flag) LOS_ListTailInsert(&priQueues[priority], &task->pendList); } } - +/*这段代码的作用是根据任务的优先级,将任务插入到对应优先级的队列中,并更新相应的位图信息。*/ /* * Insert a task to the head of priority queue, only available * when putting running task back to the ready queue. @@ -189,14 +192,14 @@ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *queueNode, UINT32 priority) LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList); OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_HEAD); } - +/*这段代码的作用是将指定任务插入到指定优先级队列的队头,用于在将当前任务从运行态切换到就绪态时,将当前任务重新插入到相应优先级队列的队头*/ VOID OsPriQueueEnqueueTail(LOS_DL_LIST *queueNode, UINT32 priority) { LosTaskCB *task = LOS_DL_LIST_ENTRY(queueNode, LosTaskCB, pendList); OsPriQueueAdd(&g_priqueue[ArchCurrCpuid()], task, QUEUE_TAIL); } - +/*这段代码的作用是将指定任务插入到指定优先级队列的队尾,用于在将一个新的任务从就绪态加入到相应优先级队列时,将任务插入到队尾*/ /* * Insert a task to the tail of priority queue. The pri-queue might be * this or another core's. @@ -215,7 +218,7 @@ VOID OsPriQueueEnqueue(LOS_DL_LIST *queueNode, UINT32 priority) /* add the task to the cpu per-core pri-queue */ OsPriQueueAdd(&g_priqueue[cpuid], task, QUEUE_TAIL); } - +/*这段代码的作用是将指定任务加入到相应的优先级队列中,并根据任务的调度要求选择适当的 CPU*/ VOID OsPriQueueDequeue(LOS_DL_LIST *queueNode) { LosTaskCB *task = NULL; @@ -234,7 +237,7 @@ VOID OsPriQueueDequeue(LOS_DL_LIST *queueNode) (*bitmap) &= ~(PRI0_BIT >> task->priority); } } - +/*这段代码的作用是从优先级队列中删除指定的任务节点,并在必要时更新位图以反映每个优先级队列的状态*/ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) { LosTaskCB *newTask = NULL; @@ -262,7 +265,7 @@ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) out: return newTask; } - +/*这段代码的作用是从当前 CPU 的优先级队列中获取具有最高优先级的任务,并将其从队列中删除。*/ VOID OsSchedResched(VOID) { LosTaskCB *runTask = NULL; @@ -326,7 +329,7 @@ VOID OsSchedResched(VOID) /* do the task context switch */ OsTaskSchedule(newTask, runTask); } - +/*这段代码实现了两个任务之间的上下文切换,包括状态更新、占用时间计算、任务监控等一系列处理,并最终调用 OsTaskSchedule 函数切换到新的任务执行。*/ VOID OsSchedPreempt(VOID) { LosTaskCB *runTask = NULL; @@ -357,7 +360,7 @@ VOID OsSchedPreempt(VOID) SCHEDULER_UNLOCK(intSave); } - +/*这段代码实现了抢占式调度的功能,能够在高优先级任务到来时立即暂停正在运行的低优先级任务,提高系统的响应速度和稳定性*/ #ifdef LOSCFG_BASE_CORE_TIMESLICE LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) { @@ -370,7 +373,7 @@ LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) } } #endif - +/*这段代码实现了基于时间片的轮转调度算法,通过限制每个任务的执行时间,实现了任务之间的公平调度*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/base/sched/sched_sq/los_priqueue.c b/src/kernel/base/sched/sched_sq/los_priqueue.c index c3a5592..124f49e 100644 --- a/src/kernel/base/sched/sched_sq/los_priqueue.c +++ b/src/kernel/base/sched/sched_sq/los_priqueue.c @@ -60,7 +60,7 @@ UINT32 OsPriQueueInit(VOID) return LOS_OK; } - +/*这段代码是用于初始化优先级队列的函数 OsPriQueueInit*/ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority) { /* @@ -76,7 +76,7 @@ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priqueueItem, UINT32 priority) LOS_ListHeadInsert(&g_priQueueList[priority], priqueueItem); } - +/*这段代码是用于将一个节点插入到优先级队列头部的函数*/ VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority) { /* @@ -92,7 +92,7 @@ VOID OsPriQueueEnqueue(LOS_DL_LIST *priqueueItem, UINT32 priority) LOS_ListTailInsert(&g_priQueueList[priority], priqueueItem); } - +/*这段代码是用于将一个节点插入到优先级队列尾部的函数*/ VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem) { LosTaskCB *runTask = NULL; @@ -103,7 +103,7 @@ VOID OsPriQueueDequeue(LOS_DL_LIST *priqueueItem) g_priQueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runTask->priority); } } - +/*这个函数的作用是取出优先级队列中的队首节点,并更新相应的状态信息。*/ LOS_DL_LIST *OsPriQueueTop(VOID) { UINT32 priority; @@ -115,7 +115,7 @@ LOS_DL_LIST *OsPriQueueTop(VOID) return NULL; } - +/*这个函数的作用是获取当前优先级队列中的队首节点,并返回该节点的指针,以供后续操作使用*/ UINT32 OsPriQueueSize(UINT32 priority) { UINT32 itemCnt = 0; @@ -140,7 +140,7 @@ UINT32 OsPriQueueSize(UINT32 priority) return itemCnt; } - +/*这个函数的作用是计算指定优先级队列中节点的数量,可以用于监控任务在不同优先级队列中的排队情况*/ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) { UINT32 priority; @@ -170,7 +170,7 @@ LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) OUT: return newTask; } - +/*这个函数的作用是获取优先级最高的任务控制块,并将其从相应的优先级队列中移除,以便进行调度执行*/ #ifdef __cplusplus #if __cplusplus } diff --git a/src/kernel/base/sched/sched_sq/los_sched.c b/src/kernel/base/sched/sched_sq/los_sched.c index 5e10fb4..14d1118 100644 --- a/src/kernel/base/sched/sched_sq/los_sched.c +++ b/src/kernel/base/sched/sched_sq/los_sched.c @@ -103,7 +103,7 @@ VOID OsSchedResched(VOID) /* do the task context switch */ OsTaskSchedule(newTask, runTask); } - +/*这段代码实现了操作系统的任务调度功能,根据任务的优先级和状态来选择合适的任务进行切换,并更新任务状态及相关信息,最终实现任务的切换和调度*/ VOID OsSchedPreempt(VOID) { LosTaskCB *runTask = NULL; @@ -134,7 +134,7 @@ VOID OsSchedPreempt(VOID) SCHEDULER_UNLOCK(intSave); } - +/*这段代码实现了在需要进行任务抢占时,将当前任务标记为就绪状态并重新加入就绪队列,然后触发任务重新调度,以实现任务的抢占和切换。*/ #ifdef LOSCFG_BASE_CORE_TIMESLICE LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) { @@ -147,7 +147,7 @@ LITE_OS_SEC_TEXT VOID OsTimesliceCheck(VOID) } } #endif - +/*这段代码实现了时间片轮转调度算法中的时间片检查和调度触发功能,当任务时间片用尽时,会自动触发调度,让其他可运行任务有机会获得 CPU 时间片并进行执行。*/ #ifdef __cplusplus #if __cplusplus }