注解汇编代码如何保持任务上下文

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    https://weharmony.gitee.io
上级 2b430771
......@@ -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 */
......
......@@ -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 @ C5=C4=R0
MCR p15, 0, R0, c13, c0, 4 @ C13=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&CPSR_MASK_MODE ,目的是清除高16
CMP R0, #CPSR_USER_MODE @R0 用户模式比较
BNE OsKernelTaskLoad @非用户模式则跳转到OsKernelTaskLoad执行,跳出
......
......@@ -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 输出回溯信息
......
......@@ -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)
......
......@@ -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 )
......
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.
先完成此消息的编辑!
想要评论请 注册