📄 mac.lst
字号:
332:mac.c ****
333:mac.c ****
334:mac.c **** /*************************************************************************
335:mac.c **** *功能描述:物理层调用,通知MAC层信道忙,MAC转入空闲态,可以接收数据
336:mac.c **** *参数说明:
337:mac.c **** *返回值: 执行结果
338:mac.c **** **************************************************************************/
339:mac.c **** result_t MACChannelBusy()
340:mac.c **** {
341:mac.c **** MACTxReset();
342:mac.c **** return SUCCESS;
343:mac.c **** }
344:mac.c ****
345:mac.c **** /*************************************************************************
346:mac.c **** *功能描述:物理层调用,通知MAC层信道闲,根据发送方式发送数据包
347:mac.c **** *参数说明:
348:mac.c **** *返回值: 执行结果
349:mac.c **** **************************************************************************/
350:mac.c **** result_t MACChannelIdle()
351:mac.c **** { //有可能同时进行载波监听和接受,在载波监听的时候,接受有效,state改为BACKOFF
352:mac.c **** if (state != CARR_SENSE) {
353:mac.c **** return FAIL;
354:mac.c **** }
355:mac.c **** if (howToSend == BCAST_DATA) {
356:mac.c **** startBcast();
357:mac.c **** }
358:mac.c ****
359:mac.c **** return SUCCESS;
360:mac.c **** }
361:mac.c ****
362:mac.c **** /*************************************************************************
363:mac.c **** *功能描述:物理层调用,检测到起始字符,通知MAC准备接收数据包
364:mac.c **** *参数说明:
365:mac.c **** *返回值: 执行结果
366:mac.c **** **************************************************************************/
367:mac.c **** result_t MACStartSymDetected(void* pkt)
368:mac.c **** {
369:mac.c **** radioState = RADIO_RX;
370:mac.c **** //
371:mac.c **** if (state == IDLE || state == CARR_SENSE) {
372:mac.c **** oldstate = state;
373:mac.c **** state = BACKOFF;
374:mac.c **** }
375:mac.c **** return SUCCESS;
376:mac.c **** }
377:mac.c ****
378:mac.c **** /*************************************************************************
379:mac.c **** *功能描述:处理错误数据包,进入睡眠
380:mac.c **** *参数说明:
381:mac.c **** *返回值: 执行结果
382:mac.c **** **************************************************************************/
383:mac.c **** static void handleErrPkt(void)
384:mac.c **** {
385:mac.c ****
386:mac.c **** MACTxReset();
387:mac.c ****
388:mac.c **** }
389:mac.c ****
390:mac.c **** /*************************************************************************
391:mac.c **** *功能描述:物理层调用,对已经接收到的数据包根据包类型调用相就的处理函数
392:mac.c **** *参数说明:包地址 接收出错标志
393:mac.c **** *返回值: 执行结果
394:mac.c **** **************************************************************************/
395:mac.c **** void* MACPhysicalRxPktDone(void* packet, char error)
396:mac.c **** {
397:mac.c **** char pktType;
398:mac.c ****
399:mac.c **** radioState = RADIO_IDLE;
400:mac.c ****
401:mac.c **** if (error) { // 接收到错误包,有碰撞发生
402:mac.c **** handleErrPkt();
403:mac.c **** return packet;
404:mac.c **** }
405:mac.c **** // MACTxReset();
406:mac.c **** pktType = *((char*)packet + 1);
407:mac.c **** if (pktType == DATA_PKT) {
408:mac.c **** return handleDATA(packet);
409:mac.c **** } else if (pktType == RTS_PKT) {
410:mac.c **** handleRTS(packet);
411:mac.c **** } else if (pktType == CTS_PKT) {
412:mac.c **** handleCTS(packet);
413:mac.c **** } else if (pktType == ACK_PKT) {
414:mac.c **** handleACK(packet);
415:mac.c **** } else {
416:mac.c **** handleErrPkt();
417:mac.c **** }
418:mac.c **** return packet;
419:mac.c **** }
420:mac.c ****
421:mac.c **** /*************************************************************************
422:mac.c **** *功能描述:对接收到的RTS数据包进行处理
423:mac.c **** *参数说明:包地址
424:mac.c **** *返回值:
425:mac.c **** **************************************************************************/
426:mac.c **** static void handleRTS(void* pkt)
427:mac.c **** {
428:mac.c ****
429:mac.c **** }
430:mac.c ****
431:mac.c **** /*************************************************************************
432:mac.c **** *功能描述:对接收到的CTS数据包进行处理
433:mac.c **** *参数说明:包地址
434:mac.c **** *返回值:
435:mac.c **** **************************************************************************/
436:mac.c **** static void handleCTS(void* pkt)
437:mac.c **** {
438:mac.c ****
439:mac.c **** }
440:mac.c ****
441:mac.c **** /*************************************************************************
442:mac.c **** *功能描述:对接收到的DATA数据包进行处理
443:mac.c **** *参数说明:包地址
444:mac.c **** *返回值: 包地址
445:mac.c **** **************************************************************************/
446:mac.c **** static void* handleDATA(void* pkt)
447:mac.c **** {
448:mac.c **** void* tmp = pkt;
449:mac.c **** OSMACMsgPtr packet = (OSMACMsgPtr)pkt;
450:mac.c ****
451:mac.c **** if (packet->toAddr == OS_BCAST_ADDR) {
452:mac.c **** if (state == BACKOFF) {state = oldstate;oldstate = IDLE;}
453:mac.c **** ReceiveDone(pkt);
454:mac.c **** return tmp;
455:mac.c **** } else if (packet->toAddr == OS_LOCAL_ADDRESS) {
456:mac.c **** // 处理单播数据包
457:mac.c **** if (state == BACKOFF) {state = oldstate;oldstate = IDLE;}
458:mac.c **** ///加入检测是否缓冲队列是否有空的检查
459:mac.c **** if((ACK_ON == 1)&&(GetFreeQueueLength() > 0)) {
460:mac.c **** sendACK(packet->fromAddr);
461:mac.c **** ReceiveDone(packet);
462:mac.c **** } else if( ACK_ON == 0 ) {
463:mac.c **** ReceiveDone(packet);
464:mac.c **** }
465:mac.c **** return tmp;
466:mac.c **** } else {
467:mac.c **** //MACTxReset();
468:mac.c **** {state = oldstate;oldstate = IDLE;}
469:mac.c **** }
470:mac.c **** return pkt;
471:mac.c **** }
472:mac.c ****
473:mac.c **** /*************************************************************************
474:mac.c **** *功能描述:对接收到的ACK数据包进行处理
475:mac.c **** *参数说明:包地址
476:mac.c **** *返回值:
477:mac.c **** **************************************************************************/
478:mac.c **** static void handleACK(void* pkt)
479:mac.c **** {
480:mac.c **** char intEnabled;
481:mac.c **** OSMACMsgPtr packet = (OSMACMsgPtr)pkt;
482:mac.c **** if (state == BACKOFF) {state = oldstate;oldstate = IDLE;}
483:mac.c **** if (packet->toAddr == OS_LOCAL_ADDRESS){
484:mac.c **** LedYellowToggle();
485:mac.c **** if(AckWaitTime > 0) {
486:mac.c **** // 设置发送请求标识
487:mac.c **** intEnabled = inp(SREG) & 0x80;
488:mac.c **** cli();
489:mac.c **** AckWaitTime = 0;
490:mac.c **** if (intEnabled) sei();
491:mac.c **** }
492:mac.c **** TransmitDone(dataPkt);
493:mac.c **** } else {
494:mac.c **** state = oldstate;
495:mac.c **** oldstate = IDLE;
496:mac.c **** }
497:mac.c **** }
498:mac.c ****
499:mac.c **** /*************************************************************************
500:mac.c **** *功能描述:设置RTS帧,发送RTS数据包
501:mac.c **** *参数说明:
502:mac.c **** *返回值:
503:mac.c **** **************************************************************************/
504:mac.c **** /*
505:mac.c **** static void sendRTS()
506:mac.c **** {
507:mac.c **** }
508:mac.c **** */
509:mac.c **** /*************************************************************************
510:mac.c **** *功能描述:设置CTS帧,发送CTS数据包
511:mac.c **** *参数说明:
512:mac.c **** *返回值:
513:mac.c **** **************************************************************************/
514:mac.c **** /*
515:mac.c **** static void sendCTS()
516:mac.c **** {
517:mac.c **** }
518:mac.c **** */
519:mac.c **** /*************************************************************************
520:mac.c **** *功能描述:设置DATA帧,发送数据包
521:mac.c **** *参数说明:
522:mac.c **** *返回值:
523:mac.c **** **************************************************************************/
524:mac.c **** /*
525:mac.c **** static void sendDATA()
526:mac.c **** {
527:mac.c **** }
528:mac.c **** */
529:mac.c ****
530:mac.c **** /*************************************************************************
531:mac.c **** *功能描述:设置ACk等待时间
532:mac.c **** *参数说明:
533:mac.c **** *返回值:
534:mac.c **** *************************************************************************/
535:mac.c **** static void SetWaitTime(void){
536:mac.c **** char intEnabled;
537:mac.c **** intEnabled = inp(SREG) & 0x80;
511 .LM76:
512 01be 9FB7 in r25,95-0x20
513 01c0 9078 andi r25,lo8(-128)
538:mac.c **** cli();
515 .LM77:
516 /* #APP */
517 01c2 F894 cli
539:mac.c **** AckWaitTime = ACKTIME;
519 .LM78:
520 /* #NOAPP */
521 01c4 8091 0000 lds r24,ACKTIME
522 01c8 8093 0000 sts AckWaitTime,r24
540:mac.c **** if (intEnabled) sei();
524 .LM79:
525 01cc 9923 tst r25
526 01ce 59F0 breq .L37
527 /* #APP */
528 01d0 7894 sei
529 /* #NOAPP */
530 01d2 09C0 rjmp .L37
531 .L32:
532 .LBE3:
533 .LBE2:
535 .LM80:
536 01d4 0E94 0000 call MACTxReset
538 .LM81:
539 01d8 8091 0000 lds r24,dataPkt
540 01dc 9091 0000 lds r25,(dataPkt)+1
541 01e0 0E94 0000 call TransmitDone
543 .LM82:
544 01e4 02C0 rjmp .L26
545 .L37:
547 .LM83:
548 01e6 0E94 0000 call MACTxReset
549 .L26:
551 .LM84:
552 01ea 81E0 ldi r24,lo8(1)
553 01ec 90E0 ldi r25,hi8(1)
555 .LM85:
556 01ee 0895 ret
557 /* epilogue: frame size=0 */
558 01f0 0895 ret
559 /* epilogue end (size=1) */
560 /* function MACPhysicalTxPktDone size 58 (57) */
564 .global MACChannelBusy
566 MACChannelBusy:
568 .LM86:
569 /* prologue: frame size=0 */
570 /* prologue end (size=0) */
572 .LM87:
573 01f2 0E94 0000 call MACTxReset
575 .LM88:
576 01f6 81E0 ldi r24,lo8(1)
577 01f8 90E0 ldi r25,hi8(1)
578 /* epilogue: frame size=0 */
579 01fa 0895 ret
580 /* epilogue end (size=1) */
581 /* function MACChannelBusy size 5 (4) */
584 .global MACChannelIdle
586 MACChannelIdle:
588 .LM89:
589 /* prologue: frame size=0 */
590 /* prologue end (size=0) */
592 .LM90:
593 01fc 8091 0000 lds r24,state
594 0200 8230 cpi r24,lo8(2)
595 0202 19F0 breq .L41
597 .LM91:
598 0204 80E0 ldi r24,lo8(0)
599 0206 90E0 ldi r25,hi8(0)
600 0208 0895 ret
601 .L41:
603 .LM92:
604 020a 8091 0000 lds r24,howToSend
605 020e 8823 tst r24
606 0210 69F4 brne .L42
607 .LBB4:
608 .LBB5:
610 .LM93:
611 0212 6091 0000 lds r22,txPktLen
612 0216 8091 0000 lds r24,dataPkt
613 021a 9091 0000 lds r25,(dataPkt)+1
614 021e 0E94 0000 call PhysicalTxPkt
616 .LM94:
617 0222 83E0 ldi r24,lo8(3)
618 0224 8093 0000 sts radioState,r24
620 .LM95:
621 0228 8093 0000 sts state,r24
622 .L42:
623 .LBE5:
624 .LBE4:
626 .LM96:
627 022c 81E0 ldi r24,lo8(1)
628 022e 90E0 ldi r25,hi8(1)
630 .LM97:
631 0230 0895 ret
632 /* epilogue: frame size=0 */
633 0232 0895 ret
634 /* epilogue end (size=1) */
635 /* function MACChannelIdle size 28 (27) */
639 .global MACStartSymDetected
641 MACStartSymDetected:
643 .LM98:
644 /* prologue: frame size=0 */
645 /* prologue end (size=0) */
647 .LM99:
648 0234 82E0 ldi r24,lo8(2)
649 0236 8093 0000 sts radioState,r24
651 .LM100:
652 023a 9091 0000 lds r25,state
653 023e 892F mov r24,r25
654 0240 8150 subi r24,lo8(-(-1))
655 0242 8230 cpi r24,lo8(2)
656 0244 28F4 brsh .L45
658 .LM101:
659 0246 9093 0000 sts oldstate,r25
661 .LM102:
662 024a 84E0 ldi r24,lo8(4)
663 024c 8093 0000 sts state,r24
664 .L45:
666 .LM103:
667 0250 81E0 ldi r24,lo8(1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -