⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 LST
📖 第 1 页 / 共 4 页
字号:
 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 + -