📄 task_switch.a51
字号:
NAME OS_TASK_SWITCH
EXTRN CODE (OSTimeTick)
EXTRN CODE (OSIntExit)
?PR?OSTickISR?OS_TASK_SWITCH SEGMENT CODE
?DT?OSTickISR?OS_TASK_SWITCH SEGMENT DATA OVERLAYABLE
;---------------------------
PUBLIC OSTickISR
;---------------------------
;--------------------------------------------
PUBLIC STACK
;--------------------------------------------
;?STACK SEGMENT IDATA
?STACK SEGMENT IDATA
RSEG ?STACK
STACK: ;堆栈
DS 0
;--------------------------------------------
RSEG ?DT?OSTickISR?OS_TASK_SWITCH
?OSTickISR?BYTE:
IEtemp?350: DS 1
;---------------------------
CSEG AT 0000BH
LJMP OSTickISR
; //功能描述: 系统时钟中断服务函数
; //#pragma disable //禁止所有中断
; void OSTickISR(void) interrupt 1 //OS_TIME_ISR
RSEG ?PR?OSTickISR?OS_TASK_SWITCH
USING 0
OSTickISR:
;--------------------------------
; IEtemp=IE;//保存中断
; SOURCE LINE # 202
MOV IEtemp?350,IE
; OS_AllIRQ_Unable(); //总中断禁止
; SOURCE LINE # 203
CLR EA
;--------------------------------
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
MOV PSW,#00H
PUSH AR0
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
USING 0
; SOURCE LINE # 196
; {uint8 data IEtemp;
;
;-----------------------------------------
;在后面先判断再设置
; TH0=T0H_COUNTER;
; SOURCE LINE # 199
;--- MOV TH0,#070H
; TL0=T0L_COUNTER;
; SOURCE LINE # 200
;--- MOV TL0,#00H
;------------------------------------------
;修改到前面--------------------------------
; IEtemp=IE;//保存中断
; SOURCE LINE # 202
;--- MOV IEtemp?350,IE
; OS_AllIRQ_Unable(); //总中断禁止
; SOURCE LINE # 203
;--- CLR EA
;--------------------------------
; //IE &= B0000_0000; //IE &= B0000_0001; //保留外部中断原来状态,屏蔽掉其他中断
;
;
; //#if EN_TIMER_SHARING > 0
;--------------------------------
; if(TH0==0)//==0说明是定时器溢出中断,!=0表示是软件设置的定时器中断
; SOURCE LINE # 211
MOV A,TH0
JNZ ?C0011
; {
; SOURCE LINE # 212
; TH0=T0H_COUNTER;
; SOURCE LINE # 213
MOV TH0,#070H
; TL0=T0L_COUNTER;
; SOURCE LINE # 214
MOV TL0,A
; OSTimeTick(); //调用系统时钟处理函数
; SOURCE LINE # 215
LCALL OSTimeTick
; }//
; SOURCE LINE # 216
?C0011:
;--------------------------------
; //#else
; // OSIntSendSignal(TIME_ISR_TASK_ID); // 唤醒ID为TIME_ISR_TASK_ID的任务
; //#endif
;
;
; OSIntExit(); //在完全退出中断时,才进行任务切换
; SOURCE LINE # 215
LCALL OSIntExit
;修改到后面--------------------------------
; //OS_AllIRQ_Enable(); //总中断允许
; IE=IEtemp; //恢复所有中断状态
; SOURCE LINE # 218
;--- MOV IE,IEtemp?350
;--------------------------------
; }
; SOURCE LINE # 219
POP AR7
POP AR6
POP AR5
POP AR4
POP AR3
POP AR2
POP AR1
POP AR0
POP PSW
POP DPL
POP DPH
POP B
POP ACC
;--------------------------------
; //OS_AllIRQ_Enable(); //总中断允许
; IE=IEtemp; //恢复所有中断状态
; SOURCE LINE # 218
MOV IE,IEtemp?350
;--------------------------------
RETI
; END OF OSTickISR
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -