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

📄 route.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 LST
📖 第 1 页 / 共 5 页
字号:
 246:route.c       **** 	nbrTable[location].outdegree = outdegree;	  
 247:route.c       **** 	} else {
 248:route.c       **** 	    if(freerecorder >= 1 ) {//路由表中还有空间
 249:route.c       **** 	      location = GetAnFreePlace();
 250:route.c       **** 		  nbrTable[location].addr = sourceaddr;
 251:route.c       **** 		  if(LocalAddrInReceive(receivemsg)){
 252:route.c       **** 		         nbrTable[location].state = SYMMETRICAL;
 253:route.c       **** 		         if (hopcount < ( metric - 1 ) ) {
 254:route.c       **** 				    metric = hopcount + 1;
 255:route.c       ****                     if(acceptable&&(outdegree >= 1 )) InParentBool(nbrTable[location].addr,location
 256:route.c       **** 				  }
 257:route.c       **** 		  } else {
 258:route.c       **** 		    nbrTable[location].state = NOSYMMETRICAL;
 259:route.c       **** 		  }
 260:route.c       **** 		  nbrTable[location].metric = hopcount;
 261:route.c       **** 		  nbrTable[location].broadseqno = broadno;
 262:route.c       **** 		  nbrTable[location].prebroadseqno = nbrTable[location].broadseqno;
 263:route.c       **** 		  nbrTable[location].sendfailtime = 0;
 264:route.c       **** 		  nbrTable[location].outdegree = outdegree;
 265:route.c       **** 		  freerecorder--;
 266:route.c       **** 		 //这里可以加入发送路由包的任务,加快路由标的更新速度
 267:route.c       **** 	    } else { //路由表满,启动替换策略
 268:route.c       **** 		  location = GetAnPlace();
 269:route.c       **** 		  if(location < MAXNEIGHBOR ) {
 270:route.c       **** 			  nbrTable[location].addr = sourceaddr;
 271:route.c       **** 			  parentpool[location] = INVALID_NODE_ID;//替换先消去
 272:route.c       **** 			  if(LocalAddrInReceive(receivemsg)){
 273:route.c       **** 					 nbrTable[location].state = SYMMETRICAL;
 274:route.c       **** 					 if (hopcount < ( metric - 1 ) ) {
 275:route.c       **** 					    metric = hopcount + 1;
 276:route.c       ****                         if(acceptable&&(outdegree >= 1 )) InParentBool(nbrTable[location].addr,loca
 277:route.c       **** 					  }
 278:route.c       **** 			  } else {
 279:route.c       **** 				nbrTable[location].state = NOSYMMETRICAL;
 280:route.c       **** 			  }
 281:route.c       **** 			  nbrTable[location].metric = hopcount;
 282:route.c       **** 			  nbrTable[location].broadseqno = broadno;
 283:route.c       **** 			  nbrTable[location].prebroadseqno = nbrTable[location].broadseqno;
 284:route.c       **** 		      nbrTable[location].sendfailtime = 0;
 285:route.c       **** 			  nbrTable[location].outdegree = outdegree;
 286:route.c       **** 			}
 287:route.c       **** 	    } 
 288:route.c       **** 	}
 289:route.c       **** }
 290:route.c       **** 
 291:route.c       **** /*************************************************************************
 292:route.c       **** *功能描述:找到相关的邻居表中的纪录项,不过该数据项一定要在表项中
 293:route.c       **** *参数说明:需要寻找的节点号
 294:route.c       **** *返回值:  节点在表项中的位置
 295:route.c       **** *************************************************************************/
 296:route.c       **** static uint8_t GetLocation(uint8_t addr){
 297:route.c       ****     uint8_t i;
 298:route.c       **** 	for(i = 0 ;i < MAXNEIGHBOR; i++) {
 299:route.c       **** 	if( nbrTable[i].addr == addr ) return i;
 300:route.c       **** 	}
 301:route.c       **** }
 302:route.c       **** 
 303:route.c       **** /*************************************************************************
 304:route.c       **** *功能描述: 检查路由包的源节点是否在本地的邻居表中
 305:route.c       **** *参数说明:路由包的源节点号
 306:route.c       **** *返回值:  TRUE OR FALSE
 307:route.c       **** *************************************************************************/
 308:route.c       **** static result_t ReceiveInLocal(uint8_t sourceaddr){
 309:route.c       ****     uint8_t i;
 310:route.c       **** 	for(i = 0 ;i < MAXNEIGHBOR; i++) {
 311:route.c       **** 	if( nbrTable[i].addr == sourceaddr ) return 1;
 312:route.c       **** 	}
 313:route.c       **** 	return 0;
 314:route.c       **** }
 315:route.c       **** 
 316:route.c       **** /*************************************************************************
 317:route.c       **** *功能描述: 检查路由包的源节点的邻居表中是否包含本地节点号
 318:route.c       **** *参数说明:接受到的数据包的指针
 319:route.c       **** *返回值:  TRUE OR FALSE
 320:route.c       **** *************************************************************************/
 321:route.c       **** static result_t LocalAddrInReceive(OSMACMsgPtr receivemsg){
 555               	.LM70:
 556               	/* prologue: frame size=0 */
 557               	/* prologue end (size=0) */
 322:route.c       ****     uint8_t i;
 323:route.c       **** 	SHopMsgPtr sHopMsg;
 324:route.c       **** 	sHopMsg = (SHopMsgPtr )receivemsg->data;
 325:route.c       **** 	RoutePacket *broadPacket = (RoutePacket *) sHopMsg->data;
 326:route.c       **** 	for(i = 0; i < MAXNEIGHBOR; i++) {
 559               	.LM71:
 560 0206 20E0      		ldi r18,lo8(0)
 561 0208 3091 0000 		lds r19,OS_LOCAL_ADDRESS
 562 020c FC01      		movw r30,r24
 563 020e 3C96      		adiw r30,12
 564               	.L62:
 327:route.c       **** 	if( broadPacket->neighbor[i] == OS_LOCAL_ADDRESS ) return 1;
 566               	.LM72:
 567 0210 8191      		ld r24,Z+
 568 0212 8317      		cp r24,r19
 569 0214 19F4      		brne .L60
 570 0216 81E0      		ldi r24,lo8(1)
 571 0218 90E0      		ldi r25,hi8(1)
 572 021a 0895      		ret
 573               	.L60:
 575               	.LM73:
 576 021c 2F5F      		subi r18,lo8(-(1))
 577 021e 2E31      		cpi r18,lo8(30)
 578 0220 B8F3      		brlo .L62
 328:route.c       **** 	}
 329:route.c       **** 	return 0;
 580               	.LM74:
 581 0222 80E0      		ldi r24,lo8(0)
 582 0224 90E0      		ldi r25,hi8(0)
 330:route.c       ****     
 331:route.c       **** }
 584               	.LM75:
 585 0226 0895      		ret
 586               	/* epilogue: frame size=0 */
 587 0228 0895      		ret
 588               	/* epilogue end (size=1) */
 589               	/* function LocalAddrInReceive size 18 (17) */
 596               	InParentBool:
 332:route.c       **** 
 333:route.c       **** static void InParentBool(uint8_t addr,uint8_t location){
 598               	.LM76:
 599               	/* prologue: frame size=0 */
 600               	/* prologue end (size=0) */
 334:route.c       ****     //入下一跳备选节点缓冲池
 335:route.c       ****     parentpool[location] = addr;
 602               	.LM77:
 603 022a E0E0      		ldi r30,lo8(parentpool)
 604 022c F0E0      		ldi r31,hi8(parentpool)
 605 022e E60F      		add r30,r22
 606 0230 F11D      		adc r31,__zero_reg__
 607 0232 8083      		st Z,r24
 608               	/* epilogue: frame size=0 */
 609 0234 0895      		ret
 610               	/* epilogue end (size=1) */
 611               	/* function InParentBool size 6 (5) */
 615               	ChooseParent:
 336:route.c       **** }
 337:route.c       **** ////////////////////////////////////////////////////////////////
 338:route.c       **** //这一部分用来获得一个放置新收到的节点信息的表项位置
 339:route.c       **** ///////////////////////////////////////////////////////////////
 340:route.c       **** /*************************************************************************
 341:route.c       **** *功能描述: 邻居表还有空间,获得一个空间
 342:route.c       **** *参数说明:
 343:route.c       **** *返回值:  空闲空间的位置
 344:route.c       **** *************************************************************************/
 345:route.c       **** static result_t GetAnFreePlace(void){
 346:route.c       ****     uint8_t i;
 347:route.c       **** 	for(i = 0 ;i < MAXNEIGHBOR; i++) {
 348:route.c       **** 	if( nbrTable[i].addr == INVALID_NODE_ID ) return i;
 349:route.c       **** 	}
 350:route.c       **** }
 351:route.c       **** 
 352:route.c       **** /*************************************************************************
 353:route.c       **** *功能描述: 邻居表满,找到一个替换的空间
 354:route.c       **** *参数说明:接受到的数据包的指针
 355:route.c       **** *返回值:  TRUE OR FALSE
 356:route.c       **** *************************************************************************/
 357:route.c       **** static uint8_t GetAnPlace(void){
 358:route.c       ****     uint8_t replace;
 359:route.c       **** 	replace = GetNoSym();
 360:route.c       **** 	if(replace > MAXNEIGHBOR) {
 361:route.c       **** 		replace = GetEqualMetric();
 362:route.c       **** 	}
 363:route.c       **** 	return replace;
 364:route.c       **** }
 365:route.c       **** 
 366:route.c       **** /*************************************************************************
 367:route.c       **** *功能描述: 找链路状况非对称的替换表项
 368:route.c       **** *参数说明:
 369:route.c       **** *返回值:  如果找到就返回位置,否则返回一个无效的值
 370:route.c       **** *************************************************************************/
 371:route.c       **** static uint8_t GetNoSym(void){
 372:route.c       ****     uint8_t i;
 373:route.c       **** 	if(flag == 0){
 374:route.c       **** 	flag = 1;
 375:route.c       **** 		for(i = 0 ;i < MAXNEIGHBOR; i++) {  
 376:route.c       **** 		  if(nbrTable[i].state == NOSYMMETRICAL) return i;
 377:route.c       **** 		} 
 378:route.c       **** 	} else {
 379:route.c       **** 	flag = 0;
 380:route.c       **** 		for(i = MAXNEIGHBOR  ;i > 0; i--) {  //避免溢出
 381:route.c       **** 			  if(nbrTable[i - 1].state == NOSYMMETRICAL) return (i - 1);
 382:route.c       **** 			} 
 383:route.c       **** 	}
 384:route.c       **** 	return (MAXNEIGHBOR + 10);
 385:route.c       **** }
 386:route.c       **** 
 387:route.c       **** /*************************************************************************
 388:route.c       **** *功能描述: 找到层数==本地节点的替换表项
 389:route.c       **** *参数说明:
 390:route.c       **** *返回值:  如果找到就返回位置,否则返回一个无效的值
 391:route.c       **** *************************************************************************/
 392:route.c       **** static uint8_t GetEqualMetric(void){
 393:route.c       ****     uint8_t i;
 394:route.c       **** 	for(i = 0 ;i < MAXNEIGHBOR; i++) {  
 395:route.c       **** 		  if(nbrTable[i].metric == metric) {
 396:route.c       **** 		  return i;
 397:route.c       **** 		  } 
 398:route.c       **** 	} 
 399:route.c       **** 	return (MAXNEIGHBOR + 10);
 400:route.c       **** }
 401:route.c       **** 
 402:route.c       **** /*************************************************************************
 403:route.c       **** *功能描述: 找到层数<本地节点的替换表项
 404:route.c       **** *参数说明:
 405:route.c       **** *返回值:  如果找到就返回位置,否则返回一个无效的值
 406:route.c       **** *************************************************************************/
 407:route.c       **** /*
 408:route.c       **** static uint8_t GetLowMetric(void){
 409:route.c       ****    uint8_t i;
 410:route.c       ****    for(i = 0 ;i < MAXNEIGHBOR; i++) {
 411:route.c       ****     if(nbrTable[i].metric < metric ){
 412:route.c       **** 	   if(nbrTable[i].sendfailtime == 0) return i; 
 413:route.c       **** 	}
 414:route.c       ****    }
 415:route.c       ****    return (MAXNEIGHBOR + 10);
 416:route.c       **** }
 417:route.c       **** */
 418:route.c       **** /////////////////////////////////////////////////////////////////////////
 419:route.c       **** //选择下一跳的节点号
 420:route.c       **** ////////////////////////////////////////////////////////////////////////
 421:route.c       **** /*************************************************************************
 422:route.c       **** *功能描述: 找到下一跳的节点号
 423:route.c       **** *参数说明:
 424:route.c       **** *返回值:  
 425:route.c       **** *************************************************************************/
 426:route.c       **** static void ChooseParent(void){
 617               	.LM78:
 618               	/* prologue: frame size=0 */
 619 0236 CF93      		push r28
 620 0238 DF93      		push r29
 621               	/* prologue end (size=2) */
 622               	.LBB10:
 623               	.LBB11:
 427:route.c       ****     uint8_t i;
 428:route.c       **** 	uint8_t location;
 429:route.c       **** 	location = GetPerfect();//选择最好的下一跳,即有对称性,层数最低的那一项
 430:route.c       **** 	if( location < MAXNEIGHBOR ) {
 431:route.c       **** 	i = location + 1;
 432:route.c       **** 	  for( ; i < MAXNEIGHBOR ;i++){
 433:route.c       **** 	  //进一步寻找最优的点
 434:route.c       **** 	  if((nbrTable[i].state == SYMMETRICAL)&&(nbrTable[i].metric <= nbrTable[location].metric )) {
 435:route.c       **** 	       if((nbrTable[i].metric < nbrTable[location].metric)&&(nbrTable[i].outdegree >= 1)) location
 436:route.c       **** 		   else if((nbrTable[i].metric == nbrTable[location].metric)\
 437:route.c       **** 		   &&(nbrTable[i].outdegree > nbrTable[location].outdegree))  location = i;
 438:route.c       **** 	     }
 439:route.c       **** 	  }
 440:route.c       **** 	} 
 441:route.c       **** 	
 442:route.c       **** 	if(location < MAXNEIGHBOR ) {
 443:route.c       **** 	currentparent = nbrTable[location].addr;
 444:route.c       **** 	} else { //找不到合适的下一跳节点
 445:route.c       **** 	currentparent = INVALID_NODE_ID;
 446:route.c       **** 	}
 447:route.c       **** 	
 448:route.c       **** 	if( OS_LOCAL_ADDRESS != SINKNODE ) {
 449:route.c       **** 	    if(currentparent == INVALID_NODE_ID ){ //层数下降要加速通报
 450:route.c       **** 			if(metric < INVALID_NODE_ID) metric++;
 451:route.c       **** 			else metric = INVALID_NODE_ID;
 452:route.c       **** 			OSPostTask(routeBroadcast);  
 453:route.c       **** 		}
 454:route.c       **** 	}
 455:route.c       **** }
 456:route.c       **** 
 457:route.c       **** /*************************************************************************
 458:route.c       **** *功能描述: 找到一个比较优的下一跳节点号
 459:route.c       **** *参数说明:
 460:route.c       **** *返回值:  如果找到就返回位置,否则返回一个无效的值
 461:route.c       **** *************************************************************************/
 462:route.c       **** static uint8_t GetPerfect(void){
 463:route.c       ****     uint8_t i;
 464:route.c       **** 	for(i = 0 ;i < MAXNEIGHBOR; i++) {
 625               	.LM79:
 626 023a 90E0      		ldi r25,lo8(0)
 627 023c 4091 0000 		lds r20,metric
 628 0240 E0E0      		ldi r30,lo8(nbrTable)
 629 0242 F0E0      		ldi r31,hi8(nbrTable)
 630 0244 20E0      		ldi r18,lo8(0)
 631 0246 30E0      		ldi r19,hi8(0)
 632               	.L72:
 465:route.c       **** 	//找到一个合适的最优解
 466:route.c       **** 	if((nbrTable[i].state == SYMMETRICAL)&&(nbrTable[i].metric < metric )\
 634               	.LM80:
 635 0248 8181      		ldd r24,Z+1
 636 024a 8130      		cpi r24,lo8(1)
 637 024c 39F4      		brne .L69
 638 024e 8281      		ldd r24,Z+2
 639 0250 8417      		cp r24,r20
 640 0252 20F4      		brsh .L69
 641 0254 8085      		ldd r24,Z+8
 642 0256 8823      		tst r24
 643 0258 09F0      		breq .+2
 644 025a 56C0      		rjmp .L91
 645               	.L69:
 647               	.LM81:
 648 025c 9F5F      		subi r25,lo8(-(1))
 649 025e 2F5F      		subi r18,lo8(-(1))
 650 0260 3F4F      		sbci r19,hi8(-(1))
 651 0262 3996      		adiw r30,9
 652 0264 9E31      		cpi r25,lo8(30)
 653 0266 80F3      		brlo .L72
 467:route.c       **** 	&&(nbrTable[i].outdegree >=1)) return i;
 468:route.c       **** 	}
 655               	.LM82:
 656 0268 88E2      		ldi r24,lo8(40)
 657 026a 90E0      		ldi r25,hi8(40)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -