?? os_cpu_a.lst
字號:
A51 MACRO ASSEMBLER OS_CPU_A 09/30/2006 10:50:44 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN os_cpu_a.OBJ
ASSEMBLER INVOKED BY: d:\Keil\C51\BIN\A51.EXE os_cpu_a.asm SET(LARGE) DEBUG EP
LOC OBJ LINE SOURCE
1 $nomod51
00AF 2 EA BIT 0A8H.7
0081 3 SP DATA 081H
00F0 4 B DATA 0F0H
00E0 5 ACC DATA 0E0H
0083 6 DPH DATA 083H
0082 7 DPL DATA 082H
00D0 8 PSW DATA 0D0H
008C 9 TR0 BIT 088H.4
008C 10 TH0 DATA 08CH
008A 11 TL0 DATA 08AH
12
13 NAME OS_CPU_A ;模塊名
14
15 ;定義重定位段
16 ?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
17 ?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
18 ?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
19 ?PR?OSTickISR?OS_CPU_A SEGMENT CODE
20
21
22
23 ;聲明引用全局變量和外部子程序
24 EXTRN IDATA (OSTCBCur)
25 EXTRN IDATA (OSTCBHighRdy)
26 EXTRN IDATA (OSRunning)
27 EXTRN IDATA (OSPrioCur)
28 EXTRN IDATA (OSPrioHighRdy)
29
30 ;EXTRN CODE (_?OSTaskSwHook)
31 ;EXTRN CODE (_?serial)
32 EXTRN CODE (_?OSIntEnter)
33 EXTRN CODE (_?OSIntExit)
34 EXTRN CODE (_?OSTimeTick)
35
36 ;對外聲明4個不可重入函數(shù)
37 PUBLIC OSStartHighRdy
38 PUBLIC OSCtxSw
39 PUBLIC OSIntCtxSw
40 PUBLIC OSTickISR
41
42 ;PUBLIC SerialISR
43
44 ;分配堆棧空間。只關(guān)心大小,堆棧起點由keil決定,通過標號可以獲得keil分配的SP起點。
45 ?STACK SEGMENT IDATA
---- 46 RSEG ?STACK
0000 47 OSStack:
0000 48 DS 40H
FFFF 49 OSStkStart IDATA OSStack-1
50
51 ;定義壓棧出棧宏
52 PUSHALL MACRO
53 PUSH PSW
54 PUSH ACC
55 PUSH B
56 PUSH DPL
57 PUSH DPH
58 MOV A,R0 ;R0-R7入棧
A51 MACRO ASSEMBLER OS_CPU_A 09/30/2006 10:50:44 PAGE 2
59 PUSH ACC
60 MOV A,R1
61 PUSH ACC
62 MOV A,R2
63 PUSH ACC
64 MOV A,R3
65 PUSH ACC
66 MOV A,R4
67 PUSH ACC
68 MOV A,R5
69 PUSH ACC
70 MOV A,R6
71 PUSH ACC
72 MOV A,R7
73 PUSH ACC
74 ;PUSH SP ;不必保存SP,任務(wù)切換時由相應(yīng)程序調(diào)整
75 ENDM
76
77 POPALL MACRO
78 ;POP ACC ;不必保存SP,任務(wù)切換時由相應(yīng)程序調(diào)整
79 POP ACC ;R0-R7出棧
80 MOV R7,A
81 POP ACC
82 MOV R6,A
83 POP ACC
84 MOV R5,A
85 POP ACC
86 MOV R4,A
87 POP ACC
88 MOV R3,A
89 POP ACC
90 MOV R2,A
91 POP ACC
92 MOV R1,A
93 POP ACC
94 MOV R0,A
95 POP DPH
96 POP DPL
97 POP B
98 POP ACC
99 POP PSW
100 ENDM
101
102 ;子程序
103 ;-------------------------------------------------------------------------
---- 104 RSEG ?PR?OSStartHighRdy?OS_CPU_A
0000 105 OSStartHighRdy:
106 USING 0 ;上電后51自動關(guān)中斷,此處不必用CLR EA指令,因為到此處還未開中斷,本程序退出后,開中
斷。
107 ;LCALL _?OSTaskSwHook
108
0000 109 OSCtxSw_in:
110
111 ;OSTCBCur ===> DPTR 獲得當前TCB指針,詳見C51.PDF第178頁
0000 7800 F 112 MOV R0,#LOW (OSTCBCur) ;獲得OSTCBCur指針低地址,指針占3字節(jié)。+0類型+1高8位數(shù)據(jù)+2低8位數(shù)據(jù)
0002 08 113 INC R0
0003 8683 114 MOV DPH,@R0 ;全局變量OSTCBCur在IDATA中
0005 08 115 INC R0
0006 8682 116 MOV DPL,@R0
117
118 ;OSTCBCur->OSTCBStkPtr ===> DPTR 獲得用戶堆棧指針
0008 A3 119 INC DPTR ;指針占3字節(jié)。+0類型+1高8位數(shù)據(jù)+2低8位數(shù)據(jù)
0009 E0 120 MOVX A,@DPTR ;.OSTCBStkPtr是void指針
000A F8 121 MOV R0,A
000B A3 122 INC DPTR
000C E0 123 MOVX A,@DPTR
A51 MACRO ASSEMBLER OS_CPU_A 09/30/2006 10:50:44 PAGE 3
000D F9 124 MOV R1,A
000E 8883 125 MOV DPH,R0
0010 8982 126 MOV DPL,R1
127
128 ;*UserStkPtr ===> R5 用戶堆棧起始地址內(nèi)容(即用戶堆棧長度放在此處) 詳見文檔說明 指針用法詳見
C51.PDF第178頁
0012 E0 129 MOVX A,@DPTR ;用戶堆棧中是unsigned char類型數(shù)據(jù)
0013 FD 130 MOV R5,A ;R5=用戶堆棧長度
131
132 ;恢復(fù)現(xiàn)場堆棧內(nèi)容
0014 7800 F 133 MOV R0,#OSStkStart
134
0016 135 restore_stack:
136
0016 A3 137 INC DPTR
0017 08 138 INC R0
0018 E0 139 MOVX A,@DPTR
0019 F6 140 MOV @R0,A
001A DDFA 141 DJNZ R5,restore_stack
142
143 ;恢復(fù)堆棧指針SP
001C 8881 144 MOV SP,R0
145
146 ;OSRunning=TRUE
001E 7800 F 147 MOV R0,#LOW (OSRunning)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -