更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_sched_pri.h 文件参考

浏览源代码.

结构体

struct  HPFQueue
 
struct  HPFRunqueue
 
struct  SchedRunqueue
 
struct  SchedParam
 
struct  SchedHPF
 
struct  SchedPolicy
 
struct  SchedOps
 
struct  TagTaskCB
 

类型定义

typedef struct TagTaskCB LosTaskCB
 
typedef BOOL(* SCHED_TL_FIND_FUNC) (UINTPTR, UINTPTR)
 

枚举

enum  SchedFlag { INT_NO_RESCH = 0x0 , INT_PEND_RESCH = 0x1 , INT_PEND_TICK = 0x2 }
 

函数

STATIC INLINE UINT64 OsGetCurrSchedTimeCycle (VOID)
 
VOID OsSchedExpireTimeUpdate (VOID)
 
STATIC INLINE SchedRunqueueOsSchedRunqueue (VOID)
 
STATIC INLINE SchedRunqueueOsSchedRunqueueByID (UINT16 id)
 
STATIC INLINE UINT32 OsSchedLockCountGet (VOID)
 
STATIC INLINE VOID OsSchedLockSet (UINT32 count)
 
STATIC INLINE VOID OsSchedLock (VOID)
 
STATIC INLINE VOID OsSchedUnlock (VOID)
 
STATIC INLINE BOOL OsSchedUnlockResch (VOID)
 
STATIC INLINE BOOL OsSchedIsLock (VOID)
 
STATIC INLINE BOOL OsPreemptable (VOID)
 
STATIC INLINE BOOL OsPreemptableInSched (VOID)
 
STATIC INLINE UINT32 OsSchedRunqueueIdleGet (VOID)
 
STATIC INLINE VOID OsSchedRunqueuePendingSet (VOID)
 
STATIC INLINE BOOL OsTaskIsRunning (const LosTaskCB *taskCB)
 
STATIC INLINE BOOL OsTaskIsReady (const LosTaskCB *taskCB)
 
STATIC INLINE BOOL OsTaskIsInactive (const LosTaskCB *taskCB)
 
STATIC INLINE BOOL OsTaskIsPending (const LosTaskCB *taskCB)
 
STATIC INLINE BOOL OsTaskIsSuspended (const LosTaskCB *taskCB)
 
STATIC INLINE BOOL OsTaskIsBlocked (const LosTaskCB *taskCB)
 
STATIC INLINE LosTaskCBOsCurrTaskGet (VOID)
 
STATIC INLINE VOID OsCurrTaskSet (LosTaskCB *task)
 注意任务地址由硬件保存,见于 CP15 | TPIDRPRW 更多...
 
STATIC INLINE VOID OsCurrUserTaskSet (UINTPTR thread)
 
STATIC INLINE VOID OsSchedIrqUsedTimeUpdate (VOID)
 
STATIC INLINE VOID OsSchedIrqStartTime (VOID)
 获取中断开始时间 更多...
 
STATIC INLINE VOID IdleRunqueueFind (UINT16 *idleCpuid)
 
STATIC INLINE VOID OsSchedTimeoutQueueAdd (LosTaskCB *taskCB, UINT64 responseTime)
 
STATIC INLINE VOID OsSchedTimeoutQueueDelete (LosTaskCB *taskCB)
 
STATIC INLINE UINT32 OsSchedTimeoutQueueAdjust (LosTaskCB *taskCB, UINT64 responseTime)
 
STATIC INLINE VOID SchedTaskFreeze (LosTaskCB *taskCB)
 
STATIC INLINE VOID SchedTaskUnfreeze (LosTaskCB *taskCB)
 
STATIC INLINE LosTaskCBHPFRunqueueTopTaskGet (HPFRunqueue *rq)
 
VOID HPFSchedPolicyInit (SchedRunqueue *rq)
 
VOID HPFTaskSchedParamInit (LosTaskCB *taskCB, UINT16 policy, const SchedParam *parentParam, const TSK_INIT_PARAM_S *param)
 
VOID HPFProcessDefaultSchedParamGet (SchedParam *param)
 
VOID IdleTaskSchedParamInit (LosTaskCB *taskCB)
 
INT32 OsSchedParamCompare (const LosTaskCB *task1, const LosTaskCB *task2)
 
VOID OsSchedPriorityInheritance (LosTaskCB *owner, const SchedParam *param)
 
UINT32 OsSchedParamInit (LosTaskCB *taskCB, UINT16 policy, const SchedParam *parentParam, const TSK_INIT_PARAM_S *param)
 
VOID OsSchedProcessDefaultSchedParamGet (UINT16 policy, SchedParam *param)
 
VOID OsSchedResponseTimeReset (UINT64 responseTime)
 
VOID OsSchedToUserReleaseLock (VOID)
 
VOID OsSchedTick (VOID)
 
UINT32 OsSchedInit (VOID)
 
VOID OsSchedStart (VOID)
 
VOID OsSchedRunqueueIdleInit (UINT32 idleTaskID)
 
VOID OsSchedRunqueueInit (VOID)
 
VOID OsSchedResched (VOID)
 
VOID OsSchedIrqEndCheckNeedSched (VOID)
 
LOS_DL_LISTOsSchedLockPendFindPos (const LosTaskCB *runTask, LOS_DL_LIST *lockList)
 

变量

UINT32 g_taskScheduled
 
SchedRunqueue g_schedRunqueue [LOSCFG_KERNEL_CORE_NUM]
 

类型定义说明

◆ LosTaskCB

typedef struct TagTaskCB LosTaskCB

在文件 los_sched_pri.h72 行定义.

◆ SCHED_TL_FIND_FUNC

typedef BOOL(* SCHED_TL_FIND_FUNC) (UINTPTR, UINTPTR)

在文件 los_sched_pri.h73 行定义.

枚举类型说明

◆ SchedFlag

enum SchedFlag
枚举值
INT_NO_RESCH 
INT_PEND_RESCH 
INT_PEND_TICK 

在文件 los_sched_pri.h80 行定义.

80 {
81 INT_NO_RESCH = 0x0, /* no needs to schedule | 无需调度*/
82 INT_PEND_RESCH = 0x1, /* pending schedule flag | 因阻塞而引起的调度*/
83 INT_PEND_TICK = 0x2, /* pending tick | 因Tick而引起的调度*/
84} SchedFlag;
SchedFlag
Definition: los_sched_pri.h:80
@ INT_NO_RESCH
Definition: los_sched_pri.h:81
@ INT_PEND_RESCH
Definition: los_sched_pri.h:82
@ INT_PEND_TICK
Definition: los_sched_pri.h:83

函数说明

◆ HPFProcessDefaultSchedParamGet()

VOID HPFProcessDefaultSchedParamGet ( SchedParam param)

在文件 los_priority.c527 行定义.

528{
529 param->basePrio = OS_USER_PROCESS_PRIORITY_HIGHEST;
530}
UINT16 basePrio
这是这个函数的调用关系图:

◆ HPFRunqueueTopTaskGet()

STATIC INLINE LosTaskCB * HPFRunqueueTopTaskGet ( HPFRunqueue rq)

在文件 los_sched_pri.h616 行定义.

617{
618 LosTaskCB *newTask = NULL;
619 UINT32 baseBitmap = rq->queueBitmap;
620#ifdef LOSCFG_KERNEL_SMP
621 UINT32 cpuid = ArchCurrCpuid();
622#endif
623
624 while (baseBitmap) {
625 UINT32 basePrio = CLZ(baseBitmap);
626 HPFQueue *queueList = &rq->queueList[basePrio];
627 UINT32 bitmap = queueList->queueBitmap;
628 while (bitmap) {
629 UINT32 priority = CLZ(bitmap);
630 LOS_DL_LIST_FOR_EACH_ENTRY(newTask, &queueList->priQueList[priority], LosTaskCB, pendList) {
631#ifdef LOSCFG_KERNEL_SMP
632 if (newTask->cpuAffiMask & (1U << cpuid)) {
633#endif
634 return newTask;
635#ifdef LOSCFG_KERNEL_SMP
636 }
637#endif
638 }
639 bitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - priority - 1));
640 }
641 baseBitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - basePrio - 1));
642 }
643
644 return NULL;
645}
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
Definition: los_hw_cpu.h:168
unsigned int UINT32
Definition: los_typedef.h:57
UINT32 queueBitmap
Definition: los_sched_pri.h:90
LOS_DL_LIST priQueList[OS_PRIORITY_QUEUE_NUM]
Definition: los_sched_pri.h:88
UINT32 queueBitmap
Definition: los_sched_pri.h:95
HPFQueue queueList[OS_PRIORITY_QUEUE_NUM]
Definition: los_sched_pri.h:94
UINT16 cpuAffiMask
函数调用图:
这是这个函数的调用关系图:

◆ HPFSchedPolicyInit()

VOID HPFSchedPolicyInit ( SchedRunqueue rq)

在文件 los_priority.c532 行定义.

533{
534 if (ArchCurrCpuid() > 0) {
535 rq->hpfRunqueue = &g_schedHPF;
536 return;
537 }
538
539 for (UINT16 index = 0; index < OS_PRIORITY_QUEUE_NUM; index++) {
540 HPFQueue *queueList = &g_schedHPF.queueList[index];
541 LOS_DL_LIST *priQue = &queueList->priQueList[0];
542 for (UINT16 prio = 0; prio < OS_PRIORITY_QUEUE_NUM; prio++) {
543 LOS_ListInit(&priQue[prio]);
544 }
545 }
546
547 rq->hpfRunqueue = &g_schedHPF;
548}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
Definition: los_list.h:104
STATIC HPFRunqueue g_schedHPF
Definition: los_priority.c:48
unsigned short UINT16
Definition: los_typedef.h:56
HPFRunqueue * hpfRunqueue
函数调用图:
这是这个函数的调用关系图:

◆ HPFTaskSchedParamInit()

VOID HPFTaskSchedParamInit ( LosTaskCB taskCB,
UINT16  policy,
const SchedParam parentParam,
const TSK_INIT_PARAM_S param 
)

在文件 los_priority.c508 行定义.

511{
512 SchedHPF *sched = (SchedHPF *)&taskCB->sp;
513
514 sched->policy = policy;
515 if (param != NULL) {
516 sched->priority = param->usTaskPrio;
517 } else {
518 sched->priority = parentParam->priority;
519 }
520 sched->basePrio = parentParam->basePrio;
521
522 sched->initTimeSlice = 0;
523 taskCB->timeSlice = sched->initTimeSlice;
524 taskCB->ops = &g_priorityOps;
525}
const STATIC SchedOps g_priorityOps
Definition: los_priority.c:68
UINT16 priority
当前优先级
UINT16 policy
UINT32 initTimeSlice
初始化时间片
UINT16 basePrio
起始优先级
UINT16 priority
INT32 timeSlice
SchedPolicy sp
const SchedOps * ops
UINT16 usTaskPrio
Definition: los_task.h:505
if(tv==NULL)
Definition: time.c:430
函数调用图:
这是这个函数的调用关系图:

◆ IdleRunqueueFind()

STATIC INLINE VOID IdleRunqueueFind ( UINT16 idleCpuid)

在文件 los_sched_pri.h488 行定义.

489{
491 UINT32 nodeNum = OsGetSortLinkNodeNum(&idleRq->timeoutQueue);
492 UINT16 cpuid = 1;
493 do {
496 if (nodeNum > temp) {
497 *idleCpuid = cpuid;
498 nodeNum = temp;
499 }
500 cpuid++;
501 } while (cpuid < LOSCFG_KERNEL_CORE_NUM);
502}
STATIC INLINE SchedRunqueue * OsSchedRunqueueByID(UINT16 id)
SortLinkAttribute timeoutQueue
Definition: los_sched_pri.h:99
函数调用图:
这是这个函数的调用关系图:

◆ IdleTaskSchedParamInit()

VOID IdleTaskSchedParamInit ( LosTaskCB taskCB)

在文件 los_idle.c177 行定义.

178{
179 SchedHPF *sched = (SchedHPF *)&taskCB->sp;
180 sched->policy = LOS_SCHED_IDLE;
181 sched->basePrio = OS_PROCESS_PRIORITY_LOWEST;
182 sched->priority = OS_TASK_PRIORITY_LOWEST;
183 sched->initTimeSlice = 0;
184 taskCB->timeSlice = sched->initTimeSlice;
185 taskCB->taskStatus = OS_TASK_STATUS_SUSPENDED;
186 taskCB->ops = &g_idleOps;
187}
const STATIC SchedOps g_idleOps
Definition: los_idle.c:48
UINT16 taskStatus
这是这个函数的调用关系图:

◆ OsCurrTaskGet()

STATIC INLINE LosTaskCB * OsCurrTaskGet ( VOID  )

在文件 los_sched_pri.h460 行定义.

461{
462 return (LosTaskCB *)ArchCurrTaskGet();
463}
STATIC INLINE VOID * ArchCurrTaskGet(VOID)
获取当前task的地址
Definition: los_hw_cpu.h:150
函数调用图:

◆ OsCurrTaskSet()

STATIC INLINE VOID OsCurrTaskSet ( LosTaskCB task)

注意任务地址由硬件保存,见于 CP15 | TPIDRPRW

在文件 los_sched_pri.h465 行定义.

466{
467 ArchCurrTaskSet(task);
468}
STATIC INLINE VOID ArchCurrTaskSet(VOID *val)
向CP15 - > C13 保存当前任务的地址
Definition: los_hw_cpu.h:155
函数调用图:
这是这个函数的调用关系图:

◆ OsCurrUserTaskSet()

STATIC INLINE VOID OsCurrUserTaskSet ( UINTPTR  thread)

在文件 los_sched_pri.h470 行定义.

471{
472 ArchCurrUserTaskSet(thread);
473}
STATIC INLINE VOID ArchCurrUserTaskSet(UINTPTR val)
向协处理器写入用户态任务ID TPIDRURO 仅用于用户态
Definition: los_hw_cpu.h:160
函数调用图:

◆ OsGetCurrSchedTimeCycle()

STATIC INLINE UINT64 OsGetCurrSchedTimeCycle ( VOID  )

在文件 los_sched_pri.h75 行定义.

76{
77 return HalClockGetCycles();
78}
UINT64 HalClockGetCycles(VOID)
函数调用图:
这是这个函数的调用关系图:

◆ OsPreemptable()

STATIC INLINE BOOL OsPreemptable ( VOID  )

在文件 los_sched_pri.h161 行定义.

162{
164 /*
165 * Unlike OsPreemptableInSched, the int may be not disabled when OsPreemptable
166 * is called, needs manually disable interrupt, to prevent current task from
167 * being migrated to another core, and get the wrong preemptable status.
168 */
169 UINT32 intSave = LOS_IntLock();
170 BOOL preemptible = (rq->taskLockCnt == 0);
171 if (!preemptible) {
172 /* Set schedule flag if preemption is disabled */
174 }
175 LOS_IntRestore(intSave);
176 return preemptible;
177}
STATIC INLINE VOID LOS_IntRestore(UINT32 intSave)
Restore interrupts. | 恢复到使用LOS_IntLock关闭所有中断之前的状态
Definition: los_hwi.h:337
STATIC INLINE UINT32 LOS_IntLock(VOID)
Disable all interrupts. | 关闭当前处理器所有中断响应
Definition: los_hwi.h:286
STATIC INLINE SchedRunqueue * OsSchedRunqueue(VOID)
size_t BOOL
Definition: los_typedef.h:88
UINT32 taskLockCnt
函数调用图:
这是这个函数的调用关系图:

◆ OsPreemptableInSched()

STATIC INLINE BOOL OsPreemptableInSched ( VOID  )

在文件 los_sched_pri.h179 行定义.

180{
181 BOOL preemptible = FALSE;
183
184#ifdef LOSCFG_KERNEL_SMP
185 /*
186 * For smp systems, schedule must hold the task spinlock, and this counter
187 * will increase by 1 in that case.
188 */
189 preemptible = (rq->taskLockCnt == 1);
190
191#else
192 preemptible = (rq->taskLockCnt == 0);
193#endif
194 if (!preemptible) {
195 /* Set schedule flag if preemption is disabled */
197 }
198
199 return preemptible;
200}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedExpireTimeUpdate()

VOID OsSchedExpireTimeUpdate ( VOID  )

在文件 los_sched.c88 行定义.

89{
90 UINT32 intSave;
91 if (!OS_SCHEDULER_ACTIVE || OS_INT_ACTIVE) {
93 return;
94 }
95
96 LosTaskCB *runTask = OsCurrTaskGet();
97 SCHEDULER_LOCK(intSave);
98 UINT64 deadline = runTask->ops->deadlineGet(runTask);
99 SCHEDULER_UNLOCK(intSave);
100 SchedNextExpireTimeSet(runTask->taskID, deadline, runTask->taskID);
101}
STATIC INLINE VOID SchedNextExpireTimeSet(UINT32 responseID, UINT64 taskEndTime, UINT32 oldResponseID)
Definition: los_sched.c:51
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
STATIC INLINE VOID OsSchedRunqueuePendingSet(VOID)
long unsigned int UINT64
Definition: los_typedef.h:66
UINT64(* deadlineGet)(const LosTaskCB *taskCB)
获取最后期限
UINT32 taskID
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedInit()

UINT32 OsSchedInit ( VOID  )

在文件 los_sched.c213 行定义.

214{
215 for (UINT16 cpuId = 0; cpuId < LOSCFG_KERNEL_CORE_NUM; cpuId++) {
217 }
218
219#ifdef LOSCFG_SCHED_TICK_DEBUG
220 UINT32 ret = OsSchedDebugInit();
221 if (ret != LOS_OK) {
222 return ret;
223 }
224#endif
225 return LOS_OK;
226}
VOID HPFSchedPolicyInit(SchedRunqueue *rq)
Definition: los_priority.c:532
UINT32 OsSchedDebugInit(VOID)
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedIrqEndCheckNeedSched()

VOID OsSchedIrqEndCheckNeedSched ( VOID  )

在文件 los_sched.c420 行定义.

421{
423 LosTaskCB *runTask = OsCurrTaskGet();
424
425 runTask->ops->timeSliceUpdate(rq, runTask, OsGetCurrSchedTimeCycle());
426
427 if (OsPreemptable() && (rq->schedFlag & INT_PEND_RESCH)) {
428 rq->schedFlag &= ~INT_PEND_RESCH;
429
431
432 runTask->ops->enqueue(rq, runTask);
433
434 LosTaskCB *newTask = TopTaskGet(rq);
435 if (runTask != newTask) {
436 SchedTaskSwitch(rq, runTask, newTask);
438 return;
439 }
440
442 }
443
444 if (rq->schedFlag & INT_PEND_TICK) {
446 }
447}
VOID OsSchedExpireTimeUpdate(VOID)
Definition: los_sched.c:88
STATIC LosTaskCB * TopTaskGet(SchedRunqueue *rq)
Definition: los_sched.c:282
STATIC VOID SchedTaskSwitch(SchedRunqueue *rq, LosTaskCB *runTask, LosTaskCB *newTask)
Definition: los_sched.c:366
STATIC INLINE UINT64 OsGetCurrSchedTimeCycle(VOID)
Definition: los_sched_pri.h:75
STATIC INLINE BOOL OsPreemptable(VOID)
VOID LOS_SpinLock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:50
VOID LOS_SpinUnlock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:84
SPIN_LOCK_S g_taskSpin
VOID(* enqueue)(SchedRunqueue *rq, LosTaskCB *taskCB)
入队列
VOID(* timeSliceUpdate)(SchedRunqueue *rq, LosTaskCB *taskCB, UINT64 currTime)
更新时间片
函数调用图:

◆ OsSchedIrqStartTime()

STATIC INLINE VOID OsSchedIrqStartTime ( VOID  )

获取中断开始时间

在文件 los_sched_pri.h481 行定义.

482{
483 LosTaskCB *runTask = OsCurrTaskGet();
484 runTask->irqStartTime = OsGetCurrSchedTimeCycle(); //获取当前时间
485}
UINT64 irqStartTime
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedIrqUsedTimeUpdate()

STATIC INLINE VOID OsSchedIrqUsedTimeUpdate ( VOID  )

在文件 los_sched_pri.h475 行定义.

476{
477 LosTaskCB *runTask = OsCurrTaskGet();
478 runTask->irqUsedTime = OsGetCurrSchedTimeCycle() - runTask->irqStartTime;//获取时间差
479}
UINT32 irqUsedTime
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedIsLock()

STATIC INLINE BOOL OsSchedIsLock ( VOID  )

在文件 los_sched_pri.h155 行定义.

156{
157 return (OsSchedRunqueue()->taskLockCnt != 0);
158}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedLock()

STATIC INLINE VOID OsSchedLock ( VOID  )

在文件 los_sched_pri.h132 行定义.

133{
135}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedLockCountGet()

STATIC INLINE UINT32 OsSchedLockCountGet ( VOID  )

在文件 los_sched_pri.h122 行定义.

123{
125}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedLockPendFindPos()

LOS_DL_LIST * OsSchedLockPendFindPos ( const LosTaskCB runTask,
LOS_DL_LIST lockList 
)

在文件 los_sched.c519 行定义.

520{
521 if (LOS_ListEmpty(lockList)) {
522 return lockList;
523 }
524
525 LosTaskCB *pendedTask1 = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(lockList));
526 INT32 ret = OsSchedParamCompare(pendedTask1, runTask);
527 if (ret > 0) {
528 return lockList->pstNext;
529 }
530
531 LosTaskCB *pendedTask2 = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_LAST(lockList));
532 ret = OsSchedParamCompare(pendedTask2, runTask);
533 if (ret <= 0) {
534 return lockList;
535 }
536
537 return SchedLockPendFindPosSub(runTask, lockList);
538}
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
Definition: los_list.h:321
STATIC INLINE LOS_DL_LIST * SchedLockPendFindPosSub(const LosTaskCB *runTask, const LOS_DL_LIST *lockList)
Definition: los_sched.c:502
INT32 OsSchedParamCompare(const LosTaskCB *task1, const LosTaskCB *task2)
Definition: los_sched.c:233
signed int INT32
Definition: los_typedef.h:60
struct LOS_DL_LIST * pstNext
Definition: los_list.h:84
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedLockSet()

STATIC INLINE VOID OsSchedLockSet ( UINT32  count)

在文件 los_sched_pri.h127 行定义.

128{
129 OsSchedRunqueue()->taskLockCnt = count;
130}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedParamCompare()

INT32 OsSchedParamCompare ( const LosTaskCB task1,
const LosTaskCB task2 
)

在文件 los_sched.c233 行定义.

234{
235 SchedHPF *rp1 = (SchedHPF *)&task1->sp;
236 SchedHPF *rp2 = (SchedHPF *)&task2->sp;
237
238 if (rp1->policy == rp2->policy) {
239 return task1->ops->schedParamCompare(&task1->sp, &task2->sp);
240 }
241
242 if (rp1->policy == LOS_SCHED_IDLE) {
243 return 1;
244 } else if (rp2->policy == LOS_SCHED_IDLE) {
245 return -1;
246 }
247 return 0;
248}
INT32(* schedParamCompare)(const SchedPolicy *sp1, const SchedPolicy *sp2)
比较调度参数
这是这个函数的调用关系图:

◆ OsSchedParamInit()

UINT32 OsSchedParamInit ( LosTaskCB taskCB,
UINT16  policy,
const SchedParam parentParam,
const TSK_INIT_PARAM_S param 
)

在文件 los_sched.c250 行定义.

251{
252 switch (policy) {
253 case LOS_SCHED_FIFO:
254 case LOS_SCHED_RR:
255 HPFTaskSchedParamInit(taskCB, policy, parentParam, param);
256 break;
257 case LOS_SCHED_IDLE:
259 break;
260 default:
261 return LOS_NOK;
262 }
263
264 return LOS_OK;
265}
VOID IdleTaskSchedParamInit(LosTaskCB *taskCB)
Definition: los_idle.c:177
VOID HPFTaskSchedParamInit(LosTaskCB *taskCB, UINT16 policy, const SchedParam *parentParam, const TSK_INIT_PARAM_S *param)
Definition: los_priority.c:508
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedPriorityInheritance()

VOID OsSchedPriorityInheritance ( LosTaskCB owner,
const SchedParam param 
)

◆ OsSchedProcessDefaultSchedParamGet()

VOID OsSchedProcessDefaultSchedParamGet ( UINT16  policy,
SchedParam param 
)

在文件 los_sched.c267 行定义.

268{
269 switch (policy) {
270 case LOS_SCHED_FIFO:
271 case LOS_SCHED_RR:
273 break;
274 case LOS_SCHED_IDLE:
275 default:
276 PRINT_ERR("Invalid process-level scheduling policy, %u\n", policy);
277 break;
278 }
279 return;
280}
VOID HPFProcessDefaultSchedParamGet(SchedParam *param)
Definition: los_priority.c:527
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedResched()

VOID OsSchedResched ( VOID  )

在文件 los_sched.c449 行定义.

450{
451 LOS_ASSERT(LOS_SpinHeld(&g_taskSpin));
453#ifdef LOSCFG_KERNEL_SMP
454 LOS_ASSERT(rq->taskLockCnt == 1);
455#else
456 LOS_ASSERT(rq->taskLockCnt == 0);
457#endif
458
459 rq->schedFlag &= ~INT_PEND_RESCH;
460 LosTaskCB *runTask = OsCurrTaskGet();
461 LosTaskCB *newTask = TopTaskGet(rq);
462 if (runTask == newTask) {
463 return;
464 }
465
466 SchedTaskSwitch(rq, runTask, newTask);
467}
BOOL LOS_SpinHeld(const SPIN_LOCK_S *lock)
Definition: los_spinlock.c:45
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedResponseTimeReset()

VOID OsSchedResponseTimeReset ( UINT64  responseTime)

在文件 los_sched.c189 行定义.

190{
191 OsSchedRunqueue()->responseTime = responseTime;
192}
UINT64 responseTime
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedRunqueue()

STATIC INLINE SchedRunqueue * OsSchedRunqueue ( VOID  )

在文件 los_sched_pri.h112 行定义.

113{
115}
SchedRunqueue g_schedRunqueue[LOSCFG_KERNEL_CORE_NUM]
Definition: los_sched.c:49
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedRunqueueByID()

STATIC INLINE SchedRunqueue * OsSchedRunqueueByID ( UINT16  id)

在文件 los_sched_pri.h117 行定义.

118{
119 return &g_schedRunqueue[id];
120}
这是这个函数的调用关系图:

◆ OsSchedRunqueueIdleGet()

STATIC INLINE UINT32 OsSchedRunqueueIdleGet ( VOID  )

在文件 los_sched_pri.h202 行定义.

203{
204 return OsSchedRunqueue()->idleTaskID;
205}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedRunqueueIdleInit()

VOID OsSchedRunqueueIdleInit ( UINT32  idleTaskID)

在文件 los_sched.c207 行定义.

208{
210 rq->idleTaskID = idleTaskID;
211}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedRunqueueInit()

VOID OsSchedRunqueueInit ( VOID  )

在文件 los_sched.c194 行定义.

195{
196 if (ArchCurrCpuid() != 0) {
197 return;
198 }
199
200 for (UINT16 index = 0; index < LOSCFG_KERNEL_CORE_NUM; index++) {
203 rq->responseTime = OS_SCHED_MAX_RESPONSE_TIME;
204 }
205}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedRunqueuePendingSet()

STATIC INLINE VOID OsSchedRunqueuePendingSet ( VOID  )

在文件 los_sched_pri.h207 行定义.

函数调用图:
这是这个函数的调用关系图:

◆ OsSchedStart()

VOID OsSchedStart ( VOID  )

在文件 los_sched.c294 行定义.

295{
296 UINT32 cpuid = ArchCurrCpuid();
297 UINT32 intSave;
298
299 PRINTK("cpu %d entering scheduler\n", cpuid);
300
301 SCHEDULER_LOCK(intSave);
302
303 OsTickStart();
304
306 LosTaskCB *newTask = TopTaskGet(rq);
307 newTask->taskStatus |= OS_TASK_STATUS_RUNNING;
308
309#ifdef LOSCFG_KERNEL_SMP
310 /* 注意:需要设置当前cpu,以防第一个任务删除失败,因为这个标志与真实的当前cpu不匹配
311 * attention: current cpu needs to be set, in case first task deletion
312 * may fail because this flag mismatch with the real current cpu.
313 */
314 newTask->currCpu = cpuid;//记录本次运行交给哪个CPU核
315#endif
316
317 OsCurrTaskSet((VOID *)newTask);//设置新任务,背后的逻辑是将新任务的地址交给硬件保存
318
320
322
323 /* System start schedule */
324 OS_SCHEDULER_SET(cpuid);
325
326 rq->responseID = OS_INVALID;
327 UINT64 deadline = newTask->ops->deadlineGet(newTask);
328 SchedNextExpireTimeSet(newTask->taskID, deadline, OS_INVALID);
329 OsTaskContextLoad(newTask);
330}
LITE_OS_SEC_TEXT_INIT VOID OsTickStart(VOID)
启动节拍
Definition: los_hw_tick.c:49
STATIC INLINE VOID OsCurrTaskSet(LosTaskCB *task)
注意任务地址由硬件保存,见于 CP15 | TPIDRPRW
VOID OsSwtmrResponseTimeReset(UINT64 startTime)
Definition: los_swtmr.c:610
VOID OsTaskContextLoad(LosTaskCB *newTask)
UINT64 startTime
UINT16 currCpu
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedTick()

VOID OsSchedTick ( VOID  )

在文件 los_sched.c175 行定义.

176{
178
179 if (rq->responseID == OS_INVALID_VALUE) {
180 if (SchedTimeoutQueueScan(rq)) {
181 LOS_MpSchedule(OS_MP_CPU_ALL);
183 }
184 }
186 rq->responseTime = OS_SCHED_MAX_RESPONSE_TIME;
187}
VOID LOS_MpSchedule(UINT32 target)
Definition: los_mp.c:76
STATIC INLINE BOOL SchedTimeoutQueueScan(SchedRunqueue *rq)
Definition: los_sched.c:133
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedTimeoutQueueAdd()

STATIC INLINE VOID OsSchedTimeoutQueueAdd ( LosTaskCB taskCB,
UINT64  responseTime 
)

在文件 los_sched_pri.h505 行定义.

506{
507#ifdef LOSCFG_KERNEL_SMP
508 UINT16 cpuid = AFFI_MASK_TO_CPUID(taskCB->cpuAffiMask);
509 if (cpuid >= LOSCFG_KERNEL_CORE_NUM) {
510 cpuid = 0;
511 IdleRunqueueFind(&cpuid);
512 }
513#else
514 UINT16 cpuid = 0;
515#endif
516
518 OsAdd2SortLink(&rq->timeoutQueue, &taskCB->sortList, responseTime, cpuid);
519#ifdef LOSCFG_KERNEL_SMP
520 if ((cpuid != ArchCurrCpuid()) && (responseTime < rq->responseTime)) {
522 LOS_MpSchedule(CPUID_TO_AFFI_MASK(cpuid));
523 }
524#endif
525}
STATIC INLINE VOID IdleRunqueueFind(UINT16 *idleCpuid)
SortLinkList sortList
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedTimeoutQueueAdjust()

STATIC INLINE UINT32 OsSchedTimeoutQueueAdjust ( LosTaskCB taskCB,
UINT64  responseTime 
)

在文件 los_sched_pri.h542 行定义.

543{
544 UINT32 ret;
545 SortLinkList *node = &taskCB->sortList;
546#ifdef LOSCFG_KERNEL_SMP
547 UINT16 cpuid = node->cpuid;
548#else
549 UINT16 cpuid = 0;
550#endif
552 ret = OsSortLinkAdjustNodeResponseTime(&rq->timeoutQueue, node, responseTime);
553 if (ret == LOS_OK) {
555 }
556 return ret;
557}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedTimeoutQueueDelete()

STATIC INLINE VOID OsSchedTimeoutQueueDelete ( LosTaskCB taskCB)

在文件 los_sched_pri.h527 行定义.

528{
529 SortLinkList *node = &taskCB->sortList;
530#ifdef LOSCFG_KERNEL_SMP
532#else
534#endif
535 UINT64 oldResponseTime = GET_SORTLIST_VALUE(node);
537 if (oldResponseTime <= rq->responseTime) {
538 rq->responseTime = OS_SCHED_MAX_RESPONSE_TIME;
539 }
540}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedToUserReleaseLock()

VOID OsSchedToUserReleaseLock ( VOID  )

在文件 los_sched.c333 行定义.

334{
335 /* The scheduling lock needs to be released before returning to user mode */
336 LOCKDEP_CHECK_OUT(&g_taskSpin);
338
340}
STATIC INLINE VOID OsSchedUnlock(VOID)
VOID ArchSpinUnlock(size_t *lock)
size_t rawLock
Definition: los_spinlock.h:51
函数调用图:

◆ OsSchedUnlock()

STATIC INLINE VOID OsSchedUnlock ( VOID  )

在文件 los_sched_pri.h137 行定义.

138{
140}
函数调用图:
这是这个函数的调用关系图:

◆ OsSchedUnlockResch()

STATIC INLINE BOOL OsSchedUnlockResch ( VOID  )

在文件 los_sched_pri.h142 行定义.

143{
145 if (rq->taskLockCnt > 0) {
146 rq->taskLockCnt--;
147 if ((rq->taskLockCnt == 0) && (rq->schedFlag & INT_PEND_RESCH) && OS_SCHEDULER_ACTIVE) {
148 return TRUE;
149 }
150 }
151
152 return FALSE;
153}
函数调用图:
这是这个函数的调用关系图:

◆ OsTaskIsBlocked()

STATIC INLINE BOOL OsTaskIsBlocked ( const LosTaskCB taskCB)

在文件 los_sched_pri.h455 行定义.

456{
457 return ((taskCB->taskStatus & (OS_TASK_STATUS_SUSPENDED | OS_TASK_STATUS_PENDING | OS_TASK_STATUS_DELAY)) != 0);
458}
这是这个函数的调用关系图:

◆ OsTaskIsInactive()

STATIC INLINE BOOL OsTaskIsInactive ( const LosTaskCB taskCB)

在文件 los_sched_pri.h440 行定义.

441{
442 return ((taskCB->taskStatus & (OS_TASK_STATUS_INIT | OS_TASK_STATUS_EXIT)) != 0);
443}
这是这个函数的调用关系图:

◆ OsTaskIsPending()

STATIC INLINE BOOL OsTaskIsPending ( const LosTaskCB taskCB)

在文件 los_sched_pri.h445 行定义.

446{
447 return ((taskCB->taskStatus & OS_TASK_STATUS_PENDING) != 0);
448}
这是这个函数的调用关系图:

◆ OsTaskIsReady()

STATIC INLINE BOOL OsTaskIsReady ( const LosTaskCB taskCB)

在文件 los_sched_pri.h435 行定义.

436{
437 return ((taskCB->taskStatus & OS_TASK_STATUS_READY) != 0);
438}

◆ OsTaskIsRunning()

STATIC INLINE BOOL OsTaskIsRunning ( const LosTaskCB taskCB)

在文件 los_sched_pri.h430 行定义.

431{
432 return ((taskCB->taskStatus & OS_TASK_STATUS_RUNNING) != 0);
433}
这是这个函数的调用关系图:

◆ OsTaskIsSuspended()

STATIC INLINE BOOL OsTaskIsSuspended ( const LosTaskCB taskCB)

在文件 los_sched_pri.h450 行定义.

451{
452 return ((taskCB->taskStatus & OS_TASK_STATUS_SUSPENDED) != 0);
453}

◆ SchedTaskFreeze()

STATIC INLINE VOID SchedTaskFreeze ( LosTaskCB taskCB)

在文件 los_sched_pri.h559 行定义.

560{
561 UINT64 responseTime;
562
563#ifdef LOSCFG_KERNEL_PM
564 if (!OsIsPmMode()) {
565 return;
566 }
567#endif
568
569 if (!(taskCB->taskStatus & (OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY))) {
570 return;
571 }
572
573 responseTime = GET_SORTLIST_VALUE(&taskCB->sortList);
575 SET_SORTLIST_VALUE(&taskCB->sortList, responseTime);
576 taskCB->taskStatus |= OS_TASK_STATUS_FROZEN;
577 return;
578}
BOOL OsIsPmMode(VOID)
Definition: los_pm.c:680
STATIC INLINE VOID OsSchedTimeoutQueueDelete(LosTaskCB *taskCB)
函数调用图:
这是这个函数的调用关系图:

◆ SchedTaskUnfreeze()

STATIC INLINE VOID SchedTaskUnfreeze ( LosTaskCB taskCB)

在文件 los_sched_pri.h580 行定义.

581{
582 UINT64 currTime, responseTime;
583
584 if (!(taskCB->taskStatus & OS_TASK_STATUS_FROZEN)) {
585 return;
586 }
587
588 taskCB->taskStatus &= ~OS_TASK_STATUS_FROZEN;
589 currTime = OsGetCurrSchedTimeCycle();
590 responseTime = GET_SORTLIST_VALUE(&taskCB->sortList);
591 if (responseTime > currTime) {
592 OsSchedTimeoutQueueAdd(taskCB, responseTime);
593 return;
594 }
595
596 SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME);
597 if (taskCB->taskStatus & OS_TASK_STATUS_PENDING) {
598 LOS_ListDelete(&taskCB->pendList);
599 }
600 taskCB->taskStatus &= ~OS_TASK_STATUS_BLOCKED;
601 return;
602}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
Definition: los_list.h:292
STATIC INLINE VOID OsSchedTimeoutQueueAdd(LosTaskCB *taskCB, UINT64 responseTime)
LOS_DL_LIST pendList
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ g_schedRunqueue

SchedRunqueue g_schedRunqueue[LOSCFG_KERNEL_CORE_NUM]
extern

在文件 los_sched.c49 行定义.

◆ g_taskScheduled

UINT32 g_taskScheduled
extern

在文件 los_task.c151 行定义.