fenglogo
Laboratório de Processadores
Programação do LPC2378 usando o arm-elf-gcc
Parte 1: Configuração do ambiente
puclogo

Introdução

Neste semestre vamos usar um novo tipo de microprocessador, radicalmente diferente da arquitetura 8051 vista em semestres anteriores. Trata-se do LPC2378 da NXP com core tipo ARM7-TDMI. A arquitetura ARM (Advanced Risc Machine) é um processador RISC de 32 bits com um pipeline de 3 estágios, que permite executar uma instrução de 32 bits a cada ciclo de clock.

A sigla TDMI (Thumb Debugger Multiplier Instruction set) representa um conjunto de intruções alternativo (Thumb mode) de 16 bits. Processadores tipo ARM7-TDMI podem executar estes dois conjuntos de instruções: ARM ou Thumb. No modo ARM todas as instruções são tem 4 bytes. No conjunto de instruções Thumb a maioria das instruções é de 2 bytes.

O LPC2378 tabém tem várias interfaces incorporadas:

Configurando o ambiente de programação

Existem vários compiladores e ambientes de desenvolvimento de software para este tipo de microprocessadors. Dentre eles podemos destacas tres sistemas. Dois ambientes integrados para Windows, incluido editor de texto compilador C, assembler, simulador e debugger: o da IAR e o da Keil. Estes são sistemas comerciais, com prossiblidades de se obter amostras grátis limitadas. Existe também a opção baseada em software livre, com o conjunto de ferramentas GNU-Gcc para a arquitetura ARM.

Eu vou descrever aqui a configuração do gcc. Este sistema tem duas vantagens muito importantes para o nosso ambiente acadêmico:

Ferramentas necessárias para programar para ARM usando o gcc

O pacote arm-elf-gcc pode ser obtido em

http://www.mikrocontroller.net/articles/ARM_GCC_toolchain_for_Linux_and_Mac_OS_X

Este pacote tem as ferramentas básicas para compilar e depurar programas para ARM, incluindo os seguintes programas:

arm-elf-gcc Compilador C
arm-elf-g++ Compilador C++
arm-elf-as Assembler.
arm-elf-ld Linker/loader
arm-elf-objcopy Copia convertendo formatos de código objeto

O pacote tambem inclui os arquivos #include e as bibliotecas básicas da linguagem C.

Para o desenvolvimento e teste dos programas para ARM algumas ferramentas adicionais também são necessárias:

O procedimento de instalação das ferramentas difere um pouco dependendo do sistema operacional.
 
Instalação do arm-gcc para Windows

Uma versão compilada para windows encontra-se em
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html#winarm
Neste site existem programas exemplo e explicações sobre o pacote WinARM. O link

Para poder compilar os programas deste tutorial, eu fiz algumas modificações no pacote WinARM:

O pacote completo está no segunte arquivo auto-extraível com cerca de 18 MBytes:

WinARM.exe [18 MBytes]

Para poder compilar os programas a partir de qualquer diretório de trabalho é necessário que o diretório WinARM\bin esteja no caminho de busca por programas executáveis (path). Para alterar o path no Windows usa-se o programa regedit para editar a chave HKEY_CURRENT_USER/Environment/PATH. Geralmente é necessário reiniciar o Windows para que esta alteração do registry faça efeito. É necessário ter poderes de administrador para poder editar o registry. Quando não se tem este tipo de acesso, pode-se criar o path apenas para a sessão corrente da janela de comandos. Supondo que o WinARM tenha sido instalado em c:\WinARM pode-se configurar o caminho com o comando:

path=c:\WinARM\bin;%path%
Este comando pode ser executado por um usuário comum, mas só faz efeito na janela de comando onde foi executado. Para automatizar este processo pode-se criar um arquivo batch com esta linha.

Outro método para configurar o caminho no Windows é usando o "Painel de Controle":

Para verificar se o compilador foi instalado com sucesso, pode-se executar o comando:

arm-elf-gcc -v
O compilador deve escrever informações sobre a versão instalada.
 
Instalação do arm-gcc para Linux

Pegar o arquivo arm-elf-gcc-4.1.0-i586-4.tgz [29 MByte]

No Linux tipo Slackware pode-se usar o comando:

installpkg arm-elf-gcc-4.1.0-i586-4.tgz
Nas outras distribuições pode-se usar os comandos:
cd /
tar xzf $OLDPWD/arm-elf-gcc-4.1.0-i586-4.tgz
cd -

Estes comandos geralmente precisam ser executados como root. O arm-elf-gcc fica instalado dentro do /usr/local com tudo pronto para usar.

Criação de um projeto aplicativo

Tendo um conjunto de ferramentas de desenvolvimento instalado e configurado, pode-se criar o diretório específico para o nosso projeto.

Por ser um compilador poderoso, capaz de compilar grandes projetos de software, o processo de compilação de um programa usando o gcc passa por diversas etapas. Geralmente o comando básico gcc ja faz tudo o que é necessário para gerar o programa executável, mas quando se compila para outra arquitetura alvo, como o ARM, é necessário ter mais controle, ativando explicitamente as etapas da compilação.

Os programas gerados pelo gcc usam um formato intermediário chamado elf (Embeddable and Linkable Format), que são os arquivos objeto com extenção .o Vários arquivos elf podem ser reunidos, incluindo o código de partida crt.o e as bibliotecas para formar o programa executável. No conjunto de ferramentas gnu, quem faz isto é o linker/loader chamado ld. No pacote para ARM temos o arm-elf-ld. Geralmente o ld é chamado automaticamente pelo gcc, mas como queremos usar uma rotina especial de partida, chamaremos o arm-elf-ld explicitamente. O resultado do comando arm-elf-ld é um programa que no Linux seria executável, mas para programá-lo na Flash do LPC2378, devemos converter este arquivo para o formato *.hex. Isto é feito pelo programa arm-elf-objcopy. Finalmente o arquivo com extenção *.hex pode ser usado para gravar a memória Flash do LPC2378 usando o programa lpc21isp.

Seria cansativo e propenso a erros ter que fazer todo este procedimento manualmente toda a vez que queremos compilar o projeto. É possível automatizar esta compilação usando um script de shell ou no DOS, um arquivo de execução em lote tipo *.bat, porém a melhor solução é usar o comando make.

O comando make usa um arquivo chamado Makefile, que descreve os procedimentos necessários para compilar o projeto.

O arquivo a02_pisca_led.zip contém a estrutura básica para o nosso primeiro projeto para o LPC2378 copilado com o arm-elf-gcc. Ao ser expandido (com unzip a02_pisca_led.zip no linux, ou com o Win-zip no Windows), ele cria um diretório chamado a02_pisca_led/ contendo os seguintes arquivos:

Makefile
Arquivo de configuração do programa make, descrevendo os procedimentos necessários para automatizar a compilação do projeto.
crt.S
Procedimento de inicialização (startup) escrito em linguagem assembly do ARM7. Este procedimento contem o ponto de entrada principal do programa e as entradas das interrupções. Ele faz algumas inicializações e chama a rotina main() da parte escrita em linguagem C.
lpc2378_flash.ld
Script de configuração de linker/loader. Este arquivo descreve como o arm-elf-ld deve alocar memória no LPC2378 para os segmentos do programa.
lpc23xx.h
Arquivo de cabeçalho para #include contendo a descrição dos registradores, e portas de I/O dos periféricos do LPC2378.
main.c
Programa principal. Neste exemplo procurou se fazer a coisa mais simples possível que tenha resultados práticos: Fazer piscar um LED.

Compilação e Instalação do projeto

Para compilar e testar o programa use o seguinte procedimento: