38#define OS_SCHED_FIFO_TIMEOUT 0x7FFFFFFF
39#define PRIQUEUE_PRIOR0_BIT 0x80000000U
40#define OS_SCHED_TIME_SLICES_MIN ((5000 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE)
41#define OS_SCHED_TIME_SLICES_MAX ((LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE)
42#define OS_SCHED_TIME_SLICES_DIFF (OS_SCHED_TIME_SLICES_MAX - OS_SCHED_TIME_SLICES_MIN)
43#define OS_SCHED_READY_MAX 30
44#define OS_TIME_SLICE_MIN (INT32)((50 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE)
91 LOS_ASSERT(currTime >= taskCB->
startTime);
95 LOS_ASSERT(incTime >= 0);
97 if (sched->
policy == LOS_SCHED_RR) {
99#ifdef LOSCFG_SCHED_DEBUG
105 if (taskCB->
timeSlice <= OS_TIME_SLICE_MIN) {
109#ifdef LOSCFG_SCHED_DEBUG
119 timeSlice = (timeSlice <= OS_TIME_SLICE_MIN) ? sched->
initTimeSlice : timeSlice;
130 if (readyTasks > OS_SCHED_READY_MAX) {
131 return OS_SCHED_TIME_SLICES_MIN;
133 time = ((OS_SCHED_READY_MAX - readyTasks) * OS_SCHED_TIME_SLICES_DIFF) / OS_SCHED_READY_MAX;
134 return (
time + OS_SCHED_TIME_SLICES_MIN);
148 LOS_ASSERT(priQue->
pstNext == NULL);
151 rq->
queueBitmap |= PRIQUEUE_PRIOR0_BIT >> basePrio;
155 *bitmap |= PRIQUEUE_PRIOR0_BIT >> priority;
173 LOS_ASSERT(priQue->
pstNext == NULL);
176 rq->
queueBitmap |= PRIQUEUE_PRIOR0_BIT >> basePrio;
180 *bitmap |= PRIQUEUE_PRIOR0_BIT >> priority;
196 *bitmap &= ~(PRIQUEUE_PRIOR0_BIT >> priority);
200 rq->
queueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> basePrio);
206 LOS_ASSERT(!(taskCB->
taskStatus & OS_TASK_STATUS_READY));
211 if (taskCB->
timeSlice > OS_TIME_SLICE_MIN) {
217#ifdef LOSCFG_SCHED_DEBUG
224 case LOS_SCHED_FIFO: {
226 if ((taskCB->
timeSlice > OS_TIME_SLICE_MIN) && (taskCB->
taskStatus & OS_TASK_STATUS_RUNNING)) {
240 taskCB->
taskStatus &= ~OS_TASK_STATUS_BLOCKED;
246#ifdef LOSCFG_SCHED_DEBUG
247 if (!(taskCB->
taskStatus & OS_TASK_STATUS_RUNNING)) {
271 if (taskCB->
taskStatus & OS_TASK_STATUS_READY) {
273 }
else if (taskCB->
taskStatus & OS_TASK_STATUS_PENDING) {
275 taskCB->
taskStatus &= ~OS_TASK_STATUS_PENDING;
278 if (taskCB->
taskStatus & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME)) {
280 taskCB->
taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME);
305 runTask->
taskStatus |= OS_TASK_STATUS_PENDING;
308 if (ticks != LOS_WAIT_FOREVER) {
309 runTask->
taskStatus |= OS_TASK_STATUS_PEND_TIME;
310 runTask->
waitTime = OS_SCHED_TICK_TO_CYCLE(ticks);
315 if (runTask->
taskStatus & OS_TASK_STATUS_TIMEOUT) {
316 runTask->
taskStatus &= ~OS_TASK_STATUS_TIMEOUT;
317 return LOS_ERRNO_TSK_TIMEOUT;
327 resumedTask->
taskStatus &= ~OS_TASK_STATUS_PENDING;
329 if (resumedTask->
taskStatus & OS_TASK_STATUS_PEND_TIME) {
331 resumedTask->
taskStatus &= ~OS_TASK_STATUS_PEND_TIME;
334 if (!(resumedTask->
taskStatus & OS_TASK_STATUS_SUSPENDED)) {
335#ifdef LOSCFG_SCHED_DEBUG
346 BOOL needSched = FALSE;
357 if (taskCB->
taskStatus & (OS_TASK_STATUS_READY | OS_TASK_STATUS_RUNNING)) {
368 BOOL needSched = FALSE;
380 if (taskCB->
taskStatus & OS_TASK_STATUS_READY) {
388 OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, sched->
priority);
389 if (taskCB->
taskStatus & OS_TASK_STATUS_INIT) {
394 if (taskCB->
taskStatus & OS_TASK_STATUS_RUNNING) {
413 if (taskCB->
taskStatus & OS_TASK_STATUS_READY) {
419 taskCB->
taskStatus |= OS_TASK_STATUS_SUSPENDED;
420 OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, taskCB);
433 taskCB->
taskStatus &= ~OS_TASK_STATUS_SUSPENDED;
458 if ((param->
policy != LOS_SCHED_RR) && (param->
policy != LOS_SCHED_FIFO)) {
475 if ((param->
policy != LOS_SCHED_RR) && (param->
policy != LOS_SCHED_FIFO)) {
487 if (
sp->priBitmap == 0) {
493 LOS_DL_LIST_FOR_EACH_ENTRY(pendedTask, list,
LosTaskCB, pendList) {
502 if (priority != LOS_INVALID_BIT_INDEX) {
504 sp->priority = priority;
529 param->
basePrio = OS_USER_PROCESS_PRIORITY_HIGHEST;
539 for (
UINT16 index = 0; index < OS_PRIORITY_QUEUE_NUM; index++) {
542 for (
UINT16 prio = 0; prio < OS_PRIORITY_QUEUE_NUM; prio++) {
macro EXC_SP_SET reg1 mrc 获取CPU信息 and mov mul reg0 计算当前CPU栈的偏移位置 ldr reg1 相减得到栈顶 mov sp
VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)
对状态字的某一标志位进行置1操作
VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
对状态字的某一标志位进行清0操作
UINT16 LOS_LowBitGet(UINT32 bitmap)
获取参数位图中最低位为1的索引位, 例如: 00110110 返回 1
UINT16 LOS_HighBitGet(UINT32 bitmap)
获取参数位图中最高位为1的索引位 例如: 00110110 返回 5
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListTailInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the tail of a doubly linked list.
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListHeadInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the head of a doubly linked list.
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
STATIC VOID HPFDequeue(SchedRunqueue *rq, LosTaskCB *taskCB)
STATIC VOID HPFPriorityInheritance(LosTaskCB *owner, const SchedParam *param)
STATIC UINT32 HPFDelay(LosTaskCB *runTask, UINT64 waitTime)
STATIC BOOL BasePriorityModify(SchedRunqueue *rq, LosTaskCB *taskCB, UINT16 priority)
STATIC INLINE VOID PriQueInsert(HPFRunqueue *rq, LosTaskCB *taskCB)
STATIC UINT32 HPFSuspend(LosTaskCB *taskCB)
STATIC UINT32 HPFSchedParamGet(const LosTaskCB *taskCB, SchedParam *param)
STATIC VOID HPFYield(LosTaskCB *runTask)
const STATIC SchedOps g_priorityOps
STATIC INLINE UINT32 TimeSliceCalculate(HPFRunqueue *rq, UINT16 basePrio, UINT16 priority)
STATIC VOID HPFEnqueue(SchedRunqueue *rq, LosTaskCB *taskCB)
STATIC VOID HPFExit(LosTaskCB *taskCB)
STATIC INT32 HPFParamCompare(const SchedPolicy *sp1, const SchedPolicy *sp2)
STATIC INLINE VOID PriQueDelete(HPFRunqueue *rq, UINT32 basePrio, LOS_DL_LIST *priQue, UINT32 priority)
STATIC VOID HPFStartToRun(SchedRunqueue *rq, LosTaskCB *taskCB)
STATIC UINT32 HPFWait(LosTaskCB *runTask, LOS_DL_LIST *list, UINT32 ticks)
STATIC INLINE VOID PriQueHeadInsert(HPFRunqueue *rq, UINT32 basePrio, LOS_DL_LIST *priQue, UINT32 priority)
STATIC UINT32 HPFResume(LosTaskCB *taskCB, BOOL *needSched)
VOID HPFSchedPolicyInit(SchedRunqueue *rq)
STATIC VOID HPFTimeSliceUpdate(SchedRunqueue *rq, LosTaskCB *taskCB, UINT64 currTime)
VOID HPFProcessDefaultSchedParamGet(SchedParam *param)
STATIC INLINE VOID PriQueTailInsert(HPFRunqueue *rq, UINT32 basePrio, LOS_DL_LIST *priQue, UINT32 priority)
STATIC BOOL HPFSchedParamModify(LosTaskCB *taskCB, const SchedParam *param)
STATIC UINT64 HPFTimeSliceGet(const LosTaskCB *taskCB)
STATIC HPFRunqueue g_schedHPF
VOID HPFTaskSchedParamInit(LosTaskCB *taskCB, UINT16 policy, const SchedParam *parentParam, const TSK_INIT_PARAM_S *param)
STATIC VOID HPFPriorityRestore(LosTaskCB *owner, const LOS_DL_LIST *list, const SchedParam *param)
恢复任务优先级
STATIC VOID HPFWake(LosTaskCB *resumedTask)
STATIC INLINE UINT64 OsGetCurrSchedTimeCycle(VOID)
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
STATIC INLINE BOOL OsPreemptableInSched(VOID)
STATIC INLINE SchedRunqueue * OsSchedRunqueue(VOID)
STATIC INLINE VOID SchedTaskFreeze(LosTaskCB *taskCB)
STATIC INLINE VOID OsSchedTimeoutQueueDelete(LosTaskCB *taskCB)
STATIC INLINE VOID SchedTaskUnfreeze(LosTaskCB *taskCB)
STATIC INLINE BOOL OsTaskIsBlocked(const LosTaskCB *taskCB)
VOID OsSchedResched(VOID)
UINT32 readyTasks[OS_PRIORITY_QUEUE_NUM]
LOS_DL_LIST priQueList[OS_PRIORITY_QUEUE_NUM]
HPFQueue queueList[OS_PRIORITY_QUEUE_NUM]
struct LOS_DL_LIST * pstNext
LOS_DL_LIST threadSiblingList
UINT32 initTimeSlice
初始化时间片
VOID(* enqueue)(SchedRunqueue *rq, LosTaskCB *taskCB)
入队列
VOID(* dequeue)(SchedRunqueue *rq, LosTaskCB *taskCB)
出队列
HPFRunqueue * hpfRunqueue