Universidade Federal do Rio Grande do Sul Escola de Engenharia Departamento de Sistemas Elétricos de Automação e Energia ENG10032 Microcontroladores 1 Objetivo Roteiro de Laboratório 2 Ambiente de Desenvolvimento Prof. Walter Fetter Lages 1 de agosto de 2015 O objetivo deste laboratório é familiarizar os alunos com a o ambiente de desenvolvimento da Galileo Gen2 em Linux. A princípio, seria possível instalar no cartão SD uma distribuição de Linux normal"e utilizar as ferramentas de desenvolvimento executando na própria Galileo. No entanto, como o processador da Galileo não é muito potente, a compilação certamente seria demorada. Outro ponto a considerar é que a memória flash da Galileo não é muito grande e para a versão final da aplicação seria interessante poder executá-la diretamente a partir da flash, sem a necessidade do cartão SD. Para isso, é necessário que o Linux executando na Galileo tenha um pequeno footprint e para isso é necessário utilizar versões especiais das bibliotecas que não suportam adequadamente ambientes de desenvolvimento mais sofisticados. A utilização de um ambiente de desenvolvimento independente da plataforma alvo, também torna o desenvolvimento mais independente da Galileo em si e mais similar aos ambientes de desenvolvimento de outras plataformas para sistemas embarcados. Ao final deste laboratório, espera-se que os alunos sejam capazes de compilar um programa em C para executar na Galileo utilizando Makefile e compilador cruzado e perceber as diferenças entre programas desenvolvidos para a plataforma host e para a plataforma alvo. 2 Configuração do Ambiente de Desenvolvimento O ambiente de desenvolvimento da Galileo é baseado no projeto Yocto, que utiliza a ferramenta BitBake para criar imagens de sistemas Linux para sistemas embar- 1
cados e o OpenEmbedded como sistema de build. Estes componentes formam um sistema build de referência chamado Poky. Utilizando o Poky se pode criar uma distribuição Linux específica para a Galileo com pequeno footprint e as bibliotecas e utilitários necessários para a aplicação em questão. Além da distribuição Linux, cria-se também um conjunto de ferramentas de desenvolvimento cruzado que utilizam as bibliotecas incluídas na distribuição. Mas adiante haverá um laboratório para onde será criada distribuição e as respectivas ferramentas de distribuição. No entanto, por hora, serão utilizada as ferramentas de desenvolvimento já incluídas no pacote do Arduino para a Galileo http://downloadmirror.intel.com/24783/eng/intelarduino-1..0-linux4.txz, para a versão de 4 bits ou http://downloadmirror. intel.com/24783/eng/intelarduino-1..0-linux32.txz, para a versão de 32 bits. Note que 4 ou 32 bits aqui se refere à plataforma onde o as ferramentas serão executadas, o código gerado para a Galileo tem que ser sempre de 32 bits. Para instalar as ferramentas faça o seguinte, no host, como superusuário 1 : 1. Baixe e descompacte o arquivo como o IDE do Arduino no diretório /opt: cd /opt tar -xjf IntelArduino-1..0-Linux4.txz rm IntelArduino-1..0-Linux4.txz 2. Ainda no diretório /opt, crie um link para a versão atual do IDE do Arduino: ln -s arduino-1..0+intel arduino 3. Crie um link para o diretório das ferramentas de desenvolvimento: ln -s arduino/hardware/tools/i58 clanton-tiny cd clanton-tiny ln -s. 1.4.2 Atenção: o nome do link tem que ser clanton-tiny, pois o as ferramentas cruzadas foram compiladas para serem instaladas no diretório /opt/clanton-tiny 2. Até é possível instalar em outro diretório, mas neste caso seria necessário passar sempre opções de compilação indicando 1 As instruções estão aqui para que sua máquina em casa possa ser configurada. No laboratório as máquinas já estão configuradas adequadamente. 2 Clanton é o nome de desenvolvimento do X1000. 2
a localização das bibliotecas padrão, dos arquivos de cabeçalho padrão, dos arquivos de start-up, etc. 3 Experimentos 1. Crie um diretório no host para colocar os códigos fontes dos programas. Habitue-se também a criar um diretório para cada programa onde existe o código fonte do programa em um Makefile. 2. A Listagem 1 mostra um programa "Hello, World!"em C. Listing 1: Programa "Hello, World!"em C. 1 #include <stdio.h> 2 3 int main(int argc,char *argv[]) 4 { 5 printf("hello, world!\n"); 7 return 0; 8 } Este programa pode ser compilado para execução no host com o Makefile mostrado na Listagem 2. Tente entender o funcionamento do Makefile 3. Compile e execute o programa host, para constatar o seu funcionamento. 4. Carregue a sua chave de SSH. 5. Transfira o programa recém compilado para a Galileo: scp hello [galileoname]: onde [galileoname] é o nome da Galileo.. Faça login na Galileo e verifique que o arquivo efetivamente encontra-se lá. 7. Tente executar o programa e verifique o que ocorre. 8. Crie outro diretório no host e copie o arquivo do programa da Listagem 1. 9. Compile o programa para execução na Galileo com o Makefile mostrado na Listagem 3. 3
Listing 2: Makefile para compilação para execução no host. 1 PREFIX=/usr/local 2 BINDIR=$(PREFIX)/bin 3 4 TARGET=hello 5 SRCS=$(TARGET).c 7 FLAGS=-O2 -Wall -g -MMD 8 INCLUDE=-I. -I$(HOME)/include 9 LIBDIR=-L$(HOME)/lib 10 LIBS= 11 12 CC=gcc 13 CFLAGS=$(FLAGS) $(INCLUDE) 14 LDFLAGS=$(LIBDIR) $(LIBS) 15 1 all: $(TARGET) 17 18 $(TARGET): $(SRCS:.c=.o) 19 $(CC) -o $@ $^ $(LDFLAGS) 20 21 %.o: %.c 22 $(CC) $(CFLAGS) -c -o $@ $< 23 24 -include $(SRCS:.c=.d) 25 2 clean: 27 rm -f *~ *.bak *.o *.d 28 29 distclean: clean 30 rm -f $(TARGET) 31 32 install: $(TARGET) 33 install -m 755 $(TARGET) $(BINDIR) 34 35 uninstall: 3 rm -f $(BINDIR)/$(TARGET) 4
Listing 3: Makefile para compilação para execução na Galileo. 1 DEVKIT_HOME=/opt/clanton-tiny 2 PATH+=:$(DEVKIT_HOME)/sysroots/pokysdk/usr/bin/i58-poky-linux-uclibc 3 4 PREFIX= 5 BINDIR=$(PREFIX) 7 USER=fetter 8 TARGETSYS=galileo9 9 10 TARGET=hello 11 SRCS=$(TARGET).c 12 13 FLAGS=-O2 -Wall -g -MMD 14 INCLUDE=-I. 15 LIBDIR= 1 LIBS= 17 18 CC=i58-poky-linux-uclibc-gcc 19 CFLAGS=$(FLAGS) $(INCLUDE) 20 LDFLAGS=$(LIBDIR) $(LIBS) 21 22 all: $(TARGET) 23 24 $(TARGET): $(SRCS:.c=.o) 25 $(CC) -o $@ $^ $(LDFLAGS) 2 27 %.o: %.c 28 $(CC) $(CFLAGS) -c -o $@ $< 29 30 -include $(SRCS:.c=.d) 31 32 clean: 33 rm -f *~ *.bak *.o *.d 34 35 distclean: clean 3 rm -f $(TARGET) 37 38 install: $(TARGET) 39 scp $(TARGET) $(USER)@$(TARGETSYS):$(BINDIR) 40 41 uninstall: 42 ssh $(USER)@$(TARGETSYS)galileo9 rm -f $(BINDIR)/$(TARGET) 5
10. Transfira o programa para a Galileo: make install 11. Tente executar o programa na Galileo e verifique o que acontece. 12. Utilize os comandos file e ldd para verificar a diferença entre os executáveis nos casos 7 e 11. 13. Aconteceria a mesma coisa se o Linux executando no host fosse também de 32 bits? 14. Faça um Hello, World!"em C++ e compile-o com um Makefile adequado para executar na Galileo.