Cosas mías

February 8, 2008

Hemos leído: Serial Port Complete 2nd. Ed. (Jan Axelson)

Filed under: Programación, Lecturas

Otro que ha caído como una pera madura de un árbol. Y no es porque no traiga información, que la trae, y mucha, sino porque… porque… aparte de los elementos de diseño hardware, que no me interesan lo más mínimo –para eso están los chatarrillas, como yo los llamo[1]-, no me aportan nada nuevo, sino más bien… se queda muy corto.

Pero veamos qué trae el libro. Los primeros capítulos son un poco rollo, con una serie de explicaciones teóricas sobre nomenclaturas, características y opciones. Los siguientes sí que les pueden resultar interesantes a los diseñadores de hardware, ya que incluso modela ecuaciones mediante código. Habla de largos máximos, de atenuaciones, masas, etc., todo ello cuestiones de diseño que no me incumben y de las que sé lo justo para poder lidiar con los problemas habituales cuando se programa con puertos serie de por medio. Sigue con más explicaciones teóricas sobre los puertos serie de los PC.

Luego trae dos capítulos enormemente interesantes ya que la literatura sobre el tema es bien escasa: RS-485, que es un RS-232 en el que se usan dos hilos diferenciales como soporte físico para el envío y recepción de datos, lo que tiene la ventaja de que al ser una señal diferencial tiene muchas menos pérdidas y en consecuencia permite cables de mayor longitud, y la desventaja de que no se permite enviar y recibir simultáneamente ya que ambos hilos se usan a la vez para la comunicación. Eso no quiere decir que no pueda ser bidireccional, sino que o bien se envía o bien se recibe. Personalmente he usado ampliamente este soporte físico para realizar comunicaciones dentro de una máquina, y lo cierto es que no tengo claro si las ventajas superan a los inconvenientes o al revés. En fin, con estos dos capítulos cualquiera se vería cualificado para diseñar sobre este formato de hardware.

Quiero hacer notar (y esto no viene en el libro), que existen protocolos más modernos y robustos basados en los hilos diferenciales, como el CAN, que usa la Mercedes dentro de sus coches. La ventaja es que resulta enormemente seguro en cuanto a pérdida de datos y que muchos temas de protocolos –como el de lucha para conseguir el control del bus- se llevan a cabo a nivel de hardware, con lo que liberan al programador de tareas bastante complejas y que llevan mucho tiempo desarrollar.

El capítulo 8 desvaría un poco, y seguro está puesto para llenar páginas: habla del Bluetooth, Wifi, etc. como protocolos serie… El primero de ellos lo es, pero el segundo seguro que no.

Dos capítulos dos sobre desarrollo con puertos serie bajo .NET (y a C++ y VB que los zurzan). Nada nuevo bajo el sol y que no esté contemplado más o menos bien leyendo la documentación de la MSDN. Aparte de algún gazapillo perdonable (un System.String se envía en formato UNICODE, no ASCII, sólo por poner un ejemplo, ya que hay alguno más), el texto trae los típicos ejemplos realizados en VB.NET y C#, facilones y evidentes. En el segundo profundiza algo más, explicando los eventos y cómo realizar programación asíncrona, aunque sólo toca la superficie.

Y es que lo que trae es apenas nada en cuanto a desarrollo de software en el que intervenga una o más UARTS, os lo digo yo que llevo buena mili con el tema.

Luego viene un capítulo sobre puertos serie sobre dispositivos, explicando un modelo de Microchip que incorpora una UART, tratando sobre cuestiones de diseño y de programación en C sobre dicho micro. Ciertamente es un capítulo loable, pero dado que cada microprocesador incorpora las UART y sus registros a su manera, tan sólo sirve para dar una ligera idea de lo que uno se puede encontrar cuando programa un procesador.

Y digo flojito porque una obra que se precie de completa debería haber contemplado este tema con mayor profundidad. Debería haber explicado cómo funcionan las UART dentro de un microprocesador grande, con toda la parafernalia de los niveles de interrupción, vectores instalables y prioridades de la UART frente a los timers (por poner un ejemplo). También debería haber cubierto en profundidad los chips UART, pastillas que llevan 4, 8 ó 16 UARTS y que se anexan al bus de datos (y cómo integrarlas dentro del firmware), o cómo montar cores UART dentro de una FPGA o similar…

Sí que trae un capítulo interesante pero de nuevo flojito sobre diseño de protocolos sobre canales serie. De nuevo apenas contempla lo más básico.

Finaliza con mucho rollo sobre convertidores USB-RS232, muchos de los temas apenas son interesantes porque de eso ya se ocupa el fabricante del chip, pero hay que llenar páginas poniendo rollos en lugar de escribir sobre lo que hay que escribir.

El libro no está mal, pero apenas cubre una iniciación tanto en el diseño del hardware como en el desarrollo con estos dispositivos; es perfectamente válido para cualquiera que empiece con el tema, pero desde luego no llega a los talones de cualquier aplicación o diseño de la Vida Real™.


[1] Que nadie se tome a mal el nombre. Dentro de lo que yo llamo nomenclatura simpática, un diseñador de hardware en un chatarrillas, un diseñador gráfico un pintamonas, y un jodío developer un chafateclas, y desde luego no hay ninguna intención peyorativa, sino que simplemente me resultan nombres tan irreverentes como yo mismo soy.

Hemos leído: USB Complete. Third Edition (Jan Axelson)

Filed under: Programación, Lecturas

Esta lectura, más que por devoción, ha sido por obligación, aunque cuando compré el libro lo hice por devoción. Es decir, mi idea era leer algo serio sobre USB para ver cómo funcionaba, y trastear un poco para poder añadir esa especialización a mi currículum… Pero tras haberlo leído mejor no pongo nada, que ya tengo suficientes quebraderos de cabeza.

He dicho que la lectura ha sido por obligación, y es cierto. Hace dos semanas me pidieron que evaluara hacer un driver USB para una placa que estamos haciendo, o más bien que estoy haciendo, pues estoy más o menos a cargo del tema completo, como si hubiera vuelto a mis orígenes… Recuerdo el cambio de color de cara del ingeniero cuando le comenté que tenía que hacer una placa conectada por USB (lo que, ahora que conozco el percal, entiendo perfectamente, ya que el chaval no es ningún gallina en cuanto al diseño de hardware se trata). Comenzamos a planificar el tema, y mientras él buscaba y evaluaba microprocesadores, chips necesarios y todo eso, yo leía afanosamente este libraco (encima estaba sin ordenador, con mi anterior placa base en el cielo –o infierno, vaya usted a saber- de las placas base, y esperando lo que ahora disfruto). Nos cruzamos una buena cantidad de llamadas, vamos lo típico, que si esto vale esto, que si necesito xx MPIS, que si puedo usar BGA, que cambia esto del protocolo de comunicaciones porque no voy a poder atenderte… Hasta que acabé de leer el libro. Entonces hice La Llamada.

YO: ¿Querías un USB puro?

JEFE: Sipi.

YO: 6 meses + fase beta + fase de pruebas sólo para el driver…

JEFE: ¿A cualo?

YO: Lo que oyes.

JEFE: ¿No se puede acortar?

YO: No creo… -Pensando que en un par de meses podría estar, pero porsiaca…

JEFE: Pos vaya…

YO: Peeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeero…

JEFE: ¿Sí? – Con tono esperanzado

YO: Podemos usar esta solución. Cada chip lleva número de serie, el driver te lo da el fabricante, acortamos también el desarrollo de nuestro hardware porque la solución nos da un acceso directo a una UART, hay dos fabricantes, si uno falla tenemos al otro aunque cambiarlo requiere cambios en el hardware…

JEFE: Pos fale…

Y luego hice la otra llamada: -Gallinica, que vamos a usar lo que has propuesto. Vuelta del color a su cara, y todos tan contentos.

Bueno, después de la anécdota, vamos al libro.

No está mal, aunque no es lo que esperaba (más bien el USB no es lo que esperaba, pero bueno). Comienza explicándonos qué es el USB, su velocidad y lo compara con otros protocolos serie, describiendo también los cuatro modos y las cuatro velocidades junto a qué soporta cada clase…

Luego entra de lleno a explicar cómo funciona el protocolo en sí, cómo se forman los comandos y su contenido, de qué tenemos que preocuparnos y de qué no (por ejemplo, todo el tema de códigos de control, CRCs y demás lo hacen los chips directamente).

Y aquí es donde me entró el canguelo… En mi vida laboral he diseñado varios protocolos que han ido por encima de hilos RS232, RS485, Paralelo (no necesariamente de 8 bits), sockets, incluso pines sueltos de un microprocesador, pero nunca he visto algo tan barroco ni tan enrevesado. Es increíble la complicación del protocolo, tan increíble que pienso mal de él. Que si transaction que si token packet, que si pid, que si endpoint, que si data, que si frames, que si latencias… Y luego están los cuatro modos. Y no hablemos de la negociación e identificación cuando se enchufa un dispositivo USB con las quince espuertas de mensajes que se tienen que enviar, y más aún cuando arrancan y soportan ahorro de energía y cosas así. Ahora entiendo por qué hay tanto driver mierdoso… Lo que es mierdoso no es el driver, sino el protocolo.

Digo que pienso mal porque un protocolo diseñado con esta mala leche sólo puede tener alguna de estas explicaciones: O bien los que lo hicieron cobraban por tiempo de discusión, o por complejidad o quisieron cerrarlo tanto que sólo unos pocos fueran capaces de entender y desarrollar el protocolo…

Continuando con el libro, el autor nos cuenta cómo funciona cada modo y las APIs que hay para hacerlo funcionar. También comenta –por encima- cómo hacer un driver. Y da algunos ejemplos sin mucha utilidad para trastear desde Visual Basic y C++. El libro está centrado en explicar el funcionamiento de la clase HID (Human Interface Device), quizás la más común de todas las clases de dispositivos USB aunque también entra en las demás.

El libro termina con las especificaciones eléctricas y con un capítulo sobre algo llamado USB-on-the-GO, que no he leído y que tampoco sé qué es ni me interesa saberlo.

Hemos leído: Multithreading Applications in Win32 (Beveridge y Wiener)

Filed under: Programación, Lecturas

Este libro ha sido una completa decepción ya que sin ser malo –que lo es-, no me ha aportado nada nuevo. Yo esperaba descubrir esplendorosas técnicas más allá de lo habitual… pero o no las hay o los autores no se enteran mucho.

El libro ha envejecido bastante bien, ya que si obviamos los comentarios sobre Windows 3.x, 95 y NT, casi todo lo explicado continua siendo actual y útil… bugs incluídos. Eso no es óbice para que los ejemplos sean pésimos y empleen código bastante malo y desactualizado. Si bien lo último es lógico, lo primero no. Las carencias del código llevan hasta a no liberar objetos del núcleo y del GDI en algunos ejemplos… algo inaceptable dentro del código moderno (y menos aún del anterior, ese olvido terminará degradando Windows 95 hasta que nos fuerce el reinicio).

Los autores presentan una descripción somera sobre multitarea, y luego pasa a contarnos cómo usar un hilo mediante CreateThread() y cómo esperar a que éste acabe de forma incorrecta –ellos mismos lo dicen-. Tras eso nos cuentan cómo utilizar las funciones Wait… (WaitForSingleObject, WaitForMultipleObjects, …) para recibir el evento de finalización.

Luego viene un capítulo clásico que explica las secciones críticas, los mutexes, los semáforos y los eventos (éstos últimos explicados de forma bastante oscura y barroca), sin aportar nada nuevo y enfocados al tema práctico, explicando con qué funciones de Win32 se pueden hacer.

También nos cuenta cómo suspender y activar los hilos, y cómo cambiar su prioridad.

Un tema bastante interesante, pero visto casi de pasada, es la entrada/salida asíncrona. Es decir, la I/O overlapped, las APC y los completion ports. La Overlapped I/O funciona ordenando una lectura/escritura y esperando el evento correspondiente de que se ha producido (así es cómo funciona la E/S dentro del .NET y por eso un programa en C# que lea y escriba frecuentemente se ejecuta incluso más rápido que un programa hecho en C++ siempre que no use esas técnicas, que suele ser lo habitual). Las APC son algo más o menos igual, pero los completion ports son una cucada (y es una de las cosas que había leído que existían pero que no había mirado todavía); Creas un pool de hilos, los asignas mediante unas funciones y e voilà, el sistema se encarga de ir despertando/durmiendo los hilos conforme vayan haciendo falta. Todo un hándicap para la programación de servidores.

Y luego entramos en la segunda parte, los temas avanzados, como el uso de volatile y el concepto de transacción. Continúa un nuevo capítulo sobre el uso de hilos con la CRT, o más bien qué cosas hay que tener en cuenta cuando se usan hilos que llaman a funciones de C estándar.

Otro más sobre C++ y cómo C++ facilita la eliminación de errores potenciales gracias a los constructores/destructores, así como la técnica para que las funciones miembro de una clase puedan ser usadas como funciones de hilo…

Sigue con los hilos bajo MFC, la separación entre hilos con bucle de mensajes e hilos sin él, y las cosas que hay que tener en cuenta cuando un hilo maneja o accede a ventanas…

El GDI y las cosas a tener en cuenta cuando se trabaja con elementos del mismo, que no son seguros en cuanto a hilos y la demostración de que la peor técnica para controlar ventanas MDI es usar un hilo para cada ventana.

El siguiente es un poco risible. Cómo depurar programas que usen hilos; en fin, aparte de lo habitual, el autor recomienda determinación, paciencia y creatividad.

Los dos siguientes, pese a ser poco profundos, resultan interesantes: DLL e hilos dentro de ellas y comunicación entre procesos: ficheros mapeados en memoria, pipes, memoria compartida, mailslots, DDE, OLE… El problema es que cuando podría profundizar, toca todos estos temas de refilón. En fin.

El libro termina desvariando un poco, con un capítulo sobre diseño de aplicaciones, ISAPI y poco más.

Ciertamente es una obra demasiado sencilla dado lo complejo del tema y pese a ser tan monotemática…

Get free blog up and running in minutes with Blogsome
Theme designed by Gary Rogers