📄 os_cpu_c.src
字号:
; .\OS_CPU_C.SRC generated from: OS_CPU_C.C
; COMPILER INVOKED BY:
; C:\Keil\C51\BIN\C51.EXE OS_CPU_C.C LARGE BROWSE DEBUG OBJECTEXTEND SRC(.\OS_CPU_C.SRC)
$NOMOD51
NAME OS_CPU_C
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
EA BIT 0A8H.7
IE DATA 0A8H
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
PS BIT 0B8H.4
SP DATA 081H
OV BIT 0D0H.2
WR BIT 0B0H.6
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
TF1 BIT 088H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
REN BIT 098H.4
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?_?OSTaskStkInit?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskCreateHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskDelHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskSwHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskStatHook?OS_CPU_C SEGMENT CODE
?PR?OSInitHookBegin?OS_CPU_C SEGMENT CODE
?PR?OSInitHookEnd?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskIdleHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTCBInitHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTimeTickHook?OS_CPU_C SEGMENT CODE
?PR?_?InitTimer0?OS_CPU_C SEGMENT CODE
EXTRN CODE (?C?ADDXBP)
EXTRN CODE (?C?XBPOFF)
EXTRN DATA (?C_XBP)
EXTRN CODE (?C?ILDIX)
EXTRN CODE (?C?CSTPTR)
PUBLIC _?InitTimer0
PUBLIC _?OSTimeTickHook
PUBLIC _?OSTCBInitHook
PUBLIC _?OSTaskIdleHook
PUBLIC OSInitHookEnd
PUBLIC OSInitHookBegin
PUBLIC _?OSTaskStatHook
PUBLIC _?OSTaskSwHook
PUBLIC _?OSTaskDelHook
PUBLIC _?OSTaskCreateHook
PUBLIC _?OSTaskStkInit
; /*
; *********************************************************************************************************
; * uC/OS-II
; * 实时内核
; * 版权所有
; *
; * 文件名 : OS_CPU_C.C
; * 作者 : Jean J. Labrosse
; * 改编 : 陈是知 北京中软 2005。1。27
; *********************************************************************************************************
; */
;
; #define OS_CPU_GLOBALS
; #include "includes.h"
;
; /*
; *********************************************************************************************************
; * 初始化任务堆栈
; *
; * 描述 : 这个函数被OSTaskCreate()或OSTaskCreateExt()调用,以便初始化新创建任务的堆栈结构。本函数
; * 与处理器高度相关。
; *
; * 参数 : task 指向任务代码的指针
; *
; * pdata 当任务第一次执行时将要传入任务的用户数据结构指针
; *
; * ptos 栈顶指针。ptos指针被默认为用户堆栈入口指针。如果OS_STK_GROWTH被置1,那么,
; * ptos指向用户堆栈的最高有效地址。同样地,如果OS_STK_GROWTH清0,ptos将指向
; * 用户堆栈的最低有效地址。
; *
; * opt 指定可以改变OSTaskStkInit()行为的选项。(见uCOS_II.H for OS_TASK_OPT_???)。
; *
; * 返回值 : 我修改了原来的程序,使函数总是返回用户堆栈空间的最低有效地址。这样修改提高了TCB换入换出
; * 的效率。
; *
; * 注意 : 任务堆栈结构:
; *
; * ---------- -
; * 用户栈最高地址---->| | |
; * ---------- |
; * | ... | 仿真堆栈空间
; *---------- ---------- | 每任务一个
; *|OSTCBCur| ?C_XBP---->| | | KEIL自动处理
; *---------- ---------- -
; * | |空闲间隔|
; * | ----------------------- ---------- ----------
; * \---->|OSTCBCur->OSTCBStkPtr| |?C_XBP低| SP---->| |
; * ----------------------- ---------- ----------
; * | |?C_XBP高| | |
; * | ---------- - ----------
; * | | | | | . |
; * | ---------- | | . |
; * | | | | | . |
; * | ---------- | ----------
; * | | . |长度 | | +1
; * | | . | | ----------
; * | | . | | OSStack---->| | 0
; * | ---------- | ----------
; * | | | | OSStkStart---->| 不关心 | -1 低地址
; * | ---------- - ----------
; * \------------->| 长度 | 低地址 系统硬件堆栈
; * ----------
; * 用户堆栈 长度=SP-OSStkStart
; *********************************************************************************************************
; */
;
; OS_STK *OSTaskStkInit (void (*task)(void *pd), void *ppdata, OS_STK *ptos, INT16U opt) reentrant
RSEG ?PR?_?OSTaskStkInit?OS_CPU_C
_?OSTaskStkInit:
USING 0
; SOURCE LINE # 67
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
; {
; OS_STK *stk;
;
; ppdata = ppdata;
; SOURCE LINE # 71
MOV DPTR,#06H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#06H
LCALL ?C?XBPOFF
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; opt = opt; //opt没被用到,保留此语句防止告警产生
; SOURCE LINE # 72
MOV DPTR,#0CH
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#0CH
LCALL ?C?XBPOFF
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; stk = (OS_STK *)ptos; //用户堆栈最低有效地址
; SOURCE LINE # 73
MOV DPTR,#09H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; *stk++ = 15; //用户堆栈长度
; SOURCE LINE # 74
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,#0FH
LCALL ?C?CSTPTR
; *stk++ = (INT16U)task & 0xFF; //任务地址低8位
; SOURCE LINE # 75
MOV DPTR,#03H
LCALL ?C?XBPOFF
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = (INT16U)task >> 8; //任务地址高8位
; SOURCE LINE # 76
MOV DPTR,#03H
LCALL ?C?XBPOFF
INC DPTR
MOVX A,@DPTR
MOV R2,A
MOV A,R2
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = 0x00; //PSW
; SOURCE LINE # 77
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
CLR A
LCALL ?C?CSTPTR
; *stk++ = 0x0A; //ACC
; SOURCE LINE # 78
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,#0AH
LCALL ?C?CSTPTR
; *stk++ = 0x0B; //B
; SOURCE LINE # 79
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,#0BH
LCALL ?C?CSTPTR
; *stk++ = 0x00; //DPL
; SOURCE LINE # 80
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
CLR A
LCALL ?C?CSTPTR
; *stk++ = 0x00; //DPH
; SOURCE LINE # 81
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
CLR A
LCALL ?C?CSTPTR
; *stk++ = 0x00; //R0
; SOURCE LINE # 82
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
CLR A
LCALL ?C?CSTPTR
;
; //R3、R2、R1用于传递任务参数ppdata,其中R3代表存储器类型,R2为高字节偏移,R1为低字节位移。
; //通过分析KEIL汇编,了解到任务的void *ppdata参数恰好是用R3、R2、R1传递,不是通过虚拟堆栈。
; *stk++ = (INT16U)ppdata & 0xFF; //R1
; SOURCE LINE # 86
MOV DPTR,#06H
LCALL ?C?XBPOFF
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = (INT16U)ppdata >> 8; //R2
; SOURCE LINE # 87
MOV DPTR,#06H
LCALL ?C?XBPOFF
INC DPTR
MOVX A,@DPTR
MOV R2,A
MOV A,R2
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = 0x01; //R3 因为我用的全是XDATA,所以存储器类型固定为1,见C51.PDF第178页说明。
; SOURCE LINE # 88
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,#01H
LCALL ?C?CSTPTR
;
; *stk++ = 0x04; //R4
; SOURCE LINE # 90
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,#04H
LCALL ?C?CSTPTR
; *stk++ = 0x05; //R5
; SOURCE LINE # 91
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -