📄 os_cpu_a.s43
字号:
#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
;*******************************************************************************
; 临界方式(OS_CRITICAL_METHOD)为3时的防护程序
;*******************************************************************************
OSCPUSaveSR
DINT
MOV.W SR,R12 ;得到状态寄存器(程序返回值放在R12中)
RET
OSCPURestoreSR
MOV.W R12,SR ;恢复状态寄存器(程序参数放在R12中)
EINT
RET
;*******************************************************************************
; MSP中断矢量
;*******************************************************************************
COMMON INTVEC
ORG TIMERA1_VECTOR
TMA_VEC DW TIMERA_ISR ; interrupt vector
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -