广嵌GEC2410开发板学习教材源码

源代码在线查看: os_cpu_a.s

软件大小: 21762 K
上传用户: Erlin
关键词: 2410 GEC 开发板 教材
下载地址: 免注册下载 普通下载 VIP

相关代码

				;/*
				;*********************************************************************************************************
				;* 文件: OS_CPU_A.S
				;* 描述: uC/OS-II在 S3C2410 上的移植代码汇编代码部分.
				;* 编写: bobey
				;*********************************************************************************************************
				;*/
				
				        AREA    os_cpu_a, CODE, READONLY
				        CODE32
				
				        IMPORT  OSTCBCur                                ; 指向当前任务TCB的指针.
				        IMPORT  OSTCBHighRdy                            ; 指向将要运行的任务TCB的指针.
				        IMPORT  OSPrioCur                               ; 当前任务的优先级.
				        IMPORT  OSPrioHighRdy                           ; 将要运行的任务的优先级.
				        IMPORT  OSTaskSwHook                            ; 任务切换的钩子函数.
				        IMPORT  OsEnterSum                              ; 关中断计数器(关中断信号量).
				        IMPORT  OSRunning                               ; uC/OS-II运行标志.
				
				        EXPORT  __OSIntCtxSw                            ; 中断级任务切换函数.
				        EXPORT  OS_TASK_SW                              ; 任务级任务切换函数.
				        EXPORT  OSStartHighRdy                          ; 开始最高优先级任务.
				
				        EXPORT  OS_ENTER_CRITICAL
				        EXPORT  OS_EXIT_CRITICAL
				
				NoInt       EQU 0x80                                    ; 关中断.
				SYS32Mode   EQU 0x1f                                    ; 系统模式代码.
				IRQ32Mode   EQU 0x12                                    ; IRQ中断模式代码.
				SVC32Mode   EQU 0x13                                    ; 管理模式代码.
				
				;/*******************************************************************************************************
				;* 函数: OS_ENTER_CRITICAL.
				;* 描述: 关 IRQ 中断.
				;*******************************************************************************************************/
				OS_ENTER_CRITICAL
				        STMFD   SP!,        {R0,LR}
				        MRS     R0,         CPSR
				        ORR     R0,         R0, #(1				        MSR     CPSR_c,     R0
				
				        LDR     R0,         =OsEnterSum
				        LDR     R1,         [R0]
				        ADD     R1,         R1, #1
				        STR     R1,         [R0]
				
				        LDMFD   SP!,        {R0,PC}
				
				;/******************************************************************************************************
				;* 函数: OS_EXIT_CRITICAL.
				;* 描述: 开 IRQ 中断.
				;******************************************************************************************************/
				OS_EXIT_CRITICAL
				        STMFD   SP!,        {R0-R1,LR}
				
				        LDR     R0,         =OsEnterSum
				        LDR     R1,         [R0]
				        SUBS    R1,         R1, #1
				        STR     R1,         [R0]
				
				        MRS     R0,         CPSR
				        BICEQ   R0,         R0, #(1				        MSREQ   CPSR_c,     R0
				
				        LDMFD   SP!,        {R0-R1,PC}
				
				;/*
				;*********************************************************************************************************
				;* 函数: __OSIntCtxSw.
				;* 描述: IRQ 中断级任务切换.
				;*********************************************************************************************************
				;*/
				__OSIntCtxSw
						STMFD   SP!,        {R0}
				        MOV     R0,         LR
				        MSR     CPSR_c,     #(NoInt | SYS32Mode)        ; 切换到系统模式.
				        STMFD   SP!,        {R0}            	        ; 保存 PC.
				        STMFD   SP!,        {LR}            	        ; 保存 LR.
				        MSR     CPSR_c,     #(NoInt | IRQ32Mode)        ; 切回 IRQ 模式.
				        LDMFD   SP!,        {R0}
				        LDR     LR,         =OSCtxSw_01
				        STMFD   SP!,        {LR}
				        LDMFD   SP!,        {PC}^
				
				;/*
				;*********************************************************************************************************
				;* 函数: OS_TASK_SW.
				;* 描述: 任务级任务切换.
				;*********************************************************************************************************
				;*/
				OS_TASK_SW
				        STMFD   SP!,        {LR}                        ; 保存 PC.
				        STMFD   SP!,        {LR}                        ; 保存 LR.
				OSCtxSw_01
				        STMFD   SP!,        {R0-R12}                    ; 保存 R12-R0.
				
				        LDR     R0,         =OsEnterSum
				        LDR     R0,         [R0]
				        MRS     R1,         CPSR
				        STMFD   SP!,        {R0-R1}                     ; 保存 CPSR,OsEnterSum.
				
				        LDR     R1,         =OSTCBCur
				        LDR     R1,         [R1]
				        STR     SP,         [R1]                        ; OSTCBCur->OSTCBStkPtr = SP.
				
				        BL      OSTaskSwHook                            ; 调用钩子函数.
				
				        LDR     R0,         =OSPrioCur                  ; OSPrioCur = OSPrioHighRdy.
				        LDR     R1,         =OSPrioHighRdy
				        LDRB    R1,         [R1]
				        STRB    R1,         [R0]
				
				        LDR     R0,         =OSTCBCur                   ; OSTCBCur  = OSTCBHighRdy.
				        LDR     R1,         =OSTCBHighRdy
				        LDR     R1,         [R1]
				        STR     R1,         [R0]
				OSCtxSw_10
				        LDR     SP,         [R1, #0]                    ; 获取新任务堆栈指针 OSTCBHighRdy->OSTCBStkPtr.
				
				        LDMFD   SP!,        {R0-R1}                     ; 恢复 CPSR,OsEnterSum.
				        LDR     R2,         =OsEnterSum
				        STR     R0,         [R2]
				        MSR     CPSR_cxsf,  R1
				
				        LDMFD   SP!,        {R0-R12,LR,PC}              ; 恢复 R12-R0,LR,PC.
				
				;/*********************************************************************************************************
				;* 函数: OSStartHighRdy.
				;* 描述: 使就绪任务中优先级最高的任务开始运行.
				;*********************************************************************************************************/
				OSStartHighRdy
				        BL      OSTaskSwHook                            ; 调用钩子函数.
				
				        LDR     R0,         =OSRunning                  ; 告诉 uC/OS-II自身已经运行.
				        MOV     R1,         #1
				        STRB    R1,         [R0]
				
				        LDR     R1,         =OSTCBHighRdy
				        LDR     R1,         [R1]
				        B       OSCtxSw_10
				
				;/*
				;*********************************************************************************************************
				        END
				;*********************************************************************************************************
				;*/
							

相关资源