Depurando com o OpenOCD e o GDB na Freedom FRDM-KL46Z

- por Sergio Prado

Categorias: Microcontroladores Tags: , ,

A Free­dom é uma plataforma de baixo custo e baixo con­sumo da Freescale para desen­volvi­mento e pro­toti­pação ráp­ida com a linha de micro­con­tro­ladores Kinetis. A FRDM-KL46Z é uma das pla­cas da plataforma Free­dom, de baixo custo e repleta de sen­sores, inter­faces de comu­ni­cação e out­ros periféricos.

FRDM-KL46Z

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… :)

gdb-vim

Happy hacking!

Sergio Prado

Sem Comentários

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

Faça um Comentário

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.