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

📄 os_cpu_a.s

📁 SmartARM2400系列开发板全套资料
💻 S
📖 第 1 页 / 共 2 页
字号:
;/***************************************Copyright (c)****************************************************
;**                            Guangzhou ZHIYUAN electronics Co.,LTD.
;**                                      
;**                                 http://www.embedtools.com
;**
;**-------------File Info---------------------------------------------------------------------------------
;** File name:               os_cpu_s.s
;** Latest modified Date:    2007-11-20
;** Latest Version:          1.0
;** Descriptions:            μCOS-II在lpc210x上的移植代码汇编代码部分,用ads1.2编译
;**-------------------------------------------------------------------------------------------------------
;** Created by:              Chenmingji
;** Created date:            2007-11-20
;** Version:                 1.0
;** Descriptions:            The original version
;**
;**-------------------------------------------------------------------------------------------------------
;** Modified by:             
;** Modified date:           
;** Version:                 
;** Descriptions:            
;**
;********************************************************************************************************/

;/********************************************************************************************************
; 宏定义
;********************************************************************************************************/
NoInt       EQU     0x80
USR32Mode   EQU     0x10
SVC32Mode   EQU     0x13
SYS32Mode   EQU     0x1f
IRQ32Mode   EQU     0x12
FIQ32Mode   EQU     0x11
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  OSIntNesting                                        ;   中断嵌套计数器
            
            EXPORT  OSIntCtxSw                                          ;   中断退出时的入口
            EXPORT  SoftwareInterrupt                                   ;   软中断入口
    

;/********************************************************************************************************
;** Function name:           SoftwareInterrupt
;** Descriptions:            软件中断,用于提供一些系统服务
;** input parameters:        依功能而定
;** output parameters:       依功能而定
;** Returned value:          依功能而定
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
SoftwareInterrupt
        CMP     R0, #8
        LDRLO   PC, [PC, R0, LSL #2]
        MOVS    PC, LR

SwiFunction
        DCD     TASK_SW                                                 ;   0
        DCD     _OSStartHighRdy                                         ;   1
        DCD     ENTER_CRITICAL                                          ;   2
        DCD     EXIT_CRITICAL                                           ;   3
        DCD     ChangeToSYSMode                                         ;   4
        DCD     ChangeToUSRMode                                         ;   5
        DCD     ISRBegin                                                ;   6
        DCD     OSISRNeedSwap                                           ;   7

;/********************************************************************************************************
;** Function name:           TASK_SW
;** Descriptions:            任务级调度
;** input parameters:        none
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
TASK_SW
        MRS     R3, SPSR                                                ;   保存任务的CPSR
        MOV     R2, LR                                                  ;   保存任务的PC
        
        MSR     CPSR_c, #(NoInt | SYS32Mode)                            ;   切换到系统模式
        STMFD   SP!, {R2}                                               ;   保存PC到堆栈
        STMFD   SP!, {R0-R12, LR}                                       ;   保存R0-R12,LR到堆栈
                                                                        ;   因为R0~R3没有保存有用数据,
                                                                        ;   所以可以这样做

        B       OSIntCtxSw_0                                            ;   真正进行任务切换

;/********************************************************************************************************
;** Function name:           ENTER_CRITICAL
;** Descriptions:            进入临界区
;** input parameters:        none
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ENTER_CRITICAL
                                                                        ;   GulOsEnterSum++
        LDR     R1, =GulOsEnterSum
        LDRB    R2, [R1]
        CMP     R2, #0xff
        MOVEQS  PC, LR
        ADD     R2, R2, #1
        STRB    R2, [R1]
                                                                        ;   关中断
        MRS     R0, SPSR
        ORR     R0, R0, #NoInt
        MSR     SPSR_c, R0
        MOVS    PC, LR

;/********************************************************************************************************
;** Function name:           EXIT_CRITICAL
;** Descriptions:            退出临界区
;** input parameters:        none
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EXIT_CRITICAL
                                                                        ;   GulOsEnterSum--
        LDR     R1, =GulOsEnterSum
        LDRB    R2, [R1]
        CMP     R2, #0
        MOVEQS  PC, LR
        SUB     R2, R2, #1
        STRB    R2, [R1]
                                                                        ;   if(GulOsEnterSum == 0) 开中断;
        CMP     R2, #0
        MRSEQ   R0, SPSR
        BICEQ   R0, R0, #NoInt
        MSREQ   SPSR_c, R0
        MOVS    PC, LR

;/********************************************************************************************************
;** Function name:           ChangeToSYSMode
;** Descriptions:            任务切换到系统模式
;** input parameters:        none
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ChangeToSYSMode
                                                                        ;   切换到系统模式
        MRS     R0, SPSR
        BIC     R0, R0, #0x1f
        ORR     R0, R0, #SYS32Mode    
        MSR     SPSR_c, R0
        MOVS    PC, LR

;/********************************************************************************************************
;** Function name:           ChangeToSYSMode
;** Descriptions:            任务切换到用户模式
;** input parameters:        none
;** output parameters:       none
;** Returned value:          none
;** Created by:              chenmingji
;** Created Date:            2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ChangeToUSRMode
                                                                        ;   切换到用户模式
        MRS     R0, SPSR
        BIC     R0, R0, #0x1f
        ORR     R0, R0, #USR32Mode    
        MSR     SPSR_c, R0
        MOVS    PC, LR

;/********************************************************************************************************
;** Function name:           ISRBegin
;** Descriptions:            ISR开始处理
;** input parameters:        none

⌨️ 快捷键说明

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