Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
tu_tou_bao_bei_
Kernel Liteos A
提交
3cc5c47c
K
Kernel Liteos A
项目概览
tu_tou_bao_bei_
/
Kernel Liteos A
与 Fork 源项目一致
Fork自
OpenHarmony / Kernel Liteos A
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos A
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
3cc5c47c
编写于
11月 13, 2020
作者:
tu_tou_bao_bei_
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
删除 los_sched.c
上级
a2d3befc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
0 addition
and
176 deletion
+0
-176
kernel/base/sched/sched_sq/los_sched.c
kernel/base/sched/sched_sq/los_sched.c
+0
-176
未找到文件。
kernel/base/sched/sched_sq/los_sched.c
已删除
100644 → 0
浏览文件 @
a2d3befc
/*
* Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "los_base.h"
#include "los_task_pri.h"
#include "los_percpu_pri.h"
#include "los_hw_pri.h"
#include "los_arch_mmu.h"
#include "los_process_pri.h"
#ifdef LOSCFG_KERNEL_CPUP
#include "los_cpup_pri.h"
#endif
#ifdef __cplusplus
#if __cplusplus
extern
"C"
{
#endif
/* __cplusplus */
#endif
/* __cplusplus */
STATIC
VOID
OsSchedSwitchProcess
(
LosProcessCB
*
runProcess
,
LosProcessCB
*
newProcess
)
{
if
(
runProcess
==
newProcess
)
{
return
;
}
#if (LOSCFG_KERNEL_SMP == YES)
runProcess
->
processStatus
=
OS_PROCESS_RUNTASK_COUNT_DEC
(
runProcess
->
processStatus
);
newProcess
->
processStatus
=
OS_PROCESS_RUNTASK_COUNT_ADD
(
newProcess
->
processStatus
);
LOS_ASSERT
(
!
(
OS_PROCESS_GET_RUNTASK_COUNT
(
newProcess
->
processStatus
)
>
LOSCFG_KERNEL_CORE_NUM
));
if
(
OS_PROCESS_GET_RUNTASK_COUNT
(
runProcess
->
processStatus
)
==
0
)
{
#endif
runProcess
->
processStatus
&=
~
OS_PROCESS_STATUS_RUNNING
;
if
((
runProcess
->
threadNumber
>
1
)
&&
!
(
runProcess
->
processStatus
&
OS_PROCESS_STATUS_READY
))
{
runProcess
->
processStatus
|=
OS_PROCESS_STATUS_PEND
;
}
#if (LOSCFG_KERNEL_SMP == YES)
}
#endif
LOS_ASSERT
(
!
(
newProcess
->
processStatus
&
OS_PROCESS_STATUS_PEND
));
newProcess
->
processStatus
|=
OS_PROCESS_STATUS_RUNNING
;
if
(
OsProcessIsUserMode
(
newProcess
))
{
LOS_ArchMmuContextSwitch
(
&
newProcess
->
vmSpace
->
archMmu
);
}
#ifdef LOSCFG_KERNEL_CPUP
OsProcessCycleEndStart
(
newProcess
->
processID
,
OS_PROCESS_GET_RUNTASK_COUNT
(
runProcess
->
processStatus
)
+
1
);
#endif
/* LOSCFG_KERNEL_CPUP */
OsCurrProcessSet
(
newProcess
);
if
((
newProcess
->
timeSlice
==
0
)
&&
(
newProcess
->
policy
==
LOS_SCHED_RR
))
{
newProcess
->
timeSlice
=
OS_PROCESS_SCHED_RR_INTERVAL
;
}
}
VOID
OsSchedResched
(
VOID
)
{
LosTaskCB
*
runTask
=
NULL
;
LosTaskCB
*
newTask
=
NULL
;
LosProcessCB
*
runProcess
=
NULL
;
LosProcessCB
*
newProcess
=
NULL
;
LOS_ASSERT
(
LOS_SpinHeld
(
&
g_taskSpin
));
if
(
!
OsPreemptableInSched
())
{
return
;
}
runTask
=
OsCurrTaskGet
();
newTask
=
OsGetTopTask
();
/* always be able to get one task */
LOS_ASSERT
(
newTask
!=
NULL
);
if
(
runTask
==
newTask
)
{
return
;
}
runTask
->
taskStatus
&=
~
OS_TASK_STATUS_RUNNING
;
newTask
->
taskStatus
|=
OS_TASK_STATUS_RUNNING
;
runProcess
=
OS_PCB_FROM_PID
(
runTask
->
processID
);
newProcess
=
OS_PCB_FROM_PID
(
newTask
->
processID
);
OsSchedSwitchProcess
(
runProcess
,
newProcess
);
#if (LOSCFG_KERNEL_SMP == YES)
/* mask new running task's owner processor */
runTask
->
currCpu
=
OS_TASK_INVALID_CPUID
;
newTask
->
currCpu
=
ArchCurrCpuid
();
#endif
(
VOID
)
OsTaskSwitchCheck
(
runTask
,
newTask
);
#if (LOSCFG_KERNEL_SCHED_STATISTICS == YES)
OsSchedStatistics
(
runTask
,
newTask
);
#endif
if
((
newTask
->
timeSlice
==
0
)
&&
(
newTask
->
policy
==
LOS_SCHED_RR
))
{
newTask
->
timeSlice
=
LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT
;
}
OsCurrTaskSet
((
VOID
*
)
newTask
);
if
(
OsProcessIsUserMode
(
newProcess
))
{
OsCurrUserTaskSet
(
newTask
->
userArea
);
}
PRINT_TRACE
(
"cpu%d run process name: (%s) pid: %d status: %x threadMap: %x task name: (%s) tid: %d status: %x ->
\n
"
" new process name: (%s) pid: %d status: %x threadMap: %x task name: (%s) tid: %d status: %x!
\n
"
,
ArchCurrCpuid
(),
runProcess
->
processName
,
runProcess
->
processID
,
runProcess
->
processStatus
,
runProcess
->
threadScheduleMap
,
runTask
->
taskName
,
runTask
->
taskID
,
runTask
->
taskStatus
,
newProcess
->
processName
,
newProcess
->
processID
,
newProcess
->
processStatus
,
newProcess
->
threadScheduleMap
,
newTask
->
taskName
,
newTask
->
taskID
,
newTask
->
taskStatus
);
/* do the task context switch */
OsTaskSchedule
(
newTask
,
runTask
);
}
VOID
OsSchedPreempt
(
VOID
)
{
LosTaskCB
*
runTask
=
NULL
;
UINT32
intSave
;
if
(
!
OsPreemptable
())
{
return
;
}
SCHEDULER_LOCK
(
intSave
);
/* add run task back to ready queue */
runTask
=
OsCurrTaskGet
();
OS_TASK_SCHED_QUEUE_ENQUEUE
(
runTask
,
0
);
/* reschedule to new thread */
OsSchedResched
();
SCHEDULER_UNLOCK
(
intSave
);
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
/* __cplusplus */
#endif
/* __cplusplus */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录