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

📄 os_cpu_a.asm

📁 ZLG的EASYARM8962开发板Keil实验例程
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;****************************************Copyright (c)****************************************************
;**                               Guangzou ZLG-MCU Development Co.,LTD.
;**                                      graduate school
;**                                 http://www.zlgmcu.com
;**
;**--------------File Info--------------------------------------------------------------------------------
;** File name: 			    os_cpu_a.asm
;** Last modified Date:     2007.01.18
;** Last Version: 		    1.0
;** Descriptions: 	        The assembly functions that a uC/OS-II port requires
;**                         uC/OS-II移植所需要的汇编函数  
;**-------------------------------------------------------------------------------------------------------
;** Created By:       	    Steven Zhou 周绍刚
;** Created date:   	    2007.01.18
;** Version:			    1.0
;** Descriptions: 		    The original version
;**
;**-------------------------------------------------------------------------------------------------------
;** Modified by:            Ni Likao 倪力考
;** Modified date:          2007.10.29
;** Version:                1.1
;** Description:            The second version 第二版
;**
;*********************************************************************************************************

;*********************************************************************************************************
;  Declarations for the interrupt handlers that are used by the application.              
;  本应用所用到的声明                                       
;*********************************************************************************************************
                EXTERN  OSRunning                
                EXTERN  OSPrioCur
                EXTERN  OSPrioHighRdy
                EXTERN  OSTCBCur
                EXTERN  OSTCBHighRdy
                EXTERN  OSIntNesting
                EXTERN  OSIntExit
                EXTERN  OSTaskSwHook
				EXTERN  OsEnterSum


;*********************************************************************************************************
;  Declarations for the exported functions             
;  输出外部声明                          
;*********************************************************************************************************
                EXPORT  OSStartHighRdy
                EXPORT  OSCtxSw
                EXPORT  OSIntCtxSw
                EXPORT  OSPendSV
				EXPORT  OS_ENTER_CRITICAL
                EXPORT  OS_EXIT_CRITICAL                  
                EXPORT  intDisAll


;*********************************************************************************************************
;  Registers or macros used by this file                                
;  本文件用到的寄存器和宏                             
;*********************************************************************************************************							    
NVIC_INT_CTRL           EQU     0xE000ED04                              ;  Interrupt control state  
                                                                        ;  register.
                                                                        ;  中断控制寄存器

NVIC_SYSPRI2            EQU     0xE000ED20                              ;  System priority register (2)
                                                                        ;  系统优先级寄存器(2)

NVIC_PENDSV_PRI         EQU     0xFFFF0000                              ;  PendSV and system tick priority
                                                                        ;  (Both are lowest,0xff)  
                                                                        ;  软件中断和系统节拍中断
                                                                        ;  (都为最低,0xff).
NVIC_PENDSVSET          EQU     0x10000000                                   ;  Value to trigger PendSV  
                                                                        ;  exception.触发软件中断的值.

OS_CRITICAL_INT_PRIO    EQU     (0 << 5)		                        ;  Critical setions manage prio. 
                                                                        ; (equal or bigger number managed) 
                                                                        ;  临界代码管理的优先级(数值等于
        PRESERVE8                                                       ;  或大于被管理)
	         
		AREA    UCOSII_ASM, CODE, READONLY
        THUMB

;*********************************************************************************************************
;** Function name:			OS_ENTER_CRITICAL
;** Descriptions:		    Enter the critical section  进入临界区                         
;** Input parameters:	    None 无
;** Output parameters:	    None 无
;** Returned value:			None 无
;** Created by:				Steven Zhou 周绍刚
;** Created Date:			2007.01.18
;**-------------------------------------------------------------------------------------------------------
;** Modified by:            Ni Likao 倪力考
;** Modified date:          2007.11.02
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************
OS_ENTER_CRITICAL
    IF OS_CRITICAL_INT_PRIO > 0
     	PUSH 	{R1,R2} 	                
     	LDR 	R1, =OS_CRITICAL_INT_PRIO                               ;  Disable priorities between 
                                                                        ;  OS_CRITICAL_INT_PRIO & 0xFF 
                                                                             			 				
		MSR 	BASEPRI,  R1                                            ;  禁能优先级在OS_CRITICAL_INT 
                                                                        ;  _PRIO到0xFF的中断      			 				 
	ELSE
		CPSID   I                                                       ;  Disable all the interrupts
                                                                        ;  禁能所有中断
		PUSH 	{R1,R2}      
	ENDIF
		LDR 	R1, =OsEnterSum			                                ;  OsEnterSum++
        LDRB 	R2, [R1]
        ADD   	R2, R2, #1
        STRB 	R2, [R1]
		POP     {R1,R2}
  		BX LR


;*********************************************************************************************************
;** Function name:			OS_EXIT_CRITICAL
;** Descriptions:			Exit the critical section  退出临界区
;** Output parameters:	    None 无
;** Input parameters:		None 无
;** Returned value:			None 无
;** Created by:				Steven Zhou 周绍刚
;** Created Date:		    2007.01.18
;**-------------------------------------------------------------------------------------------------------
;** Modified by:            Ni Likao 倪力考
;** Modified date:          2007.11.02
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************
OS_EXIT_CRITICAL
		PUSH    {R1, R2}
		LDR     R1, =OsEnterSum                                         ;  OsEnterSum--
        LDRB    R2, [R1]
        SUB     R2, R2, #1
        STRB    R2, [R1]
		MOV     R1,  #0	      
		CMP     R2,  #0			                                        ;  if OsEnterSum=0,enable 
                                                                        ;  interrupts如果OsEnterSum=0,
	IF OS_CRITICAL_INT_PRIO > 0                                         ;  开中断;
	  	MSREQ	BASEPRI, R1 
	ELSE
		MSREQ  PRIMASK, R1   
	ENDIF
	    POP   	{R1, R2}
		BX LR


;*********************************************************************************************************
;** Function name:			OSStartHighRdy
;** Descriptions:			Uses the context switcher  to cause the first task to start.
;**                         使用调度器运行第一个任务   
;** Input parameters:	    None 无
;** Output parameters:	    None 无
;** Returned value:			None 无
;** Created by:				Steven Zhou 周绍刚
;** Created Date:		    2007.01.18
;**-------------------------------------------------------------------------------------------------------
;** Modified by:            Ni Likao 倪力考
;** Modified date:          2007.11.02
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************
OSStartHighRdy

        LDR     R4, =NVIC_SYSPRI2                                       ;  set the PendSV exception 
                                                                        ;  priority设置PendSV优先级
        LDR     R5, =NVIC_PENDSV_PRI	
        STR     R5, [R4]
	    
        MOV     R4, #0                                                  ;  set the PSP to 0 for initial  
                                                                        ;  context switch call 使PSP等于0
        MSR     PSP, R4

⌨️ 快捷键说明

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