51操作系统 2009-04-17 14:45:56 阅读138 评论1 字号:大中小
CLR C
SUBB A,OSNextTaskID
JZ ?C0011
MOV R6,A
MOV A,#LOW (OSTsakStackBotton)
ADD A,OSNextTaskID
MOV R1,A
?C0010:
INC R1
MOV A,R7
ADD A,@R1
MOV @R1,A
DJNZ R6,?C0010
?C0011:
MOV OSTaskID,OSNextTaskID
DEC SP
?C0007:
LJMP LoadCtx
?C000r:
IF EN_SP2 <> 0
mov SP,r2
ENDIF
LJMP LoadCtx
*************end ********************
其中调用的LoadCtx()函数是任务环境的恢复即把调度后将要运行的任务寄存器的内容和堆栈顶的位置进行设置。
程序代码如下:
*********************************
** 函数名称: LoadCtx
**功能描述: 任务环境恢复函数
**输 入: OSTaskID,OSFastSwap
**输 出 : 无
**全局变量: 无
*********************************
RSEG ?PR?LoadCtx?OS_CPU_A
LoadCtx:
USING 0
POP Os_Enter_Sum ;恢复关中断计数器
;判断是否需要恢复所有寄存器
MOV A,OSTaskID
CJNE A,#OS_MAX_TASKS,LoadCtx_0
SJMP LoadCtx_2
LoadCtx_0:
MOV DPTR,#OSMapTbl
#if OS_MAX_TASKS < 9
MOVC A,@A+DPTR
ANL A,OSFastSwap
#else
MOV R6,OSFastSwap
CLR C
SUBB A,#8
JNC LoadCtx_1
MOV R6,OSFastSwap + 1
MOV A,OSTaskID
LoadCtx_1:
MOVC A,@A+DPTR
ANL A,R6
#endif
JNZ LoadCtx_2
;恢复寄存器
POP 7
POP 6
POP 5
POP 4
POP 3
POP 2
POP 1
POP 0
POP PSW
POP DPL
POP DPH
POP B
POP ACC
LoadCtx_2:
;判断是否需要开中断
INC Os_Enter_Sum
djnz Os_Enter_Sum,LoadCtx_3
SET_EA ;开中断
LoadCtx_3:
RET
***************end ******************
(未完,待续)
http://xky19870905.blog.163.com/blog/static/51855417200931724556782/
文章评论(0条评论)
登录后参与讨论