📄 os_cpu_c.src
字号:
; .\obj\OS_CPU_C.SRC generated from: uCosii\OS_CPU_C.C
; COMPILER INVOKED BY:
; C:\Keil\C51\BIN\C51.EXE uCosii\OS_CPU_C.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\lst\OS_CPU_C.lst) SRC(.\obj\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
T2 BIT 090H.0
EA BIT 0A8H.7
IE DATA 0A8H
EXF2 BIT 0C8H.6
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
RCAP2H DATA 0CBH
PS BIT 0B8H.4
SP DATA 081H
T2EX BIT 090H.1
OV BIT 0D0H.2
RCAP2L DATA 0CAH
C_T2 BIT 0C8H.1
WR BIT 0B0H.6
RCLK BIT 0C8H.5
TCLK BIT 0C8H.4
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
CP_RL2 BIT 0C8H.0
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
ET2 BIT 0A8H.5
TF1 BIT 088H.7
TF2 BIT 0C8H.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
TH2 DATA 0CDH
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
TL2 DATA 0CCH
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
PT2 BIT 0B8H.5
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
TR2 BIT 0C8H.2
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
EXEN2 BIT 0C8H.3
REN BIT 098H.4
T2CON DATA 0C8H
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?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 (_?OSIntExit)
EXTRN CODE (_?OSTimeTick)
EXTRN CODE (_?OSIntEnter)
EXTRN CODE (?C?ADDXBP)
EXTRN CODE (?C?XBPOFF)
EXTRN DATA (?C_XBP)
EXTRN CODE (?C?ILDIX)
EXTRN CODE (?C?CSTPTR)
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
; * 作者 : Jean J. Labrosse
; * 改编 : 杨屹 gdtyy@ri.gdt.com.cn 巨龙公司系统集成开发部 2002.09.27
; * 改编 : 钟文青,升级到与ucOS-II 2.51的代码,2003.5
; *********************************************************************************************************
; */
;
; #define OS_CPU_GLOBALS
; #include "source\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 # 73
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 # 77
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 # 78
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 # 79
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 # 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
MOV A,#0FH
LCALL ?C?CSTPTR
; *stk++ = (INT16U)task & 0xFF; //任务地址低8位
; SOURCE LINE # 81
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 # 82
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++ = 0x0A; //ACC
; SOURCE LINE # 83
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 # 84
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; //DPH
; SOURCE LINE # 85
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; //DPL
; SOURCE LINE # 86
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; //PSW
; SOURCE LINE # 87
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 # 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
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 # 92
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 # 93
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 # 94
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 # 96
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 # 97
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,#05H
LCALL ?C?CSTPTR
; *stk++ = 0x06; //R6
; SOURCE LINE # 98
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,#06H
LCALL ?C?CSTPTR
; *stk++ = 0x07; //R7
; SOURCE LINE # 99
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,#07H
LCALL ?C?CSTPTR
; //不用保存SP,任务切换时根据用户堆栈长度计算得出。
; *stk++ = (INT16U) (ptos+MaxStkSize) >> 8; //?C_XBP 仿真堆栈指针高8位
; SOURCE LINE # 101
MOV DPTR,#09H
LCALL ?C?XBPOFF
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
ADD A,#064H
CLR A
ADDC 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++ = (INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
; SOURCE LINE # 102
MOV DPTR,#09H
LCALL ?C?XBPOFF
INC DPTR
INC DPTR
MOVX A,@DPTR
ADD A,#064H
MOV R1,A
MOV R7,AR1
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
;
; return ((void *)ptos);
; SOURCE LINE # 104
MOV DPTR,#09H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R3,A
INC DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -