📄 mac.lst
字号:
280 00b6 8183 std Z+1,r24
179:mac.c **** dataPkt->toAddr = OS_BCAST_ADDR;
282 .LM36:
283 00b8 E091 0000 lds r30,dataPkt
284 00bc F091 0000 lds r31,(dataPkt)+1
285 00c0 8091 0000 lds r24,OS_BCAST_ADDR
286 00c4 8283 std Z+2,r24
180:mac.c **** dataPkt->fromAddr = OS_LOCAL_ADDRESS;
288 .LM37:
289 00c6 E091 0000 lds r30,dataPkt
290 00ca F091 0000 lds r31,(dataPkt)+1
291 00ce 8091 0000 lds r24,OS_LOCAL_ADDRESS
292 00d2 8383 std Z+3,r24
181:mac.c **** dataPkt->group = 0x01;
294 .LM38:
295 00d4 E091 0000 lds r30,dataPkt
296 00d8 F091 0000 lds r31,(dataPkt)+1
297 00dc 81E0 ldi r24,lo8(1)
298 00de 8483 std Z+4,r24
182:mac.c ****
183:mac.c **** tryToSend();
300 .LM39:
301 00e0 0E94 0000 call tryToSend
184:mac.c ****
185:mac.c **** return SUCCESS;
303 .LM40:
304 00e4 81E0 ldi r24,lo8(1)
305 00e6 90E0 ldi r25,hi8(1)
186:mac.c **** }
307 .LM41:
308 00e8 0895 ret
309 /* epilogue: frame size=0 */
310 00ea 0895 ret
311 /* epilogue end (size=1) */
312 /* function MACBroadcastMsg size 69 (68) */
319 .global MACUnicastMsg
321 MACUnicastMsg:
187:mac.c ****
188:mac.c **** /*************************************************************************
189:mac.c **** *功能描述:发送单播数据包的接口函数
190:mac.c **** *参数说明:包地址,包长度(包括包头),目的地址
191:mac.c **** *返回值:
192:mac.c **** **************************************************************************/
193:mac.c **** result_t MACUnicastMsg(void* data, uint8_t length, uint8_t toAddr)
194:mac.c **** {
323 .LM42:
324 /* prologue: frame size=0 */
325 /* prologue end (size=0) */
326 00ec FC01 movw r30,r24
195:mac.c **** char intEnabled;
196:mac.c ****
197:mac.c **** // 错误的发送方式
198:mac.c **** if (data == 0 || length == 0 || length > MAX_PKT_LEN - MAC_HEADER_LEN) {
328 .LM43:
329 00ee 892B or r24,r25
330 00f0 C9F0 breq .L21
332 .LM44:
333 00f2 6623 tst r22
334 00f4 B9F0 breq .L21
335 00f6 6633 cpi r22,lo8(54)
336 00f8 A8F4 brsh .L21
199:mac.c **** return FAIL;
200:mac.c **** }
201:mac.c ****
202:mac.c **** // 设置发送请求标识
203:mac.c **** intEnabled = inp(SREG) & 0x80;
338 .LM45:
339 00fa 9FB7 in r25,95-0x20
340 00fc 9078 andi r25,lo8(-128)
204:mac.c **** cli();
342 .LM46:
343 /* #APP */
344 00fe F894 cli
205:mac.c ****
206:mac.c **** if ((txRequest == 0)&&(AckWaitTime == 0)) {
346 .LM47:
347 /* #NOAPP */
348 0100 8091 0000 lds r24,txRequest
349 0104 8823 tst r24
350 0106 59F4 brne .L18
351 0108 8091 0000 lds r24,AckWaitTime
352 010c 8823 tst r24
353 010e 39F4 brne .L18
207:mac.c **** txRequest = 1;
355 .LM48:
356 0110 81E0 ldi r24,lo8(1)
357 0112 8093 0000 sts txRequest,r24
208:mac.c **** if (intEnabled) sei();
359 .LM49:
360 0116 9923 tst r25
361 0118 41F0 breq .L20
362 /* #APP */
363 011a 7894 sei
364 /* #NOAPP */
365 011c 06C0 rjmp .L20
366 .L18:
209:mac.c **** } else {
210:mac.c **** if (intEnabled) sei();
368 .LM50:
369 011e 9923 tst r25
370 0120 09F0 breq .L21
371 /* #APP */
372 0122 7894 sei
373 /* #NOAPP */
374 .L21:
211:mac.c **** return FAIL;
376 .LM51:
377 0124 80E0 ldi r24,lo8(0)
378 0126 90E0 ldi r25,hi8(0)
379 0128 0895 ret
380 .L20:
212:mac.c **** }
213:mac.c ****
214:mac.c **** dataPkt = (OSMACMsgPtr)data;
382 .LM52:
383 012a F093 0000 sts (dataPkt)+1,r31
384 012e E093 0000 sts dataPkt,r30
215:mac.c **** txPktLen = length + MAC_HEADER_LEN;
386 .LM53:
387 0132 695F subi r22,lo8(-(7))
388 0134 6093 0000 sts txPktLen,r22
216:mac.c **** // 数据包包头设置
217:mac.c **** dataPkt->type = DATA_PKT;
390 .LM54:
391 0138 82E0 ldi r24,lo8(2)
392 013a 8183 std Z+1,r24
218:mac.c **** dataPkt->toAddr = toAddr;
394 .LM55:
395 013c E091 0000 lds r30,dataPkt
396 0140 F091 0000 lds r31,(dataPkt)+1
397 0144 4283 std Z+2,r20
219:mac.c **** dataPkt->fromAddr = OS_LOCAL_ADDRESS;
399 .LM56:
400 0146 E091 0000 lds r30,dataPkt
401 014a F091 0000 lds r31,(dataPkt)+1
402 014e 8091 0000 lds r24,OS_LOCAL_ADDRESS
403 0152 8383 std Z+3,r24
220:mac.c **** dataPkt->group = 0x01;
405 .LM57:
406 0154 E091 0000 lds r30,dataPkt
407 0158 F091 0000 lds r31,(dataPkt)+1
408 015c 81E0 ldi r24,lo8(1)
409 015e 8483 std Z+4,r24
221:mac.c ****
222:mac.c **** tryToSend();
411 .LM58:
412 0160 0E94 0000 call tryToSend
223:mac.c ****
224:mac.c ****
225:mac.c **** return SUCCESS;
414 .LM59:
415 0164 81E0 ldi r24,lo8(1)
416 0166 90E0 ldi r25,hi8(1)
226:mac.c **** }
418 .LM60:
419 0168 0895 ret
420 /* epilogue: frame size=0 */
421 016a 0895 ret
422 /* epilogue end (size=1) */
423 /* function MACUnicastMsg size 67 (66) */
428 MACTxReset:
227:mac.c ****
228:mac.c **** /*************************************************************************
229:mac.c **** *功能描述:发送ack任务
230:mac.c **** *参数说明:无
231:mac.c **** *返回值:
232:mac.c **** **************************************************************************/
233:mac.c **** static void sendACK(uint8_t DataSrcAddr){
234:mac.c **** // 控制包初始化
235:mac.c **** ctrlPkt.fromAddr = OS_LOCAL_ADDRESS;
236:mac.c **** ctrlPkt.type = ACK_PKT;
237:mac.c **** ctrlPkt.group = 0x01;
238:mac.c **** ctrlPkt.ack = 0x06;
239:mac.c **** ctrlPkt.length = 1;
240:mac.c **** ctrlPktPt = &ctrlPkt;
241:mac.c **** ctrlPktPt->toAddr = DataSrcAddr;
242:mac.c **** ctrlPktLen = 1 + MAC_HEADER_LEN;
243:mac.c **** tryToSendACK();
244:mac.c **** }
245:mac.c **** /*************************************************************************
246:mac.c **** *功能描述:强行取消所有正在发送的任务
247:mac.c **** *参数说明:无
248:mac.c **** *返回值:
249:mac.c **** **************************************************************************/
250:mac.c ****
251:mac.c **** static result_t MACTxReset()
252:mac.c **** {
430 .LM61:
431 /* prologue: frame size=0 */
432 /* prologue end (size=0) */
253:mac.c **** radioState = RADIO_IDLE;
434 .LM62:
435 016c 81E0 ldi r24,lo8(1)
436 016e 8093 0000 sts radioState,r24
254:mac.c **** txRequest = 0;
438 .LM63:
439 0172 1092 0000 sts txRequest,__zero_reg__
255:mac.c **** state = IDLE;
441 .LM64:
442 0176 8093 0000 sts state,r24
256:mac.c **** oldstate = IDLE;
444 .LM65:
445 017a 8093 0000 sts oldstate,r24
257:mac.c **** return SUCCESS;
258:mac.c **** }
447 .LM66:
448 017e 81E0 ldi r24,lo8(1)
449 0180 90E0 ldi r25,hi8(1)
450 /* epilogue: frame size=0 */
451 0182 0895 ret
452 /* epilogue end (size=1) */
453 /* function MACTxReset size 12 (11) */
457 .global MACPhysicalTxPktDone
459 MACPhysicalTxPktDone:
259:mac.c ****
260:mac.c **** /*************************************************************************
261:mac.c **** *功能描述:发送广播包
262:mac.c **** *参数说明:无
263:mac.c **** *返回值:
264:mac.c **** **************************************************************************/
265:mac.c **** static void startBcast()
266:mac.c **** {
267:mac.c **** PhysicalTxPkt(dataPkt, txPktLen); // 调用物理层发送接口发送数据包
268:mac.c **** radioState = RADIO_TX;
269:mac.c **** state = TX_PKT;
270:mac.c ****
271:mac.c **** }
272:mac.c **** /*************************************************************************
273:mac.c **** *功能描述:发送ack帧
274:mac.c **** *参数说明:
275:mac.c **** *返回值:
276:mac.c **** **************************************************************************/
277:mac.c ****
278:mac.c **** static void startACK()
279:mac.c **** {
280:mac.c **** PhysicalTxPkt(ctrlPktPt,ctrlPktLen ); // 调用物理层发送接口发送数据包
281:mac.c **** radioState = RADIO_TX;
282:mac.c **** state = TX_PKT;
283:mac.c **** }
284:mac.c ****
285:mac.c ****
286:mac.c ****
287:mac.c **** /*************************************************************************
288:mac.c **** *功能描述:物理层发送完成,通知MAC
289:mac.c **** *参数说明:包地址
290:mac.c **** *返回值:
291:mac.c **** **************************************************************************/
292:mac.c **** result_t MACPhysicalTxPktDone(void* packet)
293:mac.c **** {
461 .LM67:
462 /* prologue: frame size=0 */
463 /* prologue end (size=0) */
464 0184 FC01 movw r30,r24
294:mac.c **** char pktType;
295:mac.c ****
296:mac.c **** if (packet == 0 || state != TX_PKT) {
466 .LM68:
467 0186 892B or r24,r25
468 0188 21F0 breq .L25
470 .LM69:
471 018a 8091 0000 lds r24,state
472 018e 8330 cpi r24,lo8(3)
473 0190 29F0 breq .L24
474 .L25:
297:mac.c **** MACTxReset();
476 .LM70:
477 0192 0E94 0000 call MACTxReset
298:mac.c **** return FAIL;
479 .LM71:
480 0196 80E0 ldi r24,lo8(0)
481 0198 90E0 ldi r25,hi8(0)
482 019a 0895 ret
483 .L24:
299:mac.c **** }
300:mac.c ****
301:mac.c **** pktType = *((char*)packet + 1);
485 .LM72:
486 019c 8181 ldd r24,Z+1
302:mac.c **** switch (pktType) {
488 .LM73:
489 019e 9927 clr r25
490 01a0 8230 cpi r24,2
491 01a2 9105 cpc r25,__zero_reg__
492 01a4 19F0 breq .L29
493 01a6 0397 sbiw r24,3
494 01a8 04F1 brlt .L26
495 01aa 1DC0 rjmp .L37
496 .L29:
303:mac.c **** case RTS_PKT:
304:mac.c **** break;
305:mac.c **** case CTS_PKT:
306:mac.c **** break;
307:mac.c **** case DATA_PKT:
308:mac.c **** if (((OSMACMsgPtr)packet)->toAddr == OS_BCAST_ADDR) { // 发广播完成
498 .LM74:
499 01ac 9281 ldd r25,Z+2
500 01ae 8091 0000 lds r24,OS_BCAST_ADDR
501 01b2 9817 cp r25,r24
502 01b4 79F0 breq .L32
309:mac.c **** MACTxReset();
310:mac.c **** TransmitDone(dataPkt);
311:mac.c **** }
312:mac.c **** else // 发单播完成
313:mac.c **** {
314:mac.c **** if(ACK_ON == 1){
504 .LM75:
505 01b6 8091 0000 lds r24,ACK_ON
506 01ba 8130 cpi r24,lo8(1)
507 01bc 59F4 brne .L32
508 .LBB2:
509 .LBB3:
315:mac.c **** //县设置等待时间实现mac的隔离
316:mac.c **** SetWaitTime();
317:mac.c **** MACTxReset();
318:mac.c **** } else {
319:mac.c **** MACTxReset();
320:mac.c **** TransmitDone(dataPkt);
321:mac.c **** }
322:mac.c ****
323:mac.c **** }
324:mac.c **** break;
325:mac.c **** case ACK_PKT: // ACK发送完成,进入空闲
326:mac.c **** MACTxReset();
327:mac.c **** break;
328:mac.c **** default: MACTxReset();
329:mac.c **** }
330:mac.c **** return SUCCESS;
331:mac.c **** }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -