Problema con el Echo Server en Spartan 3A DSP 1800

Lo primero hola, soy nuevo en el foro y no sé si hay que presentarse en algún lugar específico.
Me llamo Carlos, soy de Madrid y espero ayudar en lo posible en el foro y para empezar, que me ayuden a mí un poco

El caso es que tengo la spartan 3A DSP 1800 y estoy aun en etapa de "investigación". Trabajo con la herramienta EDK de xilinx, en Windows.

Después de realizar varios ejercicios como el Hello World, un pwm y algún ejemplo de interrupciones y creación de periféricos quería pasar a comunicaciones TCP.
Hice el ejemplo webserver con éxito y ahora quería probar con el echo server, pero no me funciona bien.
Me arranca la ejecución, pero se queda bloqueado al escribir cualquier cosa. Creo que es en la instrucción lwip_accept donde se bloquea. Entonces claro, escriba lo que escriba en la consola ya no pasa nada...
No estoy muy puesto en procesos, los estudié hace bastante tiempo y no me aclaro si hago algo mal, se me queda dormido el proceso o no sé...

éste es mi código echo server.c

#include <stdio.h>
#include <string.h>
#include "lwip/inet.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include "lwipopts.h"
u16_t ECHO_PORT = 7;
void print_echo_app_header()
{
xil_printf("\n\r-----lwIP echo server ------\n\r");
xil_printf("You can connect to the echo server @ port %d\n\r", ECHO_PORT);
}
/* thread spawned for each connection */
void process_echo_request(void *p)
{
int sd = (int)p;
int RECV_BUF_SIZE = 2048;
char recv_buf[RECV_BUF_SIZE];
int n, nwrote;
xil_printf("echo server processing requests for sd: %d\n\r", sd);
while (1) {
/* read a max of RECV_BUF_SIZE bytes from socket */
if ((n = read(sd, recv_buf, RECV_BUF_SIZE)) < 0) {
xil_printf("%s: error reading from socket %d, closing socket\n\r", __FUNCTION__, sd);
close(sd);
return;
}
/* break if the recved message = "quit" */
if (!strncmp(recv_buf, "quit", 4))
break;
/* handle request */
if ((nwrote = write(sd, recv_buf, n)) < 0) {
xil_printf("%s: ERROR responding to client echo request. received = %d, written = %d\n\r",
__FUNCTION__, n, nwrote);
xil_printf("Closing socket %d\n\r", sd);
close(sd);
return;
}
}

/* close connection */
close(sd);
}
void echo_application_thread()
{
int sock, new_sd;
struct sockaddr_in address, remote;
int size;
if ((sock = lwip_socket(AF_INET, SOCK_STREAM, 0)) < 0)
return;
address.sin_family = AF_INET;
address.sin_port = htons(ECHO_PORT);
address.sin_addr.s_addr = INADDR_ANY;
if (lwip_bind(sock, (struct sockaddr *)&address, sizeof (address)) < 0)
return;
lwip_listen(sock, 5);
size = sizeof(remote);

while (1) {
new_sd = lwip_accept(sock, (struct sockaddr *)&remote, &size);
sys_thread_new(process_echo_request, (void*)new_sd, DEFAULT_THREAD_PRIO);

}
}


Muchas gracias.

Saludos.
 
Atrás
Arriba