Customizando a memória Flash no Linker do IAR

No artigo anterior descobrimos onde fica o arquivo do Linker e entendemos o mapa de memória. Veja agora como customizar a memória Flash no Linker do IAR.
Linker do IAR
Este post faz parte da série Linker do IAR. Leia também os outros posts da série:

Recapitulando

Na parte 1 desta série vimos onde se encontra o arquivo do Linker na IDE IAR, a partir de um projeto gerado no STM32CubeMX, e detalhamos cada área do mapa de memória, tanto da Flash quanto da RAM. Deste modo, construímos uma base para prosseguirmos com o assunto para customizar o arquivo e, respectivamente, o projeto.

Projeto

Encontre o diretório no qual foi salvo o projeto gerado pelo STM32CubeMX e abra o projeto do IAR (extensão .eww). Já com a IDE aberta, juntamente com o arquivo do Linker (stm32f051x8.icf), faremos as seguintes alterações, as quais serão explicadas na sequência:

Em “Specials”, o endereço inicial, tanto da memória Flash quanto do vetor de interrupções, foi mantido (0x08000000).

Em “Memory Regions”, alteramos o endereço inicial do programa de 0x08000000 para 0x08000400. Isto significa que atribuímos 1 kB somente para o vetor de interrupção. Porém, o leitor pode se perguntar: “Será que esta quantidade está correta?”. A resposta é SIM! Vide o tamanho do vetor no arquivo .map, o qual indica o atual tamanho no mapa de memória:

Tamanho do vetor de interrupção.
Figura 1 – Tamanho do vetor de interrupção.

Nesta figura, podemos extrair também: o tipo do código (Kind: ro code), a faixa de endereço (Address: 0x08000000 – 0x080000bc), o tamanho (0xbc = 188 bytes) e o objeto que é o arquivo de saída (pós compilação) do startup_stm32f051x8.s. Ou seja, todos os endereços de cada vetor de interrupção, stack, heap e apontamento para o SystemInit após o reset, estão neste arquivo. Vemos também que a memória reservada para ROUTINE_REGION é representada por “P2”. Outra conclusão é que superestimamos a área reservada para o vetor.

Com a determinação da região do vetor, alteramos o endereço de início e fim do programa para 0x08000400 – 0x0800DFFE. Além disso, determinamos os endereços iniciais e finais da rotina que criaremos: 0x0800DFFF – 0x0800FFFF, respectivamente representados por routine_region_ROM_start__ e routine_region_ROM_end__, cujo tamanho é de 8 kB.

Modificamos, para facilitação da leitura do código e também demonstrar outra maneira de atribuição, os valores de __ICFEDIT_size_cstack__ = 2k e __ICFEDIT_size_heap__   = 1k.

Por fim, determinamos a região da rotina, indicado por ROUTINE_region e, em seguida, a seção ROUTINE_REGION, que será invocada pela diretiva de compilação #pragma.

No próximo artigo mostraremos como fazer a mesma configuração utilizando os recursos gráficos do IAR.

Saiba mais

https://www.iar.com/support/tech-notes/linker/what-is-linker-created-and-lcgbwk-in-the-.map-file/
https://www.iar.com/support/tech-notes/compiler/linker-error-for-absolute-located-variable/

Criando um projeto no IAR com o FreeRTOS

GNU ARM Cross-toolchain – Configurando stack e heap

Outros artigos da série

<< Introdução ao Linker do IAR com a STM32F0Discovery

Olá, meu nome é Eder.

Sou desenvolvedor de sistemas embarcados apaixonado por eletrônica, programação, firmware e IoT.

Tenho experiência em projetos de equipamentos médicos, energia, automação e rastreamento veicular.

Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments

WEBINAR

Imagens de Ultrassom: Princípios e Aplicações

DATA: 26/10 ÀS 19:30 H