📄 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:
75 .global update_crc
77 update_crc:
1:physical.c **** /*
2:physical.c **** ****************************************************************************
3:physical.c **** *
4:physical.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
5:physical.c **** *
6:physical.c **** *文件名: Physical.c
7:physical.c **** *程序员:
8:physical.c **** *主要内容:物理层调度控制
9:physical.c **** *完成日期:2005.5.25
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 **** #include "led.h"
19:physical.c ****
20:physical.c **** extern uint8_t OS_BCAST_ADDR;
21:physical.c **** // 物理层状态值
22:physical.c **** enum {
23:physical.c **** IDLE,
24:physical.c **** RECEIVING,
25:physical.c **** TRANSMITTING,
26:physical.c **** TRANSMITTING_LAST,
27:physical.c **** TRANSMITTING_DONE
28:physical.c **** };
29:physical.c ****
30:physical.c **** enum {FREE, BUSY}; // 缓存状态
31:physical.c ****
32:physical.c **** static char state; // 物理层状态变量
33:physical.c **** uint8_t pktLength; // 包括包头的包长度
34:physical.c **** OSMACMsg buffer1; // 用于接收和处理的缓存空间
35:physical.c **** OSMACMsg buffer2;
36:physical.c **** char recvBufState; // 接收缓存状态
37:physical.c **** char procBufState; // 处理缓存状态
38:physical.c **** char* procBufPtr; // 处理缓存地址,用于接收和处理缓存地址交换
39:physical.c **** char* sendPtr; // 指向发送缓存,由上层分配
40:physical.c **** char* recvPtr; // 指向接收缓存
41:physical.c **** char* procPtr; // 指向处理缓存
42:physical.c **** static uint8_t txCount; // 发送字节计数变量
43:physical.c **** uint8_t recvCount; // 接收字节计数变量
44:physical.c **** int16_t crcRx; // 接收数据包CRC计算结果
45:physical.c **** int16_t crcTx; // 发送数据包CRC计算结果
46:physical.c ****
47:physical.c **** /*************************************************************************
48:physical.c **** *功能描述:16位CRC计算
49:physical.c **** *参数说明:待计算的八位数据,上一次计算的CRC结果
50:physical.c **** *返回值: CRC计算一次后的结果
51:physical.c **** **************************************************************************/
52:physical.c **** int16_t update_crc(char data, int16_t crc)
53:physical.c **** {
79 .LM1:
80 /* prologue: frame size=0 */
81 /* prologue end (size=0) */
54:physical.c **** char i;
55:physical.c **** int16_t tmp;
56:physical.c **** tmp = (int16_t)(data);
83 .LM2:
84 0000 9927 clr r25
57:physical.c **** crc = crc ^ (tmp << 8);
86 .LM3:
87 0002 982F mov r25,r24
88 0004 8827 clr r24
89 0006 6827 eor r22,r24
90 0008 7927 eor r23,r25
58:physical.c **** for (i = 0; i < 8; i++) {
92 .LM4:
93 000a 20E0 ldi r18,lo8(0)
94 000c 41E2 ldi r20,lo8(4129)
95 000e 50E1 ldi r21,hi8(4129)
96 .L7:
97 0010 CB01 movw r24,r22
98 0012 880F lsl r24
99 0014 991F rol r25
100 0016 2F5F subi r18,lo8(-(1))
59:physical.c **** if (crc & 0x8000)
102 .LM5:
103 0018 77FF sbrs r23,7
104 001a 04C0 rjmp .L5
60:physical.c **** crc = (crc << 1) ^ 0x1021; // << is done before ^
106 .LM6:
107 001c BC01 movw r22,r24
108 001e 6427 eor r22,r20
109 0020 7527 eor r23,r21
110 0022 01C0 rjmp .L4
111 .L5:
61:physical.c **** else
62:physical.c **** crc = crc << 1;
113 .LM7:
114 0024 BC01 movw r22,r24
115 .L4:
117 .LM8:
118 0026 2830 cpi r18,lo8(8)
119 0028 98F3 brlo .L7
63:physical.c **** }
64:physical.c **** return crc;
65:physical.c **** }
121 .LM9:
122 002a CB01 movw r24,r22
123 /* epilogue: frame size=0 */
124 002c 0895 ret
125 /* epilogue end (size=1) */
126 /* function update_crc size 23 (22) */
131 .global packet_received
133 packet_received:
66:physical.c ****
67:physical.c **** /*************************************************************************
68:physical.c **** *功能描述:数据包接收完成任务函数,通知MAC接收处理缓存中的包,并清空处理缓存
69:physical.c **** * 和接收缓存
70:physical.c **** *参数说明:无
71:physical.c **** *返回值: 无
72:physical.c **** **************************************************************************/
73:physical.c **** void packet_received(void)
74:physical.c **** {
135 .LM10:
136 /* prologue: frame size=0 */
137 /* prologue end (size=0) */
75:physical.c **** void* tmp;
76:physical.c **** char error, intEnabled;
77:physical.c **** uint8_t len;
78:physical.c **** len = (uint8_t)procPtr[0];
139 .LM11:
140 002e E091 0000 lds r30,procPtr
141 0032 F091 0000 lds r31,(procPtr)+1
142 0036 8081 ld r24,Z
79:physical.c **** if (crcRx != *(int16_t*)(procPtr + len - 2)) {
144 .LM12:
145 0038 E80F add r30,r24
146 003a F11D adc r31,__zero_reg__
147 003c 3297 sbiw r30,2
148 003e 2091 0000 lds r18,crcRx
149 0042 3091 0000 lds r19,(crcRx)+1
150 0046 8081 ld r24,Z
151 0048 9181 ldd r25,Z+1
152 004a 2817 cp r18,r24
153 004c 3907 cpc r19,r25
154 004e 11F0 breq .L11
80:physical.c **** error = 1;
156 .LM13:
157 0050 61E0 ldi r22,lo8(1)
158 0052 01C0 rjmp .L12
159 .L11:
81:physical.c **** } else {
82:physical.c **** error = 0;
161 .LM14:
162 0054 60E0 ldi r22,lo8(0)
163 .L12:
83:physical.c **** }
84:physical.c **** tmp = MACPhysicalRxPktDone(procPtr, error); // 通知MAC对接收到的数据包进行处理
165 .LM15:
166 0056 8091 0000 lds r24,procPtr
167 005a 9091 0000 lds r25,(procPtr)+1
168 005e 0E94 0000 call MACPhysicalRxPktDone
169 0062 9C01 movw r18,r24
85:physical.c **** if (tmp) {
171 .LM16:
172 0064 892B or r24,r25
173 0066 09F4 brne .+2
174 0068 43C0 rjmp .L10
86:physical.c **** intEnabled = (* (volatile unsigned char *) (0x3F + 0x20)) & 0x80;
176 .LM17:
177 006a 4FB7 in r20,95-0x20
178 006c 4078 andi r20,lo8(-128)
87:physical.c **** * (volatile unsigned char *) (0x3F + 0x20) &= ~0x80; // 关中断
180 .LM18:
181 006e 8FB7 in r24,95-0x20
182 0070 8F77 andi r24,lo8(127)
183 0072 8FBF out 95-0x20,r24
88:physical.c **** if (recvBufState == BUSY) { // 接收缓冲中有数据待处理
185 .LM19:
186 0074 8091 0000 lds r24,recvBufState
187 0078 8130 cpi r24,lo8(1)
188 007a 79F4 brne .L14
89:physical.c **** procPtr = recvPtr; // 处理缓冲获得待处理数据地址
190 .LM20:
191 007c 8091 0000 lds r24,recvPtr
192 0080 9091 0000 lds r25,(recvPtr)+1
193 0084 9093 0000 sts (procPtr)+1,r25
194 0088 8093 0000 sts procPtr,r24
90:physical.c **** recvPtr = (char*)tmp; // 接收缓冲置空闲,可用于接收
196 .LM21:
197 008c 3093 0000 sts (recvPtr)+1,r19
198 0090 2093 0000 sts recvPtr,r18
91:physical.c **** recvBufState = FREE;
200 .LM22:
201 0094 1092 0000 sts recvBufState,__zero_reg__
202 0098 0AC0 rjmp .L15
203 .L14:
92:physical.c **** } else {
93:physical.c **** procPtr = 0; // 接收缓冲中无数据
205 .LM23:
206 009a 1092 0000 sts (procPtr)+1,__zero_reg__
207 009e 1092 0000 sts procPtr,__zero_reg__
94:physical.c **** procBufPtr = (char *)tmp;
209 .LM24:
210 00a2 3093 0000 sts (procBufPtr)+1,r19
211 00a6 2093 0000 sts procBufPtr,r18
95:physical.c **** procBufState = FREE; // 处理缓冲可用
213 .LM25:
214 00aa 1092 0000 sts procBufState,__zero_reg__
215 .L15:
96:physical.c **** }
97:physical.c **** if (intEnabled)
217 .LM26:
218 00ae 4423 tst r20
219 00b0 19F0 breq .L16
98:physical.c **** * (volatile unsigned char *) (0x3F + 0x20) |= 0x80; // 开中断
221 .LM27:
222 00b2 8FB7 in r24,95-0x20
223 00b4 8068 ori r24,lo8(-128)
224 00b6 8FBF out 95-0x20,r24
225 .L16:
99:physical.c **** if (procPtr) { // 处理从接收缓冲得到的数据
227 .LM28:
228 00b8 8091 0000 lds r24,procPtr
229 00bc 9091 0000 lds r25,(procPtr)+1
230 00c0 892B or r24,r25
231 00c2 B1F0 breq .L10
100:physical.c **** if ( !OSPostTask(packet_received) ) { // 任务队列满,丢弃数据包
233 .LM29:
234 00c4 80E0 ldi r24,lo8(pm(packet_received))
235 00c6 90E0 ldi r25,hi8(pm(packet_received))
236 00c8 0E94 0000 call OSPostTask
237 00cc 282F mov r18,r24
238 00ce 8823 tst r24
239 00d0 79F4 brne .L10
101:physical.c **** procBufPtr = procPtr;
241 .LM30:
242 00d2 8091 0000 lds r24,procPtr
243 00d6 9091 0000 lds r25,(procPtr)+1
244 00da 9093 0000 sts (procBufPtr)+1,r25
245 00de 8093 0000 sts procBufPtr,r24
102:physical.c **** procBufState = FREE;
247 .LM31:
248 00e2 2093 0000 sts procBufState,r18
103:physical.c **** MACPhysicalRxPktDone((void *) 0, 1); // 通知MAC
250 .LM32:
251 00e6 61E0 ldi r22,lo8(1)
252 00e8 80E0 ldi r24,lo8(0)
253 00ea 90E0 ldi r25,hi8(0)
254 00ec 0E94 0000 call MACPhysicalRxPktDone
255 .L10:
256 00f0 0895 ret
257 /* epilogue: frame size=0 */
258 00f2 0895 ret
259 /* epilogue end (size=1) */
260 /* function packet_received size 99 (98) */
267 .global packet_sent
269 packet_sent:
104:physical.c **** }
105:physical.c **** }
106:physical.c **** }
107:physical.c **** }
108:physical.c ****
109:physical.c **** /*************************************************************************
110:physical.c **** *功能描述:数据包发送完成任务函数,通知MAC数据包已经发送
111:physical.c **** *参数说明:无
112:physical.c **** *返回值: 无
113:physical.c **** **************************************************************************/
114:physical.c **** void packet_sent(void)
115:physical.c **** {
271 .LM33:
272 /* prologue: frame size=0 */
273 /* prologue end (size=0) */
116:physical.c **** MACPhysicalTxPktDone(sendPtr);
275 .LM34:
276 00f4 8091 0000 lds r24,sendPtr
277 00f8 9091 0000 lds r25,(sendPtr)+1
278 00fc 0E94 0000 call MACPhysicalTxPktDone
279 /* epilogue: frame size=0 */
280 0100 0895 ret
281 /* epilogue end (size=1) */
282 /* function packet_sent size 7 (6) */
285 .global PhysicalInit
287 PhysicalInit:
117:physical.c **** }
118:physical.c ****
119:physical.c **** /*************************************************************************
120:physical.c **** *功能描述:物理层初始化
121:physical.c **** *参数说明:无
122:physical.c **** *返回值: 无
123:physical.c **** **************************************************************************/
124:physical.c **** result_t PhysicalInit(void)
125:physical.c **** {
289 .LM35:
290 /* prologue: frame size=0 */
291 /* prologue end (size=0) */
126:physical.c **** state = IDLE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -