|
|
|
@ -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
|
|
|
|
|
}
|
|
|
|
|