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!