Habi Hablóg
Declaro:
XML válidoXHTML válido800x600 +
RSS válidoCSS válidoNavegador digno
  Blog   Archivo   Contacto   Administración  

Acerca de

Matemático, informático, aficionado a la electrónica, friki... y otras cosas que no vienen a cuento ni pasan los filtros de palabras.

¿Queríais un blog? Ahí va.

Red antisocial

¡Me van a volver loca! 2.0
La Fragata Portuguesa

Z
¡Me van a volver loca!

Últimos posts

El expediente X que nadie pidió
eNigma
La cuadratura del píxel
Portando desde Spectrum
Inexorable

Últimos comentarios

Habi
NoSupoResolverLaFuncion
Edu
Habi
EnriqueGG

Calendario

No hay fechas.

Categorías

Chorradas
Paranoias
Posts lúcidos
Tecnoesoterismo
Yuyus

Cenas de Abj

Abj debe 7 cenas.

Frase célebre

Abjurador dice: Pero vamos, una comida puede valer.

N-ésima cagada

Habi - 11/06/2011 1:25:29 - Yuyus

Por aquí tenemos la costumbre de terminar todos los refranes en "patada en la boca". En este caso tenemos: En casa del herrero, patada en la boca.

Bien. Todo comenzó cuando me pregunté cuán rápido podría ser el puerto paralelo de un ordenador moderno (integrado en su controlador IO y accedido a través de LPC) con respecto a uno clásico.

Así que me bajé un driver de acceso a puertos, el cual venía hasta con un componente escrito para Delphi. Vale, escribo un programa que accede 1M de veces a algún puerto y calcula la frecuencia. Y en el caso de $378 me da más de 80Mhz en escritura, y más de 75Mhz en lectura. Wow.

Al principio no me lo creí, pues el LPC debe dar un ancho de banda comparable al ISA. Pero después de ver que todo me iba bien decidí, erróneamente, aceptarlo; a saber cómo integran las cosas hoy en día, lo mismo colgaba del puente sur directamente.

Con eso puedo adaptar una unidad de disco y controlar todos los aspectos desde el PC, sin usar controladora ni nada; eso pensé, pues estaba haciendo un proyecto similar a través de USB y esto me simplificaba mucho. Así que me dispuse a ello:

Para acelerar, pasé de usar el componente y llamé directamente a las funciones del driver desde mi programa. Se hacen algunas funciones básicas (como dirección, paso, …), otras intermedias (como Index, Seek), y a probar.

Conecto, le hago los primeros tests, y… ¡perfecto! Descubro que la señal IDX no se apaga inmediatamente, sino que se mantiene un rato (arreglo fácil) y el resto (control del motor, cabezales, densidad, lectura, escritura, etc.) van perfectos. Puedo, en efecto, leer las magnetizaciones y decodificar todo con el PC, pudiendo por tanto leer discos de Amiga, C64, etc.

Así que me dedico a almacenar valores, temporizados con QueryPerformanceCounter y es entonces cuando descubro con horror que captura muchos menos de los que debería. Haciendo pruebas veo que las lecturas al puerto son mucho más lentas de lo que esperaba, algo más de 350Khz (bastante superior a un puerto paralelo normal, pero yo necesito al menos un par de Mhz para lo que quiero; y muy por debajo del ISA, ¿nos frena el integrado en este caso?).

Y es que no basta con crear el componente de acceso a puertos; además hace falta llamar a un método para su inicialización interna, que no se llama desde su constructor. Una vez llamado, los resultados son los mismos.

Finalmente, ya estaba pensando abandonar el prototipo en placa de agujeros y volver a mi diseño original con PIC e interfaz USB 2.0 cuando me he dado cuenta de algo: la contención es realmente similar en otros puertos em los que no debiera serlo; es decir, es consecuencia del overhead de los cambios a modo núcleo, IO, etc. Ayh. Usando otro método en un SO de 32 bits logro más de 750Khz, y lo mismo bajo Linux con ioperm / iopl. Ayh ayh. En cualquier caso insuficiente, gracias a esta arquitectura chapucera.


Zarith - 13/06/2011 17:19:16

Si ya te lo decía yo. Anda, pilla el USB y tira.  
Ayh, aficionados...



Habi - 13/06/2011 22:39:56

Realmente converges al "FIRST!!!!111!!!" 
 
Háztelo ver. Y lo del comentario también.



L - 15/06/2011 15:45:35

Yo estoy con Z. USB, y si puede ser, 1.1.



z - 15/06/2011 17:31:14

Unmm... Yo no bajaría del 2.0.




Post cerrado