📄 os_cpu_a.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 + -