O utilitário MAKE trabalha com dependências e procedimentos. No nosso primeiro programa, o arquivo final era o flash.bin que dependia do rst_0.bin que, por sua vez, dependia do rst_0.elf e assim por diante até chegarmos na primeira dependência que era o programa assembly rst_0.s propriamente dito. Se usarmos o símbolo ':' para marcar a dependência, teremos:
- flash.bin: rst_0.bin
- rst_0.bin: rst_0.elf
- rst_0.elf: rst_0.o
- rst_0.o: rst_0.s
Do lado esquerdo dos dois-pontos temos o produto e do lado direito o produto necessário para gerá-lo. Dessa forma, temos uma cadeia de dependências:
flash.bin: rst_0.bin: rst_0.elf: rst_0.o: rst_0.s
Essa é a primeira construção do makefile.
Dissemos que o utilitário MAKE trabalha com dependências e procedimentos. Para satisfazer as dependências temos os procedimentos. Como incluir um procedimento no arquivo makefile?
Simples: na linha seguinte à dependência, iniciando com o caractere TAB (0x09), codificamos o(s) comando(s) que satisfaz(em) essa dependência. Veja o exemplo abaixo:
- rst_0.o: rst_0.s
- arm-none-eabi-as -a -o rst_0.o rst_0.s
Para satisfazer a dependência da linha 1, o utilitário MAKE executa o comando que esta na linha 2. Simples assim. O arquivo makefile completo para o nosso promeiro programa está abaixo:
- flash.bin: rst_0.bin
- dd if=/dev/zero of=flash.bin bs=4096 count=16
- dd if=rst_0.bin of=flash.bin bs=4096 conv=notrunc
- rst_0.bin: rst_0.elf
- arm-none-eabi-objcopy -O binary rst_0.elf rst_0.bin
- rst_0.elf: rst_0.o
- arm-none-eabi-ld -Ttext=0x00000000 -o rst_0.elf rst_0.o
- arm-none-eabi-nm rst_0.elf
- rst_0.o: rst_0.s
- arm-none-eabi-as -a -o rst_0.o rst_0.s
- clean:
- rm *.bin
- rm *.elf
- rm *.o
Todas as dependências estão satisfeitas por comandos. Notem uma dependência nova na linha 13. Na verdade, podemos executar o utilitário MAKE dizendo a ele qual dependência queremos satisfazer. A linha 13 permite uma opção para limpar todos os arquivos de saída dos procedimentos executados. Vejamos sua execução:
A dependência clean executa o comando rm (remove) para excluir os arquivos desejados.
Finalmente, eis a execução de nosso makefile para gerar nosso primeiro programa:
Por último, para deixarmos mais fácil a leitura das saídas das sequências de comandos, usaremos o comando @echo para sinalizar o que está sendo executado:- U:\arm_00>make clean
- rm *.bin
- rm *.elf
- rm *.o
- U:\arm_00>
Finalmente, eis a execução de nosso makefile para gerar nosso primeiro programa:
- U:\arm_00>make
- arm-none-eabi-as -a -o rst_0.o rst_0.s
- ARM GAS rst_0.s page 1
- 1 // Primeiro programa para ARM Cortex-M0
- 2
- 3 .code 16 // Define c├│digo como THUMB
- 4 .globl _start // Necessario para o linker
- 5
- 6 .equ STACK_INIT,0x020002000
- 7
- 8 .text // Inicio da área de código
- 9 _start:
- 10
- 11 // Inicio do Vector Table
- 12
- 13 0000 00200020 .word STACK_INIT // Inicio da pilha
- 14 0004 00000000 .word reset_handler // Endereco do Reset Handler
- 15
- 16 // define o label como função para que o linker
- 17 // resolva como c├│digo THUMB
- 18
- 19 .type reset_handler, function
- 20
- 21 reset_handler: // inicio do tratamento do reset
- 22
- 23 0008 0320 mov r0, #3 // carrega r0 com o valor 3
- 24 000a 0421 mov r1, #4 // carrega r1 com o valor 4
- 25 000c 0A18 add r2, r1, r0 // soma r0 e r1 guardando em r2
- 26
- 27 000e FEE7 _stop: b . // loop infinito
- ♀ARM GAS rst_0.s page 2
- DEFINED SYMBOLS
- rst_0.s:9 .text:00000000 _start
- rst_0.s:6 *ABS*:20002000 STACK_INIT
- rst_0.s:21 .text:00000008 reset_handler
- .text:00000000 $d
- rst_0.s:23 .text:00000008 $t
- rst_0.s:27 .text:0000000e _stop
- NO UNDEFINED SYMBOLS
- arm-none-eabi-ld -Ttext=0x00000000 -o rst_0.elf rst_0.o
- arm-none-eabi-nm rst_0.elf
- 00008010 T __bss_end__
- 00008010 T __bss_start
- 00008010 T __bss_start__
- 00008010 T __data_start
- 00008010 T __end__
- 00008010 T _bss_end__
- 00008010 T _edata
- 00008010 T _end
- 00080000 T _stack
- 00000000 T _start
- 0000000e t _stop
- 00000008 t reset_handler
- 20002000 a STACK_INIT
- arm-none-eabi-objcopy -O binary rst_0.elf rst_0.bin
- dd if=/dev/zero of=flash.bin bs=4096 count=16
- 16+0 records in
- 16+0 records out
- 65536 bytes (66 kB) copied, 0 seconds, Infinity B/s
- dd if=rst_0.bin of=flash.bin bs=4096 conv=notrunc
- 0+1 records in
- 0+1 records out
- 16 bytes (16 B) copied, 0 seconds, Infinity B/s
- U:\arm_00>
- flash.bin: rst_0.bin
- @echo //////////////////////////////////////////////////
- @echo Gerando a imagem final para carga na memoria flash
- @echo //////////////////////////////////////////////////
- dd if=/dev/zero of=flash.bin bs=4096 count=16
- dd if=rst_0.bin of=flash.bin bs=4096 conv=notrunc
- rst_0.bin: rst_0.elf
- @echo //////////////////////////////////////////////////
- @echo Extraindo o arquivo binado sem os simbolos
- @echo //////////////////////////////////////////////////
- arm-none-eabi-objcopy -O binary rst_0.elf rst_0.bin
- rst_0.elf: rst_0.o
- @echo //////////////////////////////////////////////////
- @echo Executando o linker
- @echo //////////////////////////////////////////////////
- arm-none-eabi-ld -Ttext=0x00000000 -o rst_0.elf rst_0.o
- @echo //////////////////////////////////////////////////
- @echo Mostrando os simbolos apos o linker
- @echo //////////////////////////////////////////////////
- arm-none-eabi-nm rst_0.elf
- rst_0.o: rst_0.s
- @echo //////////////////////////////////////////////////
- @echo Montando o programa assembly
- @echo //////////////////////////////////////////////////
- arm-none-eabi-as -a -o rst_0.o rst_0.s
- clean:
- @echo //////////////////////////////////////////////////
- @echo Eliminando os arquivos de saida
- @echo //////////////////////////////////////////////////
- rm *.bin
- rm *.elf
- rm *.o
A execução ficaria assim:
- U:\arm_00>make
- //////////////////////////////////////////////////
- Montando o programa assembly
- //////////////////////////////////////////////////
- arm-none-eabi-as -a -o rst_0.o rst_0.s
- ARM GAS rst_0.s page 1
- 1 // Primeiro programa para ARM Cortex-M0
- 2
- 3 .code 16 // Define c├│digo como THUMB
- 4 .globl _start // Necessario para o linker
- 5
- 6 .equ STACK_INIT,0x020002000
- 7
- 8 .text // Inicio da área de código
- 9 _start:
- 10
- 11 // Inicio do Vector Table
- 12
- 13 0000 00200020 .word STACK_INIT // Inicio da pilha
- 14 0004 00000000 .word reset_handler // Endereco do Reset Handler
- 15
- 16 // define o label como função para que o linker
- 17 // resolva como c├│digo THUMB
- 18
- 19 .type reset_handler, function
- 20
- 21 reset_handler: // inicio do tratamento do reset
- 22
- 23 0008 0320 mov r0, #3 // carrega r0 com o valor 3
- 24 000a 0421 mov r1, #4 // carrega r1 com o valor 4
- 25 000c 0A18 add r2, r1, r0 // soma r0 e r1 guardando em r2
- 26
- 27 000e FEE7 _stop: b . // loop infinito
- ♀ARM GAS rst_0.s page 2
- DEFINED SYMBOLS
- rst_0.s:9 .text:00000000 _start
- rst_0.s:6 *ABS*:20002000 STACK_INIT
- rst_0.s:21 .text:00000008 reset_handler
- .text:00000000 $d
- rst_0.s:23 .text:00000008 $t
- rst_0.s:27 .text:0000000e _stop
- NO UNDEFINED SYMBOLS
- //////////////////////////////////////////////////
- Executando o linker
- //////////////////////////////////////////////////
- arm-none-eabi-ld -Ttext=0x00000000 -o rst_0.elf rst_0.o
- //////////////////////////////////////////////////
- Mostrando os simbolos apos o linker
- //////////////////////////////////////////////////
- arm-none-eabi-nm rst_0.elf
- 00008010 T __bss_end__
- 00008010 T __bss_start
- 00008010 T __bss_start__
- 00008010 T __data_start
- 00008010 T __end__
- 00008010 T _bss_end__
- 00008010 T _edata
- 00008010 T _end
- 00080000 T _stack
- 00000000 T _start
- 0000000e t _stop
- 00000008 t reset_handler
- 20002000 a STACK_INIT
- //////////////////////////////////////////////////
- Extraindo o arquivo binado sem os simbolos
- //////////////////////////////////////////////////
- arm-none-eabi-objcopy -O binary rst_0.elf rst_0.bin
- //////////////////////////////////////////////////
- Gerando a imagem final para carga na memoria flash
- //////////////////////////////////////////////////
- dd if=/dev/zero of=flash.bin bs=4096 count=16
- 16+0 records in
- 16+0 records out
- 65536 bytes (66 kB) copied, 0 seconds, Infinity B/s
- dd if=rst_0.bin of=flash.bin bs=4096 conv=notrunc
- 0+1 records in
- 0+1 records out
- 16 bytes (16 B) copied, 0 seconds, Infinity B/s
- U:\arm_00>
Pode parecer muito esforço para algo simples mas, quando uma aplicação tem muitos fontes, o utilitário MAKE facilitará o trabalho uma vez que ele sabe quais dependências precisam ser satisfeitas apenas executando procedimentos que estão desatualizados pela data dos arquivos.
Nenhum comentário:
Postar um comentário