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

📄 route.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 LST
📖 第 1 页 / 共 5 页
字号:
 127:route.c       **** static void UpdateParentPool(void){
 128:route.c       ****     uint8_t i;
 129:route.c       **** 	for(i = 0 ;i < MAXNEIGHBOR; i++) {
 130:route.c       **** 	if((nbrTable[i].state == SYMMETRICAL)&&(nbrTable[i].metric < metric )\
 308               	.LM42:
 309 00f8 8181      		ldd r24,Z+1
 310 00fa 8130      		cpi r24,lo8(1)
 311 00fc 49F4      		brne .L23
 312 00fe 8281      		ldd r24,Z+2
 313 0100 8217      		cp r24,r18
 314 0102 30F4      		brsh .L23
 315 0104 8085      		ldd r24,Z+8
 316 0106 8823      		tst r24
 317 0108 19F0      		breq .L23
 318 010a 8081      		ld r24,Z
 319 010c 8C93      		st X,r24
 320 010e 01C0      		rjmp .L22
 321               	.L23:
 131:route.c       **** 	&&(nbrTable[i].outdegree >= 1)) parentpool[i] = nbrTable[i].addr;
 132:route.c       **** 	else parentpool[i] = INVALID_NODE_ID;
 323               	.LM43:
 324 0110 3C93      		st X,r19
 325               	.L22:
 327               	.LM44:
 328 0112 9150      		subi r25,lo8(-(-1))
 329 0114 3996      		adiw r30,9
 330 0116 1196      		adiw r26,1
 331 0118 97FF      		sbrs r25,7
 332 011a EECF      		rjmp .L25
 333               	.LBE5:
 334               	.LBE4:
 336               	.LM45:
 337 011c 80E0      		ldi r24,lo8(pm(routeBroadcast))
 338 011e 90E0      		ldi r25,hi8(pm(routeBroadcast))
 339 0120 0E94 0000 		call OSPostTask
 340               	/* epilogue: frame size=0 */
 341 0124 0895      		ret
 342               	/* epilogue end (size=1) */
 343               	/* function routeTimerTask size 80 (79) */
 359               	routeBroadcast:
 133:route.c       **** 	}
 134:route.c       **** }
 135:route.c       **** /*************************************************************************
 136:route.c       **** *功能描述:路由包的建立和发送
 137:route.c       **** *参数说明:
 138:route.c       **** *返回值:
 139:route.c       **** *************************************************************************/
 140:route.c       **** static void routeBroadcast(void) {
 361               	.LM46:
 362               	/* prologue: frame size=0 */
 363 0126 0F93      		push r16
 364 0128 1F93      		push r17
 365 012a CF93      		push r28
 366 012c DF93      		push r29
 367               	/* prologue end (size=4) */
 141:route.c       **** 	//发送广播包
 142:route.c       **** 	uint8_t length;
 143:route.c       **** 	uint8_t i;
 144:route.c       ****     SHopMsgPtr sHopMsg;
 145:route.c       **** 	sHopMsg = (SHopMsgPtr )routeMsgPtr->data;
 369               	.LM47:
 370 012e C091 0000 		lds r28,routeMsgPtr
 371 0132 D091 0000 		lds r29,(routeMsgPtr)+1
 146:route.c       ****     
 147:route.c       **** 	sHopMsg->type = BROADCAST;
 373               	.LM48:
 374 0136 84E0      		ldi r24,lo8(4)
 375 0138 8D83      		std Y+5,r24
 148:route.c       **** 	sHopMsg->seq = broadseqno; //在发送完广播包以后需自加
 377               	.LM49:
 378 013a 8091 0000 		lds r24,broadseqno
 379 013e 9091 0000 		lds r25,(broadseqno)+1
 380 0142 8E83      		std Y+6,r24
 381 0144 9F83      		std Y+7,r25
 149:route.c       ****     RoutePacket *broadPacket = (RoutePacket *) sHopMsg->data;
 383               	.LM50:
 384 0146 8E01      		movw r16,r28
 385 0148 075F      		subi r16,lo8(-(9))
 386 014a 1F4F      		sbci r17,hi8(-(9))
 150:route.c       **** 	if(GetFreeQueueLength() >= 1) broadPacket->QueueUseEnable = TRUE;
 388               	.LM51:
 389 014c 0E94 0000 		call GetFreeQueueLength
 390 0150 8111      		cpse r24,__zero_reg__
 392               	.LM52:
 393 0152 81E0      		ldi r24,lo8(1)
 394               	.L32:
 151:route.c       **** 	else broadPacket->QueueUseEnable = FALSE;
 396               	.LM53:
 397 0154 8987      		std Y+9,r24
 152:route.c       **** 	broadPacket->metric = metric;
 399               	.LM54:
 400 0156 8091 0000 		lds r24,metric
 401 015a E801      		movw r28,r16
 402 015c 8983      		std Y+1,r24
 153:route.c       **** 	////
 154:route.c       **** 	if(OS_LOCAL_ADDRESS == SINKNODE ) broadPacket->outdegree = 255;
 404               	.LM55:
 405 015e 8091 0000 		lds r24,OS_LOCAL_ADDRESS
 406 0162 8130      		cpi r24,lo8(1)
 407 0164 11F4      		brne .L34
 408 0166 8FEF      		ldi r24,lo8(-1)
 409 0168 2BC0      		rjmp .L55
 410               	.L34:
 411               	.LBB6:
 412               	.LBB7:
 155:route.c       **** 	else broadPacket->outdegree = GetLocalOutDegree();
 156:route.c       ****     for (i = 0; i < MAXNEIGHBOR; i++) {
 157:route.c       **** 		broadPacket->neighbor[i] = nbrTable[i].addr;
 158:route.c       **** 	}
 159:route.c       ****     
 160:route.c       **** 	length = sizeof(RoutePacket) + SHOP_HEADER_LEN;
 161:route.c       ****     InBroadQueue(BROADCAST,length, routeMsgPtr);
 162:route.c       **** } 
 163:route.c       **** 
 164:route.c       **** static uint8_t GetLocalOutDegree(void){
 165:route.c       ****     uint8_t i;
 166:route.c       **** 	uint16_t tempoutdegree = 0;
 414               	.LM56:
 415 016a 20E0      		ldi r18,lo8(0)
 416 016c 30E0      		ldi r19,hi8(0)
 417 016e 5091 0000 		lds r21,metric
 418 0172 A0E0      		ldi r26,lo8(nbrTable)
 419 0174 B0E0      		ldi r27,hi8(nbrTable)
 420 0176 4DE1      		ldi r20,lo8(29)
 421               	.L43:
 167:route.c       **** 	for(i = 0;i < MAXNEIGHBOR; i++) {
 168:route.c       **** 	if((nbrTable[i].addr != INVALID_NODE_ID)&&(nbrTable[i].state == SYMMETRICAL)\
 423               	.LM57:
 424 0178 8C91      		ld r24,X
 425 017a 8F3F      		cpi r24,lo8(-1)
 426 017c 99F0      		breq .L38
 427 017e FD01      		movw r30,r26
 428 0180 8181      		ldd r24,Z+1
 429 0182 8130      		cpi r24,lo8(1)
 430 0184 79F4      		brne .L38
 431 0186 E281      		ldd r30,Z+2
 432 0188 E517      		cp r30,r21
 433 018a 60F4      		brsh .L38
 434               	.LBB8:
 435               	.LBB9:
 169:route.c       ****     &&(nbrTable[i].metric <  metric)) tempoutdegree = tempoutdegree + OutMapping(i);
 170:route.c       **** 	}
 171:route.c       **** 	if(tempoutdegree > 255 ) return 255;
 172:route.c       **** 	else return (tempoutdegree&0xff);
 173:route.c       **** }
 174:route.c       **** static uint8_t OutMapping(uint8_t i){
 175:route.c       ****     
 176:route.c       ****     if(nbrTable[i].metric <= 6) return DegreeTable[nbrTable[i].metric - 1];
 437               	.LM58:
 438 018c E730      		cpi r30,lo8(7)
 439 018e 30F4      		brsh .L40
 440 0190 FF27      		clr r31
 441 0192 E050      		subi r30,lo8(-(DegreeTable-1))
 442 0194 F040      		sbci r31,hi8(-(DegreeTable-1))
 443 0196 8081      		ld r24,Z
 444 0198 9927      		clr r25
 445 019a 02C0      		rjmp .L41
 446               	.L40:
 177:route.c       **** 	else return 1;
 448               	.LM59:
 449 019c 81E0      		ldi r24,lo8(1)
 450 019e 90E0      		ldi r25,hi8(1)
 451               	.L41:
 452               	.LBE9:
 453               	.LBE8:
 455               	.LM60:
 456 01a0 280F      		add r18,r24
 457 01a2 311D      		adc r19,__zero_reg__
 458               	.L38:
 460               	.LM61:
 461 01a4 4150      		subi r20,lo8(-(-1))
 462 01a6 1996      		adiw r26,9
 463 01a8 47FF      		sbrs r20,7
 464 01aa E6CF      		rjmp .L43
 466               	.LM62:
 467 01ac 2F3F      		cpi r18,255
 468 01ae 3105      		cpc r19,__zero_reg__
 469 01b0 21F0      		breq .L44
 470 01b2 18F0      		brlo .L44
 471 01b4 8FEF      		ldi r24,lo8(255)
 472 01b6 90E0      		ldi r25,hi8(255)
 473 01b8 02C0      		rjmp .L45
 474               	.L44:
 476               	.LM63:
 477 01ba 822F      		mov r24,r18
 478 01bc 9927      		clr r25
 479               	.L45:
 480               	.LBE7:
 481               	.LBE6:
 483               	.LM64:
 484 01be E801      		movw r28,r16
 485               	.L55:
 486 01c0 8A83      		std Y+2,r24
 487 01c2 D801      		movw r26,r16
 488 01c4 1396      		adiw r26,3
 489 01c6 E0E0      		ldi r30,lo8(nbrTable)
 490 01c8 F0E0      		ldi r31,hi8(nbrTable)
 491 01ca 9DE1      		ldi r25,lo8(29)
 492               	.L50:
 494               	.LM65:
 495 01cc 8081      		ld r24,Z
 496 01ce 3996      		adiw r30,9
 497 01d0 8D93      		st X+,r24
 499               	.LM66:
 500 01d2 9150      		subi r25,lo8(-(-1))
 501 01d4 97FF      		sbrs r25,7
 502 01d6 FACF      		rjmp .L50
 504               	.LM67:
 505 01d8 4091 0000 		lds r20,routeMsgPtr
 506 01dc 5091 0000 		lds r21,(routeMsgPtr)+1
 507 01e0 65E2      		ldi r22,lo8(37)
 508 01e2 84E0      		ldi r24,lo8(4)
 509 01e4 0E94 0000 		call InBroadQueue
 510               	/* epilogue: frame size=0 */
 511 01e8 DF91      		pop r29
 512 01ea CF91      		pop r28
 513 01ec 1F91      		pop r17
 514 01ee 0F91      		pop r16
 515 01f0 0895      		ret
 516               	/* epilogue end (size=5) */
 517               	/* function routeBroadcast size 103 (94) */
 531               	.global	routeBroadcastDone
 533               	routeBroadcastDone:
 178:route.c       **** }
 179:route.c       **** /*************************************************************************
 180:route.c       **** *功能描述:路由包的包号的递增
 181:route.c       **** *参数说明:发送包指针
 182:route.c       **** *返回值:
 183:route.c       **** *************************************************************************/
 184:route.c       **** void routeBroadcastDone(OSMACMsgPtr msg) {
 535               	.LM68:
 536               	/* prologue: frame size=0 */
 537               	/* prologue end (size=0) */
 185:route.c       **** 
 186:route.c       ****     broadseqno++;
 539               	.LM69:
 540 01f2 8091 0000 		lds r24,broadseqno
 541 01f6 9091 0000 		lds r25,(broadseqno)+1
 542 01fa 0196      		adiw r24,1
 543 01fc 9093 0000 		sts (broadseqno)+1,r25
 544 0200 8093 0000 		sts broadseqno,r24
 545               	/* epilogue: frame size=0 */
 546 0204 0895      		ret
 547               	/* epilogue end (size=1) */
 548               	/* function routeBroadcastDone size 10 (9) */
 553               	LocalAddrInReceive:
 187:route.c       **** }
 188:route.c       **** 
 189:route.c       **** /*************************************************************************
 190:route.c       **** *功能描述:接受到路由包,进行相关的处理
 191:route.c       **** *参数说明:
 192:route.c       **** *返回值:
 193:route.c       **** *************************************************************************/
 194:route.c       **** void routeReceiveBroadcast(OSMACMsgPtr receivemsg) {
 195:route.c       **** 	
 196:route.c       **** 	SHopMsgPtr sHopMsg;
 197:route.c       **** 	uint8_t sourceaddr;
 198:route.c       ****     uint8_t hopcount;
 199:route.c       **** 	uint16_t broadno;
 200:route.c       **** 	bool   acceptable;
 201:route.c       ****     uint8_t outdegree;
 202:route.c       **** 	
 203:route.c       **** 	sHopMsg = (SHopMsgPtr )receivemsg->data;
 204:route.c       **** 	broadno = sHopMsg->seq;
 205:route.c       **** 	RoutePacket *broadPacket = (RoutePacket *) sHopMsg->data;
 206:route.c       ****    
 207:route.c       **** 	sourceaddr = receivemsg->fromAddr;
 208:route.c       ****     hopcount = broadPacket->metric;
 209:route.c       ****     acceptable = broadPacket->QueueUseEnable;
 210:route.c       **** 	outdegree = broadPacket->outdegree;
 211:route.c       **** 	
 212:route.c       **** 	LedGreenToggle();       //绿灯亮,表示接收到广播包
 213:route.c       **** 	
 214:route.c       **** 	tablemanage(outdegree,acceptable,sourceaddr,hopcount,broadno,receivemsg);
 215:route.c       **** 	
 216:route.c       **** 	if( OS_LOCAL_ADDRESS != SINKNODE ) {
 217:route.c       **** 	   ChooseParent();
 218:route.c       **** 	}
 219:route.c       **** }
 220:route.c       **** 
 221:route.c       **** /*************************************************************************
 222:route.c       **** *功能描述:路由表的修改(每收集到一个路由包都要修改路由表)
 223:route.c       **** *参数说明:acceptable 标示路由包源是否有缓冲区
 224:route.c       ****            sourceaddr 标示路由包源的地址
 225:route.c       **** 		   hopcount   标示路由包源的层号
 226:route.c       **** 		   broadno    标示该路由包号
 227:route.c       **** 		   receivemsg 标示接受到的包的指针
 228:route.c       **** *返回值:
 229:route.c       **** *************************************************************************/
 230:route.c       **** static void tablemanage(uint8_t outdegree,bool acceptable,uint8_t sourceaddr,uint8_t hopcount,uint1
 231:route.c       ****     uint8_t location;
 232:route.c       **** 	///metric变小最好暂时不要发送一个路由广播包,以防循环路由
 233:route.c       **** 	if(ReceiveInLocal(sourceaddr)){//发送路由包的节点在本节点的邻居表中
 234:route.c       **** 	location = GetLocation(sourceaddr);//定位相关路由记录表项
 235:route.c       **** 	       if(LocalAddrInReceive(receivemsg)){ //本节点在路由包的源节点的邻居表中
 236:route.c       **** 		      nbrTable[location].state = SYMMETRICAL;
 237:route.c       **** 				  if (hopcount < ( metric - 1 ) ) {
 238:route.c       **** 				    metric = hopcount + 1; 
 239:route.c       **** 					if(acceptable&&(outdegree >= 1 )) InParentBool(nbrTable[location].addr,location);
 240:route.c       **** 				  }
 241:route.c       **** 	       }else {
 242:route.c       **** 		   nbrTable[location].state = NOSYMMETRICAL;
 243:route.c       **** 		   }
 244:route.c       ****     nbrTable[location].metric = hopcount;
 245:route.c       **** 	nbrTable[location].broadseqno = broadno;

⌨️ 快捷键说明

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