 | Nível: Introdutório Jeff Orloff, Technology Coordinator/Consultant, PBCSD/Sequoia Media Services Inc.
20/Mai/2009 Há muitas ferramentas disponíveis para programar diversas versões dos núcleos ARM, mas um conjunto especialmente popular é o conjunto de ferramentas GNU ARM. Aprenda mais sobre desenvolvimento embarcado usando o núcleo ARM, e também sobre como instalar as ferramentas GNU e começar a usá-las.
Se você tiver interesse em desenvolvimento de sistemas embarcados em um microprocessador amplamente usado, o núcleo Advanced RISC Machines (ARM) é bem adequado. Este artigo fornece um ponto de partida para entender o lado do software no desenvolvimento de sistemas embarcados, descrevendo um conjunto de ferramentas comumente usadas: o conjunto de ferramentas GNU ARM.
A família ARM
Uma das principais preocupações entre os desenvolvedores de sistemas embarcados é como obter o máximo poder de processamento com o mínimo consumo de eletricidade. A família de processadores ARM tem um dos melhores designs para equilibrar a potência do processador e o consumo de energia da bateria.
O núcleo ARM teve avanços tecnológicos por meio de diversas versões ao longo dos últimos 20 anos. Processadores recentes com sistema integrado em um chipe (SoC) e que são executados em celulares, como o T-Mobile G1 Android, combinam processadores dual-core (ARM9 e ARM11) para melhorar o desempenho de aplicativos multimídia em plataformas com baixa potência.
Os núcleos ARM mais recentes suportam dois estados operacionais: O estado ARM, no qual o núcleo executa instruções de 32 bits do tipo word-aligned, e o estado THUMB, que executa instruções de 16 bits do tipo halfword-aligned. O modo ARM fornece a potência e capacidade de intervalo de endereçamento máximas ao processador, enquanto o modo THUMB permite que partes do programa sejam escritas de um modo bem fechado, que poupa memória, o que reduz os custos com memória. Alternar entre os modos é um exercício trivial, e para muitos algoritmos, o tamanho do código necessário pode ser reduzido significativamente.
Os processadores ARM melhoram o desempenho aproveitando uma arquitetura Harvard modificada. Nessa arquitetura, o processador emprega caches separados para dados e instruções, mas são "alimentados" pelo mesmo barramento para acesso à memória externa. Além disso, as instruções são colocadas em um "pipeline" para que o processamento paralelo ocorra nas cinco instruções carregadas mais recentemente no pipeline. Em outras palavras, cada uma das cinco ações separadas (busca, decodificação, ALU, memória, gravar) que envolvem instruções ocorre em paralelo. Enquanto o fluxo no pipeline estiver constante, seu código aproveitará as vantagens de velocidade oferecidas pelo paralelismo, mas no momento em que ocorrer uma ramificação do código para fora do pipeline, todo este tem de ser reiniciado, penalizando o desempenho. A moral é tomar cuidado ao projetar o código para que possa usar a ramificação ao mínimo.
Um recurso único fornecido pela arquitetura ARM —ao forçar os programadores a pensar em modos novos e exclusivos—é que cada instrução pode ser executada de forma opcional com base no estado atual dos sinalizadores do sistema. Esse recurso pode eliminar a necessidade de ramificar alguns algoritmos e, assim, manter as vantagens de mecanismos de instrução baseada em pipeline e de cache de dados executados no seu desempenho máximo (visto que a ramificação pode forçar os caches a serem limpos desnecessariamente).
O conjunto de ferramentas GNU ARM
A maior parte da programação de sistemas ARM ocorre em estações de trabalho não-ARM que usam ferramentas para fazer a compilação cruzada para a plataforma ARM. O conjunto de ferramentas GNU ARM é um ambiente de programação desses, que permitem que você use ambientes e ferramentas da sua estação de trabalho favorita para projetar, desenvolver e até testar em simuladores de ARM.
Hospedado por CodeSourcery (veja o link em Recursos), o conjunto de ferramentas GNU descrito neste artigo—conhecido também como Sourcery G++ Lite—está disponível para download e uso sem custo. Todas as ferramentas, exceto a GNU C Library, são licenciadas sob o padrão da Licença Pública GNU, versão 3 (GPL3). A GNU C Library é licenciada sob a GPL versão 2.1. Incluídos no conjunto de ferramentas GNU estão utilitários binários (binutils), a GNU Compiler Collection (GCC), o GNU Remote Debugger (GDB), GNU make e utilitários principais GNU.
No pacote do Sourcery G++ Lite está incluída extensa documentação sobre as ferramentas de conjunto de ferramentas GNU, incluindo o documento GNU Coding Standards —sempre uma boa leitura! Sob a documentação do assembler GNU, as, você encontrará várias informações específicas de ARM: códigos operacionais, sintaxe, diretivas, e assim por diante.
Fazendo download e instalando o conjunto de ferramentas GNU
Para fazer o download do conjunto de ferramentas GNU, vá até o site de download do CodeSourcery (veja Recursos) e escolha o arquivo IA32 GNU/Linux TAR:
arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
|
Estão disponíveis versões do conjunto de ferramentas GNU para todos os principais sistemas operacionais clientes, mas este artigo se concentra na instalação e uso da versão Lite do conjunto de ferramentas para Linux®.
Visto que o design ARM progrediu, passando por versões diferentes ao longo do seu histórico, bibliotecas diferentes em C para as três versões mais comuns do design de processador —ARM v4T, ARM v5T e ARM 7—estão incluídas no pacote Lite.
A seguir, use o comando bunzip2 para extrair o arquivo no seu diretório home.
Listagem 1. Extraindo o conjunto de ferramentas GNU que foi baixado por download
$ bunzip2 arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar -xvf arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
.
.
.
(Files listed while being extracted from the archive.)
.
.
.
$
|
Agora, modifique sua variável de ambiente PATH para acessar o diretório bin do conjunto de ferramentas, e as ferramentas estarão prontas para o uso.
Configurando o Linux para usar o conjunto de ferramentas GNU
Na página de download do conjunto de ferramentas, você também encontrará vários arquivos úteis em PDF—além de um guia detalhado de Introdução—que documenta as ferramentas incluídas. As instruções nesse artigo são uma versão condensada que deve permitir que o conjunto de ferramentas seja ativado e usado rapidamente.
Se você faz muito mais programação ARM do que em processador Intel®, um método alternativo é acrescentar links simbólicos ao seu diretório /usr/local/bin que façam referências às ferramentas no diretório bin do conjunto de ferramentas. Desse modo, pode-se usar atalhos como as para executar o comando arm-none-linux-gnueabi-as de forma interativa. A Listagem 2 mostra exemplos de como configurar esses links simbólicos.
Listagem 2. Configuração de links simbólicos para ferramentas ARM
# cd /usr/local/bin
# which arm-none-linux-gnueabi-as
/home/bzimmerly/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as
# ln -s /home/bzimmerly/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as as
# ls -l as
lrwxrwxrwx 1 bzimmerly bzimmerly 76 2009-03-13 02:48 as -> /home/bzimmerly
/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-as
# ./as --version
GNU assembler (Sourcery G++ Lite 2008q1-126) 2.18.50.20080215
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-linux-gnueabi'.
#
|
Use o comando which para localizar o nome completo do caminho do comando, facilitando a cópia e colagem dele no comando ln. Daí, use o comando ln -s para criar o link simbólico. Depois disso, verifique se o link foi criado com sucesso listando-o e, depois, executando-o. Criando um link simbólico simples com todas as ferramentas no diretório bin do conjunto de ferramentas GNU, você não precisa digitar os nomes compridos. Sem dúvida, as é mais fácil digitar do que arm-none-linux-gnueabi-as toda vez que você quiser executar o assembler!
Escrevendo um programa para a arquitetura ARM
Há muitos guias disponíveis para escrever programas ARM na popular linguagem de programação C, mas há poucos que tratam de assembler puro. Para as finalidades deste artigo, vou romper com a tradição e escrever um programa de exemplo em assembler puro—algo que é em geral considerado a "bruxaria" da programação. é um simples programa do tipo "Olá, Mundo" voltado para uma única versão do Linux ARM.
O programa exemplo descrito neste artigo foi projetado para ser executado no celular T-Mobile G1 que execute o Linux Android. Ele também foi escrito genericamente para ser executado em outras plataformas Linux baseadas em ARM (fazendo apenas as chamadas padrão ao sistema). Contudo, a versão mínima do kernel Linux que você precisará usar é a versão 2.6.16, que permite que você use as novas chamadas ao sistema do kernel EABI (Embedded Application Binary Interface).
Obs.: Para ler um bom artigo sobre programação de ARM para hardware puro em vez de para Linux, veja o link para o artigo Embedded.com em Recursos.
Usando seu editor favorito, crie um script chamado build usando o código da Listagem 3. Esse script é executado no assembler GNU ARM, seguido pelo vinculador. O objetivo ao criar esse programa foi torná-lo um pequeno arquivo executável, de modo que retirei todas as informações de depuração com o switch do vinculador --strip-all. Após criar o script, torne-o executável emitindo o comando chmod +x build.
Listagem 3. Construção do aplicativo Olá, Mundo do Linux ARM
#!/bin/bash
echo Building the ARM Linux Hello World...
arm-none-linux-gnueabi-as -alh -o hw.o hw.S > hw.lst
arm-none-linux-gnueabi-ld --strip-all -o hw hw.o
|
Após isso, crie o módulo fonte, chamado hw.S e coloque o código da Listagem 4 nele.
Listagem 4. Olá, Mundo do Linux ARM
@filename: hw.S
.text
.align 2
.global _start
@ ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
@ r7 r0 r1 r2
_start:
adr r1, msg @ Address
mov r0, #1 @ STDOUT
mov r2, #16 @ Length
mov r7, #4 @ sys_write
svc 0x00000000
@ int sys_exit(int status)
@ r7 r0
mov r0, #0 @ Return code
mov r7, #1 @ sys_exit
svc 0x00000000
.align 2
msg:
.asciz "Hello Android!\n\n"
|
Na linguagem do assembler GNU, o sinal "arroba" (@) é usado para designar comentários de linha. O assembler ignora tudo após o @ até o fim da linha.
O programa usa duas chamadas de sistema Linux padrão: sys_write e sys_exit. Acima do código assembler em cada uma dessas chamadas está a linguagem C equivalente a ele em forma comentada. Isso facilita visualizar como os registradores ARM mapeiam adequadamente os parâmetros de chamada usados pelas chamadas ao sistema. A regra é lembrar que os parâmetros aparecem da esquerda para a direita, r0 para r6. O registrador r7 é especial no sentido de que é nele que você coloca o número da chamada ao sistema que está sendo usado.
A instrução svc 0x00000000 diz ao processador ARM para chamar o "supervisor", que, no caso, é o kernel Linux.
Teste do programa ARM
O conjunto de ferramentas fornece o popular GDB para fazer a depuração de programas de baixo nível. Quando o programa é para um computador single-board com unidade JTAG ou ICE anexada a ele, pode-se usar o depurador Sourcery G++ Lite (gdb) para depurar remotamente o código ARM.
Se quiser testar o código como fiz—no sistema Linux Android executado em um celular, —é preciso conectar o telefone à estação de trabalho usando o cabo USB que vem com ele, depois usar o comando adb push do kit de desenvolvimento de software (SDK's) do Android para transferir o programa para o telefone. Quando ele estiver no telefone, em um diretório que possa conter código executável (/data/local/bin), torne o programa executável enviando o comando chmod 555 hw. (O comando chmod do Android não usa +x, de modo que é necessário usar 555, em vez dele.)
Por fim, use o comando adb shell para conectar ao telefone, use cd para mudar para o diretório correto e execute-o com ./hw. Se tudo sair de acordo com os planos, o programa deverá responder como aconteceu no meu telefone, com uma saudação para você: "Olá, Android!"
Conclusão
Se essa pequena amostra de programação de montagem ARM o deixou interessado, fique à vontade para aprender mais sobre esse design de processador a partir dos links fornecidos em Recursos. O melhor recurso para um estudo profundo do núcleo ARM é a Bíblia do desenvolvimento ARM, o ARM ARM, a forma abreviada de Manual de Referência de Arquitetura ARM.
Para quem pensa em seguir essa carreira, leve em conta o seguinte: Há milhões e milhões de celulares no mundo hoje, e cada vez mais são criados a cada ano. A tecnologia de ponta chegou a um ponto em que podemos carregar no bolso máquinas com processadores dual-core e vários gigabytes de armazenamento, totalmente conectadas à Internet com informações e entretenimento instantâneos. Há uma demanda desesperada de programadores talentosos para fornecedoras de celulares. Visto que o ARM é tão comum, há muito trabalho a ser feito —trabalho que também é divertido! Como sempre, fique à vontade para se divertir com as ferramentas. Programação é parte arte e parte ciência, e pode ser uma das carreiras mais agradáveis no campo da tecnologia.
Recursos Aprender
Obter produtos e tecnologias
Discutir
-
Participe da comunidade My developerWorks; com seu perfil pessoal e página inicial customizada, você pode adaptar a developerWorks aos seus interesses e interagir com outros usuários developerWorks.
Sobre o autor  | |  | Bill Zimmerly é engenheiro de conhecimento, programador de sistemas de baixo nível, com experiência em diversas versões do UNIX e do Microsoft® Windows®, e um livre-pensador que idolatra a Lógica. Bill é também conhecido como uma pessoa não razoável. Não razoável como na frase: 'Pessoas razoáveis se adaptam ao mundo. Pessoas não razoáveis tentam adaptar o mundo a si mesmas. Todo progresso, portanto, depende das pessoas não razoáveis' (George Bernard Shaw). Criar novas tecnologias e escrever sobre elas são suas paixões. Ele reside na zona rural de Hillsboro, Missouri, onde o ar é limpo, as vistas são inspiradoras e há ótimas vinícolas por perto. Não há nada como escrever um artigo sobre script de shell do UNIX enquanto saboreia uma taça de cristal cheia de um bom Stone Hill Blush. Pode-se entrar em contato com ele pelo e-mail bill@zimmerly.com. |
Avalie esta página
|  |