Thursday, March 27, 2014

Tutorial Energia + Eclipse CDT + OpenOCD + Tiva + Stellaris = Desenvolvimento C/C++ com debug+JTAG

Tutorial completo com exemplos.



[update 2014/03/29]

O código do projeto usado no projeto pode ser clonado do meu github
https://github.com/murix/energia-0101E0012-eclipse-cdt-openocd

[post original]

Como montar um ambiente de desenvolvimento C/C++ para ARM embarcado?
Minha sugestão é usar o já consagrado eclipse CDT com os toolkits / frameworks / compiladores do projeto Energia. O projeto Energia (http://energia.nu) é um fork do Arduino para as placas de desenvolvimento da Texas (MSP430 e ARM). Por ser um fork do Arduino, o projeto Energia sofre da falta de ferramentas de debug / JTAG. O projeto Energia já vem com a ferramenta de depuração GDB, mas carece de ferramentas para JTAG como o OpenOCD. Toda essa problemática de falta de ferramentas por ser resolvida facilmente. Como todas essas ferramentas são opensource, é só baixar todas e configurar tudo para funcionar junto.


1) Downloads das ferramentas

Então vamos ao que interessa, primeiro precisamos baixar todas ferramentas atualizadas.
Este tutorial é voltado para Windows e Linux, infelizmente o MacOS X ficou de fora pois não tenho nenhum Mac para testar (aceito doações).

1) Eclipse CDT
http://eclipse.c3sl.ufpr.br/technology/epp/downloads/release/kepler/SR2/eclipse-cpp-kepler-SR2-win32.zip

2) Energia 
http://energia.nu/download/downloadv3.php?file=energia-0101E0012-windows.zip

3) OpenOCD
http://www.freddiechopin.info/en/download/category/4-openocd?download=99%3Aopenocd-0.7.0

No Linux (ArchLinux) algumas ferramentas podem ser instalados com uma única linha de comando:

1) Eclipse CDT e Openocd
pacman -S eclipse-cdt openocd

2) Energia 
http://energia.nu/download/downloadv3.php?file=energia-0101E0012-linux.tgz (32bits)
http://energia.nu/download/downloadv3.php?file=energia-0101E0012-linux64.tgz (64bits)

2) Montando o ambiente

O primeiro passo é extrair o eclipse-cdt, openocd e energia.
Para facilitar recomendo criar uma pasta com todos os downloads das ferramentas e extrair tudo dentro.
Como exemplo, criei a pasta arm-toolchain e extrai as ferramentas dentro.

3) Configurando o OpenOCD
Primeiro vamos testar o OpenOCD que é o nosso debug / JTAG.
O método é: abrir um terminal (windows+r, cmd.exe, enter) e fazer como abaixo

Ao executar o openocd pela primeira vez é preciso liberar as portas no firewall do windows,
ou então desativar o firewall do windows completamente.
OpenOCD usando configuração da board EK-LM4F120XL.
Esta configuração é usada para depurar a Stellaris LM4F120XL, Tiva C Series, Tiva Ethernet.
No windows algumas placas se recusam a funcionar com OpenOCD por motivo ainda desconhecido, no Linux todas as minhas 10 stellaris LM4F120XL e duas Tiva C Series, funcionaram sempre de primeira.
Já atualizei o firmware de todas as 12 placas usando o LMFLASH Programmer como expliquei no outro post (http://dronespersonalizados.blogspot.com.br/2014/03/atualizar-firmware-do-icdi-jtag-da-tiva.html).
Mas ainda não resolveu esse problema de somente algumas não funcionarem com o OpenOCD do Windows, se alguém tiver uma ideia ou souber a solução me conte. [ No Mac parece que o problema também não existe, o bug pelo jeito é no Windows 8 e 8.1 ]

O OpenOCD deve ficar aberto durante todo o processo de depuração, ele age como um servidor GDB na porta 3333. É nesta porta que vamos conectar o cliente GDB do Energia através do Eclipse CDT.

4) Criando o projeto do Energia (C++) no Eclipse

Agora vamos iniciar o Eclipse CDT e criar um novo projeto C++ com GCC Cross Compiler.
O projeto deve ser o C++ vazio com Cross GCC,
4.1 ) Configurando Cross Compiler



Na última tela de criação do projeto, é pedido para configurar o caminho do Cross GCC e o prefixo.
Para facilitar vamos usar o GCC do Energia, que está no caminho mostrado na foto.
Se você pode usar qualquer outro toolchain como: Linaro, Codesourcery, Mentor, buildroot,
mas se essa for a primeira vez, use o que vem no Energia que é de certeza funcionar.

4.2 ) Configurando tipo do Builder

Nas propriedades do projeto é preciso mudar o tipo de builder
Abra as configurações do projeto e mude o tipo de builder para "internal"

4.3 ) Adicionando arquivos para o projeto

Vamos adicionar os arquivos do Energia.

A pasta para se arrastar é a lm4f que fica dentro da pasta hardware do Energia,
quando terminar de copiar vai ficar como está na foto.
Para compilar esse código é preciso excluir da configuração algumas pastas.

4.4 ) Excluindo do build bibliotecas não mandatórias

Remova as libs marcadas de todos os builds (Debug e Release)

4.5 ) Configurando includes C e C++

Configure no projeto os diretórios de include C e C++
"${workspace_loc:/${ProjName}/lm4f/cores/lm4f}"
"${workspace_loc:/${ProjName}/lm4f/libraries/EEPROM}"
"${workspace_loc:/${ProjName}/lm4f/libraries/SPI}"
"${workspace_loc:/${ProjName}/lm4f/libraries/Wire}"
"${workspace_loc:/${ProjName}/lm4f/variants/stellarpad}"

Configure os includes do C e C++, o projeto Energia precisa de ambos
4.6) Configurações Misc do Compilador

Nas configurações Misc do Projeto é preciso complementar a linha:
-c -fmessage-length=0

Com esse trecho para C++:
-fno-rtti -fno-exceptions -ffunction-sections -fdata-sections -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -DF_CPU=80000000L -DARDUINO=101 -DENERGIA=12

Com esse trecho em C (tudo do C++ menos o RTTI ):
-fno-exceptions -ffunction-sections -fdata-sections -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -DF_CPU=80000000L -DARDUINO=101 -DENERGIA=12

Configurações MISC do projeto

4.7) Configurações Misc do Linker

Também é necessário configurar o linker MISC do GCC com o seguinte trecho:
 -Os -nostartfiles -nostdlib -Wl,--gc-sections -T  "${workspace_loc:/${ProjName}/lm4f/cores/lm4f/lm4fcpp_blizzard.ld}" -Wl,--entry=ResetISR -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant 

Configure o link flags com o trecho indicado acima

4.8) Bibliotecas mandatórias para o Linker

É preciso configurar quais bibliotecas do GCC são linkadas ao projeto
GCC Linker libs - o projeto Energia depende dos libs: m, c, gcc.
(math , c runtine, gcc runtine)
4.9 ) Criando um Sketch

Crie um arquivo chamado sketch.cpp com o conteúdo da foto 
Arquivo sketch.cpp segue o mesmo estilo do Energia com IDE de Arduino.
A única diferença é o include para o Energia.h
Agora toda a API do Energia está pronta para usar: digitalWrite, digitalRead, .analogWrite, analogRead, ..
4.10) Build

Agora está tudo pronto para fazer o build.

Build do Energia usando o Eclipse perfeito, sem nenhum warning!

Após o build, o que temos é um arquivo ELF para ARM de 32 bit, que não pode ser gravado diretamente na placa. Para converter de ELF para binário é usada a ferramenta arm-none-eabi-objcopy. Mas não vou entrar em detalhes, pois o foco deste tutorial é gravar e depurar tudo automaticamente usando o OpenOCD.

Lembra do OpenOCD no terminal, ele ainda deve estar aberto, pois agora vamos gravar o projeto usando o GDB client conectado no OpenOCD, tudo isso de dentro do eclipse no view de debug.

5) Instalar o plugin do GDB para debug de Hardware

No eclipse, vá até o menu "help" e escolha "install new software"

Escolha o repositório padrão do eclipse,
no grupo "Mobile and Device Development",
instale o "C/C++ GDB Hardware Debugging"
6 ) Depurando o projeto com GDB

Depois de concluída a instalação do C/C++ GDB Hardware Debugging,
vamos criar um configuração de debug para gravar o Energia recém compilado na placa pelo OpenOCD.
No eclipse, vá no menu "run", escolha "Debug configurations", e crie uma nova configuração como está na foto.



Crie uma nova configuração de debug do tipo GDB Hardware Debbuging
6.1 ) Configurando GDB: caminho e porta

Na aba Debugger, mude a porta para 3333 e configure o caminho para o GDB.
O GDB é o cliente do servidor OpenOCD.
6.2 ) Configurando comandos do GDB

Na aba startup, desmarque a opção "reset and delay" e "halt",
na caixa de comandos de inicialização escreva: "monitor reset halt"
na caixa de "run commands" escreva: "monitor reset init",
dê "apply"e depois "debug" para iniciar a gravação do Energia na placa junto com a View de Debug do Eclipse
7) Debug View 

Na view  debug do eclipse, as possibilidades são infinitas,
pode rodar o código step by step, editar as variáveis na RAM no meio da execução,
além de inúmeros outros recursos, .....
8) Monitorando OpenOCD

Enquanto isso o OpenOCD está executado todos os comandos enviados pelo Eclipse/GDB.
OpenOCD debugging
9 ) Monitorando porta Serial

Para concluir com chave de ouro vamos ver se no terminal serial está chegando o texto que foi programado no sketch.
Sketch do Energia compilado no Eclipse e gravado e depurado com GDB e OpenOCD

10) Considerações finais

Este tutorial introduziu o uso da API do Energia com um exemplo seguido da depuração com GDB / OpenOCD.
O próximo tutorial irá introduzir o FreeRTOS no projeto.