?? os_asm.s90
字號(hào):
;***********************************************************
; miRTOS是一個(gè)可在avr上運(yùn)行的mini RTOS,它屬于自由軟件,在
;它只實(shí)現(xiàn)了簡(jiǎn)單的任務(wù)切換、任務(wù)之間的消息傳遞、任務(wù)的停止與
;繼續(xù)等功能,如果你有興趣,可以在這個(gè)基礎(chǔ)上增加信號(hào)量、郵箱
;等各種功能。
; 2006年元旦閑著沒(méi)事,就寫(xiě)了這個(gè)RTOS,希望能給想了解RTOS
;的人一些幫助,其實(shí)單片機(jī)上的RTOS沒(méi)多少神秘,它通過(guò)對(duì)各個(gè)任
;務(wù)的上下文切換,來(lái)實(shí)現(xiàn)任務(wù)的分時(shí)運(yùn)行。外加上信號(hào)量,消息等
;輔助功能。
; 你可以在miRTOS上做任何操作,比如修改、增加功能等。但請(qǐng)
;在修改的地方加上相應(yīng)的修改記錄,實(shí)現(xiàn)的功能,并將其公開(kāi)化。
;如果可能的話,請(qǐng)發(fā)一份修改后的副本給我(^_^)。
; 如果你有疑問(wèn),可以找我,我的郵箱: frankie.hu@gmail.com
;當(dāng)然你也可以到www.ouravr.com 的論壇上找hunter0773,希望我們
;能共同進(jìn)步。
; 另外,在AVR上我只是一個(gè)菜鳥(niǎo),希望不要被老鳥(niǎo)門歧視哦。呵呵。
; frankie.hu 寫(xiě)于 2006.01.05夜。
; 在你修改或轉(zhuǎn)載時(shí),請(qǐng)不要?jiǎng)h除上面的聲名信息。
;***********************************************************
#include "userdef.h"
MODULE OS_ASM
PUBLIC StartTaskRunning
PUBLIC OS_Scheduler
EXTERN OS_DecTick
EXTERN OS_SetHighRdy
EXTERN Current_TCB
RSEG CODE:CODE
;**********************************************************
;函 數(shù) 名:
;功 能:
;輸入?yún)?shù): 無(wú)
;輸出參數(shù): 無(wú)
;返 回 值: 無(wú)
;==========================================================
;日 期: 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
;**********************************************************
;函 數(shù) 名: Restore_Register (宏定義)
;功 能: 恢復(fù)寄存器現(xiàn)場(chǎng)
;輸入?yún)?shù): 無(wú)
;輸出參數(shù): 無(wú)
;返 回 值: 無(wú)
;==========================================================
;日 期: 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
;**********************************************************
;函 數(shù) 名:
;功 能:
;輸入?yún)?shù): 無(wú)
;輸出參數(shù): 無(wú)
;返 回 值: 無(wú)
;==========================================================
;日 期: 2006.01.01
;作 者: frankie.hu
;修改記錄:
;**********************************************************
OS_Scheduler:
RCALL Save_Register
IN R16,SREG ;保存狀態(tài)寄存器
CLI ;禁止中斷使能
ST -Y,R16 ;保存狀態(tài)寄存器至軟堆棧
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 ;保存當(dāng)前任務(wù)的content至Current_TCB指向的TCB中
Int_Entry_0:
RCALL OS_SetHighRdy ;查找出當(dāng)前優(yōu)先級(jí)最高的在就緒狀態(tài)的任務(wù)
LDS R30,Current_TCB
LDS R31,Current_TCB+1
LD R16,Z+
LD R17,Z+
;**********************************************************
;函 數(shù) 名:
;功 能:
;輸入?yún)?shù): 無(wú)
;輸出參數(shù): 無(wú)
;返 回 值: 無(wú)
;==========================================================
;日 期: 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
;**********************************************************
;函 數(shù) 名: Int_Entry
;功 能: 定時(shí)器中斷處理,任務(wù)切換
;輸入?yún)?shù): 無(wú)
;輸出參數(shù): 無(wú)
;返 回 值: 無(wú)
;==========================================================
;日 期: 2006.01.01
;作 者: frankie.hu
;修改記錄:
;**********************************************************
Int_Entry:
RCALL Save_Register
IN R16,SREG ;保存狀態(tài)寄存器
CLI ;禁止中斷使能
ST -Y,R16 ;保存狀態(tài)寄存器至軟堆棧
;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 ;保存當(dāng)前任務(wù)的content至Current_TCB指向的TCB中
RCALL OS_DecTick
RJMP Int_Entry_0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 定時(shí)器0比較中斷
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ASEG CODE ; 采用定時(shí)器0做為TICK
ORG TIMER0_COMP_vect
RJMP Int_Entry
ENDMOD
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -