[DS] Peleando con el Wifi

Ufff,

tengo un lio en la cabeza, que no se ni como titular el hilo :p

El problema, es multiple, asi que empezaré por el principio y aviso que será largo:

Desde hace unos dias, tengo un punto de acceso Wifi, creado a partir adaptador oficial de Nintendo, mediante el truco del almendruco que no viene a cuento explicar ahora.

Vale, con esa 'excusa', me propongo portar la librería Wifi a lo que ya tengo hecho, pero el problema que se intuye, es que en ARM7 habrá problemas, ya que el soporte multithread ocupa bastante y, la libreria Wifi no se queda manca...

El caso es que despues de pequeños arreglos, la cosa acaba rulando.

Desde el PC, usando protocolo TCP/IP, consigo mandar a la DS un archivo de texto, mediante un servidor que creo en el PC, Ahoratoca hacer algo mas exigente y me acuerdo del plugin del Winamp que ha hecho un pavo, pero de momento, no hay fuentes por ningun lado (y creo que no lo tendremos...)

Así que me voy a la pagina del Winamp y ahí tienen una serie de ejemplos para poder construir una DLL que sirva de salida al Winamp.

Vale, dentro de mi DLL, creo un servidor (basado en el anterior) que se encarga de mandarme los samples de audio.


Pues bueno, la cosa es que en la DS, la cosa chuta, pero se ve que se desborda por algun lado y acaba entrecortandose el sonido (eso cuando no empieza asi) y lo curiosos, es que se que del PC no es, y no parece probable que el PC sature a a DS, cuando para enviar algo, necesita que yo se lo pida, pero es que ademas, al rato de suceder eso , la consola deja de responder.


Para abreviar al maximo, decir que he probado todo, a cambiar el tamaño de la pila, incluso he portado el codigo de ARM7 a la seccion de ARM9... usando una serie de truquillos (porque se sigue ejecutando desde ARM7) pero aqui se acaba pagando un precio: que la prioridad en los accesos del ARM9, ralentiza lo suyo y claro, si ya se atragantaba...


Una cosa que tengo descartada, es que el problemasea fruto de alguna interferencia rara con mis librerias multithread, porque le he puesto todas las condiciones favorables y nada, nenes

Por supuesto... he probado ha compilar partiendo de los codigos de ejemplo de la libreria Wifi (sin multithread,etc) , y nada

CONCLUSION: O hay un bug muy gordo en la libreria Wifi (0.3-0.3A)
o es eso unido a que la DS es mas lenta que un caracol, que ya no tengo nada claro.


Por cierto, tengo una anecdota curiosa con mi libreria multithread:

Resulta que estoy tratando de reducir su tamaño y quitando varias cosas, descubro que hay algo muy raro que hace que la libreria pese muchisimo.

Total que haciendo una limpieza, el tamaño del binario de ARM7, me queda en 37KB (sic)

Despues de mirarlo mucho, elimino una funcion y el código se queda en tan solo 18KB

¿por que? Pues, mirando el codigo:

int Get_Thread_Percent_Use()
{
int ret=0;

multithread_disabled();
if(int_mthread_time)
ret=(int) ((((long long )thread_data.thread[thread_data.actual_thread].time)*100LL)+((long long) (int_mthread_time>>1)))/((long long) int_mthread_time);
multithread_enabled();
return ret;
}

la conclusion a la que llego, es que el codigo añadido para trabajar con long long (64 bits), es una BURRRADA, sobre todo si tenemos en cuenta que... esa funcion es mas bien decorativa, para saber mas o menos como se reparten los tiempos.... asi que en ARM7 la he suprimido


Ahora me toca deshacer algunas cosas y añadir otras nuevas.... si alguien ha leido este tocho y ha trabajado con la libreria Wifi, que me cuente que tal le ha ido a el y a ver si podemos solucionar el problema con dicha libreria...
Bueno,

han pasado ya varios dias y el panorama ha cambiado bastante.

Ahora tengo la libreria Wifi funcionando y parece bastane estable, aun que tengo que advertir, que la libreria Wifi es muy costosa en recursos .

Tal y como la he dejado, en el ARM7 causa perturbaciones en el resto de las interrupciones, lo que puede afectar al uso de los temporizadores (mejor dicho: afecta, sobre todo si es un temporizador mas o menos rapido)

La sincronizacion, tal y como yo la hago, entre ARM7 y ARM9 , me garantiza un flujo mejor de datos, aparte de que he cambiado unas cuantas cosillas en la libreria, para evitar en todo lo posible un bloqueo.

La tasa de transferencia maxima sostenida que he probado (es decir, el numero de bytes que se pueden recibir sin que la consola se bloquee) es de 88200 bytes, lo que da para reproducir audio a 22Khz y 16 bits o 44Khz y 8 bits

Tambien he tenido problemas con el Reloj de Tiempo Real, que aparte d ehaber añadido hace tiempo, una RPC para poder utilizarlo desde mis librerias, me he dado cuenta de que bloquea y mucho, el sistema.

No me extraña nada que ciertas aplicaciones les responda mal lapantalla tactil, teniendo en cuenta que normalmente, eso lo teneis colgando de la interrupcion VBLANK y que parece ser, la funcion se bloquea bastante tiempo, antes de devolver el resultado.

En mi caso, la tenia en un hilo especial que no permite el cambio de tareas hasta que se suspende, pero tiene habilitadas las interrupciones y aun así, llamando una vez por segundo a dicha funcion, una tarea que tenia de fondo, se congelaba practicamente, lo que me hace suponer que el tiempo que consume la funcion del reloj , es muy alto.

En fin mirare si es posible arreglar eso de alguna forma y a ver si puedo hacer pronto una nueva release de mis librerias, esta vez, con soporte Wifi.
Soporte wifi!!! te apoyamos hermes !!
Hola, necesito ayuda urgente... Ya hace un tiempo posteé comentando que tenía que hacer un proyecto de redes para la facultad y que había pensado hacer algo para DS. Llevo unos dias peleándome con el wifi, conseguí conectarme al router sin wep, después hice que se autenticara y todo perfecto. Hasta aquí usaba DHCP. Después probé llamar a la función Wifi_SetIP para ver si iba bien asignándole la IP, la máscara, el DNS, etc. a mano y no funcionó, así que volví al DHCP y ya no ha vuelto a funcionar... Se supone que pasando a Wifi_SetIP una IP=0 tiene que volver a obtener la IP automáticamente pero no me la da. Consulto el estado de la conexión y se asocia, se autentifica, pero se queda clavada esperando la IP del DHCP. Otras veces me dice que se conecta pero aún así en el router no consta que esté conectada y tenga una IP asignada. He probado otros Homebrew (DSOrganize, beup) y tampoco me conectan. Sólo consigo que me conecte el Mario Kart. Antiguamente configurando el wifi con el Mario Kart y conectando automáticamente después con mi aplicación (PA_ConnectWifiWFC() con las PAlib o Wifi_AutoConnect() con las ndslib) o con cualquier otra también me funcionaba, pero eso ahora tampoco funciona y no sé qué puede ser. Estoy muy rallada porque si no consigo que esto funcione el proyecto se nos va a la mierda... y ya no es solo que me haga ilusión conseguir que funcione sino que no tengo ganas de suspender una asignatura por haber querido ser original xD. Si alguien puede echarme un cable... ufff que me pida lo que quiera xD. Se lo agradecería a más no poder U_U.
Viva, he encontrado donde pones tus progresos!!
Enserio, desde que se creo el foro de desarrollo no había leído nada de ti, me alegro de que sigas duro en la scene de la DS.
Gracias por mejorar dia a dia el panorama de la DS
Sh1row escribió:Hola, necesito ayuda urgente... Ya hace un tiempo posteé comentando que tenía que hacer un proyecto de redes para la facultad y que había pensado hacer algo para DS. Llevo unos dias peleándome con el wifi, conseguí conectarme al router sin wep, después hice que se autenticara y todo perfecto. Hasta aquí usaba DHCP. Después probé llamar a la función Wifi_SetIP para ver si iba bien asignándole la IP, la máscara, el DNS, etc. a mano y no funcionó, así que volví al DHCP y ya no ha vuelto a funcionar... Se supone que pasando a Wifi_SetIP una IP=0 tiene que volver a obtener la IP automáticamente pero no me la da. Consulto el estado de la conexión y se asocia, se autentifica, pero se queda clavada esperando la IP del DHCP. Otras veces me dice que se conecta pero aún así en el router no consta que esté conectada y tenga una IP asignada. He probado otros Homebrew (DSOrganize, beup) y tampoco me conectan. Sólo consigo que me conecte el Mario Kart. Antiguamente configurando el wifi con el Mario Kart y conectando automáticamente después con mi aplicación (PA_ConnectWifiWFC() con las PAlib o Wifi_AutoConnect() con las ndslib) o con cualquier otra también me funcionaba, pero eso ahora tampoco funciona y no sé qué puede ser. Estoy muy rallada porque si no consigo que esto funcione el proyecto se nos va a la mierda... y ya no es solo que me haga ilusión conseguir que funcione sino que no tengo ganas de suspender una asignatura por haber querido ser original xD. Si alguien puede echarme un cable... ufff que me pida lo que quiera xD. Se lo agradecería a más no poder U_U.


Yo he tenido miles de problemas para echar esto a andar y todavia tengo que tratar de mejorarlo.

Lo primero es que las librerias de protocolos, parecen portadas deprisa y corriendo... y eso no es nada bueno XD

Yo para que me funcione medianamente, procuro no transferir muchos datos de golpe, cambio la sincronizacion para que use la interrupcion de IPC en vez d eusar FIFO y tambien aumento la frecuencia de las interrupciones que llaman a Wifi_Update

Tambien reduzco el tiempo de retardo de 25 ms a 5ms en SGIP_TCP_TRANSMIT_DELAY

La mayoria de los problemas se producen por falta de capacidad por parte de la consola, para gestionar la informacion que entra o sale.

En parte, se produce porque la persona que ha adaptado eso, lo ha hecho desde una libreria pensada para una maquina mas potente y en nuestro caso está deshabilitando las interrupciones para evitar que se se modifiquen datos, lo que hace que durante ese tiempo no se puedan enviar ni recibir nuevos datos y yo pienso que eso acaba provocando que la cosola se cuelgue.


Por cierto, vigila la optimizacion y emplea mejor las librerias de debug para poder visualizar los mensajes en pantalla y dar quizá con el posible problema
El wifi ha vuelto a funcionar, aunque no me preguntéis cómo xD. Tiene que ser sin wep, eso sí, pero el caso es que funciona y vamos a poder seguir con el proyecto :). Gracias a todos los que intentasteis ayudar.
6 respuestas