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

📄 os_cpu_a.s

📁 基于STR710和嵌入式操作系统的串口驱动程序
💻 S
字号:
;/****************************************Copyright (c)**************************************************
;**                                      
;**                                          公 司
;**                                          部 门
;**
;**                                 http://www.xxxx.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;** 文 件 名: OS_CPU_A.S
;** 创 建 人: 罗辉联
;** 创建日期: 2006年6月10日
;** 描    述: UCOS移植代码汇编部分
;**
;**--------------历史版本--------------------------------------------------------------------------------
;** 创 建 人: 罗辉联 
;** 技术顾问: 楼东武 浙江大学信电系				(高级工程师)
;**           张美玉 浙江工业大学软件学院       (教授) 
;**           邹洪波 浙江大学自动化系           (博士)
;**           钟  曦 北京中星威电子有限公司     (工程师)
;**
;** 版    本: V1.0
;** 日   期: 2006年6月10日
;** 描   述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
 

            IMPORT  OSRunning           	;//引入的外部标号或函数
            IMPORT  OSPrioCur
            IMPORT  OSPrioHighRdy
            IMPORT  OSTCBCur
            IMPORT  OSTCBHighRdy
            IMPORT  OSTaskSwHook
           
            EXPORT  OS_CPU_SR_Save          ;//给外部使用的标号或者函数
            EXPORT  OS_CPU_SR_Restore
            EXPORT  OSStartHighRdy               
            EXPORT  OSCtxSw
            EXPORT  OSIntCtxSw


NO_INT      EQU     0xC0                    ;//禁止IRQ,FIQ中断
SVC32_MODE  EQU     0x13					;//SVC模式定义

            AREA    |.text|,CODE

            CODE32
            

;/*********************************************************************************************************
;** 函数名称: OS_CPU_SR_Save, OS_CPU_SR_Restore
;** 功能描述: 根据先前的中断状态禁止或允许中断,通常用局部变量cpu_sr保存中断状态,然后在禁止中断。cpu_sr可
;**           在需要禁止中断的任何uc/osII功能函数中使用.可以通过把cpu_sr的值复制到CPU的相关状态寄存器而实
;**           现中断的回复. 
;** 
;** 参    数: OS_CPU_SR_Restore 的参数一般用OS_CPU_SR_Save的返回值填充
;**
;** 返 回 值: OS_CPU_SR_Save 返回中断标志状态
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/ 

OS_CPU_SR_Save
        MRS     R0,CPSR                 ;//禁止IRQ,FIQ中断
        ORR     R1,R0,#NO_INT
        MSR     CPSR_c,R1
        MRS     R1,CPSR                 ;//保证IRQ,FIQ中断禁止标志设置成功
        AND     R1,R1,#NO_INT
        CMP     R1,#NO_INT
        BNE     OS_CPU_SR_Save          ;//如果IRQ,FIQ中断禁止标志设置失败重新设置
        BX      LR                      ;//原先的FIQ,IRQ中断标志通过R0返回

OS_CPU_SR_Restore						;//恢复CPSR
        MSR     CPSR_c,R0
        BX      LR

;/*********************************************************************************************************
;** 函数名称: OSStartHighRdy
;** 功能描述: uC/OS-II启动时使用OSStartHighRdy运行第一个任务,它将调用OSTaskSwHook(),然后设置OSRunning为
;**           TRUE,最后切换到优先级最高且处于就绪状态的任务
;** 
;** 参    数: None
;**
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/  

OSStartHighRdy

        MSR     CPSR_c, #(NO_INT | SVC32_MODE)
                                        ;//处理器模式切换到SVC模式,且禁止IRQ,FIQ中断 

        LDR     R0, =OSTaskSwHook       ;//调用OSTaskSwHook();
        MOV     LR, PC
        BX      R0            

        LDR     R4, =OSRunning          ;//设置OSRunning = TRUE
        MOV     R5, #1
        STRB    R5, [R4]

                                        ;//切换到最高优先级的任务
        LDR     R4, =OSTCBHighRdy       ;//获得最高优先级任务控制块地址
        LDR     R4, [R4]                ;//获取堆栈指针
        LDR     SP, [R4]                ;//切换到新的堆栈

        LDR     R4,  [SP], #4           ;//获得新任务的CPSR
        MSR     SPSR_cxsf,R4
        LDMFD   SP!, {R0-R12,LR,PC}^    ;//恢复新任务上下文
        

;/*********************************************************************************************************
;** 函数名称: OSCtxSw
;** 功能描述: 该函数在系统模式下被调用,且FIQ,IRQ被禁止,其功能包括保存当前任务上下文到当前任务堆栈,
;**           设置 OSTCBCur->OSTCBStkPtr = SP; 
;**           调用 OSTaskSwHook(); 
;**			  设置 OSPrioCur = OSPrioHighRdy;
;**           设置 OSTCBCur  = OSTCBHighRdy;
;**           设置 SP = OSTCBHighRdy->OSTCBStkPtr;
;**           从新TASK的堆栈恢复新TASK的上下文
;**           执行新的TASK
;**			  其中OSTCBCur指向挂起任务的OS_TCB
;** 		  OSTCBHighRdy指向恢复任务的OS_TCB
;**
;** 参    数: None
;**
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
  
OSCtxSw
                                        ;//保存当前TASK的CONTEXT
        STMFD   SP!, {LR}               ;//保存返回地址到堆栈
        STMFD   SP!, {LR}
        STMFD   SP!, {R0-R12}           ;Push registers
        MRS     R4,  CPSR               ;Push current CPSR
        TST     LR, #1                  ;See if called from Thumb mode
        ORRNE   R4,  R4, #0x20          ;If yes, Set the T-bit
        STMFD   SP!, {R4}
        
        LDR     R4, =OSTCBCur           ;//设置 OSTCBCur->OSTCBStkPtr = SP;
        LDR     R5, [R4]
        STR     SP, [R5]

        LDR     R0, =OSTaskSwHook       ;//调用OSTaskSwHook();
        MOV     LR, PC
        BX      R0            

        LDR     R4, =OSPrioCur          ;//设置 OSPrioCur = OSPrioHighRdy
        LDR     R5, =OSPrioHighRdy
        LDRB    R6, [R5]
        STRB    R6, [R4]
        
        LDR     R4, =OSTCBCur           ;//设置 OSTCBCur  = OSTCBHighRdy;
        LDR     R6, =OSTCBHighRdy
        LDR     R6, [R6]
        STR     R6, [R4]

        LDR     SP, [R6]                ;//设置 SP = OSTCBHighRdy->OSTCBStkPtr;

                                        ;//恢复新 TASK 的 CONTEXT
        LDMFD   SP!, {R4}               ;//获得新任务的CPSR
        MSR     SPSR_cxsf, R4
        
        LDMFD   SP!, {R0-R12,LR,PC}^    ;//恢复新任务上下文    

;/*********************************************************************************************************
;** 函数名称: OSIntCtxSw
;** 功能描述: 中断退出时的入口,其功能包括: 
;**           调用 OSTaskSwHook(); 
;**			  设置 OSPrioCur = OSPrioHighRdy;
;**           设置 OSTCBCur  = OSTCBHighRdy;
;**           设置 SP = OSTCBHighRdy->OSTCBStkPtr;
;**           从新TASK的堆栈恢复新TASK的上下文
;**           执行新的TASK
;**			  其中OSTCBCur指向挂起任务的OS_TCB
;** 		  OSTCBHighRdy指向恢复任务的OS_TCB
;**
;** 参    数: None
;**
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

OSIntCtxSw
        LDR     R0, =OSTaskSwHook       ;//调用OSTaskSwHook();
        MOV     LR, PC
        BX      R0            

        LDR     R4,=OSPrioCur           ;//设置OSPrioCur = OSPrioHighRdy
        LDR     R5,=OSPrioHighRdy
        LDRB    R6,[R5]
        STRB    R6,[R4]
        
        LDR     R4,=OSTCBCur            ;//设置OSTCBCur  = OSTCBHighRdy;
        LDR     R6,=OSTCBHighRdy
        LDR     R6,[R6]
        STR     R6,[R4]

        LDR     SP,[R6]                 ;//设置SP = OSTCBHighRdy->OSTCBStkPtr;

                                        ;//恢复新 TASK 的 CONTEXT
        LDMFD   SP!, {R4}               ;//获得新任务的CPSR
        MSR     SPSR_cxsf, R4
        
        LDMFD   SP!, {R0-R12,LR,PC}^    ;//恢复新任务上下文  
        
        
;OSIntCtxSave
;OSIntCtxRestore       
        


        END

⌨️ 快捷键说明

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