Desenvolvendo em Linux para FRDM-KL25Z – Compilação

Publicado: 13 mar 2014 em Tech
Tags:, , , ,

english

Tópicos:

  1. Introdução
  2. Ferramentas
  3. Compilação
  4. Gravação
  5. Debug

Apesar de um conjunto considerável de parâmetros operacionais serem necessários de serem passados para o compilador, conceitualmente o processo de gerar executáveis ARM apropriados para a placa FRDM-KL25Z é virtualmente o mesmo de todas as outras gerações de software baseadas em compilação e linkagem:

  • Pré-processamento, no qual os símbolos do pré-processador são resolvidos para cada arquivo de código fonte (.c) do projeto;
  • Compilação, na qual os resultados do pré-processamento são analisados e um arquivo de código objeto (.o) é gerado para cada arquivo de código fonte. Arquivos objeto contém descrições em código de máquina das funções escritas pelo programador;
  • Linkagem, na qual os arquivos de código objeto do projeto são combinados entre si e com bibliotecas do sistema para a resolução das dependências de chamada de funções. Tipicamente o principal resultado do estágio de linkagem é um arquivo executável para a arquitetura alvo de CPU.

Como exemplo de construção eu escrevi um programa simples de piscar o led RGB da FRDM-KL25Z; descompacte-o em algum lugar do seu sistema de arquivos: frdm-kl25z-blink3-1.0.tar.gz

O aplicativo frdm-kl25z-blink3 foi desenvolvido originalmente com o CodeWarrior 10.4 para Windows, a IDE oficial da Freescale para desenvolvimento na plataforma kinetis e outros produtos no momento da escrita desse artigo. O CodeWarrior é baseado em Eclipse, e existe uma versão grátis para Windows que possibilita a configuração rápida dos recursos da placa usando a tecnologia Processor Expert da Freescale. Para a compilação em Linux deste projeto CodeWarrior, eu coletei as seguintes pastas da área de trabalho do projeto:

  • Generated_Code (alocação de recursos da placa)
  • Project_Settings/Linker_Files (definições de linkagem)
  • Project_Settings/Startup_Code (registro de chamadas de funções externas para inicialização e término do programa)
  • Sources (callbacks de eventos e entrada principal do programa; é aqui onde praticamente todo o desenvolvimento posterior ocorre após a configuração da alocação de recursos da placa)

Adicionalmente, uma vez que esses arquivos foram gerados pelo Processor Expert, para pré-processamento e linkagem apropriados eles dependem de cabeçalhos de sistema e de bibiotecas ARM adicionais. Você precisa das seguintes pastas de uma instalação do CodeWarrior (para Windows):

  • MCU/ARM_GCC_Support/ewl (Freescale Embedded Warrior Libraries)
  • MCU/ProcessorExpert/lib/Kinetis/pdd/inc (Kinetis PDD headers)

No caso de uma instalação Windows do CodeWarrior não estar disponível, opcionalmente você pode fazer download do instalador do CodeWarrior for Microcontrollers 10.4 (Eclipse, offline) no site da Freescale, abri-lo com o file-roller (ou outro gerenciador de arquivos de sua preferência) e então:

  • abrir com.freescale.mcu10_4.kinetis.updatesite.zip, abrir binary/com.freescale.kinetis.gcc_root_1.0.2, e copiar MCU/ARM_GCC_Support/ewl
  • abrir Setup.exe, e copiar $_OUTDIR/ProcessorExpert/lib/Kinetis/pdd/inc

O projeto frdm-kl25z-blink3 vem com um script de configuração para verificar a existência destes arquivos, bem como outras pendências que podem afetar a construção. Edite o arquivo build.sh para atualizar PDD_HEADERS_DIR e EWL_DIR com a localização correta das pastas mencionadas acima, e execute-o para construir o arquivo executável ELF para ARM frdm_kl25z_blink3:

user@localhost /tmp/frdm-kl25z-blink3-1.0 $ ./build.sh
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-none-eabi-strip... arm-none-eabi-strip
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-none-eabi-gcc... arm-none-eabi-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... yes
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether arm-none-eabi-gcc accepts -g... yes
checking for arm-none-eabi-gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of arm-none-eabi-gcc... gcc3
checking if Generated_Code/IO_Map.h exists in sources... yes
checking for Kinetis PDD headers location... /opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
checking for GPIO_PDD.h... yes
checking for LPTMR_PDD.h... yes
checking for EWL headers location... /opt/Freescale/MCU/ARM_GCC_Support/ewl
checking how to run the C preprocessor... arm-none-eabi-gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... no
checking for sys/stat.h... no
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... no
checking for strings.h... no
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... no
checking ansi_parms.h usability... yes
checking ansi_parms.h presence... yes
checking for ansi_parms.h... yes
checking CWCPlusLib.h usability... yes
checking CWCPlusLib.h presence... yes
checking for CWCPlusLib.h... yes
checking runtime_configuration.h usability... yes
checking runtime_configuration.h presence... yes
checking for runtime_configuration.h... yes
checking if Project_Settings/Linker_Files/ProcessorExpert.ld exists in sources... yes
checking for __init_registers in -lrt... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
make  all-am
make[1]: Entering directory `/tmp/frdm-kl25z-blink3-1.0'
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT BlueLED.o -MD
-MP -MF .deps/BlueLED.Tpo -c -o BlueLED.o `test -f 'Generated_Code/BlueLED.c'
|| echo './'`Generated_Code/BlueLED.c
mv -f .deps/BlueLED.Tpo .deps/BlueLED.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT Cpu.o -MD
-MP -MF .deps/Cpu.Tpo -c -o Cpu.o `test -f 'Generated_Code/Cpu.c' || echo
'./'`Generated_Code/Cpu.c
mv -f .deps/Cpu.Tpo .deps/Cpu.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf
-O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT
GreenLED.o -MD -MP -MF .deps/GreenLED.Tpo -c -o GreenLED.o `test -f
'Generated_Code/GreenLED.c' || echo './'`Generated_Code/GreenLED.c
mv -f .deps/GreenLED.Tpo .deps/GreenLED.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf
-O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT
LEDTimer.o -MD -MP -MF .deps/LEDTimer.Tpo -c -o LEDTimer.o `test -f
'Generated_Code/LEDTimer.c' || echo './'`Generated_Code/LEDTimer.c
mv -f .deps/LEDTimer.Tpo .deps/LEDTimer.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT PE_LDD.o -MD
-MP -MF .deps/PE_LDD.Tpo -c -o PE_LDD.o `test -f 'Generated_Code/PE_LDD.c'
|| echo './'`Generated_Code/PE_LDD.c
mv -f .deps/PE_LDD.Tpo .deps/PE_LDD.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT RedLED.o -MD
-MP -MF .deps/RedLED.Tpo -c -o RedLED.o `test -f 'Generated_Code/RedLED.c'
|| echo './'`Generated_Code/RedLED.c
mv -f .deps/RedLED.Tpo .deps/RedLED.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT TU1.o -MD
-MP -MF .deps/TU1.Tpo -c -o TU1.o `test -f 'Generated_Code/TU1.c' || echo
'./'`Generated_Code/TU1.c
mv -f .deps/TU1.Tpo .deps/TU1.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT Vectors.o -MD
-MP -MF .deps/Vectors.Tpo -c -o Vectors.o `test -f 'Generated_Code/Vectors.c'
|| echo './'`Generated_Code/Vectors.c
mv -f .deps/Vectors.Tpo .deps/Vectors.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf
-O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0
-MT __arm_end.o -MD -MP -MF .deps/__arm_end.Tpo -c -o __arm_end.o
`test -f 'Project_Settings/Startup_Code/__arm_end.c' || echo
'./'`Project_Settings/Startup_Code/__arm_end.c
mv -f .deps/__arm_end.Tpo .deps/__arm_end.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf
-O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT
__arm_start.o -MD -MP -MF .deps/__arm_start.Tpo -c -o __arm_start.o
`test -f 'Project_Settings/Startup_Code/__arm_start.c' || echo
'./'`Project_Settings/Startup_Code/__arm_start.c
mv -f .deps/__arm_start.Tpo .deps/__arm_start.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT Events.o
-MD -MP -MF .deps/Events.Tpo -c -o Events.o `test -f 'Sources/Events.c' ||
echo './'`Sources/Events.c
mv -f .deps/Events.Tpo .deps/Events.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf
-O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT
ProcessorExpert.o -MD -MP -MF .deps/ProcessorExpert.Tpo -c -o ProcessorExpert.o
`test -f 'Sources/ProcessorExpert.c' || echo './'`Sources/ProcessorExpert.c
mv -f .deps/ProcessorExpert.Tpo .deps/ProcessorExpert.Po
arm-none-eabi-gcc -DHAVE_CONFIG_H -I.  -I./Sources -I./Generated_Code
-I/opt/Freescale/MCU/ProcessorExpert/lib/Kinetis/pdd/inc
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_C/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include
-I/opt/Freescale/MCU/ARM_GCC_Support/ewl/EWL_Runtime/include/arm
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2 -gstrict-dwarf -O0
-ffunction-sections -fdata-sections -Wall -fmessage-length=0 -MT sa_mtb.o
-MD -MP -MF .deps/sa_mtb.Tpo -c -o sa_mtb.o `test -f 'Sources/sa_mtb.c' ||
echo './'`Sources/sa_mtb.c
mv -f .deps/sa_mtb.Tpo .deps/sa_mtb.Po
arm-none-eabi-gcc  -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -gdwarf-2
-gstrict-dwarf -O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0
-Xlinker --gc-sections -n -L/opt/Freescale/MCU/ARM_GCC_Support/ewl/lib/armv6-m
-T./Project_Settings/Linker_Files/ProcessorExpert.ld -o frdm_kl25z_blink3
BlueLED.o Cpu.o GreenLED.o LEDTimer.o PE_LDD.o RedLED.o TU1.o Vectors.o
__arm_end.o __arm_start.o Events.o ProcessorExpert.o sa_mtb.o  -lrt
make[1]: Leaving directory `/tmp/frdm-kl25z-blink3-1.0'

frdm_kl25z_blink3: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
statically linked, not stripped

A seguir em Gravação iremos gravar o ELF frdm_kl25z_blink3 na placa FRDM-KL25Z para execução.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s