lunes, 7 de julio de 2014

F28377D, Módulo IPC (I)

Cuando tenemos un sistema multiprocesador, en el que los núcleos tienen que compartir información, esto puede ser una desventaja, ya que, por muy potentes y rápidos que sean los procesadores, la velocidad de la comunicación siempre suele ser menor, por lo que ahí se produce lo que se llama, un cuello de botella.
Lo ideal si queremos grandes velocidades de comunicación es utilizar interfaces en paralelo, de forma que si tenemos un reloj a 10MHz, sabemos que en cada pulso de reloj, tenemos un dato completo. La desventaja de este sistema es evidente, necesitamos un bus de datos, cuyo tamaño de palabra sea lo mas parecido al de los datos que queremos enviar, ya que si es menor, necesitaremos más de un ciclo de reloj para enviar un dato. Esta comunicación, si tenemos dos procesadores independientes, debemos ocupar un buen puñado de GPIO, por lo que puede ser una gran desventaja. Para los casos en los que no disponemos de GPIO de sobra, existen las comunicaciones serie, que aunque cada vez las velocidades a las que funcionan los periféricos, nunca llegarán a la velocidad de un puerto paralelo.
Todo esto cambia cuando los dos procesadores se encuentran dentro de la misma pastilla de silicio, como es el caso de el TMS320F28377D. En este caso, Texas Instruments podía haber optado sin ningún problema por una comunicación paralelo, y el sistema hubiera funcionado bien, pero no tan bien como funciona con lo que ellos han llamado Inter Processor Communication, o periférico IPC.
Este modulo incluye un conjunto de periféricos para comunicarnos de formas diferentes entre las dos CPU. Lo primero que vemos es una memoria RAM de doble puerto. Esta memoria, en principio está controlada por la CPU1, siendo esta la unica que puede leer en ella, escribir en ella, o incluso ejecutar código desde ella, mientras que la CPU2 tan solo puede leerla. Si queremos ceder el control a la CPU2 lo podemos hacer desde el código. Esta memoria compartida, si bien esta dentro del periferico IPC, yo no la consideraría un sistema de comunicación, ya que no está destinada a mandar mensajes, sino a compartir el valor de ciertas variables. Lo que si que es indudablemente un sistema de comunicación es la memoria RAM destinada al paso de mensajes, y es esta la que voy a explicaros un poco más en profundidad en esta entrada.


Este módulo dispone de 2 bloques reservados de memoria de 2kB, a través de los cuales, mediante una seria de registros podemos intercambiar mensajes directamente. Estos 2kB si que vienen asignados a cada una de las CPU, de hecho aparecen como tal en el mapa de memoria.


El nombre de cada uno de los bloques nos dice la dirección en la que fluye la comunicación. El acceso a estos bloques de memoria se hace a través de un conjunto de registros, 8 en totoal para cada procesador, 4 para enviar datos, y 4 para recibirlos.
Los 3 primeros registros los podemos utilizar como más nos convenga, lo ideal es que nos creemos un protocolo propio de comunicaciones en el que tengamos una serie de comandos, y una serie de daros que podemos utilizar como queramos.
Por ultimo decir que desde cada una de las CPU podemos activar hasta 32 flags en la CPU remota. La mayoría de estos hemos de revisarlos periódicamente mediante polling, y solamente 4 de estos generan interrupción en la CPU remota, suficientes para poder realizar una perfecta comunicación entre los dos núcleos.
En la siguiente entrada os pondré un ejemplo de la utilización de este módulo.

No hay comentarios:

Publicar un comentario