📄 os_cpu_c.lst
字号:
45 * ---------- |
46 * | ... | 仿真堆栈空间
47 *---------- ---------- | 每任务一个
48 *|OSTCBCur| ?C_XBP---->| | | KEIL自动处理
49 *---------- ---------- -
50 * | |空闲间隔|
51 * | ----------------------- ---------- ----------
52 * \---->|OSTCBCur->OSTCBStkPtr| |?C_XBP低| SP---->| |
53 * ----------------------- ---------- ----------
54 * | |?C_XBP高| | |
55 * | ---------- - ----------
56 * | | | | | . |
57 * | ---------- | | . |
58 * | | | | | . |
59 * | ---------- | ----------
60 * | | . |长度 | | +1
61 * | | . | | ----------
62 * | | . | | OSStack---->| | 0
63 * | ---------- | ----------
64 * | | | | OSStkStart---->| 不关心 | -1 低地址
65 * | ---------- - ----------
66 * \------------->| 长度 | 低地址 系统硬件堆栈
67 * ----------
68 * 用户堆栈 长度=SP-OSStkStart
69 *********************************************************************************************************
70 */
71
72 void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, OS_STK *ptos, INT16U opt) reentrant
73 {
74 1 OS_STK *stk;
75 1
76 1 ppdata = ppdata;
77 1 opt = opt; //opt没被用到,保留此语句防止告警产生
78 1 stk = (OS_STK *)ptos; //用户堆栈最低有效地址
79 1 *stk++ = 15; //用户堆栈长度
80 1 *stk++ = (INT16U)task & 0xFF; //任务地址低8位
81 1 *stk++ = (INT16U)task >> 8; //任务地址高8位
82 1 *stk++ = 0x00; //PSW
83 1 *stk++ = 0x0A; //ACC
84 1 *stk++ = 0x0B; //B
85 1 *stk++ = 0x00; //DPL
86 1 *stk++ = 0x00; //DPH
87 1
88 1 //R3、R2、R1用于传递任务参数ppdata,其中R3代表存储器类型,R2为高字节偏移,R1为低字节位移。
89 1 //通过分析KEIL汇编,了解到任务的void *ppdata参数恰好是用R3、R2、R1传递,不是通过虚拟堆栈。
90 1 *stk++ = (INT16U)ppdata & 0xFF; //R1
91 1 *stk++ = (INT16U)ppdata >> 8; //R2
92 1 *stk++ = 0x01; //R3 因为我用的全是XDATA,所以存储器类型固定为1,见C51.PD
-F第178页说明。
93 1
94 1 *stk++ = 0x03; //R3
95 1 *stk++ = 0x04; //R4
96 1 *stk++ = 0x05; //R5
97 1 *stk++ = 0x06; //R6
98 1 *stk++ = 0x07; //R7
99 1 //不用保存SP,任务切换时根据用户堆栈长度计算得出。
C51 COMPILER V7.50 OS_CPU_C 01/12/2005 21:47:41 PAGE 7
100 1 *stk++ = (INT16U) (ptos+TaskStkSize) >> 8; //?C_XBP 仿真堆栈指针高8位
101 1 *stk++ = (INT16U) (ptos+TaskStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
102 1
103 1 return ((void *)ptos);
104 1 }
105
106
107
108
109 //初始化定时器0
110 void InitTimer0(void) reentrant
111 {
112 1 TMOD=TMOD&0xF0;
113 1 TMOD=TMOD|0x01; //模式1(16位定时器),仅受TR0控制
114 1 TH0=0x70; //定义Tick=50次/秒(即0.02秒/次)
115 1 TL0=0x00; //OS_CPU_A.ASM 和 OS_TICKS_PER_SEC
116 1 ET0=1; //允许T0中断
117 1 TR0=1;
118 1 }
119
120 //在OSIntExit()中切换任务,当用方法3关中断时调整XBP
121 INT16U AdjXBP( INT16U i )
122 {
123 1 #if OS_CRITICAL_METHOD == 3
124 1 i++;
125 1 #endif
126 1
127 1 return i;
128 1 }
C51 COMPILER V7.50 OS_CPU_C 01/12/2005 21:47:41 PAGE 8
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _?OSTaskStkInit (BEGIN)
; SOURCE LINE # 72
0000 90FFFD MOV DPTR,#0FFFDH
0003 120000 E LCALL ?C?ADDXBP
0006 EB MOV A,R3
0007 F0 MOVX @DPTR,A
0008 A3 INC DPTR
0009 EA MOV A,R2
000A F0 MOVX @DPTR,A
000B A3 INC DPTR
000C E9 MOV A,R1
000D F0 MOVX @DPTR,A
000E 90FFFD MOV DPTR,#0FFFDH
0011 120000 E LCALL ?C?ADDXBP
; SOURCE LINE # 76
0014 900006 MOV DPTR,#06H
0017 120000 E LCALL ?C?XBPOFF
001A E0 MOVX A,@DPTR
001B FB MOV R3,A
001C A3 INC DPTR
001D E0 MOVX A,@DPTR
001E FA MOV R2,A
001F A3 INC DPTR
0020 E0 MOVX A,@DPTR
0021 F9 MOV R1,A
0022 900006 MOV DPTR,#06H
0025 120000 E LCALL ?C?XBPOFF
0028 EB MOV A,R3
0029 F0 MOVX @DPTR,A
002A A3 INC DPTR
002B EA MOV A,R2
002C F0 MOVX @DPTR,A
002D A3 INC DPTR
002E E9 MOV A,R1
002F F0 MOVX @DPTR,A
; SOURCE LINE # 77
0030 90000C MOV DPTR,#0CH
0033 120000 E LCALL ?C?XBPOFF
0036 E0 MOVX A,@DPTR
0037 FE MOV R6,A
0038 A3 INC DPTR
0039 E0 MOVX A,@DPTR
003A FF MOV R7,A
003B 90000C MOV DPTR,#0CH
003E 120000 E LCALL ?C?XBPOFF
0041 EE MOV A,R6
0042 F0 MOVX @DPTR,A
0043 A3 INC DPTR
0044 EF MOV A,R7
0045 F0 MOVX @DPTR,A
; SOURCE LINE # 78
0046 900009 MOV DPTR,#09H
0049 120000 E LCALL ?C?XBPOFF
004C E0 MOVX A,@DPTR
004D FB MOV R3,A
004E A3 INC DPTR
004F E0 MOVX A,@DPTR
0050 FA MOV R2,A
0051 A3 INC DPTR
C51 COMPILER V7.50 OS_CPU_C 01/12/2005 21:47:41 PAGE 9
0052 E0 MOVX A,@DPTR
0053 F9 MOV R1,A
0054 850083 E MOV DPH,?C_XBP
0057 850082 E MOV DPL,?C_XBP+01H
005A EB MOV A,R3
005B F0 MOVX @DPTR,A
005C A3 INC DPTR
005D EA MOV A,R2
005E F0 MOVX @DPTR,A
005F A3 INC DPTR
0060 E9 MOV A,R1
0061 F0 MOVX @DPTR,A
; SOURCE LINE # 79
0062 850083 E MOV DPH,?C_XBP
0065 850082 E MOV DPL,?C_XBP+01H
0068 E0 MOVX A,@DPTR
0069 FB MOV R3,A
006A A3 INC DPTR
006B E4 CLR A
006C 75F001 MOV B,#01H
006F 120000 E LCALL ?C?ILDIX
0072 A9F0 MOV R1,B
0074 FA MOV R2,A
0075 740F MOV A,#0FH
0077 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 80
007A 900003 MOV DPTR,#03H
007D 120000 E LCALL ?C?XBPOFF
0080 E0 MOVX A,@DPTR
0081 FB MOV R3,A
0082 A3 INC DPTR
0083 E0 MOVX A,@DPTR
0084 FA MOV R2,A
0085 A3 INC DPTR
0086 E0 MOVX A,@DPTR
0087 F9 MOV R1,A
0088 AF01 MOV R7,AR1
008A EF MOV A,R7
008B 54FF ANL A,#0FFH
008D FF MOV R7,A
008E 850083 E MOV DPH,?C_XBP
0091 850082 E MOV DPL,?C_XBP+01H
0094 E0 MOVX A,@DPTR
0095 FB MOV R3,A
0096 A3 INC DPTR
0097 E4 CLR A
0098 75F001 MOV B,#01H
009B 120000 E LCALL ?C?ILDIX
009E A9F0 MOV R1,B
00A0 FA MOV R2,A
00A1 EF MOV A,R7
00A2 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 81
00A5 900003 MOV DPTR,#03H
00A8 120000 E LCALL ?C?XBPOFF
00AB E0 MOVX A,@DPTR
00AC FB MOV R3,A
00AD A3 INC DPTR
00AE E0 MOVX A,@DPTR
00AF FA MOV R2,A
00B0 A3 INC DPTR
00B1 E0 MOVX A,@DPTR
C51 COMPILER V7.50 OS_CPU_C 01/12/2005 21:47:41 PAGE 10
00B2 F9 MOV R1,A
00B3 AE02 MOV R6,AR2
00B5 AF01 MOV R7,AR1
00B7 EE MOV A,R6
00B8 FF MOV R7,A
00B9 7E00 MOV R6,#00H
00BB 850083 E MOV DPH,?C_XBP
00BE 850082 E MOV DPL,?C_XBP+01H
00C1 E0 MOVX A,@DPTR
00C2 FB MOV R3,A
00C3 A3 INC DPTR
00C4 E4 CLR A
00C5 75F001 MOV B,#01H
00C8 120000 E LCALL ?C?ILDIX
00CB A9F0 MOV R1,B
00CD FA MOV R2,A
00CE EF MOV A,R7
00CF 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 82
00D2 850083 E MOV DPH,?C_XBP
00D5 850082 E MOV DPL,?C_XBP+01H
00D8 E0 MOVX A,@DPTR
00D9 FB MOV R3,A
00DA A3 INC DPTR
00DB E4 CLR A
00DC 75F001 MOV B,#01H
00DF 120000 E LCALL ?C?ILDIX
00E2 A9F0 MOV R1,B
00E4 FA MOV R2,A
00E5 E4 CLR A
00E6 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 83
00E9 850083 E MOV DPH,?C_XBP
00EC 850082 E MOV DPL,?C_XBP+01H
00EF E0 MOVX A,@DPTR
00F0 FB MOV R3,A
00F1 A3 INC DPTR
00F2 E4 CLR A
00F3 75F001 MOV B,#01H
00F6 120000 E LCALL ?C?ILDIX
00F9 A9F0 MOV R1,B
00FB FA MOV R2,A
00FC 740A MOV A,#0AH
00FE 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 84
0101 850083 E MOV DPH,?C_XBP
0104 850082 E MOV DPL,?C_XBP+01H
0107 E0 MOVX A,@DPTR
0108 FB MOV R3,A
0109 A3 INC DPTR
010A E4 CLR A
010B 75F001 MOV B,#01H
010E 120000 E LCALL ?C?ILDIX
0111 A9F0 MOV R1,B
0113 FA MOV R2,A
0114 740B MOV A,#0BH
0116 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 85
0119 850083 E MOV DPH,?C_XBP
011C 850082 E MOV DPL,?C_XBP+01H
011F E0 MOVX A,@DPTR
0120 FB MOV R3,A
C51 COMPILER V7.50 OS_CPU_C 01/12/2005 21:47:41 PAGE 11
0121 A3 INC DPTR
0122 E4 CLR A
0123 75F001 MOV B,#01H
0126 120000 E LCALL ?C?ILDIX
0129 A9F0 MOV R1,B
012B FA MOV R2,A
012C E4 CLR A
012D 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 86
0130 850083 E MOV DPH,?C_XBP
0133 850082 E MOV DPL,?C_XBP+01H
0136 E0 MOVX A,@DPTR
0137 FB MOV R3,A
0138 A3 INC DPTR
0139 E4 CLR A
013A 75F001 MOV B,#01H
013D 120000 E LCALL ?C?ILDIX
0140 A9F0 MOV R1,B
0142 FA MOV R2,A
0143 E4 CLR A
0144 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 90
0147 900006 MOV DPTR,#06H
014A 120000 E LCALL ?C?XBPOFF
014D E0 MOVX A,@DPTR
014E FB MOV R3,A
014F A3 INC DPTR
0150 E0 MOVX A,@DPTR
0151 FA MOV R2,A
0152 A3 INC DPTR
0153 E0 MOVX A,@DPTR
0154 F9 MOV R1,A
0155 AF01 MOV R7,AR1
0157 EF MOV A,R7
0158 54FF ANL A,#0FFH
015A FF MOV R7,A
015B 850083 E MOV DPH,?C_XBP
015E 850082 E MOV DPL,?C_XBP+01H
0161 E0 MOVX A,@DPTR
0162 FB MOV R3,A
0163 A3 INC DPTR
0164 E4 CLR A
0165 75F001 MOV B,#01H
0168 120000 E LCALL ?C?ILDIX
016B A9F0 MOV R1,B
016D FA MOV R2,A
016E EF MOV A,R7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -