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

📄 os_cpu_a.asm

📁 一个简单易用的可裁减的小型实时操作系统 移植非常简单
💻 ASM
字号:
;/*
; *******************************************************************************
; *
; * MicroROS
; *
; * Copyright (C) 2007 <amwox@163.com>			
; *
; * Description	: 任务切换,时钟Tick,与移植密切相关
; *
; * File	: os_cpu_a.h
; * Author	: amwox
; * Edition	: V0.01
; * History	: 2007-10-29  created 
; * 		  2008-01-01  只保留全局的 _TaskSwitch
; *		  _IntProlog 和 _Prolog 改为宏分别在_TaskSwitch 和 中断的开始处调用
; *		  退出_TaskSwitch和中断时改为JMP _Epilog,解决中断中CALL与RET不匹配
; *		  问题(由于每次CALL _Epilog造成RET返回的层数比CALL调用的层数少1)
; *******************************************************************************
; */
SREG    = 0x3F
SPH     = 0x3E
SPL     = 0x3D 

                MODULE OS_CPU_A
;********************************************************************************************************
;               C文件中声明的函数和变量
;********************************************************************************************************
		
		EXTERN OS_TimeTick
		EXTERN _SaveSP        
		EXTERN _RestoreSP
		;EXTERN Uart0RX_int
		;EXTERN Uart0TX_int
		;EXTERN USART1_RXC
		;EXTERN USART1_TXC
        
;********************************************************************************************************
;               全局函数声明
;********************************************************************************************************  
		PUBLIC _TaskSwitch
		
;********************************************************************************************************
;               宏定义
;********************************************************************************************************

PUSHRS          MACRO                               ; 保存所有的寄存器
                ST      -Y,R0
                ST      -Y,R1
                ST      -Y,R2
                ST      -Y,R3
                ST      -Y,R4
                ST      -Y,R5
                ST      -Y,R6
                ST      -Y,R7
                ST      -Y,R8
                ST      -Y,R9
                ST      -Y,R10
                ST      -Y,R11
                ST      -Y,R12
                ST      -Y,R13
                ST      -Y,R14
                ST      -Y,R15
                ;ST      -Y,R16
                ST      -Y,R17
                ST      -Y,R18
                ST      -Y,R19
                ST      -Y,R20
                ST      -Y,R21
                ST      -Y,R22
                ST      -Y,R23
                ST      -Y,R24
                ST      -Y,R25
                ST      -Y,R26
                ST      -Y,R27
                ST      -Y,R30
                ST      -Y,R31
                ENDM

POPRS           MACRO                               ;还原所有的寄存器
                LD      R31,Y+
                LD      R30,Y+
                LD      R27,Y+
                LD      R26,Y+
                LD      R25,Y+
                LD      R24,Y+
                LD      R23,Y+
                LD      R22,Y+
                LD      R21,Y+
                LD      R20,Y+
                LD      R19,Y+
                LD      R18,Y+
                LD      R17,Y+
                ;LD      R16,Y+
                LD      R15,Y+
                LD      R14,Y+
                LD      R13,Y+
                LD      R12,Y+
                LD      R11,Y+
                LD      R10,Y+
                LD      R9,Y+
                LD      R8,Y+
                LD      R7,Y+
                LD      R6,Y+
                LD      R5,Y+
                LD      R4,Y+
                LD      R3,Y+
                LD      R2,Y+
                LD      R1,Y+
                LD      R0,Y+
                ENDM

PUSHSP          MACRO                               ; 保存堆栈指针
                IN      R26,SPL
                IN      R27,SPH
                ST      -Y,R26
                ST      -Y,R27
                ENDM

POPSP           MACRO                               ; 还原堆栈指针
                LD      R16,Y+
                OUT     SPH,R16
                LD      R16,Y+
                OUT     SPL,R16
                ENDM

PUSHSREG        MACRO                               ; 保存CPU状态寄存器
                IN      R16,SREG
                ST      -Y,R16
                ENDM

POPSREG         MACRO                               ; 还原CPU状态寄存器
                LD      R16,Y+
                OUT     SREG,R16
                ENDM

_IntProlog	MACRO
		ST	-Y, R16		
		IN      R16,SREG         
		SBR     R16,0x80		;在中断调用时要先恢复中断
		ST	-Y, R16
		CALL	_CLEAR_RETI
		CLI
		PUSHRS	
		PUSHSP
		MOVW R17:R16,R29:R28
		CALL _SaveSP
		ENDM
		
_Prolog		MACRO
		ST      -Y,R16
		PUSHSREG 
		CLI
		PUSHRS	
		PUSHSP
		MOVW R17:R16,R29:R28
		CALL _SaveSP
		ENDM
                
;********************************************************************************************************
;            	汇编代码 
;********************************************************************************************************

		RSEG    CODE

;********************************************************************************************************
;清除中断标志            	
;********************************************************************************************************  			
_CLEAR_RETI:		
		RETI
;********************************************************************************************************
;            	
;********************************************************************************************************  	
_Epilog:
		CLI
		CALL _RestoreSP
		MOVW R29:R28,R17:R16
		POPSP
		POPRS
		POPSREG
		LD      R16,Y+
		RET
		
;********************************************************************************************************
;这个函数只能在汇编中,在C中编写会出现高级优化时,出现不正确的编译结果
;**CALL _Epilog不能改为 JMP _Epilog**这与压栈的SP位置有关系
;********************************************************************************************************  
_TaskSwitch:
		_Prolog
		JMP _Epilog
		
;********************************************************************************************************
;
;描    述: 时钟滴嗒
;
;********************************************************************************************************

OS_TICK_ISR:
		_IntProlog  	
		CALL	OS_TimeTick
		JMP	_Epilog

USART0_RXC_vect:
		_IntProlog
		;CALL	Uart0RX_int
		JMP	_Epilog
        
USART0_TXC_vect:
		_IntProlog
		;CALL	Uart0TX_int
		JMP	_Epilog 

USART1_RXC_vect:
		_IntProlog
		;CALL	USART1_RXC
		JMP	_Epilog
        
USART1_TXC_vect:
		_IntProlog
		;CALL	USART1_TXC
		JMP	_Epilog
		
;********************************************************************************************************
;
;描    述: 中断向量,CPU进入中断时自动将SREG中的中断标志位清零,
;
;********************************************************************************************************

		COMMON  INTVEC
		ORG      0x3C            ;TIMER0_COMP_vect
		JMP     OS_TICK_ISR		

		ORG	0x48
		JMP	USART0_RXC_vect  ;

		ORG	0x50
		JMP	USART0_TXC_vect  ;
        
		ORG      0x78            ;USART1_RXC_vect
		JMP     USART1_RXC_vect
        
		ORG      0x80            ;USART1_TXC_vect
		JMP     USART1_TXC_vect
        
		END

⌨️ 快捷键说明

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