Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
鸿蒙内核源码分析
注释鸿蒙内核源码
提交
361754bf
注释鸿蒙内核源码
项目概览
鸿蒙内核源码分析
/
注释鸿蒙内核源码
通知
270
Star
29
Fork
11
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
106
Wiki
分析
仓库
DevOps
项目成员
Pages
注释鸿蒙内核源码
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
106
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
361754bf
编写于
3月 15, 2021
作者:
鸿蒙内核源码分析
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
注解汇编代码如何保持任务上下文
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://weharmony.gitee.io
上级
2b430771
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
25 addition
and
25 deletion
+25
-25
arch/arm/arm/src/include/los_hw_pri.h
arch/arm/arm/src/include/los_hw_pri.h
+1
-1
arch/arm/arm/src/los_dispatch.S
arch/arm/arm/src/los_dispatch.S
+11
-11
arch/arm/arm/src/los_hw.c
arch/arm/arm/src/los_hw.c
+2
-2
arch/arm/include/los_hw.h
arch/arm/include/los_hw.h
+9
-9
kernel/base/include/los_task_pri.h
kernel/base/include/los_task_pri.h
+1
-1
zzz/git/push.sh
zzz/git/push.sh
+1
-1
未找到文件。
arch/arm/arm/src/include/los_hw_pri.h
浏览文件 @
361754bf
...
...
@@ -50,7 +50,7 @@ extern "C" {
#define GEN_REGS_NUM 13
/* The size of this structure must be smaller than or equal to the size specified by OS_TSK_STACK_ALIGN (16 bytes). */
typedef
struct
{
typedef
struct
{
//参考OsTaskSchedule来理解
#if !defined(LOSCFG_ARCH_FPU_DISABLE)
UINT64
D
[
FP_REGS_NUM
];
/* D0-D31 */
UINT32
regFPSCR
;
/* FPSCR */
...
...
arch/arm/arm/src/los_dispatch.S
浏览文件 @
361754bf
...
...
@@ -168,7 +168,7 @@ OsStartToRun:
STRH
R1
,
[
R0
,
#
4
]
@
将寄存器
R1
中的低
16
位写入以
R0
+
4
地址的存储器中
/
*
R0
is
new
task
,
save
it
on
tpidrprw
*/
MCR
p15
,
0
,
R0
,
c13
,
c0
,
4
@
C
5
=
C4
=
R0
MCR
p15
,
0
,
R0
,
c13
,
c0
,
4
@
C
13
=
R0
ISB
@
指令同步屏障,清除流水线并且确保在新指令执行时,之前的指令都已经执行完毕。
VPUSH
{
S0
}
/*
fpu
*/
...
...
@@ -182,19 +182,19 @@ OsStartToRun:
*
R0
:
new
task
*
R1
:
run
task
*/
OsTaskSchedule
:
/*任务调度*/
OsTaskSchedule
:
/*任务调度
,
OsTaskSchedule
的目的是将寄存器值按
TaskContext
的格式保存起来
*/
MRS
R2
,
CPSR
/*
MRS
指令用于将特殊寄存器
(
如
CPSR
和
SPSR
)
中的数据传递给通用寄存器,要读取特殊寄存器的数据只能使用
MRS
指令
*/
STMFD
SP
!,
{
LR
}
/*
返回地址入栈
*/
STMFD
SP
!,
{
LR
}
/*
为何返回地址要再次入栈
@
note_why
*/
STMFD
SP
!,
{
LR
}
/*
返回地址入栈
,
对应
TaskContext
->
PC
(
R15
寄存器
)
*/
STMFD
SP
!,
{
LR
}
/*
再次入栈对应
,
对应
TaskContext
->
LR
(
R14
寄存器
)
*/
/
*
jump
sp
*/
SUB
SP
,
SP
,
#
4
/**/
SUB
SP
,
SP
,
#
4
/*
跳的目的是为了
,
对应
TaskContext
->
SP
(
R13
寄存器
)
*/
/
*
push
r0
-
r12
*/
STMFD
SP
!,
{
R0
-
R12
}
@
将寄存器列表中的寄存器
(
R0
-
R12
)
压栈
。
STMFD
SP
!,
{
R2
}
/*
R2
入栈
*/
STMFD
SP
!,
{
R0
-
R12
}
@
对应
TaskContext
->
R
[
GEN_REGS_NUM
](
R0
~
R12
寄存器
)
。
STMFD
SP
!,
{
R2
}
/*
R2
入栈
对应
TaskContext
->
regPSR
*/
/
*
8
bytes
stack
align
*/
SUB
SP
,
SP
,
#
4
@
栈对齐
SUB
SP
,
SP
,
#
4
@
栈对齐
,
对应
TaskContext
->
resved
/
*
save
fpu
registers
*/
PUSH_FPU_REGS
R2
/*
保存
fpu
寄存器
*/
...
...
@@ -215,8 +215,8 @@ OsTaskContextLoad: @加载上下文
/
*
8
bytes
stack
align
*/
ADD
SP
,
SP
,
#
4
@
栈对齐
LDMFD
SP
!,
{
R0
}
@
将堆栈内容出栈保存到寄存器
R0
MOV
R4
,
R0
@
R4
=
R0
说明
R4
也记录了
CPSR
内容
,
这个内容将用于
OsKernelTaskLoad
中保存到
SPSR
LDMFD
SP
!,
{
R0
}
@
此时
SP
!
位置保存的是
CPSR
的内容
,
弹出到
R0
MOV
R4
,
R0
@
R4
=
R0
,
将
CPSR
保存在
r4
,
将在
OsKernelTaskLoad
中保存到
SPSR
AND
R0
,
R0
,
#
CPSR_MASK_MODE
@
R0
=
R0
&C
PSR_MASK_MODE
,
目的是清除高
16
位
CMP
R0
,
#
CPSR_USER_MODE
@
R0
和
用户模式比较
BNE
OsKernelTaskLoad
@
非用户模式则跳转到
OsKernelTaskLoad
执行
,
跳出
...
...
arch/arm/arm/src/los_hw.c
浏览文件 @
361754bf
...
...
@@ -101,7 +101,7 @@ LITE_OS_SEC_TEXT_INIT VOID *OsTaskStackInit(UINT32 taskID, UINT32 stackSize, VOI
#ifdef LOSCFG_INTERWORK_THUMB // 16位模式
taskContext
->
regPSR
=
PSR_MODE_SVC_THUMB
;
/* CPSR (Enable IRQ and FIQ interrupts, THUMNB-mode) */
#else
#else
//用于设置CPSR寄存器
taskContext
->
regPSR
=
PSR_MODE_SVC_ARM
;
/* CPSR (Enable IRQ and FIQ interrupts, ARM-mode) */
#endif
...
...
@@ -135,7 +135,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsUserTaskStackInit(TaskContext *context, TSK_ENTRY_F
#ifdef LOSCFG_INTERWORK_THUMB
context
->
regPSR
=
PSR_MODE_USR_THUMB
;
#else
context
->
regPSR
=
PSR_MODE_USR_ARM
;
context
->
regPSR
=
PSR_MODE_USR_ARM
;
//工作模式:用户模式 + 工作状态:arm
#endif
context
->
R
[
0
]
=
stack
;
//栈指针给r0寄存器
context
->
SP
=
TRUNCATE
(
stack
,
LOSCFG_STACK_POINT_ALIGN_SIZE
);
//异常模式所专用的堆栈 segment fault 输出回溯信息
...
...
arch/arm/include/los_hw.h
浏览文件 @
361754bf
...
...
@@ -44,16 +44,16 @@ extern "C" {
#endif
/* __cplusplus */
#endif
/* __cplusplus */
#define OS_SCHEDULE_IN_IRQ 0x0
#define OS_SCHEDULE_IN_TASK 0x1
#define OS_SCHEDULE_IN_IRQ 0x0
//因中断产生调度
#define OS_SCHEDULE_IN_TASK 0x1
//因任务产生调度
#define PSR_T_ARM 0x00000000u
#define PSR_T_THUMB 0x00000020u
#define PSR_MODE_SVC 0x00000013u
#define PSR_MODE_SYS 0x0000001Fu
#define PSR_FIQ_DIS 0x00000040u
#define PSR_IRQ_DIS 0x00000080u
#define PSR_MODE_USR 0x00000010u
#define PSR_T_ARM 0x00000000u
//工作状态:arm
#define PSR_T_THUMB 0x00000020u
//工作状态:thumb
#define PSR_MODE_SVC 0x00000013u
//管理模式
#define PSR_MODE_SYS 0x0000001Fu
//系统模式
#define PSR_FIQ_DIS 0x00000040u
//禁止快中断
#define PSR_IRQ_DIS 0x00000080u
//禁止普通中断
#define PSR_MODE_USR 0x00000010u
//用户模式
#define PSR_MODE_SVC_THUMB (PSR_MODE_SVC | PSR_T_THUMB | PSR_FIQ_DIS | PSR_IRQ_DIS)
#define PSR_MODE_SVC_ARM (PSR_MODE_SVC | PSR_T_ARM | PSR_FIQ_DIS | PSR_IRQ_DIS)
...
...
kernel/base/include/los_task_pri.h
浏览文件 @
361754bf
...
...
@@ -294,7 +294,7 @@ extern SPIN_LOCK_S g_taskSpin;//任务自旋锁
#define OS_TCB_NAME_LEN 32
typedef
struct
{
VOID
*
stackPointer
;
/**< Task stack pointer */
//
非用户模式下的栈指针
VOID
*
stackPointer
;
/**< Task stack pointer */
//
用于保存任务上下文TaskContext *context
UINT16
taskStatus
;
/**< Task status */
//各种状态标签,可以拥有多种标签,按位标识
UINT16
priority
;
/**< Task priority */
//任务优先级[0:31],默认是31级
UINT16
policy
;
//任务的调度方式(三种 .. LOS_SCHED_RR )
...
...
zzz/git/push.sh
浏览文件 @
361754bf
git add
-A
git commit
-m
'
0xe51ff004 = "ldr pc, [pc, #-4]"
git commit
-m
'
注解汇编代码如何保持任务上下文
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://weharmony.gitee.io
'
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录