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

📄 os_cpu.s

📁 一个小的操作系统包括应用程序很有参考价值
💻 S
字号:

;************************************************
;
;   MX RTOS AVR 嵌入式操作系统 V1.10 汇编 内核文件
;   作者:罗国祥 DEF edisonluo@sina.com
;   本人收回本内核所有权
;   2004年3月1日
;
;************************************************






;插入声明文件包
#include <avr/io.h>
#include <avr/signal.h>

#define OS_SET_I SEI             ;开总中断
#define OS_CLEAR_I CLI           ;关总中断


.global OS_GET_TO_TASK_INT       ;汇编函数跳入下一条线程(中断模式)
.global OS_GET_TO_TASK_DISP      ;汇编函数跳入下一条线程(普通模式)
.global START_TICK_POINT         ;汇编函数第一次启动时跳入调度入口点
.global OS_DISP_TIME_P           ;汇编线程等待处理过程

.extern OS_ATTEMPER              ;C函数获取下一条线程
.extern OS_GETTO_NEXT_TASK_INT   ;C函数进入下一条线程(中断模式)
.extern OS_GETTO_NEXT_TASK_DISP  ;C函数进入下一条线程(普通模式)
.extern OS_SAVE_TASK_SP          ;C函数保存当前线程SP指针
.extern OS_DLY_TIME_DEC          ;C函数线程等待时间处理函数
.extern OS_RELOAD_TICK           ;重新初始化系统时钟


;保存寄存器宏
.macro PUSHRS
	PUSH R0
	PUSH R1
	PUSH R2
	PUSH R3
	PUSH R4
	PUSH R5
	PUSH R6
	PUSH R7
	PUSH R8
	PUSH R9
	PUSH R10
	PUSH R11
	PUSH R12
	PUSH R13
	PUSH R14
	PUSH R15
	PUSH R16
	PUSH R17
	PUSH R18
	PUSH R19
	PUSH R20
	PUSH R21
	PUSH R22
	PUSH R23
	PUSH R24
	PUSH R25
	PUSH R26
	PUSH R27
	PUSH R28
	PUSH R29
	PUSH R30
	PUSH R31

	IN R16,0X3F   ;保存SREG寄存器
	PUSH R16
.endm

;恢复寄存器宏

.macro POPRS
 
	POP R16       ;恢复SREG寄存器
	OUT 0X3F,R16

	POP R31
	POP R30
	POP R29
	POP R28
	POP R27
	POP R26
	POP R25
	POP R24
	POP R23
	POP R22
	POP R21
	POP R20
	POP R19
	POP R18
	POP R17
	POP R16
	POP R15
	POP R14
	POP R13
	POP R12
	POP R11
	POP R10
	POP R9
	POP R8
	POP R7
	POP R6
	POP R5
	POP R4
	POP R3
	POP R2
	POP R1
	POP R0
.endm

;汇编函数跳入下一条线程
OS_GET_TO_TASK_INT:
  POPRS
  OS_SET_I              ;开中断
  RETI
  
;汇编函数跳入下一条线程
OS_GET_TO_TASK_DISP:
  POPRS
  OS_SET_I              ;开中断
  RET

;汇编线程等待处理过程
OS_DISP_TIME_P:                    ;线程延时处理
	OS_CLEAR_I                     ;关中断
	PUSHRS                         ;保存寄存器
	IN R25,0X3E                    ;传递SPH
	IN R24,0X3D                    ;传递SPL
	RCALL OS_SAVE_TASK_SP          ;调用C保存SP
	RCALL OS_ATTEMPER              ;进入C调度
	RJMP  OS_GETTO_NEXT_TASK_DISP  ;进入C指向函数处理过程
	

;第一次启动入口点
START_TICK_POINT:	
	RCALL OS_ATTEMPER;             ;进入C调度
	RJMP  OS_GETTO_NEXT_TASK_DISP  ;进入C指向函数处理过程

;中断入口
.global	SIG_OVERFLOW0              ;中断入口点 用户根据情况修改
SIG_OVERFLOW0:                     ;中断入口点 用户根据情况修改

 	;SEI
	OS_CLEAR_I                     ;关中断
	PUSHRS                         ;保存寄存器
	IN R25,0X3E                    ;传递SPH
	IN R24,0X3D                    ;传递SPL
	RCALL OS_SAVE_TASK_SP          ;调用C保存SP
	RCALL OS_RELOAD_TICK           ;C函数重新初始化系统时钟
    RCALL OS_DLY_TIME_DEC          ;时钟节拍处理
	RCALL OS_ATTEMPER;             ;进入C调度
	RJMP  OS_GETTO_NEXT_TASK_INT   ;进入C指向函数处理过程


⌨️ 快捷键说明

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