Configurando o Atmel Studio 7 para compilar um projeto Arduino.
Tópicos:
1- Introdução
2- Para saber mais
3- Criando um projeto no Atmel Studio a partir de um sketch Arduino.
4- A estrutura de um projeto Arduino no Atmel Studio
5- Sequencia de compilação
6- Finalizando
Se você curtir esse artigo, não esqueça de dar uns cliques nos anúncios para ver o que os anunciantes tem para te oferecer. Vou ficar muito contente.
1- Introdução:
A partir da versão 7.0.582 o Atmel Studio passou suportar a importação de projetos ‘sketch’ do Arduino. Essa funcionalidade foi melhorada na versão 7.0.790 de acordo com esse link -> aqui <-.
Para que a importação de sketchs Arduino funcione adequadamente é necessário realizar uma série de configurações no Atmel Studio.
Essa primeira parte do tutorial procura abordar de forma consistente as configurações e passos necessários para criar um projeto no Atmel Studio 7 baseado no sketch ‘Blink’ do Arduino e indica como proceder com sua compilação.
É necessário que o leitor faça o download, instale, se familiarize e tenha a plataforma do Arduino funcionando para poder seguir essa série de tutoriais.
Muito importante: não utilize o Microchip Studio junto com a plataforma do Arduino 2.X (por enquanto não são compatíveis).
É para utilizar o Microchip Studio apenas com a plataforma do Arduino 1.8.19 ou anterior.
Como de praxe, antes de entrarmos a fundo no assunto caro leitor, saiba que sua presença em meu site é motivo de orgulho e satisfação. Não hesite em comentar e propor melhorias no texto. Um grande abraço e boa leitura!
2- Sobre o Atmel Studio:
O Atmel Studio é a plataforma oficial de desenvolvimento da família de micro controladores ATMEL, utilizados pela plataforma Arduino.
Essa plataforma oferece várias funcionalidades de produtividade como ‘code completion’, modo debug avançado com simulação de microprocessador permitindo a visualização do estado das entradas, saídas e registradores internos do microprocessador. A plataforma Atmel Studio também oferece suporte à funcionalidade OCD – ‘on chip debug’ desde que o Atmel Studio seja utlizado em conjunto com as ferramentas de desenvolvimento da Atmel como o programador AVR Dragon, ATMEL ICE e outros kits de desenvolvimento da Atmel.
Esse tutorial é baseado no Atmel Studio 7 versão 7.0.1188 conforme figura 1 abaixo. A última versão do Atmel Studio pode ser encontrada no site da Atmel -> nesse link aqui <-.
Durante o tutorial, você irá notar que eu vou falar Atmel Studio e Microchip Studio. Microchip Studio é a versão mais nova do Atmel Studio. O conteúdo desta série de artigos se aplica a ambas versões.
Este tutorial aborda o uso do Atmel Studio SEM usar o plugin “Visual Micro Arduino IDE for Visual Studio” que é proprietário e pago.
Faça o download e instalação do Atmel Studio antes de prosseguir.
2- Para saber mais:
Caso queira, informação adicional pode ser encontrada nos links abaixo:
O man do avr-g++ -> nesse link aqui <-
O man do make -> nesse link aqui <-
A documentação do AtMega328p pode ser encontrada -> nesse link aqui <-
AVR Dragon -> nesse link aqui <-
Download da plataforma Arduino -> nesse link aqui <-
Microchip Studio (antigo Atmel Studio) -> nesse link aqui <-
Compiladores: JOSÉ NETO, João. Introdução à Compilação. São Paulo: Livros Técnicos e Científicos S.A., 1987. 222 p. ISBN: 85-216-0483-1.
3- Criando um projeto no Atmel Studio a partir de um sketch Arduino.
A criação de um projeto no Atmel Studio a partir da importação de um sketch da plataforma Arduino permite que o programador tenha acesso a todas as funcionalidades do ambiente de desenvolvimento do Atmel Studio sem perder as características da plataforma Arduino. Essa funcionalidade permite o reaproveitamento no Atmel Studio das bibliotecas desenvolvidas para os shields e utilizadas na plataforma Arduino. Basta referenciá-las e as utilizar no projeto, tópico que será visto no próximo tutorial.
A criação de um projeto a partir de um sketch do Arduino é feita em duas partes. Primeiro abre-se o projeto no Atmel Studio e depois um script faz a importação do sketch do Arduino para a plataforma do Atmel Studio.
A primeira parte da criação do projeto deve ser feita conforme indicado abaixo. Basta clicar em ‘File’ (1) -> ‘New’ (2) -> ‘Project’ (3) -> ‘Create project from Arduino sketch’ (4). Em seguida define-se os campos ‘Name’, ‘Location’ e ‘Solution Name’ (5) e clica em ‘Ok’ (6), conforme indicado na figura 2 abaixo.
Ao clicar em ‘Ok’ (6), conforme figura 3 abaixo, o Atmel Studio irá abrir uma tela para:
- Selecionar o arquivo sketch que será a base do projeto Arduino (7),
- Informar o caminho da IDE do Arduino – onde está o executável arduino.exe (8),
- Configurar o tipo de cartão Arduino (9),
- Informar qual é o chip que a placa Arduino está utilizando (10).
Ainda conforme figura 3 note que informar o tipo de cartão (9) e o chip utilizado pela placa Arduino (10) é importante para o compilador. O arquivo de sketch informado no item (7), que é o ‘Blink’ nesse exemplo, apenas será copiado para o projeto do Atmel Studio e nenhuma alteração será feita no sketch origem. Basta clicar em ‘Ok’ (11) após configurar esses parâmetros.
Assim que a tela de configuração da figura 3 é fechada, uma tela indicando o progresso da importação é exibida. Nessa etapa um script do Atmel Studio lança o executável ‘arduino.exe’, para criar os diretórios do projeto e fazer a importação do sketch Arduino para a pasta de projetos do Atmel Studio. Esse processo leva cerca de 5 minutos.
Caso demore mais tempo, pode ser que o ‘arduino.exe’ tenha falhado em sua execução. Nesses casos, normalmente a reinicialização do computador resolve o problema.
No português claro: A importação é meio bugada mesmo. Se alguém descobrir o motivo e a solução para esse tipo de situação, me avisa que eu publico aqui dando os devidos créditos.
4- A estrutura de um projeto Arduino no Atmel Studio:
O sketch Arduino que foi importado é composto por dois programas independentes. Terminada a importação do sketch, segue abaixo na figura 4 como o Atmel Studio exibe essa estrutura em sua IDE:
4.1- Solution Explorer e Properties:
No quadro ‘Solution Explorer’ da figura 4 acima podemos ver a solução do Atmel Studio ‘Arduino_No_AtmelStudio’ cujo conteúdo possui dois projetos independentes sendo eles o ‘ArduinoCore’ e o ‘Blink’.
- Tanto o projeto ‘ArduinoCore’ como o projeto ‘Blink’ possuem uma estrutura de arquivos inicial.
- As pastas ‘Libraries’, ‘include’ e ‘src’ do projeto ‘ArduinoCore’ possuem o conjunto de arquivos nativos da plataforma Arduino (estão populadas com os arquivos da plataforma Arduino).
- As pastas do projeto ‘Blink’ servem para abrigar os arquivos desenvolvidos pelo programador. O nome do projeto pode ser alterado.
- Como nada foi compilado ainda, note que a pasta ‘Output Files’ de ambos projetos estão vazias.
- O quadro ‘Properties’ exibe informações acerca do componente selecionado no quadro ‘Solution Explorer’.
5- Sequência de compilação manual:
Para executar o build automático basta clicar com o botão esquerdo do mouse na solução ‘Arduino_No_AtmelStudio’ e teclar ‘F7’. Mas entender o processo de build e saber disparar ele manualmente é uma importante ferramenta para depurar o código. Acompanhe os passos a seguir.
A compilação de um programa, em linhas gerais (para ir a fundo, consulte as referências) consiste na etapa de ‘build’ responsável por gerar um ou mais códigos objeto e na etapa de ‘link’, responsável por integrar os códigos objeto gerados na etapa de ‘build’ formando um arquivo único.
O AtmelStudio cria uma ‘Solução’ composta por dois projetos, ‘ArduinoCore’ e o ‘Blink’ (nesse caso). Cada projeto precisa ser pré-processado e compilado individualmente para depois serem integrados na etapa de ‘link’ (montagem), gerando o código binário final.
5.1- FAzendo o Build do ArduinoCore:
O projeto ‘ArduinoCore’ deve ser compilado primeiro por uma simples razão: Se a compilação do ArduinoCore falhar não será gerado o arquivo objeto ‘libArduinoCore.a’. Por efeito cascata a etapa de montagem irá falhar em todos os outros projetos contidos na solução ‘Arduino_No_AtmelStudio’.
Para compilar apenas o projeto ‘ArduinoCore’ precisa acessar o ‘Solution Explorer’ -> clicar com o botão direito do mouse no projeto ‘Arduino Core’-> o menu de contexto irá abrir exibindo as opções de compilação ‘Build’, ‘Rebuild’, ‘Clean’ e outras. Clique na opção ‘Build’.
Conforme indicado na figura 5 abaixo, o processo de build do projeto ‘ArduinoCore’ é iniciado. A janela ‘Output’ vai atualizando as mensagens do build durante seu processamento. Ao final do processamento temos o conteúdo da pasta ‘Dependencies’ atualizado e o arquivo objeto ‘libArduinoCore.a’ é disponibilizado na pasta ‘Output Files’.
Se o arquivo objeto ‘libArduinoCore.a’ não foi gerado, algo deu errado. É necessário interpretar as mensagens do build apresentadas na tela ‘Output’ e fazer as correções necessárias antes de prosseguir.
5.2- FAzendo o Build do Blink:
Conforme dito no tópico 5.1, somente após a compilação do projeto ‘ArduinoCore’ é que o projeto ‘Blink’ pode ser compilado.
Para compilar apenas o projeto ‘Blink’, precisa acessar o ‘Solution Explorer’ -> clicar com o botão direito do mouse no projeto ‘Blink’-> o menu de contexto irá abrir exibindo as opções de compilação ‘Build’, ‘Rebuild’, ‘Clean’ e outras. Clique na opção ‘Build’.
Da mesma forma que no build do projeto ‘ArduinoCore’, o processo de build do projeto ‘Blink’ é iniciado. A janela ‘Output’ vai atualizando as mensagens do build durante seu processamento, porém de um modo diferente, conforme segue:
------ Build started: Project: ArduinoCore, Configuration: Debug AVR ------ Build started. Project "ArduinoCore.cppproj" (default targets): Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "c:\users\renat.desktop-7sijlum\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\ArduinoCore\ArduinoCore.cppproj" (target "Build" depends on it): Task "RunCompilerTask" Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 8 --output-sync make: Nothing to be done for 'all'. Done executing task "RunCompilerTask". Task "RunOutputFileVerifyTask" Done executing task "RunOutputFileVerifyTask". Done building target "CoreBuild" in project "ArduinoCore.cppproj". Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != ''). Target "Build" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Avr.common.targets" from project "c:\users\renat.desktop-7sijlum\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\ArduinoCore\ArduinoCore.cppproj" (entry point): Done building target "Build" in project "ArduinoCore.cppproj". Done building project "ArduinoCore.cppproj". Build succeeded. ------ Build started: Project: Blink, Configuration: Debug AVR ------ Build started. Project "Blink.cppproj" (default targets): Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "c:\users\renat.desktop-7sijlum\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Blink.cppproj" (target "Build" depends on it): Using "RunCompilerTask" task from assembly "C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\AvrGCC.dll". Task "RunCompilerTask" Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 8 --output-sync Building file: .././Sketch.cpp Invoking: AVR8/GNU C Compiler : 4.9.2 "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-g++.exe" -funsigned-char -funsigned-bitfields -DDEBUG -DF_CPU=16000000L -DARDUINO=10801 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -DUSB_VID=0x2341 -DUSB_PID=0x0043 -DUSB_MANUFACTURER="\"Arduino LLC\"" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.1.130\include" -I"..\\..\ArduinoCore\include\core" -I"..\\..\ArduinoCore\include\variants\standard" -Os -fno-threadsafe-statics -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -w -mmcu=atmega328p -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.1.130\gcc\dev\atmega328p" -c -std=gnu++11 -MD -MP -MF "Sketch.d" -MT"Sketch.d" -MT"Sketch.o" -o "Sketch.o" ".././Sketch.cpp" Finished building: .././Sketch.cpp Building target: Blink.elf Invoking: AVR8/GNU Linker : 4.9.2 "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-g++.exe" -o Blink.elf Sketch.o -Wl,-Map="Blink.map" -Wl,--start-group -Wl,-lm -Wl,-lArduinoCore -Wl,--end-group -Wl,-L"c:\users\RENAT~1.DES\DOCUME~1\ATMELS~1\7.0\ARDUIN~3\ARDUIN~1\ARDUIN~1\Debug" -Wl,--gc-sections -mmcu=atmega328p -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.1.130\gcc\dev\atmega328p" -Os Finished building target: Blink.elf "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "Blink.elf" "Blink.hex" "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "Blink.elf" "Blink.eep" || exit 0 "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "Blink.elf" > "Blink.lss" "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "Blink.elf" "Blink.srec" "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "Blink.elf" text data bss dec hex filename 1068 0 9 1077 435 Blink.elf Done executing task "RunCompilerTask". Using "RunOutputFileVerifyTask" task from assembly "C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\AvrGCC.dll". Task "RunOutputFileVerifyTask" Program Memory Usage : 1068 bytes 3,3 % Full Data Memory Usage : 9 bytes 0,4 % Full Done executing task "RunOutputFileVerifyTask". Done building target "CoreBuild" in project "Blink.cppproj". Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != ''). Target "Build" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Avr.common.targets" from project "c:\users\renat.desktop-7sijlum\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Blink.cppproj" (entry point): Done building target "Build" in project "Blink.cppproj". Done building project "Blink.cppproj". Build succeeded. ========== Build: 2 succeeded or up-to-date, 0 failed, 0 skipped ==========
- O script de Build olha e verifica que ‘Blink’ precisa do ‘ArduinoCore’ e dispara o build do ‘ArduinoCore’.
- O próprio ‘Make’ na linha 9 retorna a mensagem ‘make: Nothing to be done for ‘all” indicando que o ‘ArduinoCore’ foi compilado anteriormente e tudo está ok.
- Na linha 19 começa a compilação do projeto ‘Blink’.
- Na linha 27 é chamado o make.
- Na linha 33 é invocado o montador (Linker).
- Na linha 34 é informado o caminho para que seja encontrada a biblioteca ‘libArduinoCore.a’, resultado da compilação do projeto ‘ArduinoCore’. Note que o caminho está escrito no formato 8.3 (6 caracteres~numero . extensão do arquivo)
- Na linha 36 é criado o arquivo ‘Blink.hex’ que é o firmware a ser carregado na placa do Arduino Uno.
Ao final do processamento temos o conteúdo da pasta ‘Dependencies’ atualizado e a pasta ‘Output Files’ é populada com os arquivos ‘Blink.elf’, ‘Blink.map’ e o ‘Blink.hex’ que é o firmware a ser carregado no Arduino Uno pelo AVRDUDE. A configuração do AVRDUDE será abordada no próximo artigo.
Os arquivos ‘Blink.lss’, ‘Blink.eep’ e o ‘Blink.srec’ não são necessários nesse tutorial. O compilador pode ser configurado para não criar esses arquivos. Essa configuração pode ser realizada acessando as propriedades do projeto ‘Blink’ -> item ‘Toolchain’ -> AVR/GNU Common -> Output Files e desmarcando a opção de criação dos arquivos ‘.lss’, ‘.eep’ e ‘.srec’.
6- Finalizando:
Nessa etapa foi introduzida a configuração inicial para se importar um projeto Arduino no Atmel Studio, foi comentado sobre a organização do projeto Arduino dentro da plataforma Atmel Studio e apresentou-se o processo de compilação do projeto ‘Blink’ em detalhes. Os próximos artigos vão abordar a configuração da ‘Toolchain’ e outros tópicos como: importação de bibliotecas dos shields, configuração do AVRDUDE e depuração de código utilizando a plataforma Atmel Studio.
Torçam para que eu tenha fôlego!
Um grande abraço e saiba que a satisfação é minha pelo prestígio de ter sua atenção até esse ponto.
By Renato de Pierri
17 de Janeiro de 2017, atualizado em 24 de Junho de 2024.