⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a_3.s

📁 周立功的EASYARM2131的测试程序
💻 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 + -