Hello Again. i don´t know what happend, but i have tested all solution and don´t work always is blocked in recv.
I follow the call stack, because the debug mode doesn´t work at the moment, and this the result 9 _handle_Data_Address_Read() 0x8001fa34 *//FAIL here is the last call* 8 xTaskRemoveFromEventList() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\tasks.c:1596 0x80012682 7 xTaskRemoveFromEventList() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\tasks.c:1596 0x80012682 6 prvUnlockQueue() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\queue.c:1056 0x80013358 5 xQueueGenericSend() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\queue.c:539 0x80012ee8 4 sys_sem_signal() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\NETWORK\lwip-port\AT32UC3A\sys_arch.c:138 0x80016eca 3 do_recv() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\lwip-1.3.0\src\api\api_msg.c:923 0x80011156 2 tcpip_thread() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\lwip-1.3.0\src\api\tcpip.c:271 0x8000ed84 1 <symbol is not available> 0xdeadbeef Do you know what is the cause of the problem? Another thing: I have deleted the task WEB and TFTP example and now that i have more memory the problem appear more frecuency in the connection of the accept socket: always don´t fetch a _malloc instruction. I´ll put the call stack the nex time Thanks Oscar On Thu, Oct 1, 2009 at 8:17 AM, Oscar F <[email protected]> wrote: > Thank you again Kieran, first i would tell you the situation today. > > i have three socket, i received data of two and fail in the other. The size > of the buffer today is 2048, but i have a message of 12000 bytes. In this > moment i can´t declare this buffer because the application crack and RTOS > don´t enter. this is my other problem and i hope solve too. > > I have tested to define a little buffer ( 10 bytes ) but recv( ) don´t > enter in this socket. i don´t understand because in two socket work!! and in > the other no. > > The other solution (" make recv non-blocking") should test, but one > question: If enter in the fucntion and the size received is not the total, > select wait again, no ? and i only would have to do the call to recv (not > blocking ) until the lengh of the message is total received. > > please , if i want to define a big buffer 12000, what variable of config i > have to change in RTOS and lwipopts should i change. My micro is > AT32UC3A0512 and i think i have enough memory ( 512 Kb falsh and 64K of > SRAM). today the program need 200Kbytes en flash. Maybe i need to define the > buffer in internal flash and not in the RAM memory. I not sure but this > declaration fail: > static portCHAR BufferRx[TAM_RX_RTU]; TAM_RX_RTU=2048. > Any advice? > > Regards > Thanks > Oscar > > The CODE today: > > while(1){ > FD_ZERO(&readset); > maxfd=0; > print_dbg(" Metemos los 3 Sockets por donde podemos recibir para > entrar en el select \n"); > for(i=1;i<4;i++) > { > FD_SET(aSocket[i], &readset); > print_dbg("socket : "); > print_dbg_ulong(aSocket[i]); > print_dbg("\n "); > if (aSocket[i]> maxfd) > maxfd = aSocket[i]; > } > > > > > // Check for received packets on configured sockets (blocking ) > ret = select(maxfd+1, &readset, NULL, NULL, NULL); > > print_dbg("select ha entrado \n"); > > if (ret > 0) //No error > { > //Check data for socket 1 > if (FD_ISSET(aSocket[1], &readset)) > * ProcessRequestPC_to_RTU(aSocket[1]); //DON¨T RECEIVE* > > //Check data for socket 2 > if (FD_ISSET(aSocket[2], &readset)) > * ProcessRequestPC_to_PCU(aSocket[2]);* *//RECEIVE OK* > > //Check data for socket 3 > if (FD_ISSET(aSocket[3], &readset)) > * ProcessRequestPC_Finish(aSocket[3]); //RECEIVE OK* > > } > else > { > print_dbg(" Error en select \n"); > CloseConnectionPC(aSocket,lSocket ); > return; > } > } > } > > > void static ProcessRequestPC_to_RTU (int s) > { > int result,nbytesRx; > long code_command,length_command; > > print_dbg("Recibido mensaje RTU \n"); > nbytesRx=0; //Total=0; > > result = recv(s, BufferRx, TAM_RX_RTU, 0); > if (result<=0) //Error or close connection > { > print_dbg("Fallo Recv \n"); > CloseConnectionPC(aSocket,lSocket ); > return; > } > nbytesRx+=result; //Byte received > print_dbg("Procesando RTU 1 \n"); > //Calculate the Length. ¡¡¡¡¡ I supposed that 4 byte are received always > TAKE CARE!!!!!!! > memcpy(&length_command, BufferRx, LENGHT_RX); > if (length_command!=nbytesRx) > { > do{ > result = recv(s, BufferRx+nbytesRx, length_command-nbytesRx, 0); > if (result<=0) //Error or close connection > { > print_dbg("Fallo Recv \n"); > CloseConnectionPC(aSocket,lSocket ); > return; > } > print_dbg("Procesando RTU 2 \n"); > nbytesRx+=result; > > } while (nbytesRx<length_command); > } > //All message is received > memcpy(&code_command, BufferRx+LENGHT_RX,L_CODE_RX); //copy the code of > message > > switch(code_command) > { > > > } > } > > void static ProcessRequestPC_to_PCU (int s) > { > int result,nbytesRx; > long code_command,length_command; > > print_dbg("Recibido mensaje PCU \n"); > nbytesRx=0; > > result = recv(s, BufferRx, TAM_RX_RTU, 0); > if (result<=0) > { > print_dbg("Fallo Recv \n"); > CloseConnectionPC(aSocket,lSocket ); > return; > } > nbytesRx+=result; > > //Calculate the Length > memcpy(&length_command, BufferRx, LENGHT_RX); > if (length_command!=nbytesRx) > { > do{ > result = recv(s, BufferRx+nbytesRx, length_command-nbytesRx, 0); > if (result<=0) > { > print_dbg("Fallo Recv \n"); > CloseConnectionPC(aSocket,lSocket ); > return; > } > nbytesRx+=result; > > } while (nbytesRx<length_command); > } > //All message is received > memcpy(&code_command, BufferRx+LENGHT_RX, L_CODE_RX); //copy the code > of message > > switch(code_command) > { > > > } > > } > > void static ProcessRequestPC_Finish (int s) > { > int result,nbytesRx; > long code_command,length_command; > > print_dbg("Recibido mensaje Finish \n"); > nbytesRx=0; > > result = recv(s, BufferRx, TAM_RX_RTU, 0); > if (result<=0) > { > print_dbg("Fallo Recv \n"); > CloseConnectionPC(aSocket,lSocket ); > return; > } > nbytesRx+=result; > > print_dbg("Procesando finish 1 \n"); > //Calculate the Length > memcpy(&length_command, BufferRx, LENGHT_RX); > if (length_command!=nbytesRx) > { > do{ > result = recv(s, BufferRx+nbytesRx, length_command-nbytesRx, 0); > if (result<=0) > { > print_dbg("Fallo Recv \n"); > CloseConnectionPC(aSocket,lSocket ); > return; > } > print_dbg("Procesando finish 2 \n"); > nbytesRx+=result; > > } while (nbytesRx<length_command); > } > //All message is received > memcpy(&code_command, BufferRx+LENGHT_RX, L_CODE_RX); //copy the code > of message > print_dbg("Comando recibido= "); > print_dbg_ulong(code_command); > print_dbg("\n Longitud= "); > print_dbg_ulong(length_command); > switch(code_command) > { > case ID_SPR_01: > print_dbg("\n cerramos pero falla"); > CloseConnectionPC(aSocket,lSocket ); > return; > > } > > } > > > > > > > > > > > > > > > > On Wed, Sep 30, 2009 at 4:44 PM, Kieran Mansley <[email protected]> wrote: > >> On Wed, 2009-09-30 at 12:48 +0200, Oscar F wrote: >> > Hello again, the problem continous, in this moment i have achived >> > accept the connection, then i have inserted in a select struct the >> > three request socket . >> > >> > When the customer send me a request i awake in select, but i can read >> > anything, the program block in recv. The size of this reception is >> > variable, in my first connection i ´must receive 10 bytes. >> >> My guess is that you're stuck in this bit: >> >> > result = recv(s, BufferRx,sizeof(BufferRx), 0); //Block the >> > program and i saw with wireshark that the message is full with 10 >> > bytes >> >> What is sizeof(BufferRx)? The recv() function may block waiting for the >> buffer to be full, so if you have given it a large buffer, you could >> have to wait a while for it to fill up and return. If I remember from >> your earlier posts you don't have much memory allocated to network >> buffers, so it may be that there are just not enough network buffers to >> hold that amount of data, and it never gets full, and recv never >> returns. >> >> You could either: >> 1) give a smaller length argument to recv() - it sounds like you only >> want 10 bytes of data, so give it the value 10. >> 2) make recv non-blocking by passing the MSG_DONTWAIT flag in the flags >> argument - it will then return whatever data it can get (which may be >> nothing, but as select has said there is some it should return >> something). >> >> Kieran >> >> >> >> _______________________________________________ >> lwip-users mailing list >> [email protected] >> http://lists.nongnu.org/mailman/listinfo/lwip-users >> > >
_______________________________________________ lwip-users mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/lwip-users
