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

📄 os_asm.s90

📁 牛人写的AVR单片机操作系统源代码
💻 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 + -