lunes, 7 de marzo de 2016

Código Assembler del 'C' para el Zynq

Introducción


Para los que hicimos nuestros primeros programas para microprocesador en Assembler (algún tiempo atrás :) ) , aun hoy en día es lindo 'ver' el código assembler generado desde el 'C' que escribimos en nuestra aplicación que sera ejecutada en el Zynq. 
Pero, por otro lado, algunas veces es necesario escribir una rutina o una funcion directamente en Assembler, sobre todo cuando es necesario una muy alta frecuencia de funcionamiento/calculo. 
La herramienta SDK, que es parte del entorno Vivado de Xilinx, tiene un modo de 'ver' el Assembler generado desde el 'C'/

Uso de la Herramienta Xilinx Microprocessor Debugger (XMD) 


XMD es una herramienta que facilita la depuración (debug) y verificación de sistemas implementados en Dual ARM Cortex-A9 (también se puede usar con MicroBlaze y Power PC). 

SDK provee una consola llamada Consola XMD, donde se puede escribir un comando XMD para que sea ejecutado. Los comandos usados son del tipo Tool Command Language (Tcl). 

La Consola XMD se puede abrir de dos modos diferentes: 
  1. Cuando se activa la perspectiva Debug, la Consola XMD se abre automáticamente. 
  2. En la perspectiva C/C++, se debe hacer Xilinx Tool-> XMD Console. 
Una captura de pantalla de la Consola XMD (en la perspectiva Debug) es mostrada a continuación:


Tal como se puede apreciar, la Consola XMD es una típica consola Tcl, donde es posible ejecutar cualquier comando Tcl permitido por XMD. El comando a ejecutar se debe escribir a continuación del indicador XMD%.

Nota: hay una herramienta mas completa que 'casi' reemplazaría a XMD, que se llama Xilinx System Debugger Command-line Command-Line Interface (XSDB). SDK también provee una Consola XSDB (que será explicada dentro de poco). Sin embargo, aun hay comandos que solo están disponibles en la Consola XMD, tal como es el comando que veremos a continuación. 
 
Entonces, volviendo al objetivo de este post, para ser capaz de 'ver' el código Assembler generado desde el 'C', el comando XMD a escribir es el siguiente: 

arm-xilinx-eabi-objdump -S .elf

En la figura debajo se muestra el lugar donde se debe escribir el comando, y la sintaxis completa (notar el uso de doble barra atrás '\\'): 


Para ejecutar el comando se presiona . El resultado de la ejecución del comando se muestra en la siguiente figura, junto con algunos títulos indicativos de las distintas partes del archivo generado: 


El archivo es de un gran tamaño. Pero es fácil de seguir si se tiene algo de experiencia usando lenguaje Assembler. 

Bien, hasta acá llegamos con este post, espero que les sea útil..  :) 

miércoles, 2 de marzo de 2016

Error (en algunas versiones): "undefined reference to Xil_ICacheDisable"

Introducción


Cuando comencé mis primeros pasos con Vivado-SDK me encontré con un problema bastante raro, y aún hoy me preguntan por ese problema, así es que aquí lo publico. 
Resulta que tratando de hacer el proyecto mas simple de todos, el famoso Hello World, me encontré con 10 errores en el SDK... ! Como a pesar de seguir todos los pasos de distintos tutoriales puedo generar diez errores con el proyecto Hello World... ??!!

Encontrando y Solucionando el Problema


Siguiendo los pasos descritos en distintos tutoriales genere el proyecto Hello World en Vivado. Acá ven una captura de pantalla del diseño (creo que es lo mas simple que se puede hacer en Vivado ! :) ) ... : 


Una vez generado el diseño, seguí todos los pasos para primero Export Hardware, y luego invocar SDK
En el entorno SDK, cree una nueva Application Project basada en el patrón (template) Hello World. Luego ejecuto Build Project, y acá aparecen los errores: 


Entonces, lo primero que hago (lo que uno casi siempre hace :) )... es buscar ayuda en la web...., busqué, busqué, y ... nada encontré... Así es que empece a investigar por mi lado y descubrí lo que parece ser un 'bug' en la versión 2015.1 de Vivado: aún cuando la interface DDR no está configurada en hardware, es generada incompletamente en software. 

En un proyecto tan simple como el Hello World, no hay ninguna necesidad de usar la memoria externa DDR disponible en el ZedBoard. Por lo que no hay necesidad de habilitar la interface DDR en el Zynq. Sin embargo, para solucionar los errores presentados anteriormente es necesario habilitar la interface DDR, aún cuando no se vaya a realizar ninguna Rd/Wr en la DDR. 
Nota importante: otras versiones de Vivado no generar estos errores. 

Una vez que se  agrega la interface DDR (en el entorno Vivado, ver figura debajo) y se regenera el hardware y el Application Project, los errores no vuelven a aparecer cuando se ejecuta Build Project.


En un próximo post detallo como se fuerza al linker para usar la OCM (On Chip Memory) para ejecutar el Hello World.