?? physical.lst
字號:
1 .file "physical.c"
2 .arch atmega128
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
87 .global update_crc
89 update_crc:
1:physical.c **** /*
2:physical.c **** ****************************************************************************
3:physical.c **** * 寧波中科集成電路設(shè)計中心 版權(quán)所有 Copyright 2005
4:physical.c **** * http:\\www.nbicc.com
5:physical.c **** *文件名: physical.h
6:physical.c **** *程序員: 夏鵬 xpsonny@nbicc.com
7:physical.c **** *主要內(nèi)容 物理層調(diào)度控制
8:physical.c ****
9:physical.c **** *如有問題或BUG,請登錄www.wsn.net.cn 提問或用郵件和作者聯(lián)系
10:physical.c **** ****************************************************************************
11:physical.c **** */
12:physical.c ****
13:physical.c **** #include "physical.h"
14:physical.c **** #include "message.h"
15:physical.c **** #include "radiocontrol.h"
16:physical.c **** #include "os.h"
17:physical.c **** #include "mac.h"
18:physical.c ****
19:physical.c **** //static result_t PhysicalIdle(void); // 進入空閑
20:physical.c **** //static result_t PhysicalSleep(void); // 睡眠
21:physical.c ****
22:physical.c **** //extern uint8_t OS_BCAST_ADDR;
23:physical.c **** // 物理層狀態(tài)值
24:physical.c **** enum {
25:physical.c **** IDLE,
26:physical.c **** RECEIVING,
27:physical.c **** TRANSMITTING,
28:physical.c **** TRANSMITTING_LAST,
29:physical.c **** TRANSMITTING_DONE
30:physical.c **** };
31:physical.c ****
32:physical.c **** enum {FREE, BUSY}; // 緩存狀態(tài)
33:physical.c ****
34:physical.c **** static char state; // 物理層狀態(tài)變量
35:physical.c **** static uint8_t pktLength; // 包括包頭的包長度
36:physical.c **** static OSMACMsg buffer1; // 用于接收和處理的緩存空間
37:physical.c **** static OSMACMsg buffer2;
38:physical.c **** static char recvBufState; // 接收緩存狀態(tài)
39:physical.c **** static char procBufState; // 處理緩存狀態(tài)
40:physical.c **** static char* procBufPtr; // 處理緩存地址,用于接收和處理緩存地址交換
41:physical.c **** static char* sendPtr; // 指向發(fā)送緩存,由上層分配
42:physical.c **** static char* recvPtr; // 指向接收緩存
43:physical.c **** static char* procPtr; // 指向處理緩存
44:physical.c **** static uint8_t txCount; // 發(fā)送字節(jié)計數(shù)變量
45:physical.c **** static uint8_t recvCount; // 接收字節(jié)計數(shù)變量
46:physical.c **** static int16_t crcRx; // 接收數(shù)據(jù)包CRC計算結(jié)果
47:physical.c **** static int16_t crcTx; // 發(fā)送數(shù)據(jù)包CRC計算結(jié)果
48:physical.c ****
49:physical.c **** /*************************************************************************
50:physical.c **** *功能描述:16位CRC計算
51:physical.c **** *參數(shù)說明:待計算的八位數(shù)據(jù),上一次計算的CRC結(jié)果
52:physical.c **** *返回值: CRC計算一次后的結(jié)果
53:physical.c **** **************************************************************************/
54:physical.c **** int16_t update_crc(char data, int16_t crc)
55:physical.c **** {
91 .LM1:
92 /* prologue: frame size=0 */
93 /* prologue end (size=0) */
56:physical.c **** char i;
57:physical.c **** int16_t tmp;
58:physical.c **** tmp = (int16_t)(data);
95 .LM2:
96 0000 9927 clr r25
59:physical.c **** crc = crc ^ (tmp << 8);
98 .LM3:
99 0002 982F mov r25,r24
100 0004 8827 clr r24
101 0006 6827 eor r22,r24
102 0008 7927 eor r23,r25
60:physical.c **** for (i = 0; i < 8; i++) {
104 .LM4:
105 000a 20E0 ldi r18,lo8(0)
106 000c 41E2 ldi r20,lo8(4129)
107 000e 50E1 ldi r21,hi8(4129)
108 .L7:
109 0010 CB01 movw r24,r22
110 0012 880F lsl r24
111 0014 991F rol r25
112 0016 2F5F subi r18,lo8(-(1))
61:physical.c **** if (crc & 0x8000)
114 .LM5:
115 0018 77FF sbrs r23,7
116 001a 04C0 rjmp .L5
62:physical.c **** crc = (crc << 1) ^ 0x1021; // << is done before ^
118 .LM6:
119 001c BC01 movw r22,r24
120 001e 6427 eor r22,r20
121 0020 7527 eor r23,r21
122 0022 01C0 rjmp .L4
123 .L5:
63:physical.c **** else
64:physical.c **** crc = crc << 1;
125 .LM7:
126 0024 BC01 movw r22,r24
127 .L4:
129 .LM8:
130 0026 2830 cpi r18,lo8(8)
131 0028 98F3 brlo .L7
65:physical.c **** }
66:physical.c **** return crc;
67:physical.c **** }
133 .LM9:
134 002a CB01 movw r24,r22
135 /* epilogue: frame size=0 */
136 002c 0895 ret
137 /* epilogue end (size=1) */
138 /* function update_crc size 23 (22) */
143 .global packet_received
145 packet_received:
68:physical.c ****
69:physical.c **** /*************************************************************************
70:physical.c **** *功能描述:數(shù)據(jù)包接收完成任務(wù)函數(shù),通知MAC接收處理緩存中的包,并清空處理緩存
71:physical.c **** * 和接收緩存
72:physical.c **** *參數(shù)說明:無
73:physical.c **** *返回值: 無
74:physical.c **** **************************************************************************/
75:physical.c **** void packet_received(void)
76:physical.c **** {
147 .LM10:
148 /* prologue: frame size=0 */
149 002e CF93 push r28
150 /* prologue end (size=1) */
77:physical.c **** //void* tmp;
78:physical.c **** char error, intEnabled;
79:physical.c **** uint8_t len;
80:physical.c **** len = (uint8_t)procPtr[0];
152 .LM11:
153 0030 E091 0000 lds r30,procPtr
154 0034 F091 0000 lds r31,(procPtr)+1
155 0038 8081 ld r24,Z
81:physical.c **** if (crcRx != *(int16_t*)(procPtr + len - 2)) {
157 .LM12:
158 003a E80F add r30,r24
159 003c F11D adc r31,__zero_reg__
160 003e 3297 sbiw r30,2
161 0040 2091 0000 lds r18,crcRx
162 0044 3091 0000 lds r19,(crcRx)+1
163 0048 8081 ld r24,Z
164 004a 9181 ldd r25,Z+1
165 004c 2817 cp r18,r24
166 004e 3907 cpc r19,r25
167 0050 11F0 breq .L11
82:physical.c **** error = 1;
169 .LM13:
170 0052 61E0 ldi r22,lo8(1)
171 0054 01C0 rjmp .L12
172 .L11:
83:physical.c **** } else {
84:physical.c **** error = 0;
174 .LM14:
175 0056 60E0 ldi r22,lo8(0)
176 .L12:
85:physical.c **** }
86:physical.c **** // 通知MAC對接收到的數(shù)據(jù)包進行處理
87:physical.c **** MACPhysicalRxPktDone(procPtr, error);
178 .LM15:
179 0058 8091 0000 lds r24,procPtr
180 005c 9091 0000 lds r25,(procPtr)+1
181 0060 0E94 0000 call MACPhysicalRxPktDone
88:physical.c **** intEnabled = (* (volatile unsigned char *) (0x3F + 0x20)) & 0x80;
183 .LM16:
184 0064 CFB7 in r28,95-0x20
185 0066 C078 andi r28,lo8(-128)
89:physical.c **** * (volatile unsigned char *) (0x3F + 0x20) &= ~0x80; // 關(guān)中斷
187 .LM17:
188 0068 8FB7 in r24,95-0x20
189 006a 8F77 andi r24,lo8(127)
190 006c 8FBF out 95-0x20,r24
90:physical.c **** if (recvBufState == BUSY) { // 接收緩沖中有數(shù)據(jù)待處理
192 .LM18:
193 006e 8091 0000 lds r24,recvBufState
194 0072 8130 cpi r24,lo8(1)
195 0074 C9F4 brne .L13
91:physical.c **** procPtr = recvPtr; // 處理緩沖獲得待處理數(shù)據(jù)地址
197 .LM19:
198 0076 2091 0000 lds r18,recvPtr
199 007a 3091 0000 lds r19,(recvPtr)+1
200 007e 3093 0000 sts (procPtr)+1,r19
201 0082 2093 0000 sts procPtr,r18
92:physical.c **** recvPtr = procBufPtr;
203 .LM20:
204 0086 8091 0000 lds r24,procBufPtr
205 008a 9091 0000 lds r25,(procBufPtr)+1
206 008e 9093 0000 sts (recvPtr)+1,r25
207 0092 8093 0000 sts recvPtr,r24
93:physical.c **** procBufPtr = procPtr;
209 .LM21:
210 0096 3093 0000 sts (procBufPtr)+1,r19
211 009a 2093 0000 sts procBufPtr,r18
94:physical.c **** recvBufState = FREE;
213 .LM22:
214 009e 1092 0000 sts recvBufState,__zero_reg__
95:physical.c **** packet_received();
216 .LM23:
217 00a2 0E94 0000 call packet_received
218 00a6 02C0 rjmp .L15
219 .L13:
96:physical.c **** } else {
97:physical.c **** procBufState = FREE; // 處理緩沖可用
221 .LM24:
222 00a8 1092 0000 sts procBufState,__zero_reg__
223 .L15:
98:physical.c **** }
99:physical.c **** if (intEnabled)
225 .LM25:
226 00ac CC23 tst r28
227 00ae 19F0 breq .L10
100:physical.c **** * (volatile unsigned char *) (0x3F + 0x20) |= 0x80; // 開中斷
229 .LM26:
230 00b0 8FB7 in r24,95-0x20
231 00b2 8068 ori r24,lo8(-128)
232 00b4 8FBF out 95-0x20,r24
233 .L10:
234 /* epilogue: frame size=0 */
235 00b6 CF91 pop r28
236 00b8 0895 ret
237 /* epilogue end (size=2) */
238 /* function packet_received size 70 (67) */
244 .global packet_sent
246 packet_sent:
101:physical.c ****
102:physical.c **** }
103:physical.c ****
104:physical.c **** /*************************************************************************
105:physical.c **** *功能描述:數(shù)據(jù)包發(fā)送完成任務(wù)函數(shù),通知MAC數(shù)據(jù)包已經(jīng)發(fā)送
106:physical.c **** *參數(shù)說明:無
107:physical.c **** *返回值: 無
108:physical.c **** **************************************************************************/
109:physical.c **** void packet_sent(void)
110:physical.c **** {
248 .LM27:
249 /* prologue: frame size=0 */
250 /* prologue end (size=0) */
111:physical.c **** MACPhysicalTxPktDone(sendPtr);
252 .LM28:
253 00ba 8091 0000 lds r24,sendPtr
254 00be 9091 0000 lds r25,(sendPtr)+1
255 00c2 0E94 0000 call MACPhysicalTxPktDone
256 /* epilogue: frame size=0 */
257 00c6 0895 ret
258 /* epilogue end (size=1) */
259 /* function packet_sent size 7 (6) */
262 .global PhysicalInit
264 PhysicalInit:
112:physical.c **** }
113:physical.c ****
114:physical.c **** /*************************************************************************
115:physical.c **** *功能描述:物理層初始化
116:physical.c **** *參數(shù)說明:無
117:physical.c **** *返回值: 無
118:physical.c **** **************************************************************************/
119:physical.c **** result_t PhysicalInit(void)
120:physical.c **** {
266 .LM29:
267 /* prologue: frame size=0 */
268 /* prologue end (size=0) */
121:physical.c **** state = IDLE;
270 .LM30:
271 00c8 1092 0000 sts state,__zero_reg__
122:physical.c **** recvPtr = (char*)&buffer1;
273 .LM31:
274 00cc 80E0 ldi r24,lo8(buffer1)
275 00ce 90E0 ldi r25,hi8(buffer1)
276 00d0 9093 0000 sts (recvPtr)+1,r25
277 00d4 8093 0000 sts recvPtr,r24
123:physical.c **** procBufPtr = (char*)&buffer2;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -