📄 os_cpu_a_3.s
字号:
;/****************************************Copyright (c)**************************************************
;** 广州周立功单片机发展有限公司
;** 研 究 所
;** 产品一部
;**
;** http://www.zlgmcu.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: os_cpu_s.s
;**创 建 人: 陈明计
;**最后修改日期: 2003年6月19日
;**描 述: μCOS-II在LPC210x上的移植代码汇编代码部分,用ADS1.2编译
;**
;**--------------历史版本信息----------------------------------------------------------------------------
;** 创建人: 陈明计
;** 版 本: V1.0
;** 日 期: 2003年6月5日
;** 描 述: 原始版
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.1
;** 日 期: 2003年6月11日
;** 描 述: 配合Vectors.s更正IRQ嵌套的BUG而作相应的修改
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.2
;** 日 期: 2003年6月13日
;** 描 述: 按照μCOS-II V2.52的要求修改(以前是基于μCOS-II V2.0)
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.3
;** 日 期: 2003年6月19日
;** 描 述: 不完全按照μCOS-II V2.52的要求以提高效率
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;定义系统模式堆栈的大小
SVC_STACK_LEGTH EQU 32
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;T_bit用于检测进入异常前cpu是否处于THUMB状态
T_bit EQU 0x20
CODE32
AREA |subr|, CODE, READONLY
IMPORT OSTCBCur ;指向当前任务TCB的指针
IMPORT OSTCBHighRdy ;指向将要运行的任务TCB的指针
IMPORT OSPrioCur ;当前任务的优先级
IMPORT OSPrioHighRdy ;将要运行的任务的优先级
IMPORT OSTaskSwHook ;任务切换的钩子函数
IMPORT OSRunning ;uC/OS-II运行标志
IMPORT OsEnterSum ;关中断计数器(关中断信号量)
IMPORT SWI_Exception ;软中断异常处理程序
EXPORT __OSStartHighRdy
EXPORT OSIntCtxSw ;中断退出时的入口,参见startup.s中的IRQ_Handler
EXPORT OSCtxSw
EXPORT SoftwareInterrupt ;软中断入口
;/*********************************************************************************************************
;** 函数名称: SoftwareInterrupt
;** 功能描述: 软件中断,用于提供一些系统服务,功能参考os_cpu_c.c文件
;** 输 入: 依功能而定
;** 输 出 : 依功能而定
;** 全局变量: 无
;** 调用模块: SWI_Exception
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年6月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年6月13日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年6月19日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;软件中断
SoftwareInterrupt
LDR SP, StackSvc ; 廳怴?抲懲?巜?
STMFD SP!, {R0-R3, R12, LR}
MRS R3, SPSR ; 曐懚忬?
STMFD SP!, {R3}
TST R3, #T_bit ; 拞抐慜惀斲惀Thumb忬?
LDRNEH R0, [LR,#-2] ; 惀: 庢摼Thumb忬?SWI崋
BICNE R0, R0, #0xff00
LDREQ R0, [LR,#-4] ; 斲: 庢摼arm忬?SWI崋
BICEQ R0, R0, #0xFF000000 ; r0 = SWI崋丆R1巜岦嶲悢懚?埵抲
CMP R0, #1
LDRLO PC, =OSCtxSw
LDREQ PC, =__OSStartHighRdy ; SWI 0x01?戞堦師擟?愗?;
LDMFD SP!, {R3} ; MRS R3, SPSR huifu 忬?
MSR SPSR_cxsf, R3
BL SWI_Exception
LDMFD SP!, {R0-R3, R12, PC}^
StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)
;/*********************************************************************************************************
;** 函数名称: OSIntCtxSw
;** 功能描述: 中断退出时的入口
;** 输 入: R3 :当前任务的状态寄存器CPSR(即SPSR的值)
;** R4-R12:当前任务的R4-R11
;** 当前处理器模式的堆栈结构(出栈次序):R0-R3、R12、PC(当前任务的)
;** 输 出 : 无
;** 全局变量: OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年6月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年6月13日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年6月19日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSCtxSw
LDR R3, [SP, #24] ;?庢PC
LDR R1, [SP, #20] ;?庢R12
MRS R0, CPSR
MSR CPSR_c, #(NoInt | SYS32Mode)
MOV R2,LR
STMFD SP!,{R1-R3} ; R12, LR,PC
STMFD SP!,{R4-R11} ;R4-R11
MSR CPSR_c,R0
LDMFD SP!, {R3} ; SPSR huifu 忬?
LDMFD SP!, {R4-R7} ;R0-R3
ADD SP,SP,#8
LDR R2, =OsEnterSum
LDR R2,[R2]
MSR CPSR_c, #(NoInt | SYS32Mode)
STMFD SP!,{R2-R7} ; OsEnterSum,SPSR, R0-R3
LDR R0, =OSTCBCur
LDR R0, [R0]
STR SP, [R0]
BL OSTaskSwHook ;?梡?巕敓悢 ;OSPrioCur <= OSPrioHighRdy
LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4] ;OSTCBCur <= OSTCBHighRdy
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4]
OSIntCtxSw_1 ;?庢怴擟?懲?巜?
LDR R4, [R6]
ADD SP, R4, #68 ;17婑懚婍OsEnterSum,CPSR,R0-R12,LR,PC
LDR LR, [SP, #-8]
MSR CPSR_c, #(NoInt | SVC32Mode) ;?擖娗棟柾幃
MOV SP, R4 ;?抲懲?巜?
LDMFD SP!, {R4, R5} ;CPSR,OsEnterSum;夬?怴擟?揑OsEnterSum
LDR R3, =OsEnterSum
STR R4, [R3]
MSR SPSR_cxsf, R5 ;夬?CPSR
LDMFD SP!, {R0-R12,LR, PC }^
OSIntCtxSw
MSR CPSR_c, #(NoInt | SYS32Mode)
MOV R3,SP
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 愗?夞irq柾幃
MOV SP,R3
LDR R3, [SP, #24] ;?庢PC
LDR R1, [SP, #20] ;?庢R12
MRS R0, CPSR
MSR CPSR_c, #(NoInt | SYS32Mode)
MOV R2,LR
STMFD SP!,{R1-R3} ; R12, LR,PC
STMFD SP!,{R4-R11} ;R4-R11
MSR CPSR_c,R0
LDMFD SP!, {R3} ; SPSR huifu 忬?
LDMFD SP!, {R4-R7} ;R0-R3
ADD SP,SP,#8
MSR CPSR_c, #(NoInt | SYS32Mode)
LDR R2, =OsEnterSum ;OsEnterSum=0, SAVE BACK
MOV R1,#0
STR R1,[R2]
LDR R2,[R2]
STMFD SP!,{R2-R7} ; OsEnterSum,SPSR, R0-R3
LDR R0, =OSTCBCur
LDR R0, [R0]
STR SP, [R0]
BL OSTaskSwHook ;?梡?巕敓悢 ;OSPrioCur <= OSPrioHighRdy
LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4] ;OSTCBCur <= OSTCBHighRdy
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4] ;?庢怴擟?懲?巜?
LDR R4, [R6]
ADD SP, R4, #68 ;17婑懚婍OsEnterSum,CPSR,R0-R12,LR,PC
LDR LR, [SP, #-8]
MSR CPSR_c, #(NoInt | SVC32Mode) ;?擖娗棟柾幃 NO IRQ
MOV SP, R4 ;?抲懲?巜?
LDMFD SP!, {R4, R5} ;CPSR,OsEnterSum
LDR R3, =OsEnterSum ;夬?怴擟?揑OsEnterSum
STR R4, [R3]
MSR SPSR_cxsf, R5 ;夬?CPSR
LDMFD SP!, {R0-R12,LR, PC }^
;/*********************************************************************************************************
;** 函数名称: __OSStartHighRdy
;** 功能描述: uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
;** OSStartHighRdy会调用__OSStartHighRdy
;** 输 入: 无
;** 输 出 : 无
;** 全局变量: OSRunning,OSTCBCur,OSTCBHighRdy,OsEnterSum
;** 调用模块: OSTaskSwHook
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年6月13日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode) ;崘?uC/OS-II帺恎涍??峴
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
BL OSTaskSwHook ;?梡?巕敓悢
LDR R6, =OSTCBHighRdy ;巜?悢?拞揑尦慺丆巜岦堦槩 OS_TCB
LDR R6, [R6] ;OSTCBHighRdy ?揑庱抧毈 乮OS_TCB ??懱拞揑戞堦槩尦慺:懲?巜?, OSSTK *OSTCBStkPtr乯 dy
B OSIntCtxSw_1
AREA SWIStacks, DATA, NOINIT,ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -