📄 os_asm.s90
字号:
;***********************************************************
; miRTOS是一个可在avr上运行的mini RTOS,它属于自由软件,在
;它只实现了简单的任务切换、任务之间的消息传递、任务的停止与
;继续等功能,如果你有兴趣,可以在这个基础上增加信号量、邮箱
;等各种功能。
; 2006年元旦闲着没事,就写了这个RTOS,希望能给想了解RTOS
;的人一些帮助,其实单片机上的RTOS没多少神秘,它通过对各个任
;务的上下文切换,来实现任务的分时运行。外加上信号量,消息等
;辅助功能。
; 你可以在miRTOS上做任何操作,比如修改、增加功能等。但请
;在修改的地方加上相应的修改记录,实现的功能,并将其公开化。
;如果可能的话,请发一份修改后的副本给我(^_^)。
; 如果你有疑问,可以找我,我的邮箱: frankie.hu@gmail.com
;当然你也可以到www.ouravr.com 的论坛上找hunter0773,希望我们
;能共同进步。
; 另外,在AVR上我只是一个菜鸟,希望不要被老鸟门歧视哦。呵呵。
; frankie.hu 写于 2006.01.05夜。
; 在你修改或转载时,请不要删除上面的声名信息。
;***********************************************************
#include "userdef.h"
MODULE OS_ASM
PUBLIC StartTaskRunning
PUBLIC OS_Scheduler
EXTERN OS_DecTick
EXTERN OS_SetHighRdy
EXTERN Current_TCB
RSEG CODE:CODE
;**********************************************************
;函 数 名:
;功 能:
;输入参数: 无
;输出参数: 无
;返 回 值: 无
;==========================================================
;日 期: 2006.01.01
;作 者: frankie.hu
;修改记录:
;**********************************************************
Save_Register:
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 ;Save current task content
RET
;**********************************************************
;函 数 名: Restore_Register (宏定义)
;功 能: 恢复寄存器现场
;输入参数: 无
;输出参数: 无
;返 回 值: 无
;==========================================================
;日 期: 2006.01.01
;作 者: frankie.hu
;修改记录:
;**********************************************************
Restore_Register MACRO
LD R31,Y+ ;restore high priority readied task's content
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
;**********************************************************
;函 数 名:
;功 能:
;输入参数: 无
;输出参数: 无
;返 回 值: 无
;==========================================================
;日 期: 2006.01.01
;作 者: frankie.hu
;修改记录:
;**********************************************************
OS_Scheduler:
RCALL Save_Register
IN R16,SREG ;保存状态寄存器
CLI ;禁止中断使能
ST -Y,R16 ;保存状态寄存器至软堆栈
IN R16,SPL
ST -Y,R16
IN R16,SPH
ST -Y,R16
LDS R30,Current_TCB
LDS R31,Current_TCB+1
ST Z+,R28
ST Z+,R29 ;保存当前任务的content至Current_TCB指向的TCB中
Int_Entry_0:
RCALL OS_SetHighRdy ;查找出当前优先级最高的在就绪状态的任务
LDS R30,Current_TCB
LDS R31,Current_TCB+1
LD R16,Z+
LD R17,Z+
;**********************************************************
;函 数 名:
;功 能:
;输入参数: 无
;输出参数: 无
;返 回 值: 无
;==========================================================
;日 期: 2006.01.01
;作 者: frankie.hu
;修改记录:
;**********************************************************;
StartTaskRunning:
MOVW R29:r28,R17:R16
LD R16,Y+
OUT SPH,R16
LD R16,Y+
OUT SPL,R16
LD R16,Y+
OUT SREG,R16
;RCALL Restore_Register
Restore_Register
RETI
;**********************************************************
;函 数 名: Int_Entry
;功 能: 定时器中断处理,任务切换
;输入参数: 无
;输出参数: 无
;返 回 值: 无
;==========================================================
;日 期: 2006.01.01
;作 者: frankie.hu
;修改记录:
;**********************************************************
Int_Entry:
RCALL Save_Register
IN R16,SREG ;保存状态寄存器
CLI ;禁止中断使能
ST -Y,R16 ;保存状态寄存器至软堆栈
;LDI R16,TCNT0_RELOAD_VALUE
;OUT TCNT0,R16
IN R16,SPL
ST -Y,R16
IN R16,SPH
ST -Y,R16
LDS R30,Current_TCB
LDS R31,Current_TCB+1
ST Z+,R28
ST Z+,R29 ;保存当前任务的content至Current_TCB指向的TCB中
RCALL OS_DecTick
RJMP Int_Entry_0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 定时器0比较中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ASEG CODE ; 采用定时器0做为TICK
ORG TIMER0_COMP_vect
RJMP Int_Entry
ENDMOD
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -