Os_cpu_a.s
上传用户:zfj3589
上传日期:2022-07-13
资源大小:635k
文件大小:10k
- ;/****************************************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 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}
- MOV R1, SP ; R1指向参数存储位置
- MRS R3, SPSR
- 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, =OSIntCtxSw
- LDREQ PC, =__OSStartHighRdy ; SWI 0x01为第一次任务切换
- 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日
- ;**-------------------------------------------------------------------------------------------------------
- ;********************************************************************************************************/
- OSIntCtxSw
- ;下面为保存任务环境
- LDR R2, [SP, #20] ;获取PC
- LDR R12, [SP, #16] ;获取R12
- MRS R0, CPSR
- MSR CPSR_c, #(NoInt | SYS32Mode)
- MOV R1, LR
- STMFD SP!, {R1-R2} ;保存LR,PC
- STMFD SP!, {R4-R12} ;保存R4-R12
- MSR CPSR_c, R0
- LDMFD SP!, {R4-R7} ;获取R0-R3
- ADD SP, SP, #8 ;出栈R12,PC
-
- MSR CPSR_c, #(NoInt | SYS32Mode)
- STMFD SP!, {R4-R7} ;保存R0-R3
-
- LDR R1, =OsEnterSum ;获取OsEnterSum
- LDR R2, [R1]
- STMFD SP!, {R2, R3} ;保存CPSR,OsEnterSum
- ;保存当前任务堆栈指针到当前任务的TCB
- LDR R1, =OSTCBCur
- LDR R1, [R1]
- STR SP, [R1]
- 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寄存器CPSR,OsEnterSum,R0-R12,LR,SP
- 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 }^ ;运行新任务
- ;/*********************************************************************************************************
- ;** 函数名称: __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
- LDR R6, [R6]
- B OSIntCtxSw_1
- AREA SWIStacks, DATA, NOINIT,ALIGN=2
- SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间
- END
- ;/*********************************************************************************************************
- ;** End Of File
- ;********************************************************************************************************/