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

📄 tcp.s

📁 AVR单片机系统开发经典实例部分源程序
💻 S
📖 第 1 页 / 共 5 页
字号:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Socket 20 pS[TTCPSocket]
	.dbend
	.dbfunc e TCP_SocketStage _TCP_SocketStage fV
;          Stage -> R22
;         Socket -> R20,R21
	.even
_TCP_SocketStage::
	xcall push_gset2
	mov R22,R18
	movw R20,R16
	.dbline -1
	.dbline 385
; }
; 
; #endif
; 
; // ******************************************************************************************
; // set the socket stage
; 
; void TCP_SocketStage(T_TCP_Socket *Socket, T_TCP_Stage Stage)
; {
	.dbline 386
; 	if (Socket == NULL) return;													//
	cpi R20,0
	cpc R20,R21
	brne L112
X9:
	.dbline 386
	xjmp L111
L112:
	.dbline 388
; 																				//
; 	Socket->Stage = Stage;														// set the socket stage
	movw R30,R20
	std z+0,R22
	.dbline 389
; 	Socket->Retries = 0;														//
	clr R2
	std z+38,R2
	.dbline 390
; 	u16_Put(&Socket->Retry_Timer, Socket->RoundTripTime * TCP_Retry_Time);		// send next packet asap
	movw R30,R20
	ldd R18,z+36
	ldd R19,z+37
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R18,R16
	movw R16,R20
	subi R16,217  ; offset = 39
	sbci R17,255
	xcall _u16_Put
	.dbline 393
; 
; 	#ifdef Debug
; 		TCP_DisplaySocketStage(Socket);
	movw R16,R20
	xcall _TCP_DisplaySocketStage
	.dbline -2
L111:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Stage 22 c
	.dbsym r Socket 20 pS[TTCPSocket]
	.dbend
	.dbfunc e TCP_UpdateRoundTripTime _TCP_UpdateRoundTripTime fV
;           Time -> R18,R19
;         Socket -> R16,R17
	.even
_TCP_UpdateRoundTripTime::
	.dbline -1
	.dbline 400
; 	#endif
; }
; 
; // ******************************************************************************************
; 
; void TCP_UpdateRoundTripTime(T_TCP_Socket *Socket, u16 Time)
; {
	.dbline 404
; 	// update our record of roughtly how long it takes for the total round trip time for tcp data.
; 	// we the value to work out how long we should wait for tx retries
; 
; 	if (Socket == NULL) return;											//
	cpi R16,0
	cpc R16,R17
	brne L115
X10:
	.dbline 404
	xjmp L114
L115:
	.dbline 406
; 																		//
; 	if (Socket->RoundTripTime < Time)									//
	movw R30,R16
	ldd R2,z+36
	ldd R3,z+37
	cp R2,R18
	cpc R3,R19
	brsh L117
	.dbline 407
; 		Socket->RoundTripTime = Time;									// bump straight up
	movw R30,R16
	std z+37,R19
	std z+36,R18
	xjmp L118
L117:
	.dbline 409
; 	else																//
; 	{																	//
	.dbline 410
; 		Socket->RoundTripTime += Time;									// average round trip time
	movw R24,R16
	adiw R24,36
	movw R30,R24
	ldd R4,z+0
	ldd R5,z+1
	add R4,R18
	adc R5,R19
	std z+1,R5
	std z+0,R4
	.dbline 411
; 		Socket->RoundTripTime >>= 1;									//    "
	movw R24,R16
	adiw R24,36
	movw R30,R24
	ldd R4,z+0
	ldd R5,z+1
	lsr R5
	ror R4
	std z+1,R5
	std z+0,R4
	.dbline 412
; 	}																	//
L118:
	.dbline 414
; 																		//
; 	if (Socket->RoundTripTime < 100) Socket->RoundTripTime = 100;		// no lower than 100ms
	movw R30,R16
	ldd R24,z+36
	ldd R25,z+37
	cpi R24,100
	ldi R30,0
	cpc R25,R30
	brsh L119
	.dbline 414
	ldi R24,100
	ldi R25,0
	movw R30,R16
	std z+37,R25
	std z+36,R24
	xjmp L120
L119:
	.dbline 416
; 	else																//
; 	if (Socket->RoundTripTime > 6000) Socket->RoundTripTime = 6000;		// no higher than 6000ms
	ldi R24,6000
	ldi R25,23
	movw R30,R16
	ldd R2,z+36
	ldd R3,z+37
	cp R24,R2
	cpc R25,R3
	brsh L121
	.dbline 416
	movw R30,R16
	std z+37,R25
	std z+36,R24
L121:
L120:
	.dbline -2
L114:
	.dbline 0 ; func end
	ret
	.dbsym r Time 18 s
	.dbsym r Socket 16 pS[TTCPSocket]
	.dbend
	.dbfunc e TCP_CloseSocket _TCP_CloseSocket fc
;         Socket -> R20,R21
	.even
_TCP_CloseSocket::
	xcall push_gset2
	movw R20,R16
	.dbline -1
	.dbline 422
; }
; 
; // ******************************************************************************************
; 
; bool TCP_CloseSocket(T_TCP_Socket *Socket)
; {	// close the tcp socket
	.dbline 423
; 	if (Socket == NULL) return true;				// socket is closed
	cpi R20,0
	cpc R20,R21
	brne L124
X11:
	.dbline 423
	ldi R16,1
	xjmp L123
L124:
	.dbline 425
; 
; 	switch (Socket->Stage)
	movw R30,R20
	ldd R22,z+0
	clr R23
	cpi R22,0
	cpc R22,R23
	breq L127
X12:
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L127
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L130
	cpi R22,3
	ldi R30,0
	cpc R23,R30
	breq L131
	cpi R22,4
	ldi R30,0
	cpc R23,R30
	breq L131
	xjmp L126
X13:
	.dbline 426
; 	{
	.dbline 428
; 		case TCP_CLOSED			:
; 		case TCP_LISTEN			:	break;			// close the socket
L130:
	.dbline 429
; 		case TCP_SYN_SENT		:	TCP_SocketStage(Socket, TCP_CLOSED);
	clr R18
	movw R16,R20
	xcall _TCP_SocketStage
	.dbline 430
; 									TCP_SendPacket(Socket, TCP_RST);
	ldi R18,4
	movw R16,R20
	xcall _TCP_SendPacket
	.dbline 431
; 									return false;
	clr R16
	xjmp L123
L131:
	.dbline 433
; 		case TCP_SYN_RECEIVED	:
; 		case TCP_ESTABLISHED	:	TCP_SocketStage(Socket, TCP_FIN_WAIT_1);
	ldi R18,5
	movw R16,R20
	xcall _TCP_SocketStage
	.dbline 434
; 									TCP_SendPacket(Socket, TCP_FIN | TCP_ACK);
	ldi R18,17
	movw R16,R20
	xcall _TCP_SendPacket
L126:
	.dbline 435
; 		default					:	return false;
	clr R16
	xjmp L123
L127:
	.dbline 438
; 	}
; 
; 	TCP_SocketStage(Socket, TCP_CLOSED);			//
	clr R18
	movw R16,R20
	xcall _TCP_SocketStage
	.dbline 440
; 													//
; 	return true;									// socket is closed
	ldi R16,1
	.dbline -2
L123:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Socket 20 pS[TTCPSocket]
	.dbend
	.dbfunc e TCP_SocketListen _TCP_SocketListen fpS[TTCPSocket]
;         Socket -> R20,R21
;           Port -> R22,R23
	.even
_TCP_SocketListen::
	xcall push_gset2
	movw R22,R16
	sbiw R28,2
	.dbline -1
	.dbline 444
; }
; 
; T_TCP_Socket *TCP_SocketListen(u16 Port)
; {	// create a new tcp socket and set it to listen mode
	.dbline 448
; 	T_TCP_Socket	*Socket;													//
; 																				//
; 	#ifdef StaticTCPSocket
; 		Socket = TCP_Socket;													// static socket
	lds R20,_TCP_Socket
	lds R21,_TCP_Socket+1
	.dbline 460
; 	#else
; 		Socket = malloc(sizeof(T_TCP_Socket));									// allocate memory for a tcp socket
; 		if (Socket == NULL)														//
; 		{																		//
; 			#ifdef Debug
; 	       	SendDebugRStr(tcp_Str35);											//
; 	    	#endif
; 			return NULL;														// failed to get a socket
; 		}																		//
; 	#endif
; 																				//
; 	memset(Socket, 0, sizeof(T_TCP_Socket));									//
	ldi R24,1075
	ldi R25,4
	std y+1,R25
	std y+0,R24
	clr R18
	clr R19
	movw R16,R20
	xcall _memset
	.dbline 461
; 	Socket->LocalPort = Port;													// select the port we are gona listen on
	movw R30,R20
	std z+35,R23
	std z+34,R22
	.dbline 462
; 	Socket->OurSequenceNum = Random32;											// our sequence number
	lds R4,_Random32+2
	lds R5,_Random32+2+1
	lds R2,_Random32
	lds R3,_Random32+1
	movw R30,R20
	std z+22,R2
	std z+23,R3
	std z+24,R4
	std z+25,R5
	.dbline 463
; 	Socket->RoundTripTime = TCP_RoundTripTime;									// default average round trip time - ms
	ldi R24,1000
	ldi R25,3
	movw R30,R20
	std z+37,R25
	std z+36,R24
	.dbline 464
; 	Socket->TheirMaxSegSize = TCP_Default_MSS;									//
	ldi R24,536
	ldi R25,2
	movw R30,R20
	std z+15,R25
	std z+14,R24
	.dbline 465
; 	Socket->OutGoing = false;													//
	clr R2
	movw R30,R20
	std z+12,R2
	.dbline 466
; 	Socket->AckDelay = 65000;													//
	ldi R24,65000
	ldi R25,253
	movw R30,R20
	std z+10,R25
	std z+9,R24
	.dbline 468
; 																				//
; 	TCP_SocketStage(Socket, TCP_LISTEN);										// open a tcp listening socket
	ldi R18,1
	movw R16,R20
	xcall _TCP_SocketStage
	.dbline 470
; 																				//
; 	return Socket;																// success
	movw R16,R20
	.dbline -2
L132:
	adiw R28,2
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Socket 20 pS[TTCPSocket]
	.dbsym r Port 22 s
	.dbend
	.dbfunc e TCP_OpenSocket _TCP_OpenSocket fpS[TTCPSocket]
;         Socket -> R10,R11
;           Port -> y+12
;             IP -> y+8
	.even
_TCP_OpenSocket::
	xcall push_arg4
	xcall push_gset3
	sbiw R28,2
	.dbline -1
	.dbline 474
; }
; 
; T_TCP_Socket *TCP_OpenSocket(u32 IP, u16 Port)
; {	// create a tcp socket and initiate an out going connection
	.dbline 477
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L136
	ldd R0,y+12
	ldd R1,y+13
	tst R0
	brne L134
	tst R1
	brne L134
X14:
L136:
	.dbline 477
; 	T_TCP_Socket	*Socket;													//
; 																				//
; 	if ((!IP) || (!Port)) return NULL;											//
	clr R16
	clr R17
	xjmp L133
L134:
	.dbline 480
; 																				//
; 	#ifdef StaticTCPSocket
; 		Socket = TCP_Socket;													// static socket
	lds R10,_TCP_Socket
	lds R11,_TCP_Socket+1
	.dbline 492
; 	#else
; 		Socket = malloc(sizeof(T_TCP_Socket));									// allocate memory for a tcp socket
; 		if (Socket == NULL)														//
; 		{																		//
; 			#ifdef Debug
; 	       	SendDebugRStr(tcp_Str35);											//
; 	    	#endif
; 			return NULL;														// failed to get a socket
; 		}																		//
; 	#endif
; 																				//
; 	memset(Socket, 0, sizeof(T_TCP_Socket));									//
	ldi R24,1075
	ldi R25,4
	std y+1,R25
	std y+0,R24
	clr R18
	clr R19
	movw R16,R10
	xcall _memset
	.dbline 494
; 																				//
; 	if (TCP_TmpPort < TCP_OutGoingPortLow) TCP_TmpPort = TCP_OutGoingPortLow;	//
	lds R24,_TCP_TmpPort
	lds R25,_TCP_TmpPort+1
	cpi R24,0
	ldi R30,4
	cpc R25,R30
	brsh L137
	.dbline 494
	ldi R24,1024
	ldi R25,4
	sts _TCP_TmpPort+1,R25
	sts _TCP_TmpPort,R24
	xjmp L138
L137:
	.dbline 496
; 	else																		//
; 	if (TCP_TmpPort >= TCP_OutGoingPortHigh) TCP_TmpPort = TCP_OutGoingPortHigh;//
	lds R24,_TCP_TmpPort
	lds R25,_TCP_TmpPort+1
	cpi R24,0
	ldi R30,16
	cpc R25,R30
	brlo L139
	.dbline 496
	ldi R24,4096
	ldi R25,16
	sts _TCP_TmpPort+1,R25
	sts _TCP_TmpPort,R24
L139:
L138:
	.dbline 498
; 																				//
; 	Socket->LocalPort = TCP_TmpPort++;											// select the port we are gona listen on
	lds R2,_TCP_TmpPort
	lds R3,_TCP_TmpPort+1
	movw R24,R2
	adiw R24,1
	sts _TCP_TmpPort+1,R25
	sts _TCP_TmpPort,R24
	movw R30,R10
	std z+35,R3
	std z+34,R2
	.dbline 499
; 	Socket->RemotePort = Port;													// select the port we are gona listen on
	movw R30,R10
	ldd R0,y+12
	ldd R1,y+13
	std z+33,R1
	std z+32,R0
	.dbline 500
; 	Socket->RemoteIP.ip32 = IP;													// select the port we are gona listen on
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	movw R30,R10
	std z+28,R2
	std z+29,R3
	std z+30,R4
	std z+31,R5
	.dbline 501
; 	Socket->OurSequenceNum = Random32;											// our sequence number
	lds R4,_Random32+2
	lds R5,_Random32+2+1
	lds R2,_Random32
	lds R3,_Random32+1
	movw R30,R10
	std z+22,R2
	std z+23,R3
	std z+24,R4
	std z+25,R5
	.dbline 502
; 	Socket->TheirMaxSegSize = TCP_Default_MSS;									//
	ldi R24,536
	ldi R25,2
	movw R30,R10
	std z+15,R25
	std z+14,R24
	.dbline 503
; 	Socket->RoundTripTime = TCP_RoundTripTime;									// default average round trip time - ms
	ldi R24,1000
	ldi R25,3
	movw R30,R10
	std z+37,R25
	std z+36,R24
	.dbline 504
; 	Socket->OutGoing = true;													//
	ldi R24,1
	movw R30,R10
	std z+12,R24
	.dbline 505
; 	Socket->AckDelay = 65000;													//
	ldi R24,65000
	ldi R25,253
	movw R30,R10
	std z+10,R25
	std z+9,R24
	.dbline 507
; 																				//
; 	TCP_SocketStage(Socket, TCP_SYN_SENT);										// start a an outgoing connection
	ldi R18,2
	movw R16,R10
	xcall _TCP_SocketStage
	.dbline 508
; 	u16_Put(&Socket->Retry_Timer, Socket->RoundTripTime * TCP_Retry_Time);		// next packet asap
	movw R30,R10
	ldd R18,z+36
	ldd R19,z+37
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R18,R16
	movw R16,R10
	subi R16,217  ; offset = 39
	sbci R17,255
	xcall _u16_Put
	.dbline 510
; 																				//
; 	return Socket;																// success
	movw R16,R10
	.dbline -2
L133:
	adiw R28,2
	xcall pop_gset3
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r Socket 10 pS[TTCPSocket]
	.dbsym l Port 12 s
	.dbsym l IP 8 l
	.dbend
	.dbfunc e TCP_RxSaveData _TCP_RxSaveData fI
;              i -> R10,R11
;            len -> y+16
;            Src -> R14,R15
;         Socket -> R12,R13
	.even
_TCP_RxSaveData::

⌨️ 快捷键说明

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