📄 os_cpu_a.s
字号:
;/****************************************Copyright (c)**************************************************
;**
;** 公 司
;** 部 门
;**
;** http://www.xxxx.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;** 文 件 名: OS_CPU_A.S
;** 创 建 人: 罗辉联
;** 创建日期: 2006年6月10日
;** 描 述: UCOS移植代码汇编部分
;**
;**--------------历史版本--------------------------------------------------------------------------------
;** 创 建 人: 罗辉联
;** 技术顾问: 楼东武 浙江大学信电系 (高级工程师)
;** 张美玉 浙江工业大学软件学院 (教授)
;** 邹洪波 浙江大学自动化系 (博士)
;** 钟 曦 北京中星威电子有限公司 (工程师)
;**
;** 版 本: V1.0
;** 日 期: 2006年6月10日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
IMPORT OSRunning ;//引入的外部标号或函数
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSTaskSwHook
EXPORT OS_CPU_SR_Save ;//给外部使用的标号或者函数
EXPORT OS_CPU_SR_Restore
EXPORT OSStartHighRdy
EXPORT OSCtxSw
EXPORT OSIntCtxSw
NO_INT EQU 0xC0 ;//禁止IRQ,FIQ中断
SVC32_MODE EQU 0x13 ;//SVC模式定义
AREA |.text|,CODE
CODE32
;/*********************************************************************************************************
;** 函数名称: OS_CPU_SR_Save, OS_CPU_SR_Restore
;** 功能描述: 根据先前的中断状态禁止或允许中断,通常用局部变量cpu_sr保存中断状态,然后在禁止中断。cpu_sr可
;** 在需要禁止中断的任何uc/osII功能函数中使用.可以通过把cpu_sr的值复制到CPU的相关状态寄存器而实
;** 现中断的回复.
;**
;** 参 数: OS_CPU_SR_Restore 的参数一般用OS_CPU_SR_Save的返回值填充
;**
;** 返 回 值: OS_CPU_SR_Save 返回中断标志状态
;**
;** 作 者: 罗辉联
;** 日 期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OS_CPU_SR_Save
MRS R0,CPSR ;//禁止IRQ,FIQ中断
ORR R1,R0,#NO_INT
MSR CPSR_c,R1
MRS R1,CPSR ;//保证IRQ,FIQ中断禁止标志设置成功
AND R1,R1,#NO_INT
CMP R1,#NO_INT
BNE OS_CPU_SR_Save ;//如果IRQ,FIQ中断禁止标志设置失败重新设置
BX LR ;//原先的FIQ,IRQ中断标志通过R0返回
OS_CPU_SR_Restore ;//恢复CPSR
MSR CPSR_c,R0
BX LR
;/*********************************************************************************************************
;** 函数名称: OSStartHighRdy
;** 功能描述: uC/OS-II启动时使用OSStartHighRdy运行第一个任务,它将调用OSTaskSwHook(),然后设置OSRunning为
;** TRUE,最后切换到优先级最高且处于就绪状态的任务
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSStartHighRdy
MSR CPSR_c, #(NO_INT | SVC32_MODE)
;//处理器模式切换到SVC模式,且禁止IRQ,FIQ中断
LDR R0, =OSTaskSwHook ;//调用OSTaskSwHook();
MOV LR, PC
BX R0
LDR R4, =OSRunning ;//设置OSRunning = TRUE
MOV R5, #1
STRB R5, [R4]
;//切换到最高优先级的任务
LDR R4, =OSTCBHighRdy ;//获得最高优先级任务控制块地址
LDR R4, [R4] ;//获取堆栈指针
LDR SP, [R4] ;//切换到新的堆栈
LDR R4, [SP], #4 ;//获得新任务的CPSR
MSR SPSR_cxsf,R4
LDMFD SP!, {R0-R12,LR,PC}^ ;//恢复新任务上下文
;/*********************************************************************************************************
;** 函数名称: OSCtxSw
;** 功能描述: 该函数在系统模式下被调用,且FIQ,IRQ被禁止,其功能包括保存当前任务上下文到当前任务堆栈,
;** 设置 OSTCBCur->OSTCBStkPtr = SP;
;** 调用 OSTaskSwHook();
;** 设置 OSPrioCur = OSPrioHighRdy;
;** 设置 OSTCBCur = OSTCBHighRdy;
;** 设置 SP = OSTCBHighRdy->OSTCBStkPtr;
;** 从新TASK的堆栈恢复新TASK的上下文
;** 执行新的TASK
;** 其中OSTCBCur指向挂起任务的OS_TCB
;** OSTCBHighRdy指向恢复任务的OS_TCB
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSCtxSw
;//保存当前TASK的CONTEXT
STMFD SP!, {LR} ;//保存返回地址到堆栈
STMFD SP!, {LR}
STMFD SP!, {R0-R12} ;Push registers
MRS R4, CPSR ;Push current CPSR
TST LR, #1 ;See if called from Thumb mode
ORRNE R4, R4, #0x20 ;If yes, Set the T-bit
STMFD SP!, {R4}
LDR R4, =OSTCBCur ;//设置 OSTCBCur->OSTCBStkPtr = SP;
LDR R5, [R4]
STR SP, [R5]
LDR R0, =OSTaskSwHook ;//调用OSTaskSwHook();
MOV LR, PC
BX R0
LDR R4, =OSPrioCur ;//设置 OSPrioCur = OSPrioHighRdy
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
LDR R4, =OSTCBCur ;//设置 OSTCBCur = OSTCBHighRdy;
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
STR R6, [R4]
LDR SP, [R6] ;//设置 SP = OSTCBHighRdy->OSTCBStkPtr;
;//恢复新 TASK 的 CONTEXT
LDMFD SP!, {R4} ;//获得新任务的CPSR
MSR SPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}^ ;//恢复新任务上下文
;/*********************************************************************************************************
;** 函数名称: OSIntCtxSw
;** 功能描述: 中断退出时的入口,其功能包括:
;** 调用 OSTaskSwHook();
;** 设置 OSPrioCur = OSPrioHighRdy;
;** 设置 OSTCBCur = OSTCBHighRdy;
;** 设置 SP = OSTCBHighRdy->OSTCBStkPtr;
;** 从新TASK的堆栈恢复新TASK的上下文
;** 执行新的TASK
;** 其中OSTCBCur指向挂起任务的OS_TCB
;** OSTCBHighRdy指向恢复任务的OS_TCB
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSIntCtxSw
LDR R0, =OSTaskSwHook ;//调用OSTaskSwHook();
MOV LR, PC
BX R0
LDR R4,=OSPrioCur ;//设置OSPrioCur = OSPrioHighRdy
LDR R5,=OSPrioHighRdy
LDRB R6,[R5]
STRB R6,[R4]
LDR R4,=OSTCBCur ;//设置OSTCBCur = OSTCBHighRdy;
LDR R6,=OSTCBHighRdy
LDR R6,[R6]
STR R6,[R4]
LDR SP,[R6] ;//设置SP = OSTCBHighRdy->OSTCBStkPtr;
;//恢复新 TASK 的 CONTEXT
LDMFD SP!, {R4} ;//获得新任务的CPSR
MSR SPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}^ ;//恢复新任务上下文
;OSIntCtxSave
;OSIntCtxRestore
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -