ARM专辑-152M-pdf.zip

源代码在线查看: os_cpu_a.s

软件大小: 74715 K
上传用户: QQ
关键词: M-pdf ARM 152 zip
下载地址: 免注册下载 普通下载 VIP

相关代码

				;/****************************************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 				        LDR     R4, =OSPrioCur
				        LDR     R5, =OSPrioHighRdy
				        LDRB    R6, [R5]
				        STRB    R6, [R4]
				                                                    ;OSTCBCur 				        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
				;********************************************************************************************************/
							

相关资源