Depurando com o OpenOCD e o GDB na Freedom FRDM-KL46Z
- por Sergio Prado
A Freedom é uma plataforma de baixo custo e baixo consumo da Freescale para desenvolvimento e prototipação rápida com a linha de microcontroladores Kinetis. A FRDM-KL46Z é uma das placas da plataforma Freedom, de baixo custo e repleta de sensores, interfaces de comunicação e outros periféricos.

A Freescale disponibiliza gratuitamente o IDE Kinetis Design Studio para auxiliar no desenvolvimento de aplicações para esta plataforma. Este IDE é baseado no Eclipse e utiliza o GCC como toolchain.
Ambientes de desenvolvimento gráficos são mais amigáveis e possuem uma curva de aprendizado menor. Porém, por utilizarem mais recursos da máquina de desenvolvimento, são mais lentos e suscetíveis a erros, além de serem menos flexíveis comparados às soluções baseadas em ferramentas de linha de comando.
Neste caso, para quem gosta da flexibilidade e produtividade de um ambiente baseado em linha de comandos, com o Vim é possível ter um ambiente de desenvolvimento bem parecido com um IDE, mas com a vantagem de não depender de uma interface gráfica, consumir menos recursos e possibilitar uma maior flexibilidade na configuração das ferramentas (mais informações no artigo “Configurando o Vim como IDE para desenvolver aplicações em C/C++“).
E o legal é que podemos configurar o mesmo ambiente de desenvolvimento integrado com o Vim para desenvolver e depurar aplicações bare-metal em microcontroladores. Para isso, podemos utilizar a dupla GDB e OpenOCD.
O GDB é o debugger do projeto GNU e padrão em distribuições Linux. O OpenOCD é uma aplicação que serve de interface para o GDB se comunicar com a plataforma de hardware, implementando os protocolos e drivers necessários para conversar com diversas interfaces de depuração.
Para testar este ambiente, utilizei a Freedom Board FRDM-KL46Z. O primeiro passo é compilar e testar uma aplicação bare-metal para esta plataforma de hardware. Para isso, você pode seguir os procedimentos descritos no artigo “Desenvolvimento bare metal para ARM Cortex-M com o GCC no Linux“.
Para que o OpenOCD possa se comunicar com o target, precisamos atualizar o bootloader da placa para um bootloader que suporte o protocolo CMSIS-DAP. O projeto MBED fornece um bootloader compatível com este protocolo, então é só seguir as instruções descritas no site do projeto.
Depois baixe o código-fonte do OpenOCD:
| $ git clone git://git.code.sf.net/p/openocd/code openocd $ cd openocd/ | 
Configure a compilação do OpenOCD com os comandos abaixo:
| $ ./bootstrap $ ./configure [...] OpenOCD configuration summary -------------------------------------------------- MPSSE mode of FTDI based devices yes (auto) ST-Link JTAG Programmer yes (auto) TI ICDI JTAG Programmer yes (auto) Keil ULINK JTAG Programmer yes (auto) Altera USB-Blaster II Compatible yes (auto) Versaloon-Link JTAG Programmer yes (auto) Segger J-Link JTAG Programmer yes (auto) OSBDM (JTAG only) Programmer yes (auto) eStick/opendous JTAG Programmer yes (auto) Andes JTAG Programmer yes (auto) USBProg JTAG Programmer yes (auto) Raisonance RLink JTAG Programmer yes (auto) Olimex ARM-JTAG-EW Programmer yes (auto) CMSIS-DAP Compliant Debugger yes (auto) | 
Confirme que o suporte ao CMSIS-DAP foi habilitado (última linha no comando acima). Caso não tenha sido habilitado, pode ser necessário instalar a biblioteca abaixo:
| $ sudo apt-get install libhidapi-dev | 
Depois é só compilar e instalar o OpenOCD na sua máquina de desenvolvimento:
| $ make $ sudo make install | 
No repositório do código-fonte da aplicação bare-metal que disponibilizei, já tem um arquivo de configuração do OpenOCD:
| $ cd ~/bare-metal-arm/
$ cat openocd.cfg
source [find interface/cmsis-dap.cfg]
source [find target/kl46.cfg]
$_TARGETNAME configure -event gdb-attach { reset init } | 
É só ligar a placa e executar o OpenOCD:
| $ openocd | 
Depois abra um outro terminal e execute o GDB:
| $ export PATH=~/toolchain/gcc-arm-none-eabi-4_9-2014q4/bin/:$PATH $ arm-none-eabi-gdb -ex "target remote localhost:3333" main.elf | 
O comando load pode ser usado para gravar o firmware na memória flash do microcontrolador:
| (gdb) load Loading section .interrupts, size 0xc0 lma 0x0 Loading section .flash_config, size 0x10 lma 0x400 Loading section .text, size 0x170 lma 0x410 Start address 0x410, load size 576 Transfer rate: 1 KB/sec, 192 bytes/write. | 
A partir daí, todos os comandos do GDB funcionam.
Você pode colocar um breakpoint na função main:
| (gdb) b main Breakpoint 1 at 0x504: file main.c, line 47. | 
E iniciar a execução com o comando continue (a aplicação irá parar no breakpoint configurado):
| (gdb) c Continuing. Note: automatically using hardware breakpoints for read-only addresses. Breakpoint 1, main () at main.c:47 47 led_red_init(); | 
Você pode executar passo a passo com os comandos next ou step, ou então continuar a execução com o comando continue (guia de referência do GDB).
Até escorre uma lágrima quando tudo isso é integrado ao Vim… :)

Happy hacking!
Sergio Prado

Sem Comentários
Nenhum comentário até agora... é a sua chance de ser o primeiro a comentar!