📄 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 OPTIMIZE(SIZE) BROWSE ORDER DEBUG OBJECTEXTEND SRC(.\OS_CPU_C.SRC)
$NOMOD51
NAME OS_CPU_C
P0 DATA 080H
SP DATA 081H
DPL DATA 082H
DPH DATA 083H
PCON DATA 087H
TCON DATA 088H
TMOD DATA 089H
TL0 DATA 08AH
TL1 DATA 08BH
TH0 DATA 08CH
TH1 DATA 08DH
AUXR DATA 08EH
P1 DATA 090H
SCON DATA 098H
SBUF DATA 099H
P2 DATA 0A0H
AUXR1 DATA 0A2H
IE DATA 0A8H
P3 DATA 0B0H
IP DATA 0B8H
XICON DATA 0C0H
T2CON DATA 0C8H
T2MOD DATA 0C9H
RCAP2L DATA 0CAH
RCAP2H DATA 0CBH
TL2 DATA 0CCH
TH2 DATA 0CDH
PSW DATA 0D0H
ACC DATA 0E0H
WDT DATA 0E1H
P4 DATA 0E8H
B DATA 0F0H
P0_0 BIT 080H.0
P0_1 BIT 080H.1
P0_2 BIT 080H.2
P0_3 BIT 080H.3
P0_4 BIT 080H.4
P0_5 BIT 080H.5
P0_6 BIT 080H.6
P0_7 BIT 080H.7
IT0 BIT 088H.0
IE0 BIT 088H.1
IT1 BIT 088H.2
IE1 BIT 088H.3
TR0 BIT 088H.4
TF0 BIT 088H.5
TR1 BIT 088H.6
TF1 BIT 088H.7
P1_0 BIT 090H.0
P1_1 BIT 090H.1
P1_2 BIT 090H.2
P1_3 BIT 090H.3
P1_4 BIT 090H.4
P1_5 BIT 090H.5
P1_6 BIT 090H.6
P1_7 BIT 090H.7
T2 BIT 090H.0
T2EX BIT 090H.1
RI BIT 098H.0
TI BIT 098H.1
RB8 BIT 098H.2
TB8 BIT 098H.3
REN BIT 098H.4
SM2 BIT 098H.5
SM1 BIT 098H.6
SM0 BIT 098H.7
P2_0 BIT 0A0H.0
P2_1 BIT 0A0H.1
P2_2 BIT 0A0H.2
P2_3 BIT 0A0H.3
P2_4 BIT 0A0H.4
P2_5 BIT 0A0H.5
P2_6 BIT 0A0H.6
P2_7 BIT 0A0H.7
EX0 BIT 0A8H.0
ET0 BIT 0A8H.1
EX1 BIT 0A8H.2
ET1 BIT 0A8H.3
ES BIT 0A8H.4
ET2 BIT 0A8H.5
EA BIT 0A8H.7
P3_0 BIT 0B0H.0
P3_1 BIT 0B0H.1
P3_2 BIT 0B0H.2
P3_3 BIT 0B0H.3
P3_4 BIT 0B0H.4
P3_5 BIT 0B0H.5
P3_6 BIT 0B0H.6
P3_7 BIT 0B0H.7
RXD BIT 0B0H.0
TXD BIT 0B0H.1
INT0 BIT 0B0H.2
INT1 BIT 0B0H.3
T0 BIT 0B0H.4
T1 BIT 0B0H.5
WR BIT 0B0H.6
RD BIT 0B0H.7
PX0 BIT 0B8H.0
PT0 BIT 0B8H.1
PX1 BIT 0B8H.2
PT1 BIT 0B8H.3
PS BIT 0B8H.4
PT2 BIT 0B8H.5
IT2 BIT 0C0H.0
IE2 BIT 0C0H.1
EX2 BIT 0C0H.2
PX2 BIT 0C0H.3
IT3 BIT 0C0H.4
IE3 BIT 0C0H.5
EX3 BIT 0C0H.6
PX3 BIT 0C0H.7
CP_RL2 BIT 0C8H.0
C_T2 BIT 0C8H.1
TR2 BIT 0C8H.2
EXEN2 BIT 0C8H.3
TCLK BIT 0C8H.4
RCLK BIT 0C8H.5
EXF2 BIT 0C8H.6
TF2 BIT 0C8H.7
P BIT 0D0H.0
FL BIT 0D0H.1
OV BIT 0D0H.2
RS0 BIT 0D0H.3
RS1 BIT 0D0H.4
F0 BIT 0D0H.5
AC BIT 0D0H.6
CY BIT 0D0H.7
P4_0 BIT 0E8H.0
P4_1 BIT 0E8H.1
P4_2 BIT 0E8H.2
P4_3 BIT 0E8H.3
ISP_DATA DATA 0E2H
ISP_ADDRH DATA 0E3H
ISP_ADDRL DATA 0E4H
ISP_CMD DATA 0E5H
ISP_TRIG DATA 0E6H
ISP_CONTR DATA 0E7H
?PR?_?OSTaskStkInit?OS_CPU_C SEGMENT CODE
?PR?_?OSInitHookBegin?OS_CPU_C SEGMENT CODE
?PR?_?OSInitHookEnd?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskCreateHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskSwHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTCBInitHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTimeTickHook?OS_CPU_C SEGMENT CODE
?PR?_?OSTaskIdleHook?OS_CPU_C SEGMENT CODE
?PR?UserTickTimer?OS_CPU_C SEGMENT CODE
?PR?OSTickISR?OS_CPU_C SEGMENT CODE
?PR?SerialISR?OS_CPU_C SEGMENT CODE
?PR?_?InitHardware?OS_CPU_C SEGMENT CODE
?XD?OS_CPU_C SEGMENT XDATA
EXTRN CODE (_?OSTimeTick)
EXTRN CODE (_?OSIntEnter)
EXTRN CODE (_?OSIntExit)
EXTRN CODE (?C?ADDXBP)
EXTRN CODE (?C?PSTXDATA)
EXTRN CODE (?C?XBPOFF)
EXTRN CODE (?C?PLDXDATA)
EXTRN DATA (?C_XBP)
EXTRN CODE (?C?PLDIXDATA)
EXTRN CODE (?C?CSTPTR)
EXTRN CODE (?C?IILDX)
EXTRN CODE (?C?CLDOPTR)
PUBLIC pc_send
PUBLIC _?InitHardware
PUBLIC SerialISR
PUBLIC OSTickISR
PUBLIC UserTickTimer
PUBLIC _?OSTaskIdleHook
PUBLIC _?OSTimeTickHook
PUBLIC _?OSTCBInitHook
PUBLIC _?OSTaskSwHook
PUBLIC _?OSTaskCreateHook
PUBLIC _?OSInitHookEnd
PUBLIC _?OSInitHookBegin
PUBLIC _?OSTaskStkInit
RSEG ?XD?OS_CPU_C
pc_send: DS 7
; /*
; *********************************************************************************************************
; * uC/OS-II
; * 实时内核
; *
; * (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
; * 版权所有
; *
; * MCU-51 专用代码
; * KEIL C51大模式编译
; *
; * 文件名 : OS_CPU_C.C
; * 作者 :
; *********************************************************************************************************
; */
;
; #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) reentrant, void *ppdata, OS_STK *ptos, INT16U opt) reentrant
RSEG ?PR?_?OSTaskStkInit?OS_CPU_C
_?OSTaskStkInit:
USING 0
; SOURCE LINE # 71
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
LCALL ?C?PSTXDATA
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
; {
; OS_STK *stk;
;
; ppdata = ppdata;
; SOURCE LINE # 75
MOV DPTR,#06H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV DPTR,#06H
LCALL ?C?XBPOFF
LCALL ?C?PSTXDATA
; opt = opt; //opt没被用到,保留此语句防止告警产生
; SOURCE LINE # 76
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 = ptos; //用户堆栈最低有效地址
; SOURCE LINE # 77
MOV DPTR,#09H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PSTXDATA
; *stk++ = 15; //用户堆栈长度
; SOURCE LINE # 78
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#0FH
LCALL ?C?CSTPTR
; *stk++ = (INT16U)task & 0xFF; //任务地址低8位
; SOURCE LINE # 79
MOV DPTR,#03H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV R7,AR1
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = (INT16U)task >> 8; //任务地址高8位
; SOURCE LINE # 80
MOV DPTR,#03H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV A,R2
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = 0x0A; //ACC
; SOURCE LINE # 81
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#0AH
LCALL ?C?CSTPTR
; *stk++ = 0x0B; //B
; SOURCE LINE # 82
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#0BH
LCALL ?C?CSTPTR
; *stk++ = 0x00; //DPH
; SOURCE LINE # 83
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
CLR A
LCALL ?C?CSTPTR
; *stk++ = 0x00; //DPL
; SOURCE LINE # 84
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV B,#01H
LCALL ?C?PLDIXDATA
CLR A
LCALL ?C?CSTPTR
; *stk++ = 0x00; //PSW
; SOURCE LINE # 85
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV B,#01H
LCALL ?C?PLDIXDATA
CLR A
LCALL ?C?CSTPTR
; *stk++ = 0x00; //R0
; SOURCE LINE # 86
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV B,#01H
LCALL ?C?PLDIXDATA
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 # 90
MOV DPTR,#06H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV R7,AR1
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = (INT16U)ppdata >> 8; //R2
; SOURCE LINE # 91
MOV DPTR,#06H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV A,R2
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = 0x01; //R3 因为我用的全是XDATA,所以存储器类型固定为1,见C51.PDF第178页说明。
; SOURCE LINE # 92
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#01H
LCALL ?C?CSTPTR
;
; *stk++ = 0x04; //R4
; SOURCE LINE # 94
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#04H
LCALL ?C?CSTPTR
; *stk++ = 0x05; //R5
; SOURCE LINE # 95
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#05H
LCALL ?C?CSTPTR
; *stk++ = 0x06; //R6
; SOURCE LINE # 96
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#06H
LCALL ?C?CSTPTR
; *stk++ = 0x07; //R7
; SOURCE LINE # 97
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,#07H
LCALL ?C?CSTPTR
; //不用保存SP,任务切换时根据用户堆栈长度计算得出。
; *stk++ = (INT16U) (ptos+MaxStkSize) >> 8; //?C_XBP 仿真堆栈指针高8位
; SOURCE LINE # 99
MOV DPTR,#09H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV A,R1
ADD A,#064H
MOV R1,A
CLR A
ADDC A,R2
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,R7
LCALL ?C?CSTPTR
; *stk++ = (INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
; SOURCE LINE # 100
MOV DPTR,#09H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV A,R1
ADD A,#064H
MOV R1,A
CLR A
ADDC A,R2
MOV R7,AR1
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?PLDIXDATA
MOV A,R7
LCALL ?C?CSTPTR
;
; return ((void *)ptos);
; SOURCE LINE # 102
MOV DPTR,#09H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
; }
; SOURCE LINE # 103
?C0001:
MOV DPTR,#0EH
LJMP ?C?ADDXBP
; END OF _?OSTaskStkInit
;
; #if OS_CPU_HOOKS_EN
;
; /*
; *********************************************************************************************************
; * OS INITIALIZATION HOOK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -