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

📄 os_cpu_a.s

📁 SmartARM2400系列开发板全套资料
💻 S
📖 第 1 页 / 共 2 页
字号:
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ISRBegin
                                                                        ;   OSIntNesting++
        LDR     R1, =OSIntNesting
        LDRB    R2, [R1]
        ADD     R2, R2, #1
        STRB    R2, [R1]
        MOVS    PC, LR

;/********************************************************************************************************
;** Function name:           OSISRNeedSwap
;** Descriptions:            查看任务是否需要切换
;** input parameters:        none
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSISRNeedSwap
        LDR     R1, =OSTCBHighRdy
        LDR     R2, =OSTCBCur
        CMP     R1, R2
        MOVEQ   R0, #0
        MOVNE   R0, #1
        MOVS    PC, LR

;/********************************************************************************************************
;** Function name:           OSIntCtxSw
;** Descriptions:            中断退出时的入口
;** input parameters:        R3:     当前任务的状态寄存器CPSR(即SPSR的值)
;**                          R4-R12: 当前任务的R4-R11
;**                          当前处理器模式的堆栈结构(出栈次序):R0-R3、R12、PC(当前任务的)
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
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
        
OSIntCtxSw_0        
        LDR     R1, =GulOsEnterSum                                      ;   获取OsEnterSum
        LDR     R2, [R1]
        STMFD   SP!, {R2, R3}                                           ;   保存CPSR,GulOsEnterSum

                                                                        ;   保存当前任务堆栈指针到当前任务的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,GulOsEnterSum,R0-R12,LR,SP
        LDR     LR, [SP, #-8]
        MSR     CPSR_c, #(NoInt | SVC32Mode)                            ;   进入管理模式
        MOV     SP, R4                                                  ;   设置堆栈指针

        LDMFD   SP!, {R4, R5}                                           ;   CPSR,GulOsEnterSum
                                                                        ;   恢复新任务的OsEnterSum
        LDR     R3, =GulOsEnterSum
        STR     R4, [R3]
    
        MSR     SPSR_cxsf, R5                                           ;   恢复CPSR
        LDMFD   SP!, {R0-R12, LR, PC }^                                 ;   运行新任务

;/********************************************************************************************************
;** Function name:           _OSStartHighRdy
;** Descriptions:            uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
;**                          OSStartHighRdy会调用_OSStartHighRdy
;** input parameters:        none
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
_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

;/********************************************************************************************************
;** Function name:           TaskEntry
;** Descriptions:            所有任务的入口
;** input parameters:        与任务一样
;** output parameters:       与任务一样
;** Returned value:          与任务一样
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
       EXPORT  TaskEntry
TaskEntry
        BX      R14

;/*********************************************************************************************************
;** Function name:           OSTaskStkInit
;** Descriptions:            任务堆栈初始化代码,本函数调用失败会使系统崩溃
;** input parameters:        task:  任务开始执行的地址
;**                          pdata: 传递给任务的参数
;**                          ptos:  任务的堆栈开始位置
;**                          opt:   附加参数,当前版本对于本函数无用,具体意义参见OSTaskCreateExt()的opt参数
;** output parameters:       none
;** Returned value:          新堆栈位置
;** Created by:              LinEnqiang
;** Created Date:            2008/05/02
;**--------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**--------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/
       EXPORT  OSTaskStkInit
OSTaskStkInit 
		MOV		R3,	R0
	;/* 
    ; *  建立任务环境,ADS1.2使用满递减堆栈
    ; */
        MOV     R0, R2        
		LDR		R2,	=TaskEntry		
		SWP     R2,R2,[R0]                                              ;  pc,所有任务的入口
		STMDB	R0!,{R3}                                                ;  lr,任务真正的入口         
		
		MOV		R2,	#0
		MOV		R3,	#0
		STMDB	R0!,{R2,R3}                                             ;  R12、R11                   
		STMDB	R0!,{R2,R3}                                             ;  R10、R9                    
		STMDB	R0!,{R2,R3}                                             ;  R8、R7                     
		STMDB	R0!,{R2,R3}                                             ;  R6、R5                     
		STMDB	R0!,{R2,R3}                                             ;  R4、R3                     
		STMDB	R0!,{R2,R3}                                             ;  R2、R1                     
		
		MOV		R2 , #0x10		
		STMDB	R0!,{R1-R3}                                             ;  r0,第一个参数使用R0传递    
		                                                                ;  spsr,允许 IRQ, FIQ 中断   
		                                                                ;  关中断计数器OsEnterSum; 
		BX      R14
	    
    AREA    MyEnterSumDatas, DATA, ALIGN = 2; 
        EXPORT  GulOsEnterSum
        
GulOsEnterSum	DCD		0	 

    END
;/********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -