UDP Socket Problem...

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

UDP Socket Problem...

ソリューションへジャンプ
2,362件の閲覧回数
OOLife
Contributor III

 

Hello?

 

I'm testing UDP Socket program.

 

I made 8 UDP server tasks and each tasks has their own UDP socket.

(MQX Version  3.4.)

 

Every socket was created successfully. ( _RTCS_socket_part_init  is set to  10)

 

_RTCS_socket_part_init = 10;

 

My code works fine with short UDP frame less than 800 bytes frame.

 

But, If UDP frame is longer than 800, recvfrom() function is never return.

(I'm not sure the exact number. But, I just tested by 800 bytes frame and 900 bytes frame sending UDP client.)

 

So, I traced into recvfrom() and I found OVERRUN error.

Received packet length seems to correct, however packet was discarded.

 

I don't understand, why overrun error occured.....

 

How can I received Long(1500) UDP frame.

 

Who can tell me where I'm wrong or something can be modified?

 

I appreciate any kind of your reply...

 

Thank you.

 

ラベル(1)
タグ(1)
0 件の賞賛
返信
1 解決策
790件の閲覧回数
OOLife
Contributor III

Hi all

 

Finally, I got the answer.

 

Everything works fine !! :smileyvery-happy:

 

Don't create DMA Buffer (of RTCS Task) on the External Memory....

 

It's the answer.

 

BR

OOLife

元の投稿で解決策を見る

0 件の賞賛
返信
2 返答(返信)
790件の閲覧回数
OOLife
Contributor III

Hello, experts...

 

Following is my RTCS Setup code.

 

 _RTCSPCB_init = 4; _RTCSPCB_grow = 2; _RTCSPCB_max = 20; _RTCS_msgpool_init = 4; _RTCS_msgpool_grow = 2; _RTCS_msgpool_max  = 20; _RTCS_socket_part_init = 4; _RTCS_socket_part_grow = 2; _RTCS_socket_part_max  = 20;  _UDP_max_queue_size    = 3000;    _RTCSTASK_priority = 6; _RTCSTASK_stacksize = 10000;... error = RTCS_create(); error = ipcfg_init_device(0, mac); error = ipcfg_bind_staticip(0, &ip_data);...// Each Task call this function for socket binding.// currently, I used 8 UDP sockets.void Bindings( uint_32 *pSock, sockaddr_in *pladdr, uint_32 portNo ){ uint_32     error; pladdr->sin_family      = AF_INET; pladdr->sin_port        = portNo; pladdr->sin_addr.s_addr = INADDR_ANY; *pSock = socket(PF_INET, SOCK_DGRAM, 0); if( *pSock==RTCS_SOCKET_ERROR ) {  printf("error; port=%d\n", portNo);  _task_block(); }  error = bind(*pSock, pladdr, sizeof(sockaddr_in)); if( error!=RTCS_OK ) {  printf("error; bind port=%d, error=0x%lx\n", error);  _task_block(); }}// Each Task has infinite while loop.void TASK1( uint_32 initial_data ){ // local variable definition ... Bindings( &sock, &laddr, 20000 ); while( 1 ) {  rlen = sizeof(raddr);  length = recvfrom(sock, buffer, sizeof(buffer), 0, &raddr, &rlen);  printf("received length = %d\n", length);... }}

 

 

Abobe code works fine.

 

However, if frame size is longer than 823 bytes then recvfrom() is never return.

 

CW7.2 / RTCS / Ethernet Status  dialog is shown attached image.

 

Rx DMA Overrun: 63     --> this counter is exactly matched with my test sending counter.

 

How can I fix it?

 

Let me know if I the question isn't very clear.

 

I would like to know how to modify or check my souce code in order to prevent this Rx DMA Overrun error.

 

Regards.

 

0 件の賞賛
返信
791件の閲覧回数
OOLife
Contributor III

Hi all

 

Finally, I got the answer.

 

Everything works fine !! :smileyvery-happy:

 

Don't create DMA Buffer (of RTCS Task) on the External Memory....

 

It's the answer.

 

BR

OOLife

0 件の賞賛
返信