Mostrando entradas con la etiqueta TMS320F28377D. Mostrar todas las entradas
Mostrando entradas con la etiqueta TMS320F28377D. Mostrar todas las entradas

domingo, 13 de julio de 2014

F28377D, Módulo IPC (II)

Como ya os dije en la entrada anterior, una vez os expliqué por encima como funciona el sistema de mensajería entre los dos núcleos del F28377D, toca ponerlo a prueba.
He diseñado dos programas, uno para cada CPU, sencillos en los que se puede ver de forma clara como utilizar este sistema de mensajería. El programa, como he dicho es muy sencillo, la CPU1 envia un mensaje compuesto por 3 bytes, uno de comando, otro de dirección y otro de dato, una vez enviados, hace saltar la interrupción del canal 1 del IPC en la CPU2. Esta, una vez ha almacenado los datos e las variables correspondientes, le devuelve un valor, y hace que en la CPU1 salte la interrupción del canal 0 del IPC, que lee el valor devuelto. Los códigos son los siguientes:

Lo primero que hacemos en los dos núcleos es inicializarlos mediante la función InitSysCtrl(), que se encuentra en el archivo F2837xD_SysCtrl.c. En esta función se inicializa el PLL y el oscilador para obtener una velocidad de 190MHz. Después, en la CPU1 se inicializan los GPIO. Aquí, en el caso que lo necesitaramos, seria donde la CPU1 cedería el control de los GPIO correspondientes a la CPU2. En este caso no se ha hecho. Una vez hecho esto, todo lo relacionado con la inicialización del PIE i las interrupciones se hace del mimo modo que en cualquier C28. Lo siguiente es en la CPU1 preparar el mensaje que queremos mandar, escribirlo en los registros correspondientes y activar la interrupción del IPC1 en la CPU2. Mientras en esta vamos a bucle principal a esperar a que salte la interrupción. Una vez han llegado los datos, los pasamos a la variables correspondientes, y devolvemos un valor de respuesta. Para avisar a la CPU1 que hemos recibido correctamente los datos, activamos la interrupción del IPC0 en la CPU1, y este lee la respuesta.
A partir de este programa se pueden hacer otros más complejos y utilizando mas periféricos. Espero que os resulte interesante y probéis estos potentes microcontroladores.

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.

sábado, 28 de junio de 2014

F28377D, programando un doble núcleo.

Hola a todos!! Hace unos meses envié un correo electrónico a Texas Instruments preguntándoles si sería posible que me mandaran uno de sus nuevos microcontroladores de la familia C2000 de doble núcleo, de forma que los pudiera probar y escribir entradas sobre ellos, sin casi ninguna esperanza ni siquiera de recibir respuesta. Para mi sorpresa, después de un par de correos más contándoles mi experiencia con microcontroladores de la familia C2000 se pusieron en contacto conmigo para darme la genial noticia de que me iban a mandar uno de esos microcontroladores, y hace una semana lo recibí calentito desde Texas Instruments!.


Estos nuevos microcontroladores son, sin duda, lo más potente que hay ahora mismo en el mercado. Internamente cuenta con dos microcontroladores de la serie delfino, cada uno con su propia unidad en punto flotante, además de 2 coprocesadores matemáticos (Control Law Acelerators), funcionando en paralelo a los principales, con lo que en total, este integrado cuenta con 4 procesadores independientes. Los dos procesadores principales pueden funcionar hasta 200MHz, por lo que haciendo funcionar los dos en paralelo alcanzamos una velocidad de 400MHz, aunque desde Texas Instruments dicen que podemos llegar hasta 880MIPS equivalentes.
Toda esta velocidad que encontramos dentro del procesador, no valdría de mucho si no somos capaces de adquirir señales del exterior también a una ata velocidad, para eso, el F28377D cuenta con 4 conversores analógico - digital que tienen dos modos de funcionamiento. Podemos hacerlos funcionar con una resolución de 16 bits, y a una velocidad de 1MSPS, lo que se traduce en 4MSPS haciendo funcionar los 4 en paralelo, o bien si necesitamos mayor velocidad, podemos sacrificar un poco la resolución bajándola a 12 bits y tendremos 3.5MSPS en cada conversor, o 14MSPS en total.
A parte de estas características, cuenta con todas las de los microcontroladores de la serie Delfino, 24 canales PWM, conversor digital - analógico de 12 bits, 4 buses SCI, 2 buses I2C, PWM de alta resolución...


Para poder gestionar los dos núcleos internos, el f28377D tiene una configuración Maestro - Esclavo, de forma que tenemos la CPU1 que es la que tiene el control, y la CPU2 está a sus ordenes. Desde la CPU1 tenemos el control de todos sus periféricos propios, como son sus temporizadores, su FPU, además del control de todos los GPIO. La CPU2, también controla todos sus periféricos propios, pero no puede controlar ningún GPIO , ni ponerse en marcha por si misma. Lo que debemos hacer es desde la CPU1, arrancar la CPU2, y de esta forma ya tenemos los dos núcleos corriendo sus propios programas. Para poder controlar los GPIO desde la CPU2, es la CPU1 la que debe ceder el control de estos, una vez hecho esto, la CPU2 tiene acceso a los pines cedidos, como si de los suyos propios se tratara.
Para que los dos Delfino puedan comunicarse entre ellos, existen un módulo IPC de comunicación. El módulo IPC (Inter Processor Communication), consta de un sistema de mensajería entre los dos procesadores, y mediante interrupciones, y una memoria SARAM compartida, de forma que cuando queramos compartir algún dato entre las CPUs, guardamos el dato en la memoria SARAM compartida, y mediante el sistema de mensajería le decimos a la otra CPU que tiene el dato disponible. Además de estos mensajes, para evitar el acceso simultaneo a una misma dirección de memoria, el sistema cuenta con un sistema de semáforos.



En cuanto a la programación, cada proyecto para el F28377D cuenta con dos proyectos independientes, uno para cada CPU. Y a la hora de programarlo, debemos programar cada uno d elos núcleos por separado, y luego arrancarlos de forma separada, en primer lugar la CPU1, y luego la CPU2. Esta secuencia de arranque es lógica si tenemos en cuenta que hasta que la CPU1 no arranque la CPU2, esta no va a hacer nada, pero sin embargo si que podemos arrancar solo la CPU1 sin utilizar la segunda. Además de las dos CPUs, también tenemos las dos CLA, las cuales cuentan con sus propio código también, que arrancamos y ejecutamos desde su CPU correspondiente.
En resumen, existen muchísimas posibilidades con este microcontrolador. En las próximas entradas os iré explicando más sobre este microcontrolador, y me gustaría hacer un par de vídeos.