Debugging con Wiggler, !OpenOCD y Toolchain GNUARM:

Tabla de Contenidos

Debugging con Wiggler, !OpenOCD y Toolchain GNUARM:

Hardware:

Esquema de la interconexión de los dispositivos:

JTAG:

Usos

Interfaces de hardware JTAG

Referencias

Wiggler clone:

Circuito:

Placa y distribución de los componentes:

Software

!OpenOCD:

Compilando !OpenOCD desde la SVN:

Comandos generales:

Daemon

Manejador de estado del Target:

Comandos de acceso a memoria:

Comandos para la memoria Flash:

Comandos específicos ARM7/9

Uso de !OpenOCD:

Archivo de configuración para ARM7 LPC2114 y Wiggler:

Consideraciones puerto paralelo y usuarios:

Conectando el Wiggler con !OpenOCD:

Uso básico con programa alojado en RAM usando arm-elf-insight:

Consideraciones linker script:

Consideraciones placa de desarrollo ARM:

Ejemplos:

Estado Actual del Proyecto:

Hardware:

Esquema de la interconexión de los dispositivos:

<table align="center" border="0"><tbody><tr><td><img src=%ATTACHURL%/EsquemaDebug.png /></td></tr></tbody></table>

JTAG:

JTAG, the Joint Test Access Group, se fundó en 1985 para crear estándares de prueba de PCB y circuitos integrados. La ùltima versiòn de este propòsito fue aprobada por IEEE como IEEE Std. 1149.1-2001 [IEEE1149], IEEE Standard Test Access Port and Boundary-Scan Architecture.

Usualmente, el tèrmino JTAG refiere al antes mesionado IEEE standard, antes que a el grupo que creò este. Como consecuencia, JTAG debería hacer referencia a IEEE Std. 1149.1.

Usos

Según lo dicho anteriormente JTAG ha sido adoptado con otros propósitos. Los usos comunes incluyen:

Boundary-Scan testing. Esto es para lo que JTAG fue originalmente creado. Los patrones de prueba son serialmente corridos en el dispositivo para ser testeados, mientras los resultados son mandados de vuelta al equipamiento de testeo maestro. Las conexiones entre ICs o el correcto funcionamiento de un IC por si mismo puede ser testeado usando boundary-scan testing.

In-System Programming (ISP). In-System programmable devices incluye (Flash-)EEPROMs, dispositivos de lógica programable (CPLDs, FPGAs) y microcontroladores con memoria integrada no volátil. La programación In-System permite a estos dispositivos ser reconfigurados in-field, tanto como facilmente testeados y debbugeados durante la fase de desarrollo.

Debugging. Los tradicionales emuladores In-Circuit han venido despopularizándose con los modernos microcontroladores embebidos, el nuevo diseño System-On-Chip incluye facilidades de debug entre todos los dispositivos. JTAG esta siendo usado para acceder al circuito integrado de debug en el microcontrolador, dejando otras interfases de comunicación libres para uso general. Este es el método actualemente utilizado para debug en microcontroladores ARM.

Un sitema típico para cualquier propósito incluyendo JTAG consiste en un sistema host (generalmente una PC), uan interface de hardware, y un sistema target.

Interfaces de hardware JTAG

El hardware depende de la tarea que vayamos a realizar, y demás recursos disponibles como por ejemplo recursos.

El más simple dispositivo que está siendo usado en la actualidad son un poco màs que cambiadores de nivel para el puerto paralelo de la PC. El Macraigor Wiggler, o clones de este dispositivo comercialmente disponible, y varios cables paralelos disponibles desde algunos distribuidores PLD (como Xilinx Parallel Cable III, Altera ByteBlaster MV, Lattice ispDOWNLOAD cable) son miembros de este tipo de interface. El host PC serializa todo dato que debe ser transmitido a través de JTAG cambiando bits individuales del puerto paralelo. Un solo acceso al puerto toma al menos 1uS, limitando la frecuencia máxima a 500kHz, pero en la practica los resultados serás mucho más bajos.

Dsipositivos más avanzados implementan la serialización en hardware, resultando en una performance drasticamente incrementada. El Macraigor Raven es una interface para el puerto paralelo de la PC que está disponible para correr hasta 8MHz, aunque la velocidad efectiva sea un poco menor. FTDI's FT2232c son dispositivos con USB 1.1 Fullspeed (hasta 11MBit) que operan a con frecuencias TCK de hasta 6MHz.

Referencias

IEEE Std. 1149.1-2001

Wiggler clone:

El Wiggler clone es un programador/debbuger utilizado para la programación de microcontroladores ARM. Utiliza la interfase JTAG de los mismos y el puerto paralelo de nuestra PC.

El puerto paralelo debe estar configurado en EPP en la configuración de la BIOS.

Circuito:

<img width="600" alt="wiggler_schema.png" src="/pub/CIII/LabElectronica/DebugWigglerOpenOCDGNUARM/wiggler_schema.png" height="450" />

Placa y distribución de los componentes:

Jtag_Wiggler_placa.pdf: Placa Wiggler JTAG.

Jtag_Wiggler_distrib.pdf: Distribución de los Componentes en la placa.

Software

!OpenOCD:

El Open On-Chip Debugger (!OpenOCD) permite la interacción con el usuario a travéz de una interface telnet (por defecto: port 4444) y con un GDB server (por defecto: port 3333). El intérprete de línea de comandos esta disponible para ambas interfaces. Nosotros lo utilizamos para que haga el vínculo entre la Wiggler y nuestro arm-elf-gdb o arm-elf-insight.

Está disponible en los mirrors Debian. Para más información al respecto la página oficial del proyecto es:

<a target="top" href="http://openfacts.berlios.de/index-en.phtml?title=Open''On-Chip_Debugger">http://openfacts.berlios.de/index-en.phtml?title=Open_On-Chip_Debugger</a>Compilando !OpenOCD desde la SVN:Como se ha detectado un bug para los micros LPC en las versiones de !OpenOCD que se encuentran en los repositorios Debian se hace una pequeña reseña de como compilar el proyecto desde sus fuentes. Bajamos el ultimo repositorio desde la SVN como usuario con: *$ svn checkout svn://svn.berlios.de/openocd/trunk* luego usamos automakey autoconfcon el script que trae el proyecto: *$ ./bootstrap* ahora usamos configure con los flags necesarios: *$ ./configure --prefix /home/usuario/ --enable-parport --enable-parport_ppdev* lo cual va a depender de el jtag que tengamos. ahora solo resta realizar make *$ make* y luego agregar al .bashrc de nuestro usuario el proyecto: PATH=~/trunk/src/:${PATH} Hay que reiniciar el modo gráfico para que el bash comienze a funcionar, además se desintaló el openocd de Debian antes de realizar todo. Comandos generales:Daemonsleep <msec>Espera por nmilisegundos de retornar la ejecución. Util en conexiones con archivos script(comandos 'script' y configuraciones 'target_script').shutdownCierra el !OpenOCD daemon, desconectando todos los clientes (GDB, Telnet).debug_level [n]Muestra o ajusta el nivel de debug a n<0-3>log_output <file>: Redirecciona el logeo a <file> (defaultstderr)script <file>Ejecuta comando desde <file>Manejador de estado del Target:poll ['on'||'off']Hace polling sobre el target para saber su estado. Si el target esta en modo debug, muestra información específica de la arquitectura acerca del estado actual. Un parámetro opcional permite habilitar o desabilitar el polling contínuo.haltEnvía un requerimiento de parada al target. El debugger señala el requerimiento de debug, y espera al target para entrar en el debug mode.resume [address]Retorna el target a su actual posición en el código, o a otra dirección opcional.step [address]Ejecuta un solo paso en el target en su actual posición, o a otra dirección opcional.reset ['run'||'halt'||'init'||'run_and_halt'||'run_and_init']Realiza un hard-reset. Los parámetros opcionales especifican que debe pasar después del reset. Estos parámetros opcionales sobreescriben las especificaciones en el archivo de configuración, disponiendo un nuevo comportamiento para el comando 'reset' por defecto.run: Pone a correr al target.halt: Inmediatamente detiene el target (trabaja solo baja ciertas configuraciones).init: Inmediatamente detiene el target, y ejecuta el reset script (trabaja solo baja ciertas configuraciones).run_and_halt: Hace correr el target por un cierto período de tiempo, después realiza una parada.run_and_init: Hace correr el target por un cierto período de tiempo, después realiza una parada. Ejecuta el reset script una vez que el target entra en modo debug.Comandos de acceso a memoria:Estos comandos permiten acceder a un sector específico de la memoria del sistema:mdw <addr> [count]muestra memory wordsmdh <addr> [count]muestra memory half-wordsmdb <addr> [count]muestra memory bytesmww <addr> <value>escribe memory wordmwh <addr> <value>escribe memory half-wordmwb <addr> <value>escribe memory byte$ load_image <file>['bin'||'ihex'||'elf'] Load image <file>to target memory at dump_image <file><size>Dump <size>bytes of target memory starting at to a (binary) <file>. load_binary <file>[DEPRECATED] Load binary <file>to target memory at dump_binary <file><size>[DEPRECATED] Dump <size>bytes of target memory starting at to a (binary) <file>.: Comandos para la memoria Flash:flash banksLista los bancos flash configuradosflash info <num>Muestra información acerca de los bancos flash <num>flash probe <num>Identifica la flash, o valida los parámetros de la flash configurada. La operación depende del tipo de flash.flash erase_check <num>Chequea el estado de borrado de los sectores en banco flash <num>. Esta es la única operación que actualiza la información de estado de borrado mostrada por 'flash info'. Esto significa que se tiene que ejecutar un comando 'erase_check' despues de borrar o programar el dispositivo para tener información actualizada.flash protect_check <num>Chequea el estado de protección de los sectores en un banco flash <num>.flash erase <num> <first> <last>Borra sectores en el banco<num>, empezando en el sector <first>hasta e incluyendo <last>. La numeración de los sectores empieza de 0. Dependiendo del tipo de flash, el borrado puede requerir protección para ser deshabilitado primero (e.g. Intel Advanced Bootblock flash using the CFI driver).flash write <num> <file> <offset> [DEPRECATED]Escribe el binario<file>al banco flash <num>, espezando en <offset>bytes desde el comienzo del banco. Este comando fue reemplazado por el nuevo comando 'flash write_binary' usando la misma sintaxis.flash write_binary <num> <file> <offset>Escribe el binario<file>al banco flash <num>, espezando en <offset>bytes desde el comienzo del banco.flash write_image <file> [offset] [type]Escribe la imágen <file>al/los actual/es banco/s flash del target. Una relocación[offset] puede ser especificada y el archivo[type] puede ser especificado explicitamente como 'bin' (binary), 'ihex' (Intel hex), 'elf' (ELF file) o 's19' (Motorola s19).flash protect <num> <first> <last> <'on'||'off'>Habilita ('on') o deshabilita ('off') la protección a sectores flash <first>hasta <last>del banco flash <num>.flash auto_eraseHabilita ('on') para borrar bancos flash priorizando para escribir el uso del comando flash write_image solamente. Por defecto es ('off'), los bancos flash tienen que ser borrados usando el comando flash erase.Comandos específicos ARM7/9Estos comandos son específicos para ARM7 y ARM9, como !ARM7TDMI, ARM720t, ARM920t o !ARM926EJ-S. arm7_9 sw_bkpts <'enable'||'disable'>Enable/disable uso de software breakpoints. En sistemas ARMv4, esto reserva uno de los registros watchpoint para implementar breakpoints por software. Desabilitando SW Bkpts libera el registro.arm7_9 force_hw_bkpts <'enable'||'disable'>Cuando force_hw_bkpts está habilitado, el sw_bkpts support está desabilitado, y todos los breakpoints son transformados en hardware breakpoints.arm7_9 dbgrq <'enable'||'disable'>Habilita el uso de el DBGRQ bit para forzar la entrada en modo debug. Esto debe ser seguro para todos pero no lo es para núcleos !ARM7TDMI-S (como Philips LPC).arm7_9 fast_writes <'enable'||'disable'>DEPRECATED. Mirar "arm7_9 fast_memory_access" en este caso.arm7_9 fast_memory_access <'enable'||'disable'>Habilita al !OpenOCD a leer y escribir memoria sin chequear que la operación se haya completado. Esto provee una gran incremento de la velocidad, especialmente con cables USB JTAG (FT2232), pero puede ser inseguro si es usado en dispositivos a muy baja velocidad, como el reloj de 32kHz del !AT91RM9200.arm7_9 dcc_downloads <'enable'||'disable'>Habilita el uso del canal de comunicación de debug (DCC) para escribir grandes cantidades de memoria (>128 byte). Las descargas DCC ofrecen un incremento grande de la velocidad, pero pueden ser potencialmente inseguras, especialmente con dispositivos corriendo a baja velocidad. Este comando fue introducido con OpenOCD rev. 60.Uso de !OpenOCD:Archivo de configuración para ARM7 LPC2114 y Wiggler:#daemon configurationtelnet_port 4444gdb_port 3333# tell gdb our flash memory map# and enable flash programminggdb_memory_map enablegdb_flash_program enable#interfaceinterface parportparport_port /dev/parport0parport_cable wigglerjtag_speed 3#use combined on interfaces or targets that can't set TRST/SRST separatelyreset_config trst_and_srst srst_pulls_trst#jtag scan chain#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)jtag_device 4 0x1 0xf 0xe#target configurationtarget create target0 arm7tdmi -endian little -chain-position 0 -variant arm7tdmi-s_r4working_area 0 0x40000000 0x4000 nobackup#[new_target_name] configure -work-area-virt 0 -work-area-phys 0x40000000 -work-area-size 0x4000 -work-area-backup false#flash bank lpc2000 <base> <size> 0 0 <target#> <variant>flash bank lpc2000 0x0 0x20000 0 0 0 lpc2000_v2 14765 calc_checksum# For more information about the configuration files, take a look at:# http://openfacts.berlios.de/index-en.phtml?title=Open+On-Chip+Debugger#init#reset haltConsideraciones puerto paralelo y usuarios:Para el correcto funcionamiento del !OpenOCD con nuestra interfaz Wiggler debemos tener los permisos como usuario para acceder al mismo. Para agregar el usuario a dialout como root tipeamos: # gpasswd -a suusuario dialoutAdemás damos los permisos pertinentes de la siguiente forma: $ su# rmmod lp# modprobe ppdev# chmod 666 /dev/parport0# exit$Conectando el Wiggler con !OpenOCD:Aqui vemos que debe mostrarnos openocd al correrlo. Lo hacemos desde la carpeta donde esta nuestro archivo de configuración (en mi caso en donde a la vez se encuentra mi proyecto). La opción debug nos muestra toda la información de lo que va haciendo el programa y file linkea nuestro archivo de configuración con !OpenOCD. usuario@dominio:~/Desktop/Debug$ openocd --file wiggler.cfg --debug 0Open On-Chip Debugger 1.0 (2008-11-21-19:57) svn:1181BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS$URL: svn://svn.berlios.de/openocd/trunk/src/openocd.c $Debug:1. 0 configuration.c:88 find_file(): found wiggler.cfgDebug:1. 0 command.c:91 script_command(): script_command - telnet_portDebug:1. 0 command.c:108 script_command(): script_command - telnet_port, argv[0]=ocd_telnet_portDebug:1. 0 command.c:108 script_command(): script_command - telnet_port, argv[1]=4444Debug:11 0 command.c:91 script_command(): script_command - gdb_portDebug:12 0 command.c:108 script_command(): script_command - gdb_port, argv[0]=ocd_gdb_portDebug:13 0 command.c:108 script_command(): script_command - gdb_port, argv[1]=3333Debug:15 0 command.c:91 script_command(): script_command - gdb_memory_mapDebug:16 0 command.c:108 script_command(): script_command - gdb_memory_map, argv[0]=ocd_gdb_memory_mapDebug:17 0 command.c:108 script_command(): script_command - gdb_memory_map, argv[1]=enableDebug:19 0 command.c:91 script_command(): script_command - gdb_flash_programDebug:20 0 command.c:108 script_command(): script_command - gdb_flash_program, argv[0]=ocd_gdb_flash_programDebug:21 0 command.c:108 script_command(): script_command - gdb_flash_program, argv[1]=enableDebug:23 0 command.c:91 script_command(): script_command - interfaceDebug:24 0 command.c:108 script_command(): script_command - interface, argv[0]=ocd_interfaceDebug:25 0 command.c:108 script_command(): script_command - interface, argv[1]=parportDebug:27 1 command.c:91 script_command(): script_command - parport_portDebug:28 1 command.c:108 script_command(): script_command - parport_port, argv[0]=ocd_parport_portDebug:29 1 command.c:108 script_command(): script_command - parport_port, argv[1]=/dev/parport0Debug:31 1 command.c:91 script_command(): script_command - parport_cableDebug:32 1 command.c:108 script_command(): script_command - parport_cable, argv[0]=ocd_parport_cableDebug:33 1 command.c:108 script_command(): script_command - parport_cable, argv[1]=wigglerDebug:35 1 command.c:91 script_command(): script_command - jtag_speedDebug:36 1 command.c:108 script_command(): script_command - jtag_speed, argv[0]=ocd_jtag_speedDebug:37 1 command.c:108 script_command(): script_command - jtag_speed, argv[1]=3Debug:38 1 jtag.c:1965 handle_jtag_speed_command(): handle jtag speedUser:39 1 command.c:372 command_print(): jtag_speed: 3Debug:41 1 command.c:91 script_command(): script_command - reset_configDebug:42 1 command.c:108 script_command(): script_command - reset_config, argv[0]=ocd_reset_configDebug:43 1 command.c:108 script_command(): script_command - reset_config, argv[1]=trst_and_srstDebug:44 1 command.c:108 script_command(): script_command - reset_config, argv[2]=srst_pulls_trstDebug:46 1 command.c:91 script_command(): script_command - jtag_deviceDebug:47 1 command.c:108 script_command(): script_command - jtag_device, argv[0]=ocd_jtag_deviceDebug:48 1 command.c:108 script_command(): script_command - jtag_device, argv[1]=4Debug:49 1 command.c:108 script_command(): script_command - jtag_device, argv[2]=0x1Debug:50 1 command.c:108 script_command(): script_command - jtag_device, argv[3]=0xfDebug:51 1 command.c:108 script_command(): script_command - jtag_device, argv[4]=0xeDebug:52 1 target.c:3993 jim_target(): Target command params:Debug:53 1 target.c:3994 jim_target(): target create target0 arm7tdmi -endian little -chain-position 0 -variant arm7tdmi-s_r4 Debug:55 1 command.c:91 script_command(): script_command - working_areaDebug:56 1 command.c:108 script_command(): script_command - working_area, argv[0]=ocd_working_areaDebug:57 1 command.c:108 script_command(): script_command - working_area, argv[1]=0Debug:58 1 command.c:108 script_command(): script_command - working_area, argv[2]=0x40000000Debug:59 1 command.c:108 script_command(): script_command - working_area, argv[3]=0x4000Debug:60 1 command.c:108 script_command(): script_command - working_area, argv[4]=nobackupDebug:62 2 command.c:91 script_command(): script_command - bankDebug:63 2 command.c:108 script_command(): script_command - bank, argv[0]=ocd_flash_bankDebug:64 2 command.c:108 script_command(): script_command - bank, argv[1]=lpc2000Debug:65 2 command.c:108 script_command(): script_command - bank, argv[2]=0x0Debug:66 2 command.c:108 script_command(): script_command - bank, argv[3]=0x20000Debug:67 2 command.c:108 script_command(): script_command - bank, argv[4]=0Debug:68 2 command.c:108 script_command(): script_command - bank, argv[5]=0Debug:69 2 command.c:108 script_command(): script_command - bank, argv[6]=0Debug:70 2 command.c:108 script_command(): script_command - bank, argv[7]=lpc2000_v2Debug:71 2 command.c:108 script_command(): script_command - bank, argv[8]=14765Debug:72 2 command.c:108 script_command(): script_command - bank, argv[9]=calc_checksumDebug:74 2 command.c:91 script_command(): script_command - initDebug:75 2 command.c:108 script_command(): script_command - init, argv[0]=ocd_initDebug:76 2 openocd.c:143 handle_init_command(): target init completeDebug:77 2 parport.c:353 parport_init(): opening /dev/parport0...Debug:78 2 parport.c:365 parport_init(): ...openDebug:79 41 parport.c:237 parport_reset(): trst: 0, srst: 0Debug:80 41 openocd.c:150 handle_init_command(): jtag interface init completeDebug:81 41 jtag.c:1625 jtag_init_inner(): Init JTAG chainDebug:82 41 jtag.c:327 jtag_call_event_callbacks(): jtag event: JTAG controller reset (TLR or TRST)Debug:83 41 jtag.c:1305 jtag_reset_callback(): -Debug:84 41 jtag.c:327 jtag_call_event_callbacks(): jtag event: JTAG controller reset (TLR or TRST)Debug:85 41 jtag.c:1305 jtag_reset_callback(): -Info:86 52 jtag.c:1414 jtag_examine_chain(): JTAG device found: 0x4f1f0f0f (Manufacturer: 0x787, Part: 0xf1f0, Version: 0x4)Debug:87 52 jtag.c:327 jtag_call_event_callbacks(): jtag event: JTAG controller reset (TLR or TRST)Debug:88 52 jtag.c:1305 jtag_reset_callback(): -Debug:89 52 openocd.c:156 handle_init_command(): jtag init completeDebug:90 56 embeddedice.c:401 embeddedice_write_reg(): 0: 0x00000005Debug:91 60 embeddedice.c:401 embeddedice_write_reg(): 12: 0x00000000Debug:92 60 embeddedice.c:401 embeddedice_write_reg(): 20: 0x00000000Debug:93 62 openocd.c:159 handle_init_command(): jtag examine completeDebug:94 62 openocd.c:165 handle_init_command(): flash init completeDebug:95 62 openocd.c:169 handle_init_command(): mflash init completeDebug:96 62 openocd.c:173 handle_init_command(): NAND init completeDebug:97 62 openocd.c:177 handle_init_command(): pld init completeDebug:98 63 gdb_server.c:2205 gdb_init(): gdb service for target arm7tdmi at port 3333Warning: 99 63 tcl_server.c:178 tcl_init(): no tcl port specified, using default port 6666Warning: 100 110 arm7_9_common.c:744 arm7_9_poll(): DBGACK set while target was in unknown state. Reset or initialize target.Debug:101 110 embeddedice.c:401 embeddedice_write_reg(): 0: 0x00000005Debug:102 110 embeddedice.c:401 embeddedice_write_reg(): 12: 0x00000000Debug:103 113 arm7_9_common.c:1164 arm7_9_debug_entry(): target entered debug from ARM stateDebug:104 148 arm7_9_common.c:1196 arm7_9_debug_entry(): target entered debug state in System modeDebug:105 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r0: 0x2000001fDebug:106 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r1: 0xe3a03000Debug:107 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r2: 0x00aa0000Debug:108 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r3: 0xe0028014Debug:109 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r4: 0xe002c000Debug:110 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r5: 0x7ffffe3cDebug:111 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r6: 0x4000012cDebug:112 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r7: 0x00000000Debug:113 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r8: 0xffffffffDebug:114 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r9: 0xffffffffDebug:115 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r10: 0xffffffffDebug:116 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r11: 0x40003ef4Debug:117 151 arm7_9_common.c:1227 arm7_9_debug_entry(): r12: 0x40003ef8Debug:118 152 arm7_9_common.c:1227 arm7_9_debug_entry(): r13: 0x40003ee4Debug:119 152 arm7_9_common.c:1227 arm7_9_debug_entry(): r14: 0x4000022cDebug:120 152 arm7_9_common.c:1227 arm7_9_debug_entry(): r15: 0x4000039cDebug:121 152 arm7_9_common.c:1233 arm7_9_debug_entry(): entered debug state at PC 0x4000039cDebug:122 152 target.c:717 target_call_event_callbacks(): target event 4 (early-halted)Debug:123 152 target.c:3125 target_handle_event(): event: 4 early-halted - no actionDebug:124 152 target.c:717 target_call_event_callbacks(): target event 5 (halted)Debug:125 152 target.c:3125 target_handle_event(): event: 5 halted - no actionUser:126 152 target.c:973 target_arch_state(): target state: haltedUser:127 152 armv4_5.c:317 armv4_5_arch_state(): target halted in ARM state due to breakpoint, current mode: Systemcpsr: 0x2000001f pc: 0x4000039cY ya tenemos nuestro Wiggler conectado, en este caso en el puerto 3333 del localhost. Uso básico con programa alojado en RAM usando arm-elf-insight:Una vez que se tiene conectado !OpenOCD desde la consola, procedemos a ejecutar arm-elf-insight en otra consola entrando: usuario@dominio:~/Desktop/Debug$ arm-elf-insight Target Settings configuramos:

<img width="741" alt="Targetselection.png" src="/pub/CIII/LabElectronica/DebugWigglerOpenOCDGNUARM/Targetselection.png" height="430" />

Open

<img width="492" alt="abrirprograma.png" src="/pub/CIII/LabElectronica/DebugWigglerOpenOCDGNUARM/abrirprograma.png" height="285" />

Le ponemos que "no" a cada una de las sugerencias:

<img width="564" alt="no.png" src="/pub/CIII/LabElectronica/DebugWigglerOpenOCDGNUARM/no.png" height="122" />

Connect to target y nos tiene que dar el mensaje:

<img width="267" alt="ok.png" src="/pub/CIII/LabElectronica/DebugWigglerOpenOCDGNUARM/ok.png" height="129" />

Download y nos tiene que dar el mensaje de que la descarga fue exitosa en la parte inferior de la pantalla. Desde alli procedemos a operar el Debugger teniendo las siguientes opciones:

<img width="423" alt="menu.png" src="/pub/CIII/LabElectronica/DebugWigglerOpenOCDGNUARM/menu.png" height="99" />

De izquierda a derecha: Run: Corre el programa o lo relanza.Step: Realiza el proximo paso.Next: Realiza hasta la proxima función.Finish:Continue: Corre hasta el siguiente Breakpoint.Step en assembly: Realiza un paso en codigo ensamblador.Next en assembly: Realiza una función en código ensamblador.Registers: Muestra los registros del nucleo ARM - no funciona ( si funciona en gdb y en memoria)Memoria: Muestra el valor actual de la memoria del micro. (Muy importante)Stack: Muestra el estado actual del Stack en C.Watch Expression: Busca expresiones en el código.Local Variables: Muestra el valor de las variables locales.Breakpoints: Muestra los breakpoints.Console: Muestra la consola de gdb.Consideraciones linker script:El linker script que usamos debe alojar todos los sectores de nuestro programa en la memoria RAM, de modo de que la aplicación se aloje alli. Esto se logra modificando el linker script, cambiando ROM o FLASH por RAM como sector destinado. Consideraciones placa de desarrollo ARM:En nuestra placa de desarrollo se debe conectar el puente que se encuentra dispuesto a tal fin. El mismo conecta Los pines RTCK con el TCK de la interface JTAG. El circuito sincroniza por TCK al ARM cores internal clock, generando la entrada DBGTCKEN requerida por el ARM core y provee un clock de realimentación (RTCK) que habilita el debugger a usar velocidades de clock adaptables. Ejemplos:Blink-Led en C corriendo en RAM: Ejemplo Blink LedEstado Actual del Proyecto:Se plantea como próximas actividades: Programar y Debuggear el ARM residiendo en Flash.Realizar las mismas experiencias con un dispositivo de interfaz USB (Se sugiere oocd-link) Hay mas información en: http://www.hs-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.htmly en http://www.joernonline.de/Complejizar el proyecto a un Sistema Operativo de Tiempo Real.Información adicional http://wiki.sikken.nl/index.php?title=ArmDebug#Insight