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

📄 os_cpu_a.s

📁 在三星的S3C44B0X上移植的uCOSII2.80的源程序
💻 S
字号:
;/*
;*********************************************************************************************************
;* 文件: OS_CPU_A.S
;* 描述: uC/OS-II在 44B0X 上的移植代码汇编代码部分.
;* 编写: 深思 (001-12345@sohu.com).
;*********************************************************************************************************
;*/
        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<<7)
        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<<7)
        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.
;* 描述: uC/OS-II启动时使用 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
;*********************************************************************************************************
;*/

⌨️ 快捷键说明

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