- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
http://forum.niosforum.com/work2/style_emoticons/<#EMO_DIR#>/wink.gif
I need to transfer a lot of data from PC to the 1c20 board . So, I try to modify the simple socket server project which provided by Nios II IDE . but , I find that the speed of the transfer is very slow. The speed is only 1.4 kbytes http://forum.niosforum.com/work2/style_emoticons/<#EMO_DIR#>/sad.gif I am very worry about the problem How to solve this problem ? thanks a lotLink Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have done the same. Since you probably do not send packets both ways (mostly TO the board), lwip waits for outgoing packets for some time before it ACKs a packet. You need to change the timeout for this counter, and you should also send an immediate reply for each packet.
Do the following in \altera\kits\nios2\components\altera_lwip\UCOSII\src\downloads\lwip-0.6.3\src\api\tcp.h: # define TCP_FAST_INTERVAL 100 You should try other values as well. Also, in tcp.c, change tcp_recved() to: void tcp_recved(struct tcp_pcb *pcb, u16_t len) { int ackNow=0; if ((u32_t)pcb->rcv_wnd + len > TCP_WND) { pcb->rcv_wnd = TCP_WND; } else { pcb->rcv_wnd += len; ackNow=1; } if (!(pcb->flags & TF_ACK_DELAY) && !(pcb->flags & TF_ACK_NOW)) { /* * We send an ACK here (if one is not already pending, hence * the above tests) as tcp_recved() implies that the application * has processed some data, and so we can open the receiver's * window to allow more to be transmitted. This could result in * two ACKs being sent for each received packet in some limited cases * (where the application is only receiving data, and is slow to * process it) but it is necessary to guarantee that the sender can * continue to transmit. */ tcp_ack(pcb); }else if((pcb->flags & TF_ACK_DELAY)&&(ackNow)){ //++cg[11/10/2004]: I think this is what Atte Kojo was talking about tcp_ack(pcb); } }- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
thanks martinlie ~
I follow your suggestion and the transfer speed is up to 100 kbytes . How can I do to reach the transfer speed of 1 M bytes per second ?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I don't know how lwip is built internally, but since it is "processor generic", I believe that the simplicity of porting the code is favoured over performance.
If someone could fill me in here, I would also be glad to know how to push performance. What system are you running on? (memory, speed, processor level)- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your figures sound very wrong. I routinely get close to 1 MBytes/s UDP transfer (using a 1c20 full featured design). You will also see in the MicroC/OS-II forum that someone has got throughput of 4Mbytes/s.
I'm afraid this is not a case of a simplified port over performance. It's mostly down to the performance of the lan91c111 interface. Useful things to boost performance are to raise the fMax and increase the size of the data cache. That said though your figures sound low.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
--- Quote Start --- I have done the same. Since you probably do not send packets both ways (mostly TO the board), lwip waits for outgoing packets for some time before it ACKs a packet. You need to change the timeout for this counter, and you should also send an immediate reply for each packet. Do the following in \altera\kits\nios2\components\altera_lwip\UCOSII\src\downloads\lwip-0.6.3\src\api\tcp.h: # define TCP_FAST_INTERVAL 100 You should try other values as well. Also, in tcp.c, change tcp_recved() to: void tcp_recved(struct tcp_pcb *pcb, u16_t len) { int ackNow=0; if ((u32_t)pcb->rcv_wnd + len > TCP_WND) { pcb->rcv_wnd = TCP_WND; } else { pcb->rcv_wnd += len; ackNow=1; } if (!(pcb->flags & TF_ACK_DELAY) && !(pcb->flags & TF_ACK_NOW)) { /* * We send an ACK here (if one is not already pending, hence * the above tests) as tcp_recved() implies that the application * has processed some data, and so we can open the receiver's * window to allow more to be transmitted. This could result in * two ACKs being sent for each received packet in some limited cases * (where the application is only receiving data, and is slow to * process it) but it is necessary to guarantee that the sender can * continue to transmit. */ tcp_ack(pcb); }else if((pcb->flags & TF_ACK_DELAY)&&(ackNow)){ //++cg[11/10/2004]: I think this is what Atte Kojo was talking about tcp_ack(pcb); } } --- Quote End --- Hello, I am using Quartus II version 10.0sp1. I did not found the# define and the function you mentioned. Can you advice me how can I achieve better data rates using TCP and simple socket server. Your prompt response is highly appreciated. Thanks & Regards
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi yctsai,
Do you mind to share with me your working simple socket server project? I am using the design example i can get from this forum but it doesnt work so far. Thanks. Please send it to my email account cafukarfoo@yahoo.com- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page