?? os_cpu_a.s43.bak
字號:
#include <msp430x14x.h>
;*******************************************************************************
; 保存寄存器宏
;*******************************************************************************
PUSHALL MACRO
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
ENDM
POPALL MACRO
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
ENDM
;*********************************************************************************
; 公共和外部變量聲明
;*********************************************************************************
EXTERN OSIntExit
EXTERN OSIntNesting
EXTERN OSISRStkPtr
EXTERN OSPrioCur
EXTERN OSPrioHighRdy
EXTERN OSRunning
EXTERN OSTCBCur
EXTERN OSTCBHighRdy
EXTERN OSTimeTick
EXTERN SetQuickTask1_Rdy
EXTERN SetQuickTask2_Rdy
PUBLIC OSCtxSw
PUBLIC OSCPURestoreSR
PUBLIC OSCPUSaveSR
PUBLIC OSIntCtxSw
PUBLIC OSStartHighRdy
PUBLIC TIMERA_ISR
;*******************************************************************************
; 系統開始運行最高任務
;*******************************************************************************
RSEG CODE ; 程序代碼
OSStartHighRdy
mov.b #1, &OSRunning ;設置系統運行標志
mov.w SP, &OSISRStkPtr ;保存中斷堆棧(中斷堆棧為開始時系統分配堆棧)
mov.w &OSTCBHighRdy, R13 ;裝載最高優先級堆棧
mov.w @R13, SP
POPALL ;
reti ;仿真中斷返回
;*******************************************************************************
; 任務級切換程序
;*******************************************************************************
OSCtxSw
push sr ; 仿真中斷響應,保存狀態寄存器
PUSHALL ;
mov.w &OSTCBCur, R13 ; 保存當前任務堆棧指針
mov.w SP, 0(R13)
mov.b &OSPrioHighRdy, R13 ; 刷新當前優先級為最高優先級
mov.b R13, &OSPrioCur ;
mov.w &OSTCBHighRdy, R13 ; 設置當前任務為最高優先級任務
mov.w R13, &OSTCBCur ;
mov.w @R13, SP ; 設置堆棧指針到最高優先級堆棧指針
POPALL ;
reti ; 仿真中斷返回
;*******************************************************************************
; 中斷級切換程序
;*******************************************************************************
OSIntCtxSw
mov.b &OSPrioHighRdy, R13 ; 刷新當前優先級為最高優先級
mov.b R13, &OSPrioCur ;
mov.w &OSTCBHighRdy, R13 ; 設置當前任務為最高優先級任務
mov.w R13, &OSTCBCur ;
mov.w @R13, SP ; 設置堆棧指針到最高優先級堆棧指針
POPALL ;
reti ; 中斷返回
;*******************************************************************************
; 系統定時器
;*******************************************************************************
TIMERA_ISR ; tiumera ISR
ADD &TAIV,PC
RETI
JMP CCIFG1_ISR
JMP CCIFG2_ISR
RETI
RETI
TAIFG_ISR
PUSHALL ;
cmp.b #0, &OSIntNesting ; 如果沒有中斷嵌套,裝載中斷堆棧
jne TMA_ISR_1
mov.w &OSTCBCur, R13 ;
mov.w SP, 0(R13)
mov.w &OSISRStkPtr, SP ;
TMA_ISR_1
inc.b &OSIntNesting ; 中斷嵌套計數加1
eint ; 允許中斷
call #OSTimeTick ; 調用系統Tick程序
dint ; 不允許中斷
call #OSIntExit ; 調用中斷級調度程序,如果調度成功將不運行下面程序
cmp.b #0, &OSIntNesting ; 如果沒有中斷嵌套,返回到最高優先級任務
jne TMA_ISR_2
mov.w &OSTCBHighRdy, R13 ;
mov.w @R13, SP
TMA_ISR_2
POPALL ;
reti ; 中斷返回
CCIFG1_ISR
reti
CCIFG2_ISR
reti
;********************************************************************************************************
; SAVE AND RESTORE THE CPU'S STATUS REGISTER
;
; Description: These functions are used to implement OS_CRITICAL_METHOD #3 by saving the status register
; in a local variable of the calling function and then, disables interrupts.
;
; Notes : R12 is assumed to hold the argument passed to OSCPUSaveSR() and also, the value returned
; by OSCPURestoreSR().
;********************************************************************************************************
OSCPUSaveSR
MOV.W SR,R12
DINT
RET
OSCPURestoreSR
MOV.W R12,SR
EINT
RET
;********************************************************************************************************
; TIMERA INTERRUPT VECTOR ENTRY
;
; MSP430x11x1/MSP430F14x Interrupt vectors
;********************************************************************************************************
COMMON INTVEC
ORG TIMERA1_VECTOR
TMA_VEC DW TIMERA_ISR ; interrupt vector
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -